by Levak » 15 Nov 2011, 01:01
Bon, j'approche de la fin, enfin ... plutôt du on.paint() qui est le dernier truc que je toucherais puisque c'est le seul truc qui me permet de tester le reste =D
Il me reste un bug étrange lors des Redo pour copier un texte, et le fait de copier un texte avec certains caractères spéciaux (typiquement je copie un texte multi-lignes d'une application ça ne foire pas, je copie d'une autre application ça fait planter dans la fonction d'affichage).
Globalement il faut que yatto retienne plusieurs choses (c'est valable pour les autres aussi) :
- ça ne sert à rien de recréer le monde quand on a à disposition des fonctions telles que string.find ou string.split ou encore string.match qui répondent à des expressions rationnelles (rien que l'exemple comptabul m'est resté en travers de la gorge : 30 lignes pompeuses contre 1 instruction optimisée D:)
- Les variables globales c'est le mal. Même si le Lua le permet, là en l'occurrence, on ne s'y retrouve plus. On accepte cependant les globales explicites (donc évitons les variables telles que i, j, k etc ... qui trainent et dont on ne maîtrise pas la valeur)
- Le clipboard n'est pas un dépotoir et ne doit pas servir de buffer temporaire.
- des espaces avant et après les opérateurs =( [ toto=1 ==> toto = 1 ] pleeeeeaaase
- table.getn est strictement égal à #. Pareil pour string.len()
- encoder ton texte avec des @@eol@@, inutile que je te le dise, tu dois déjà savoir que ça sert à rien car '\n' ou encore string.uchar(10) marchent très bien :O
- ipairs() et pairs() sont des fonctions magiques pour les boucles for. Tu devrais y jeter un oeil.
- if not(toto==nil) then =====> if toto then
Tips :
- J'ai changé la structure de donnée des UndoRedo par une beaucoup plus légère (Excale m'a émit un doute et j'ai tout de suite compris). Avant, si on tapait un texte de 500 caractères, la table d'Undo comportait inutilement 500 caractères. Maintenant elle est majorée par une variable qu'on pourra modifier plus tard : maxUndo. C'est une structure circulaire (ou liste chaînée cyclique). Cela permet de toujours ajouter les données en tête, mais d'avoir une queue mobile, ce qui fait que lorsqu'on atteint la majoration (donc que la tête se retrouve derrière la queue), on avance la queue (on pert donc la dernière donnée) et on stock la nouvelle tête à la place de l'ancienne donnée. Quelques manipulations en plus (comme un merge des données appartenant à l'ancienne tête) pour le cas spécifique des Undo/Redo.
- Je vais changer la coloration syntaxique par des regex. De ce que j'ai compris, et je reste assez étonné de ton idée originale, tu reparses tout le buffer (ou partie, j'ai pas lu l'algo du on.paint en détail) et tu colories chaque fois que tu trouves une occurrence. Sauf que tu recolories. Et oui, du noir, puis du bleu, puis du gris si on est en commentaire et qu'il s'agit d'un token.
Peut être plus quand ça me reviendra :O
Responsable design/graphique de TI-PlanetI do not get mad at people, I just want them to learn the way I learnt.