[Writer] Compter les mots correctement

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

[Writer] Compter les mots correctement

Message par ThierryM »

Bonjour à tous,
Sous OOo (et même WORD 2007), le comptage des mots n'est pas très fiable. Voici donc un bout de code qui permet de compter correctement les mots pour la langue française (respect des apostrophes, pas de comptage de la ponctuation double, tirets) :

Code : Tout sélectionner

Function ComptageMots()
 'Macro permettant de calculer le nombre de caractères spéciaux, des signes particuliers, des mots
 'par Thierry Munoz, le 20/01/2010, sous License GNU v3

  ' Comptage des caractères spéciaux, des signes particuliers, des mots
 ' Les signes de ponctuation encadrés par 2 espaces sont comptabilisés comme un mot
 ' Ce bug se retrouve sous WORD et sous OOo aussi avec l'outil statistique !!!
 ' En effet, la méthode de calcul considère qu'un mot est toujours précédé par un espace
 ' Cette macro fait les corrections pour ces signes de ponctuation doubles (les anglosaxons ne laissent pas d'espace avant), les guillemets,les parenthèses
 ' Les apostrophes, les tirets sont pris aussi en compte (ce que ne fait pas OOO nativement, idem pour WORD 2007)
 
texte=thisComponent.Text.String 'récupère le texte du document (sans les cadres de texte)
 longueurTexteBrut=len(texte) 'Nombre total de caractères du texte

 EspaceAvant=true 'Variable qui permet de compter le nombre de mots séparés par des espaces
 For n = 1 to longueurTexteBrut
   caractere = Mid(texte, n, 1)
    Select Case caractere
		Case " "   ' espaces
            nEsp = nEsp + 1
            'compte les espaces successifs qui n'interviennent pas dans le comptage des mots
            If EspaceAvant Then nEspaceDouble=nEspaceDouble+1
            EspaceAvant=true
		Case Chr(9)   ' tabulations
            nTab = nTab + 1
            EspaceAvant=true
        Case Chr(13)   ' retours à la ligne
            nRet = nRet + 1
            EspaceAvant=true
        Case Chr(10)	' Sauts de ligne qui inclut les chr(13) !!!
         	nSautLig= nSautLig+1
            EspaceAvant=true
        Case ":",";","!","?",Chr(34),Chr(171),Chr(187) 'permet de ne pas compter ces signes comme des mots dont les guillemets
        	nSignesPonctuationDouble=nSignesPonctuationDouble + 1
            EspaceAvant=true
        Case ".","," 'Cas de la ponctuation simple qui ne devrait pas avoir d'espace devant
        	EspaceAvant=true
        Case "(",")" 'Cas des parenthèses au cas où il y aurait un espace derrière elles
            	nParentheses=nParentheses+1
        Case "'" 'Compte le nombre d'apostrophes
        	nApostrophes=nApostrophes+1
        Case "-" 'Compte le nombre de tirets
        	If EspaceAvant=false then nTiretsMot=nTiretsMot+1        		
        Case Else 'Permet le calcul du nombre de mots
        	If EspaceAvant then nMots= nMots+1
        	EspaceAvant=false
   End Select    
 Next n
 'Réajustement du nombre réel de mots
 nMots=nMots+nApostrophes+nTiretsMot
End Function
Pour plus de détail sur l'obtention de statistiques par macro, voir le fil "[Writer] Affichage des statistiques détaillées d'un texte" dans la section "Suprêmes de code".

En espérant que ça aide la communauté,

Thierry
Edit du 21/01/2010 : Rajout d'une portion de code pour tenir compte des guillemets, des parenthèses ...
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
Tapio
Fraîchement OOthentifié
Messages : 6
Inscription : 09 avr. 2010 15:07

Re: [Writer] Compter les mots correctement

Message par Tapio »

J'aime beaucoup les différents commentaires qui aident à comprendre le code :D
OpenOffice 2.4 sous Windows 7
Celestus
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 29 août 2009 16:19

