Re: Statistiques

2014-10-10 Par sujet Scott Kostyshak
2014-10-10 12:37 GMT-04:00 Stéphane Mourey
:

Bonjour Stéphane,

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

En anglais, je pense que la traduccion correcte de "signes" c'est
plutôt "characters". En anglais quand on voit "signs" dans ce
contexte, on pense plutôt a "punctuation signs", c'est à dire "!?,.".
C'est possible qu'en Grande Bretagne c'est différent mais j'ai trouvé
le suivant, qui indique que ce n'est pas le cas:
http://forum.wordreference.com/showthread.php?t=1540778

En français quand on dit "charactères" est-ce qu'on pense seulement à
"lettres" et pas à "!?,."? En anglais, je pense que "!?,." sont des
"characters" mais ne sont pas des "letters" alors la distinction est
bonne.

Je te conseille donc "words|chars|chars-space".

> Voilà ce que cela donne :
>
> case LFUN_SERVER_GET_STATISTICS:
> DocIterator from, to;
> if (cur.selection()) {
> from = cur.selectionBegin();
> to = cur.selectionEnd();
> } else {
> from = doc_iterator_begin(&buffer_);
> to = doc_iterator_end(&buffer_);
> }
>
> Buffer buffer = cur.buffer();
> buffer.updateStatistics(from, to);
> switch (cmd.getArg(0)) {
> case "words":
> cur.message(buffer.wordCount());
> break;
> case "signs":
> cur.message(buffer.charCount(false));
> break;
> case "signs-space":
> cur.message(buffer.charCount(true));
> break;
> default:
> cur.message(buffer.wordCount() + buffer.charCount(false) +
> buffer.charCount(true));
> }
> break;

Je ne suis pas super fort en C++, mais je pense qu'on peut utiliser
"case" qu'avec un "int" ou un "char" et non pas un string (ou quoi qui
soit cmd.GetArg(0)). Je suppose que tu pourrais créer un enum. Le
mieux serait de regarder ce qui font d'autres parties du code que
utilises cmd.getArg(). Comme j'ai dit, c'est possible que j'ai tort
la-dessus.

> ./autogen.sh > ok
> ./configure >configure: error: cannot compile a simple Qt executable. Check
> you have the right $QTDIR.

Parfois c'est nécessaire de tout refaire dès le début. C'est à dire
que tu devrais essayer avec un "git clean -xdf" avant. Mais attention,
ça va supprimer tous les fichiers éxtras alors fais une sauvegarde du
dossier avant au cas ou.

Il me semble que tu fais beaucoup de progès. Il m'a fallu au moins
cinquante "itérations Jean-Marc" pour mon premier patch.

Bon weekend,

Scott


Re: Statistiques

2014-10-10 Par sujet Stéphane Mourey

Re-bonjour,

Je réponds vite, car je n'ai plus beaucoup de temps là, tout de suite, 
mais j'ai de nouveaux éléments :

Le 10/10/2014 17:25, Jean-Marc Lasgouttes a écrit :
Je dirais "words|signs|signs-space" comme possibilité d'arguments. Il 
vaut mieux être bref.

J'ai corrigé en :

 * \li Syntax: server-get-statistics 
 * \li Params:  indicate the statistic to
   get, none for all space separated

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.

OK.
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.
le "cur" dans le code, c'est le curseur ? Il se comporte comment en 
ligne de commande ?
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.
Je l'ai fait, déplaçant mes "case" de Buffer vers les fonctions 
équivalentes Test3 (et en supprimant les this). Mais les fonction 
"updateStatistics", "wordCount" et "charCount" ne sont-elle pas des 
méthodes de Buffer ? Du coup, j'ai essayé de le récupérer le buffer dans 
une variable, pour appeler les méthodes...


Voilà ce que cela donne :

case LFUN_SERVER_GET_STATISTICS:
DocIterator from, to;
if (cur.selection()) {
from = cur.selectionBegin();
to = cur.selectionEnd();
} else {
from = doc_iterator_begin(&buffer_);
to = doc_iterator_end(&buffer_);
}

Buffer buffer = cur.buffer();
buffer.updateStatistics(from, to);
switch (cmd.getArg(0)) {
case "words":
cur.message(buffer.wordCount());
break;
case "signs":
cur.message(buffer.charCount(false));
break;
case "signs-space":
cur.message(buffer.charCount(true));
break;
default:
cur.message(buffer.wordCount() +
   buffer.charCount(false) + buffer.charCount(true));
}
break;

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


./autogen.sh > ok
./configure >configure: error: cannot compile a simple Qt executable. 
Check you have the right $QTDIR.


 Hum!

Mes filles viennent de rentrer, c'est fini pour aujourd'hui, il faut que 
je "babysite" :)


Merci et bon week-end.

Stéphane Mourey

--
Blog: Impossible Exil 


Re: Statistiques

2014-10-10 Par sujet Jean-Marc Lasgouttes

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

  * \li Params: 


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



Re: Statistiques

2014-10-10 Par sujet Stéphane Mourey

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
   
 * \li Params: 
 * \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>