Re-bonjour,

Voilà, j'ai eu un peu de temps aujourd'hui pour me pencher à nouveau à la question.

Jean-Marc (merci!), j'explique tout ce que j'ai fait en réagissant à tes réponses ci-dessous :
  * je ne comprend pas bien le fonctionnement de LyXAction.cpp, mais
    j'ai l'impression qu'il sert à faire le lien entre la commande reçue
    par le serveur (statistics) et le nom de la fonction en interne
    (LFUN_STATISTICS)
Exact, et il y a en plus une série de drapeaux indiquant quand cette fonction peut être utilisée.
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>
     * \li Origin: brokenclock, Oct 10 2014
     * \endvar
     */
   { LFUN_SERVER_GET_STATISTICS, "server-get-statistics", ReadOnly |
   Argument, System },


Je me suis inspiré des autres fonctions pour choisir les drapeaux, mais j'avoue que c'est un peu piffométrique... Peux-tu confirmer ou corriger Jean-Marc ? Les commentaires sont corrects ? On voit que j'attends un paramètre à choisir parmi trois chaînes de caractères.
        LFUN_STATISTICS_NOVIEW, // brokenclock 20141006
Oui (au nom près)
J'ai mis :
        LFUN_SERVER_GET_STATISTICS,     // brokenclock 20141010
juste avant la ligne LFUN_LASTACTION.
Dans Buffer.cpp, plutôt. Il faut en effet ajouter un case dans Buffer::getStatus. C'est là qu'on dit si la fonction est activée ou pas. Ici, elle est toujours activée.
Du coup dans Buffer::getStatus, j'ai ajouté :

        case LFUN_SERVER_GET_STATISTICS:
            break;

pour activer la fonction.
Et si la commande est activée dans dans Buffer::getStatus, alors elle est sans doute traitée dans Buffer::dispatch ?
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;

  * comment je fais pour écrire proprement dans ~/.lyxpipe.out ?
Le mieux est de regarder le fonctions LFUN_SERVER_GET_xxx (d'où le changement de nom ci-dessus).
C'est ce que j'ai fait, je n'ai trouvé que LFUN_SERVER_GET_XY et LFUN_SERVER_GET_LAYOUT dans Text3.cpp.
Ici, la commande magique sera
   result.setMessage(le résultat à renvoyer);
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.

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).

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.
--
Blog: Impossible Exil <http://impossible-exil.info>

Répondre à