Re: [Writer] Compter les mots correctement

Message par Celestus »

En version corrigée, ça donne ça :
(Vous n'avez plus qu'à faire copié-collé pour que ça marche)

Code : Tout sélectionner

REM  *****  BASIC  *****

Sub Main

    ' Macro permettant de calculer un nombre de mots pour un texte en la langue française (France) (lang code = fr-FR).
    ' Elle prend en charge tous les caractères de la norme "ANSI Europe de l'ouest" (= "Windows-1252" = "CP1252") (qui englobe la norme "ASCII").

    ' Si vous sélectionnez du texte, la fonction ne considèrera que le texte sélectionné.
    ' Si vous ne sélectionnez pas de texte, la fonction considèrera tout le document.

    ' Par convention :
    ' - On compte un mot comme étant un groupe de caractères séparé des autres groupes par un espace (isolables typographiquement).
    ' - Tous les caractères qui ne sont pas des chiffres ou des lettres comptent pour rien.

    ' Ce qui signifie :
    ' - Les chiffres ou nombres isolés comptent pour 1 mot.
    '   (Exemple : "Cette phrase contient 5 mots.")
    ' - Les mots courts comme "le", "la", "de", "à", "a", "où", "y", etc. comptent pour 1 mot.
    ' - Les mots élidés comme "c'", "d'", "j'", "l'", "m'", "n'", "s'", "t'" comptent pour un mot.
    '   (Exemple : "C'est ainsi." = 3 mots)
    ' - Les mots composés comptent pour plusieurs mots si chaque terme est un mot indépendant.
    '   (Exemple : "grand-mère" = 2 mots, "c'est-à-dire" = 4 mots, "tout-à-l'égout" = 4 mots)
    ' - Les mots composés contenant des mots qui n'existent pas de manière indépendante ne comptent pas.
    '   (Exemple : "socio-économique = 1 mot, car "socio" est l'abrégé de "social" et ne s'emploi pas seul)
    '   (Exemple : "sociologico-économique = 1 mot, car "sociologico" est l'abrégé de "sociologique" et ne s'emploi pas seul)
    '   (Exemple : "sociologique-économique = 2 mots)
    ' - Le "t" présent dans "a-t-il" ou "prend-t-il" est une notation purement euphonique, il ne compte pas.
    ' - Les caractères abrégés comme l'esperluette (& = et) ou les caractères de monnaie (€, ¢, $, £, ¤, ¥, etc.) comptent pour 1 mot.
    ' - Les autres caractères (type # (dièse), _ (underscore), % (pourcent), etc.) ne comptent pas.

    ' Dans les algorithmes habituel de comptage des mots, on considère forcément qu'un mot est précédé d'un espace.
    ' Les espaces insécables ne sont pas pris en compte.
    ' Cette méthode de calcul fonctionne pour les anglo-saxons qui ne séparent pas leur ponctuation,
    ' mais pas pour les français qui séparent les caractères de type deux-points, point-virgule, point d'exclamation, etc.
    ' Cette macro propose un nouvel algorithme qui corrige ces erreurs.

    ' ATTENTION :
    ' Cette macro compte forcément les mots composés (séparés par un ou des tirets) comme plusieurs mots.
    ' Elle n'est pas capable de reconnaître les mots qui composent un mot-composé comme étant indépendants ou non.
    ' Vous devrez donc réajuster le résultat en fonction. Le nombre de mots composés est affiché dans le résultat.

    objet_texte                 = ThisComponent.CurrentController.getViewCursor
    if (objet_texte.IsCollapsed = TRUE) then
        string_texte            = ThisComponent.Text.String                              ' On récupère le texte de tout le document (sans les cadres).
    else
        string_texte            = objet_texte.String                                     ' On récupère le texte sélectionné (sans les cadres).
    end if

    i_longueur_texte            = len(string_texte)                                      ' On calcule le nombre total de caractères.

    i                           = 0                                                      ' On initialise une variable d'itération de boucle.
    i_nombre_mot                = 0                                                      ' On initialise une variable pour compter le nombre de mots.
    i_nombre_mot_compose        = 0                                                      ' On initialise une variable pour compter le nombre de mots composés.
    i_nombre_mot_coupe          = 0                                                      ' On initialise une variable pour compter le nombre de mots coupés par un retour à la ligne.

    b_premier_mot               = TRUE                                                   ' On initialise une variable pour compter le premier mot.
    b_compter_le_mot_apres      = FALSE                                                  ' On initialise une variable pour savoir s'il faut ou non compter un mot qui est après.
    c_caractere                 = ""                                                     ' On initialise une variable pour travailler sur un caractère.

    i_nombre_retour_chariot     = 0                                                      ' On initialise une variable pour compter le nombre de retours chariot (= CR = Carriage return = 0D).
    i_nombre_saut_de_ligne      = 0                                                      ' On initialise une variable pour compter le nombre de sauts de ligne  (= LF = Line feed       = 0A).
    i_nombre_retour_a_la_ligne  = 0                                                      ' On initialise une variable pour compter le nombre de retours à la ligne.
                                                                                         ' Remarque sur le retour à la ligne :
                                                                                         ' - Sous Windows = 0D 0A = CR LF = chr(13) chr(10)     (Norme standard)
                                                                                         ' - Sous Linux   = 0D    = CR    = chr(13)
                                                                                         ' - Sous MacOSX  = 0A    = LF    = chr(10)

    for i = 1 to i_longueur_texte step 1                                                 ' Boucle allant du premier au dernier caractère du texte récupéré.
        c_caractere = mid(string_texte, i, 1)                                            ' On récupère un caractère.

        select case c_caractere

            case " ", chr(160)                                                           ' Si ce caractère est un espace ou un espace insécable...
                b_compter_le_mot_apres = TRUE

            case chr(9)                                                                  ' Si ce caractère est une tabulation...
                b_compter_le_mot_apres = TRUE

            case chr(13)                                                                 ' Si ce caractère est un retour chariot...
                i_nombre_retour_chariot = i_nombre_retour_chariot + 1
                b_compter_le_mot_apres  = TRUE

                if (i >= 2) then
                    if (mid(string_texte, i - 1, 1) = "-") then                          ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
                        b_compter_le_mot_apres = FALSE
                    end if
                end if

            case chr(10)                                                                 ' Si ce caractère est un saut de ligne...
                i_nombre_saut_de_ligne = i_nombre_saut_de_ligne + 1
                b_compter_le_mot_apres = TRUE

                if (i >= 3) then
                    if (mid(string_texte, i - 2, 2) = "-" & chr(13)) then                ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
                        b_compter_le_mot_apres = FALSE
                    else
                        if (mid(string_texte, i - 1, 1) = "-") then
                            b_compter_le_mot_apres = FALSE
                        end if
                    end if
                end if

            case ":", ";", "!", "¡", "?", "¿", chr(34), chr(171), chr(187)               ' Si ce caractère est un signe de ponctuation double... (qui nécessite un espace avant)
                b_compter_le_mot_apres = TRUE                                            ' (34 = ") (171 = «) (187 = »)

            case ".", ","                                                                ' Si ce caractère est un signe de ponctuation simple... (qui ne nécessite pas un espace avant)
                b_compter_le_mot_apres = TRUE

                if (i >= 2) then                                                         ' Pour ne pas compter comme plusieurs mots les chiffres séparés par des points ou des virgules.
                    if (isnumeric(mid(string_texte, i - 1, 1)) = TRUE) then
                        if (i <=  i_longueur_texte - 1) then
                            if (isnumeric(mid(string_texte, i + 1, 1)) = TRUE) then
                                b_compter_le_mot_apres = FALSE
                            end if
                        end if
                    end if
                end if

            case chr(39), chr(146)                                                       ' Pour ne pas compter les apostrophes, qu'ils soient ou non séparés du mot.
                b_compter_le_mot_apres = TRUE                                            ' (39 = ', 146 = ’)

            case "-"
                i_nombre_mot_compose   = i_nombre_mot_compose + 1
                b_compter_le_mot_apres = TRUE

                if (i <=  i_longueur_texte - 2) then
                    if (mid(string_texte, i, 3) = "-t-") then                            ' Pour ne pas compter le "t" d'un "-t-".
                        i_nombre_mot_compose   = i_nombre_mot_compose - 1
                        b_compter_le_mot_apres = FALSE
                    end  if
                end if

                if (i <=  i_longueur_texte - 1) then
                    c_caractere = mid(string_texte, i + 1, 1)
                    if (c_caractere = chr(13)) OR (c_caractere = chr(10)) then           ' Pour ne pas compter en double les mots coupés par un tiret à la suite d'un retour à la ligne.
                        i_nombre_mot_compose   = i_nombre_mot_compose - 1
                        i_nombre_mot_coupe     = i_nombre_mot_coupe   + 1
                        b_compter_le_mot_apres = FALSE
                    end if
                end if

            case "(", ")", "[", "]", "{", "}"                                            ' Pour ne pas compter les parenthèses, qu'elles soient ou non séparées du mot.
                b_compter_le_mot_apres = TRUE

            case "+", "×", "/", "\", "%", "‰", "=", "<", ">"                             ' Pour ne pas compter ces signes comme un mot s'ils sont isolés.
                b_compter_le_mot_apres = TRUE

            case "_", "–", "—", "¬", "¯", "•", "#", "*", "`", "´", "~", "˜ ", "|", "¦"
                b_compter_le_mot_apres = TRUE

            case "@", "‚", "ƒ", "„", "…", "†","‡", "^", "¨", "Š", "‹", "›", "º", "ª"
                b_compter_le_mot_apres = TRUE

            case "‘", "“", "”", "§", "©", "®", "™", "ª", "°", "§", "µ", "¶", "·", "¸"
                b_compter_le_mot_apres = TRUE

            case "±", "¹", "²", "³"
                b_compter_le_mot_apres = TRUE

            case else
                if (b_compter_le_mot_apres = TRUE) then
                    i_nombre_mot = i_nombre_mot + 1
                else
                    if (b_premier_mot = TRUE) then
                        i_nombre_mot  = i_nombre_mot + 1
                        b_premier_mot = FALSE
                    end if
                end if

                b_compter_le_mot_apres = FALSE
       end select
    next i

    if (i_nombre_retour_chariot = i_nombre_saut_de_ligne) then
        i_nombre_retour_a_la_ligne = i_nombre_retour_chariot
    else
        if (i_nombre_retour_chariot > i_nombre_saut_de_ligne) then
            i_nombre_retour_a_la_ligne = i_nombre_retour_chariot
        else
            i_nombre_retour_a_la_ligne = i_nombre_saut_de_ligne
        end if
    end if

    msgbox "Statistiques :"                                                                                                                                                     & chr(13) & _
                                                                                                                                                                                  chr(13) & _
           "- "  & "Nombre de mots = "               & i_nombre_mot               & " ("                     & i_nombre_mot - i_nombre_mot_compose & " à " & i_nombre_mot & ")" & chr(13) & _
                                                                                                                                                                                  chr(13) & _
           "   " & "(Incertitude de "                & i_nombre_mot_compose       & " mot(s) car il y a "    & i_nombre_mot_compose                & " mot(s) composé(s)."      & chr(13) & _
           "   " & " Dans un mot composé, on compte seulement les"                                                                                                              & chr(13) & _
           "   " & " mots qui peuvent exister de manière indépendante :"                                                                                                        & chr(13) & _
           "   " & " - grand-mère                                  = 2 mots"                                                                                                    & chr(13) & _
           "   " & " - c'est-à-dire                                   = 4 mots"                                                                                                 & chr(13) & _
           "   " & " - tout-à-l'égout                              = 4 mots"                                                                                                    & chr(13) & _
           "   " & " - socio-économique                      = 1 mot  (économique)"                                                                                             & chr(13) & _
           "   " & " - anti-inflammatoire                      = 1 mot  (inflammatoire)"                                                                                        & chr(13) & _
           "   " & " - delta-4-epi-androstène-di-one = 3 mots (delta, 4, androstène)"                                                                                           & chr(13) & _
           "   " & " Cette macro n'est pas capable de faire cette différence,"                                                                                                  & chr(13) & _
           "   " & " elle compte tous les mots composés comme plusieurs mots)"                                                                                                  & chr(13) & _
                                                                                                                                                                                  chr(13) & _
           "   " & "(Pour connaître le nombre exacte de mots,"                                                                                                                  & chr(13) & _
           "   " & " il vous faut lancer une recherche sur le caractère tiret (""-""),"                                                                                         & chr(13) & _
           "   " & " et compter les mots composés un par un)"                                                                                                                   & chr(13) & _
                                                                                                                                                                                  chr(13) & _
           "- "  & "Nombre de mots coupés = "        & i_nombre_mot_coupe                                                                                                       & chr(13) & _
           "   " & "(Mots coupés par un tiret puis un retour à la ligne)"                                                                                                       & chr(13) & _
                                                                                                                                                                                  chr(13) & _
           "- "  & "Nombre de retours à la ligne = " & i_nombre_retour_a_la_ligne                                                                                               & chr(13) & _      
           "   " & "(Dont "                          & i_nombre_retour_chariot    & " retour(s) chariot et " & i_nombre_saut_de_ligne              & " saut(s) de ligne)"       & chr(13) & _
                                                                                                                                                                                  chr(13) & _
           "- "  & "Nombre de caractères = "         & i_longueur_texte

