«Du coup il avait été renommé». Par qui, pourquoi, évidemment ça ne se discute même pas.
Ça me casse les pieds de me faire donner la leçon à chaque fois que je mets le nez dans le code. «ah oui mais non».
=> D'abord, j'ai passé mon après-midi à débugguer du code pourri de chez pourri. C'était tout de même spectaculaire: aucune fonction de traitement des images ne pouvait fonctionner, puisque image_valeur_trans fournissait une mauvaise fonction pour... ouvrir les fichiers graphiques; la moitié des fonctions de traitement des couleurs était également dans les choux (celles qui font la conversion hexadécima-décimal). C'était un énorme commit rigoureusement pas testé que j'ai débuggué. L'intégralité du commit porte sur les filtres graphiques, et aucun filtre graphique ne pouvait fonctionner. Même pas image_reduire. J'ai rien contre les bugs; mais quand un énorme paquet n'a pas _du tout_ été testé, je ne suis pas d'accord. Et quand je passe mon après-midi à débugguer ça, je me fais pas rembarrer à la première ligne: «ah oui mais non je vais te faire la leçon».
=> Je constate qu'on introduit une rupture de compatibilité uniquement dans le but de rendre le code plus joli. En échange de cette perte de compatibilité, donc, l'utilisateur ne gagne aucune fonctionnalité nouvelle ni aucune amélioration des performances. Je suis d'accord pour les ruptures de compatibilité, exceptionnelles, si en face on me donne un véritable bénéfice. Là, c'est juste pour la beauté du code.
=> Me faire la leçon sur le thème «on obtient au total nommage clair des filtres», merci, mais:
- c'est moi qui ai introduit la fonction «image_typo» le 19 mai 2005, et elle s'appelait déjà «image_typo» [4350],
- c'est moi qui ai introduit la série complète de manipulation d'images le 2 novembre 2005 [4954], et elles s'appelaient déjà toutes «image_kekchose» (sauf «reduire_image» qui est très antérieure);
- c'est moi qui ai introduit la série de fonctions de manipulation des couleurs le même jour [4958], et elles s'appelaient déjà toutes «couleur_trucmuche».
Avant que n'arrivent les fonctions sql_xxx, il n'y a jamais eu aucun autre exemple de tentative de créer un nommage cohérent pour une série de fonctions dans SPIP. Et à ma connaissance il n'y en pas d'autres. Même les fonctions de pipeline ne sont pas nommées comme telles.
Alors, oui, merci, je sais pourquoi ces fonctions s'appellent comme ça, c'est moi qui les ai nommées il y a quasiment cinq ans, et elles avaient déjà un nommage «clair». Et je les avais toutes documentées à l'époque, ce qui n'est pas forcément le cas de ce qui se code dans SPIP depuis. M'opposer un beau «nommage clair des filtres» parce qu'on renomme couleur_extraire en autre chose, faut tout de même avoir un sacré toupet.
=> Pour le plaisir de la règle qui dit que «couleur_xxx prend une couleur en entrée et donne une couleur en sortie, et image_xxx prend une image et donne une image», nous voilà avec une fonction «extraire_image_couleur» qui, elle, n'entre plus dans aucune catégorie de nommage. C'est vrai que c'est plus clair comme ça. On peut même l'appeler «extraire_une_couleur_de_l_image» si on veut, d'ailleurs, parce que là on est totalement libre.
J'ajoute que les fonctions qui font trois mots, c'est juste impossible à mémoriser; image_passe_partout, je vais dans la doc à chaque fois. Là, non seulement j'oublierai le nom de la fonction, mais en plus je me demanderai à chaque fois si c'est extraire_image_couleur ou extraire_couleur_image (pourquoi l'un plutôt que l'autre, d'ailleurs?). Mais «couleur_extraire», ça perturbait la beauté intrinsèque du code source de SPIP.
=> Le point important: la structure du code devient carrément top-délire. La perte de temps pour entrer dans ce code, c'est assez dingue.
=> Alors tant qu'à faire, puisqu'on cause des fonctions graphiques, je fais un apparté. Ça n'est pas la première fois que le code de ces fonctions devient compliqué. Il y a depuis un bon bout de temps un système de fichiers «.src» qui chapeaute le système. C'est censé apporter des gains de performances. En théorie, ça me semble très bien. Mais:
- la conséquence première est que je me suis fait éjecter du code que j'ai créé (les fonctions graphiques en particulier); je n'arrive pas à piger le fonctionnement de ce truc, et quand il y a des bugs, je suis totalement incapable de savoir le corriger et je dois attendre la bonne volonté de la seule personne qui sait comment corriger;
- ça ne serait pas gênant si, pour le coup, on avait un vrai gain de performance;
- mais dans la pratique, c'est systématiquement buggué; comme je ne pige pas le système, je ne sais pas si ça vient d'une particularité de GD2 ou de la surcouche des fonctions graphiques; toujours est-il que, dès qu'on enfile les fonctions graphiques, ça déconne totalement: calculs non effectués mais résultat intermédiaire affiché à l'écran, images calculées qui disparaissent purement et simplement lors des recalculs...
- et la seule solution que je connaisse, c'est d'insérer des image_graver toutes les deux, voire une, fonctions graphiques.
Ce qui fait qu'en pratique:
- c'est une des dernières grandes parties cohérentes du code que j'ai créées dans SPIP et on me l'a fermée au nez avec un système que je ne comprends pas;
- en pratique il n'y a pas de gain de performance, puisque la situation théorique (les fonctions graphiques se suivent sans interruption) n'est pas praticable sur les serveurs;
- en pratique je suis obligé de truffer mon code d'insertion d'ordres purement techniques qui n'ont d'autre objet que de faire re-fonctionner le bazar (à certains endroits, où je traite de grosses images, j'ai quasiment besoin d'insérer un image_graver toutes les deux lignes). Je perds en lisibilité et en temps.
Pour la route, je vous donne un bout du code d'un des tout derniers sites que j'ai fait:
[src="(#LOGO_RUBRIQUE_SURVOL||sinon{#LOGO_RUBRIQUE_NORMAL}|image_masque{masques/305x85.png}|image_graver|image_renforcement{0.1}|image_graver|image_aplatir{jpg}|extraire_attribut{src})" ]
J'ai donc trois filtres graphiques et deux image_graver. Et là c'est pour faire un truc absolument rudimentaire.
Je ne sais pas exactement ce que la théorie de l'informatique permet de conclure de ce genre de situation. Mais là, clairement, je ne vois pas ce que l'imposition d'une méthode scientifiquement imparable et théoriquement épatante nous a apporté.
=> Après cet aparté, je reviens au code d'aujourd'hui. Encore une fois, le découpage en une foultitude de fichiers a l'air séduisant intellectuellement, et je pense que même moi je pourrais vous expliquer le pourquoi d'une telle découpe. Sauf que dans la pratique, ça donne le débuggage de la fonction couleur_extraire (pardon: extraire_couleur_image, non: extraire_image_couleur):
- la fonction extraire_image_couleur est installée, presque seule, dans:
/extensions/filtres_images/images_fonctions.php
elle ne fait rien, elle appelle _image_couleur_extraire (notez l'inversion des termes qui doit certainement répondre à une logique géniale), qui se trouve dans:
/extensions/filtres/images_lib.php
qui utilise _image_valeurs_trans, que l'on va trouver là:
/ecrire/inc/filtres_images_lib_mini.php
La fonction d'extraction de couleur fait aussi, par exemple, un appel à la fonction _couleur_dec_to_hex, qui se trouve dans
/ecrire/inc/filtres_images_lib_mini.php
Ouf. Parce que si on utilisait la fonction inverse, _couleur_hex_to_dec, on chargerait la fonction couleur_html_to_hex, qui se trouve dans:
/ecrire/inc/filtres_images_mini.php
(Accessoirement, _couleur_dec_to_hex que j'utilise régulièrement dans mes plugins adopte un underscore initial, mais je dois me souvenir que la fonction couleur_html_to_hex que je n'utilise rigoureusement jamais, elle, n'en prend pas.)
- autre exemple, les couleurs sont logiquement traitées dans:
/extensions/filtres_images/filtres/couleurs.php
Où l'on trouve la fonction couleur_extreme. Cette fonction appelle _couleur_hex_to_dec, qui fait donc nous l'avons vu un passage par
/ecrire/inc/filtres_images_mini.php
Après la conversion de couleurs codées en hexadécimales en couleurs codées en décimal, le filtre convertit le codage RVB de la couleur en HSL avec la fonction _couleur_rgb2hsl; fonction qui se trouve dans un nouveau fichier:
/extensions/filtres_images/inc/filtres_images.php
Tout est à l'avenant. La fonction couleur_foncer_si_claire, dans la version que j'ai sous le nez, fait elle un appel à:
/ecrire/inc/filtres_images_mini.php
parce que c'est là que se trouve la fonction couleur_foncer. Mais auparavant, passage par _couleur_hex_to_dec, qui est ailleurs et qui fait elle-même un détour par un troisième fichier.
Je n'insiste pas trop sur le fait que les fichiers s'appellent:
- images_lib.php
- filtres_images.php
- filtres_images_mini.php
- filtres_images_lib_mini.php
parce que vous risqueriez de trouver cela confusionnant.
Alors je veux bien qu'on rationalise. La séparation entre filtres et filtres_images, oui. La séparation entre filtres_images et filtres_images_mini, pourquoi pas. Mais là, c'est juste pas possible: il y a maintenant 9 fichiers pour faire la même chose que 2 précédemment. Et, avec les petits exemples ci-dessus, on se rend compte que c'est parfaitement artificiel. On passe par la moitié de ces neuf fichiers rien que pour afficher du texte blanc sur une couleur foncée. Si cette couleur foncée est extraite d'une image, on est alors passé par l'autre moitié. Quand au débuggage, c'est juste un chemin de croix.
Ce qui nous vaut cet argument: «un nommage clair des filtres dont on peut comprendre ce qu'ils font rien que par leur nom, et dont l'api et la façon de les écrire pourra être documentée». C'est vrai qu'avant on ne savait pas ce que faisaient les fonctions et l'API ne pouvait pas être documentée. Maintenant encore moins, mais au moins je sais pourquoi.
Arnaud