!RndSig et Mail.app

Pour les chanceux qui ont déjà leur mac, j’imagine que cette page pourrait servir de point de départ à une intégration de !RndSig dans cet OS

Publicités

"Recherche intxC3xA9grateurs !"

Pour que !RndSig devienne un vrai bon script Ruby, je cherche des intégrateurs pour développer les couches d’adaptation spécifiques pour (au moins) MacOSX (parce qu’un jour, je l’aurai, mon Mac), Linux (à mon avis, il doit falloir une version par Window manager, mais je peux me tromper). Donc, si vous vous sentez compétents dans ces domaines, déposez un petit commentaire. Je mettrai dans la journée le code entier de l’appli sur le serveur. Dans le même genre, j’ai besoin d’un petit conseil pour Windows : quand j’utilise comme hotkey ctrl-alt-F11, ça foire lamentablement.

En revanche (avec XP), win-F11 fonctionne très bien (à un point tel que RndSig est rangé dans son placard, désolé O cher maître, et encore merci pour l’idée génialissime).

Choix de la signature

Maintenant que la liste des ginature est construite, il ne reste plus qu’à sélectionner la bonne ! Pour cela, et dans la mesure où Config est en fait le conteneur d’objets Signatures, on crée une méthode dans cette classe permettant cette sélection :

https://gist.github.com/266039

Simple, non ? On calcule le poids de chaque signature (l’appel à compute) pour le tableau de texte (processed) passé en argument. Et, une fois le tableau obtenu, on le trie par ordre décroissant. Il ne reste plus alors qu’à trouver la valeur d’une signature :

https://gist.github.com/266041

Mortellement complexe, non ? Une autre partie de l’application n’a pas été décrite ici (et, franchement, je ne crois pas que ça intéresse grand monde) : c’est celle mappant les touches sur l’OS. Elle est affreusement complexe, n’existe pour l’instant que pour Windows, et est de plus d’une laideur peu commune. Alors, à moins que certains lecteurs y tiennent par-dessus tout, je crois bien que je ne vais pas en parler.

Chargement de signatures

J’ai parlé la dernière fois du fichier de configuration et de sa lecture (pour les curieux, j’en ai mis un exemple ici). Mais je n’avais pas exmpliqué le chargement des signatures (le fameux loadSignatures). Donc allons-y. Il s’agit encore une fois de lire un fichier dont on connaît le format. Une signature se présente sous la forme suivante :

-- (Conan) Conan "Conan, qu'y a-t-il de mieux dans la vie ?" Conan "Ecraser ses ennemis, les voir mourir devant soi et entendre les lamentations de leurs femmes."

D’abord, un signe -- pour commencer (l’espace fait partie du symbole). Eventuellement, un nom (entre parenthèses), un certain nombre de mots clés, dont le poids dans la signature correspond au WEIGHT défini dans le fichier de configuration. Puis, à la ligne suivante, et jusqu’à la prochaine ligne vide, le texte de la signature. Ca donne une méthode loadSignatures assez simple :

https://gist.github.com/266027

Bon, en fait, il y aune ruse. J’ai légèrement étendu le code de {RndSig} pour gérer plusieurs fichiers de signatures. Cette méthode se contente donc de charger chaque fichier de signature, en appelant la suivante, un poil plus complexe :

https://gist.github.com/266029

Pas bien compliqué, somme toute : sigText récupère chaque ligne de la signature. Si la ligne est vide (lineLength==0), on crée une nouvelle signature qu’on place dans la liste qui va bien. Sinon, on ajoute le texte à sigText. Bien sûr, -- impose le remplacement de sigText par line. Rien de bien complexe, quoi. Sauf qu’on construit au vol une signature. Mais ça, j’en reparlerai plus tard. Les curieux pourront consulter le fichier signature.rb, au même en,droit que le reste.

 

Lecture d\’un fichier de configuration

Comme {!RndSig} n’est qu’un clone de {RndSig}, il doit commencer, tout comme son illustre cousin, par lire un fichier de configuration pour charger un certain nombre d’informations. J’ai donc choisi de commencer par cette tâche mon implémentation. Avant toute chose, jetons un oeil à un fichier de configuration typique :

EDITEUR C:Program Filesnotepad2Notepad2.exeMULTIPLE DELAI 50 RCHQUOTE FORCERCRLF TOUCHE control-shift-F11 TOUCHEMAN control-alt-F11 AUTOCLE POIDS 10 POIDSAUTO 2 FCHDEF mysigs IGNORE les,des,mes,tes,ses,leur,leurs,notre,notres,votre,votres,you,your,yours,his IGNORE sur,sous,moi,toi,elle,pas,suis,sommes,etes,avons,avez,ont,pour,avec,une,mon IGNORE ton,son,dans,est,sont,her,they,their,are,were,and,for,with,under,over,out,off IGNORE from,our,your,well,html,the PRESEP  PRE Nicolas Delsaux

Ca a l’air facile, mais en fait non : un certain nombre de ces lignes de configuration sont des déclarations de flags (RCHQUOTE, FORCERCRLF, AUTOCLE), d’autres sont des entiers (DELAI, POIDS, POIDSAUTO), d’autres des chaînes de caractère (EDITEUR, TOUCHE), et d’autres enfin des parties de chaînes (IGNORE, PRE). Pour arriver à ce résultat en Ruby, je me suis donc défini un objet Config, contenant un attribut pour chaque élément de la configuration. Seulement, comment le charger ? Simplement en lisant le premier mot de chaque ligne, puis en lisant la valeur associée à cette clé dans un Hash. Et enfin, en exécutant le morceau de code qu’est cette valeur. Plus clairement, voyons un exemple (pas trop simple) : POIDS.

https://gist.github.com/266034

On remarquera la ruse qui consiste à associer, dans le initialize (pour que @weight soit bien associé à l’instance courante d’objet Config), la clé WEIGHT à un objet Proc permettant de définir un bout de code exécutable. J’expliquerais le loadSignatures la prochaine fois. En attendant, la version courante de la classe Config est disponible ici