Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

Transformer un document XML, le cas de mes liens Wikipédia

Première rédaction de cet article le 26 février 2010
Dernière mise à jour le 4 mars 2010


Comme le savent mes fidèles lecteurs, ce blog comporte pas mal de liens vers Wikipédia (plusieurs milliers différents) pour expliquer un sigle, une technique ou un concept. J'essaie de les vérifier mais, évidemment, certaines tâches sont mieux faites par un logiciel qu'à la main. C'est le cas de la désambiguation de sigles (mettre un lien Wikipédia vers Domain Name System plutôt que vers DNS qui est ambigu). Ce blog étant réalisé en XML, est-il facile d'utiliser les techniques XML pour remplacer toutes les occurrences de <wikipedia name="DNS"> par <wikipedia name="Domain Name System"> ? Non, et c'est pour cela que j'ai dû récemment adopter une nouvelle méthode.

L'ancienne méthode reposait sur un principe simple : la force de XML est la disponibilité d'un très grand nombre d'outils facilitant les tâches du programmeur (par exemple XSLT). Il semblait donc simple d'écrire un programme XSLT qui assurait ce remplacement des acronymes par des extensions, s'assurant ainsi que le lien vers « FAI » allait bien aboutir sur la page « Fournisseur d'accès à Internet » et pas sur la « Fédération anarchiste ibérique » ou bien sur la page d'homonymie.

Mais ce programme très simple n'est pas, je trouve, adapté à mes méthodes d'écriture. En effet, s'il respecte l'infoset (le document XML abstrait, avec sa structure et son contenu), il ne respecte pas du tout la syntaxe. Par exemple, il remplace les entités XML alors que je voudrais les garder pour faciliter l'édition (regardez le source XML de cet article, par exemple, avec l'entité &rfced;). C'est une limite fondamentale de tous les outils XML.

Il peut donc être préférable (oui, je sais, c'est un affreux bricolage) de travailler au niveau du texte, par exemple avec des expressions rationnelles. Ce n'est en général pas conseillé du tout (XML a une syntaxe contextuelle et ne peut en général pas s'analyser uniquement avec des expressions rationnelles, une petite recherche sur Stack Overflow montre en effet plein d'articles sur la question). Mais, ici, c'est la seule solution que j'ai trouvé (c'est aussi parce que je voulais travailler sur le fichier avec les acronymes expansés, autrement j'aurais pu juste rajouter une étape au traitement qui va du source XML à la page HTML).

Donc, comment est-ce que je fais ? (Le programme responsable est scripts/canon-wp.py si vous récupérez l'archive complète des programmes de ce blog.) Le programme est en Python et utilise le module d'expressions rationnelles. Il lit un fichier texte (schemas/wikipedia-repl.txt dans l'archive du blog), cherche un lien <wikipedia> et remplace éventuellement le nom de l'article de Wikipédia. Un exemple d'une partie de la table est :

...
CMS Système de gestion de contenu
CPU Processeur
CSS Feuilles de style en cascade
CVS Concurrent versions system
...

L'expression rationnelle utilisée (et qui est loin d'être parfaite, voir les commentaires dans le programme) est :


(.*?)<wikipedia *((( |^ *)name *= *\"([^\"]+)\" *>([^<]+))|(*>([^<]+)))</wikipedia>

Une alternative possible, suggérée par Emmanuel Saint-James, est de travailler avec SAX, qui respecte les entités. Je testerai ça un jour, avec la bibliothèque Sax de Python.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)