Un package pour manipuler du SVG avec PHP

Dimanche 18 avril

J’ai un peu utilisé meyfa/php-svg, un package PHP permettant de manipuler du code SVG.

Mon utilisation actuelle en est assez simple compte tenu des capacités potentielles de cet outil : partir d’une image existante, modifier les propriétés de quelques éléments (couleurs, épaisseurs de traits, etc.) puis afficher le SVG résultant dans une page HTML.

Ceci vient en remplacement d’un système qui, écrit en JavaScript (et utilisant la bibliothèque Raphaël), s’exécutait entièrement dans le navigateur. En recourant à PHP, j’élimine un certain nombre d’incertitudes et je peux mettre en place un système de cache (au lieu de regénérer sans cesse des choses identiques ou très proches les unes des autres).

Ce package peut également utiliser la bibliothèque GD pour générer une image matricielle à partir du code SVG ! Le résultat n’est pas toujours visuellement très beau, mais c’est de la faute de GD, qui reste un outil vraiment peu subtil (bien que, avec des efforts un et acharnement certains, on peut lui faire faire des choses parfois assez impressionnantes).

J’ai beaucoup consulté le code du package. C’est un travail qui me semble de grande qualité. C’est très bien structuré, organisé, documenté, et on sent que ça a représenté beaucoup de boulot. L’auteur a écrit un grand nombre de classes spécialisées pour modéliser les différents éléments SVG, et a même réimplémenté lui-même, en pur PHP, certaines fonctionnalités du DOM !

Les différentes méthodes sont souvent flexibles dans les paramètres acceptés. Par exemple, getElementsByClassName() prend, évidemment, une classe sous forme de chaîne de caractères mais accepte aussi un tableau de chaînes. Ou également une chaîne contenant plusieurs noms de classes séparés par des espaces. Par ailleurs, faire un echo d’à peu près n’importe quel objet convertit automatiquement celui-ci en une chaîne de code SVG le représentant. Le genre de « petites » choses qui rendent l’usage plus direct et plus intuitif.

Il existe même une méthode getComputedStyle(), disponible sur tout type de nœud, qui se charge si nécessaire de parcourir toute l’arborescence d’éléments ancêtres d’un nœud donné afin de déterminer le style réel qui s’applique à lui. Très utile quand certains attributs sont centralisés dans un élément ancêtre plutôt que d’être dupliqués sur chaque nœud enfant. C’est d’autant plus pertinent quand, pour des raisons d’efficacité, on travaille sur des images qui ont été « minifiées » (ou plutôt optimisées) via des outils tels que SVGO.

Bref, ça semble fort sympathique, et mes premiers usages de ce package ont été vraiment très concluants.