GTML à ma sauce

Qu'est-ce que GTML

Je ne vais pas m’attarder sur cette question, vu que cela est déjà très bien décrit sur la page de GTML. Pour dire les choses rapidement, c'est un programme qui lit des fichiers HTML dans lesquels on peut insérer certaines instructions particulières qui permettent de maintenir tout un site de façon uniforme sans avoir à modifier 25 fichiers à chaque mise-à-jour, et, en complément des feuilles de style, de modifier très rapidement l’aspect général du site.

Les modifications que j’y ai faites

GTML a plein de caractéristiques intéressantes : parmi elles, la possibilité de gérer une navigation à travers le site en définissant une hiérarchie dans les pages, et la possibilité de générer des plans du site personnalisés.

Dans les faits, ces deux fonctionnalités dans la version originale de gtml ne correspondaient pas tout à fait à mes souhaits :

  • Pour ce qui est de la navigation, les règles de hiérarchie étaient un peu trop vagues : dans une hiérarchie du type 1-2-1 (j’entends par là une page de niveau 1 dont dépend une page de niveau 2, suivie par une page de niveau 1) , la page de niveau 2 est donné comme page suivante de la première page de niveau 1, et la seconde page de niveau 1 est donnée comme page suivante pour la page de niveau 2.

    Ce système est celui appliqué de manière courante dans les documentations en-ligne (puisqu'il fait alors sens une fois qu'on a fini un chapitre de passer au suivant), cela ne convenait guère au cas de mon site où les différents "chapitres" n’ont en règle générale rien à voir ensemble !

    J’ai donc modifié le code de GTML (écrit en PERL) pour ajuster le comportement comme je le souhaitais (c'est à dire, dans notre exemple) que la seconde page de niveau 1 soit la suivante de la première, et que la page de niveau 2 n’ait pas de page suivante ou précédente.

    Avant de le proposer en patch à celui qui maintient GTML, il me faut d’abord rendre ce comportement optionnel…

  • En ce qui concerne la géération des plans de site, la version originale de GTML ne permet pas de les générer de façon valide. J’entends par là qu'il n’y est pas possible de décider où va se placer la liste de niveau inférieure par rapport à son parent : en effet, la macro définissant un niveau hiérarchique du plan est de la forme __TOC_ITEM__(x,y), qui se transforme par défaut en <li><a href="y">x</a>.

    Par défaut, donc, le tag <li> n’est pas fermé, ce qui est valide en HTML 4.01, mais pas en XHTML 1.0, étant donné qu'il ne s'agit même pas de XML bien formé. Si donc on ferme le tag <li> en redéfinissant la macro ainsi : <li><a href="y">x</a></li>, on se trouve confronté à un nouveau problème ; en effet, la liste de niveau inférieure est insérée par défaut à la suite de l’élément courant, si bien que l’on obtiendrait un code de la forme :

    <ul>
    <li><a href="example/index.html</a></li>
    <ul> […] </ul>
    </ul>

    Ceci n’est toujours pas valide : un élément <ul> ne peut contenir que des éléments <li> en en HTML 4.01.

    La solution que j’ai adoptée et qui permet d’obtenir une plus grande souplesse de définition pour la macro considérée consiste à ajouter un argument à la macro __TOC_ITEM__ pour indiquer l’emplacement de la liste de niveau inférieure. Ainsi, par défaut, la dite macro est définie en tant que define __TOC_ITEM__(x,y,z) <li><a href="y">x</a>z</li>.

    Là encore, je serais bien inspiré de proposer un patch à l’auteur, mais il faudra que je trouve un moyen de conserver la compatibilité avec l’ancienne version !

  • Dans la même veine que le plan du site qui s'avère très pratique, il m’a paru intéressant de développer une nouvelle fonction permettant d’obtenir le plan d’une branche du site : cela permet pour les pages d’index de ne pas avoir à rajouter un lien à chaque fois que l’on ajout un élément dans la hiérarchie sous cet index : j’utilise cette fonction par exemple dans ma liste de commentaires de livres et de films.

    Il m’a semblé aussi intéressant de permettre d’afficher un index d’une autre partie du site : quand on souhaite "sauter" un niveau de hiérarchie ou pour des raisons de présentation (ce cela que j’utilise pour la page d’accueil désormais). Pour employer cette fonction, il suffit d’invoquer #index dans la page souhaitée, suivant éventuellement du nom de fichier (ou de son alias) si c'est l’index d’une autre branche que l’on souhaite. Pour configurer la présentation, il suffit d’utiliser les éléments __TOC_x__ et __TOC_x_ITEM__ comme pour le plan du site (#toc), où x est le niveau de la hiérarchie considérée [peut-être devrais-je séparer complètement les deux opérations ?]

    Enfin, cerise sur le gâteau, si #index est utilisé dans une hiérarchie qui référence la page courante, celle si ce voit attribuer par défaut la class 'self' [il faut que je détaille comment changer ce comportement par défaut]

Vous pouvez télécharger ma version modifiée de GTML (grâce aux bienfaits de la GNU Public License !)