End Sub
Dernière modification par Celestus le 30 juil. 2014 15:10, modifié 1 fois.
Avatar de l’utilisateur
Alain de La Chaume
HédOOniste
HédOOniste
Messages : 1527
Inscription : 28 sept. 2008 12:56
Localisation : ʇsǝnoo,ꞁ ɐ ʇuǝɯǝʇǝꞁdɯoↃ

Re: [Writer] Compter les mots correctement

Message par Alain de La Chaume »

Bonjour,
[b][color=#104090]Celestus[/color][/b] a écrit :En version corrigée, ça donne ça :
(Vous n'avez plus qu'à faire copié-collé pour que ça marche)
A supposer que la version en cours nécessite des corrections, il serait bien de mentionner lesquelles.
De plus, je trouve le commentaire accompagnant la version dite corrigée pour le moins laconique (...).
Quant à copier-coller n'importe quoi sans vérification, je passe mon tour et je déconseille à quiconque.
(API-culteur et pêcheur de macros en mode loisirs occasionnels, mais toujours les pieds dans l'OO)
AOO 4.1.2 sous Linux Xubuntu Voyager 14.04 (x86_64)
Celestus
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 29 août 2009 16:19

Re: [Writer] Compter les mots correctement

Message par Celestus »

Alain de La Chaume a écrit :Bonjour,
[b][color=#104090]Celestus[/color][/b] a écrit :En version corrigée, ça donne ça :
(Vous n'avez plus qu'à faire copié-collé pour que ça marche)
A supposer que la version en cours nécessite des corrections, il serait bien de mentionner lesquelles.
De plus, je trouve le commentaire accompagnant la version dite corrigée pour le moins laconique (...).
Quant à copier-coller n'importe quoi sans vérification, je passe mon tour et je déconseille à quiconque.
C'est un code très simple et très documenté.
Copiez-le dans un fichier texte et lisez.

Quand je dis "version corrigée", il s'agit d'une marque d'ironie : la version du début de ce forum présente de nombreuses erreurs de comptage de mots.

La mienne compte correctement, en utilisant les standards de comptage des mots établis par l'académie française, et elle prend en compte tous les caractères de l'ANSI CP1252.
Ce n'est pas une version corrigée, c'est une version complètement réécrite.

J'ai programmé de manière lisible et claire en mettant des commentaires partout. Si vous n'êtes pas neurasthénique, contentez-vous de lire et vous comprendrez.
Sinon copiez et collez et vous verrez que ça marchera (un code viral serait bien plus complexe, il n'y a aucun danger avec ça).

Sinon libre à vous de continuer à utiliser la macro précédente.

Cordialement.
OlivierR
SuppOOrter
SuppOOrter
Messages : 1037
Inscription : 24 mai 2006 20:34
Localisation : Lorraine, France

Re: [Writer] Compter les mots correctement

Message par OlivierR »

' Cette macro compte forcément les mots composés (séparés par un ou des tirets) comme plusieurs mots.
' Elle n'est pas capable de reconnaître les mots qui composent un mot-composé comme étant indépendants ou non.
' Vous devrez donc réajuster le résultat en fonction. Le nombre de mots composés est affiché dans le résultat.
Vous pouvez faire la distinction entre les mots liés comme «dis-le» avec les mots composés comme «socio-économique» en faisant appel à l’API du correcteur orthographique.
Il ne faut pas faire usage de la fonction isValid, celle-ci renverra True avec «dis-le» comme avec «socio-économique».

En revanche, vous pouvez faire appel à la fonction spell qui peut vous renvoyer une analyse morphologique du mot que vous passez en paramètre.

Le code est en Python, je ne sais pas comment ça s’écrirait en Basic.

Faire appel au correcteur orthographique :

Code : Tout sélectionner

ctx= uno.getComponentContext()
xSvMgr = ctx.ServiceManager
xSpellchecker = xSvMgr.createInstanceWithContext("com.sun.star.linguistic2.SpellChecker", ctx)
Récupérer l’analyse morphologique d’un mot (ça fait appel à l’API de Hunspell qui est peu documentée) :

Code : Tout sélectionner

def isKnownWord (xSpellchecker, xLocale, word):
    x = xSpellchecker.spell("<?xml?><query type='analyze'><word>" + word + "</word></query>", xLocale, ())
    if not x:
        return False
    t = x.getAlternatives()
    if not t:
        return False
    if "po:" in t[0]:
        return True
    return False
La variable “xLocale”, c’est celle que vous récupérez avec un curseur sur le caractère courant avec :

Code : Tout sélectionner

xLocale = xCursor.CharLocale
LibreOffice 7.1Windows 10Grammalecte, correcteur grammatical et orthotypographique
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Re: [Writer] Compter les mots correctement

Message par ThierryM »

Bonjour à tous,
Sans vouloir polémiquer ou rentrer dans un débat stérile, je viens de voir le message pour le moins laconique (et frustrant quand on cherche à apprendre de ses erreurs) de Célestus et j'aurais aimé avoir une explication concernant les erreurs supposées du comptage des mots de ma macro. Il est vrai que ma macro considère tous les mots composés comme des mots indépendants mais mis à part ce détail je ne vois pas où seraient les autres erreurs. D'ailleurs la macro proposée par Celestus n'améliore apparemment pas ce point là. Je partage tout à fait l'avis d'Alain... J'aurais préféré moi aussi un apport plus constructif de Célestus qui ne voulait pas, semble-t-il, que corriger ma version :lol: ...

Pour en revenir au débat (chose plus importante), je persiste à dire que le comptage des mots dans LibreOffice (je n'utilise plus Word pour vérifier avec les dernières versions) est inexact et que ma macro est encore d'actualité (je m'en sers régulièrement dans ma classe). Par exemple pour le texte ci-dessous (tiré d'une dictée, désolé pour la source que je ne trouve plus) :
Les châtaignes
Les congés de la Toussaint, je les passais chez mes grands-parents. Ils habitaient non loin d'un bois. On trouvait dans ce bois de nombreux châtaigniers. Nous y restions de longs moments à remplir nos sacs de châtaignes à la bogue épineuse. J'aimais ce moment de fête. À la maison, nous les triions et les essuyions. Ensuite, nous les décortiquions. Grand-père et grand-mère, avec mon aide, se relayaient pour les faire cuire. « Chauds, les marrons chauds ! » criait mon grand-père, car les châtaignes, une fois cuites, prennent le nom de marrons.
Ma macro recense 97 mots et ma version de LibreOffice (4.3.3.2) 94 alors que si l'on compte les mots-composés pour 1 seul on arrive à 93 (il y a 4 mots composés). Donc dans tous les cas, le résultat retourné par LibreOffice est erroné (c'est soit 93 ou 97 mais pas 94 qui est inexplicable). Je préfère mon comptage : je l'utilise à l'école pour évaluer des dictées et des erreurs de recopiage par rapport au nombre total de mots (dans l'écriture de "grands-parents" je considère que l'élève a écrit 2 mots plutôt qu'un).
Cordialement,

Thierry
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
Avatar de l’utilisateur
PierreDeQuébec
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 27 mai 2015 09:48

Re: [Writer] Compter les mots correctement

Message par PierreDeQuébec »

Bonjour,

Le fil est vieux mais le sujet d'actualité! Ma solution au problème fut dicter par la paresse. J'utilise la fonction WordCounts de Writer pour obtenir un résultat conforme à l'algorithme de LibreOffice. Le code est le suivant.

D'abord, il faut définir une variable oTmp

Code : Tout sélectionner

Dim oTmp As Object				' Un document temporaire.
Ensuite, l'appel à la fonction doit-être précédé par la création d'un document temporaire (non visible)

Code : Tout sélectionner

        ' Créer un document temporaire.
        oVal(0).Name = "Hidden"
	oVal(0).Value = True
	oVal(1).Name = "MacroExecutionMode"
	oVal(1).Value = com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN
	oTmp = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, oVal() )

Code : Tout sélectionner

Function CompterMotsParagraphe (ByRef sTexte As string) As Long

' Paramètres:
' sTexte :					Texte ne contenant qu'un seul paragraphe.
'							Attention, aucun test n'est fait pour vérifier s'il
'							n'y a qu'un seul paragraphe.
' Retourne
' 0							Le paragraphe est vide
' Un nombre > 0				Le nombre de mots.

	 Dim oText            														' Pointeur vers le texte dans le fichier temporaire.
	 Dim oCursor          														' Curseur dans le fichier temporaire.


	' Effacer le texte du document temporaire.
	' La variable pointant vers le document temporaire doit porter le nom oTmp
	' et être de portée globale.
	oCursor = oTmp.Text.createTextCursor
	oCursor.gotoStartOfParagraph(False)
	oCursor.gotoEndOfParagraph(True)
	oCursor.setString("")
	
	' Algorithme : Coller le texte du paragraphe dans un document temporaire ne contenant
	' aucun autre texte et faire usage de la méthode WordCount de Writer.
	CompterMotsParagraphe = 0

	' Coller le texte passé en argument.
	oText = oTmp.getText()
	oCursor = oText.createTextCursor()
	oText.insertString( oCursor, sTexte, False)
	
	' Compter les mots!
	CompterMotsParagraphe = oTmp.WordCount()
  
End Function	' CompterMotsParagraphe
L'appel à la fonction sera similaire à ce qui suit:

vText = ThisComponent.Text ' Le text du document.
vCur = vText.CreateTextCursor() ' Un curseur.
vCur.GoToStart(False)
(Sélectionner votre texte ici avec une méthode du genre vCur.gotoNextParagraph(False).
L'API OO sur le curseur pourra vous aider.)
lCompteMotPara = CompterMotsParagraphe (vCur.GetString())
LibreOffice version: 6.3.1.2, version téléchargée sur Kubuntu 19.04 Disco Dingo. Locale: fr_CA
Noyau 5.0.0-31-generic. Système 64 bits