Bonjour,

Le 10/10/2014 16:58, Stéphane Mourey a écrit :
J'ai donc ajouté les lignes suivantes au fichier LyXAction.cpp :

    /*!
      * \var lyx::FuncCode lyx::LFUN_SERVER_GET_STATISTICS
      * \li Action: Count the statistics (number of words and characters)
                    in the document.
      * \li Notion: Note that this function gives the number of
    words/chars written,
                   not the number of characters which will be typeset.
      * \li Syntax: server-get-statistics
    <words|signs-spaces-inluded|signs-spaces-excluded>
      * \li Params: <words|signs-spaces-inluded|signs-spaces-excluded>

Je dirais "words|signs|signs-space" comme possibilité d'arguments. Il vaut mieux être bref.

La ligne Params: est sensée expliquer à quoi chaque argument sert.

      * \li Origin: brokenclock, Oct 10 2014
      * \endvar
      */
    { LFUN_SERVER_GET_STATISTICS, "server-get-statistics", ReadOnly |
    Argument, System },

On peut supposer, comme dans la commande wc, que sans argument on renvoie les 3 valeurs séparées par un espace. Dans ce cas, le Argument n'est pas nécessaire.

[je saute plein de choses sans problème]

Et si la commande est activée dans dans Buffer::getStatus, alors elle
est sans doute traitée dans Buffer::dispatch ?

Oui exactement.

J'ai donc ajouté dans Buffer::dispatch le cas :

         case LFUN_SERVER_GET_STATISTICS:
             this.updateStatistics(from, to);
             switch (cmd.getArg(0)) {
                 case "words":
                     cur.message(this.wordCount());
                     break;
                 case "signs-without-spaces":
                     cur.message(this.charCount(false));
                     break;
                 case "signs-with-spaces":
                     cur.message(this.charCount(true));
                     break;
                 default:
                     return false;
             }
             break;

Déjà, tu peux enlever les "this.", on n'utilise pas cette forme dans le code LyX.

D'autre part, dans la classe Buffer, on n'a pas de curseur (c'est un buffer qui n'est pas nécessairement en train d'être édité). Par exemple, quand on fait un export depuis la ligne de commande, il n'y a pas de curseur.

Tu as raison qu'il serait utile d'avoir un curseur, ce qui veut dire qu'il faudrait déplacer le code dans Text3.cpp (== un morceau de texte en train d'être édité). Dans ce cas, tu fais comme les autres exemples de serveur.

Les deux fonctions que j'ai trouvées utilisent cur.message(), que j'ai
donc utilisé dans mon code, sans savoir si cela vaut quelque chose.

Oui, c'est bien.

Un autre problème qui me saute aux yeux tient aux arguments à envoyer à
Buffer::updateStatistics : je ne sais pas comment lui indiquer d'où
commencer son compte, ni où finir (par défaut, du début à la fin du
document... je ne pense pas qu'on puisse gérer d'autres possibilités en
passant par le serveur).

Comme tu as un curseur, tu peux reprendre le code de LFUN_STATISTICS pour calculer from et to.

Voilà où j'en suis. À mon avis, il ne manque pas grand chose pour que ça
marche, mais ce n'est pas encore la peine que je lance la compilation.

Oui, tu as tous les morceaux, et n'hésite pas lancer la compilation, cela peut faire faire des découvertes :)

Bon week end,
JMarc

Répondre à