Stocker des pages de MediaWiki sur un disque dur

Je travaille beaucoup avec des pages de MediaWiki en ce moment. Un aspect de ce travail consiste à stocker des pages du wiki sur le disque dur.

De MediaWiki vers un disque dur

Si cela peut sembler simple au premier abord, il y a tout de même certaines choses à respecter.

Les pages peuvent contenir des caractères spéciaux. Par exemple sous Windows, le double point n’est pas autorisé. En Java, il ne semble pas qu’il existe une fonction qui sache convertir un nom de fichier en ne substituant que chaque caractère non valide [1].

Un autre aspect concerne les slashs. De nombreux wikis utilisent le slash comme marqueur de sous-page. (Voir l’aide de Subpages chez MediaWiki).

Enfin et c’est le pire: Windows n’est pas sensible à la différence minuscules-majuscules («case sensitive» en anglais). Les fichiers MaPage.mediawiki et Mapage.mediawiki sont les mêmes pour le système de fichiers de Windows. Pourtant pour MediaWiki il peut exister deux pages différentes portant ce nom. Autrement dit, sans faire attention on se retrouvera avec de belles collisions sur le disque dur.

Ma solution:
Après différents essais, il me semble que le plus simple est d’utiliser la méthode suivante:

1) Utiliser la fonction URLEncoder.encode(..) pour convertir tous les caractères spéciaux (par exemple « : » en « %3A ».) Cette fonction en fait un petit peu trop, car de nombreux caractères qui seraient acceptables dans un nom de fichier sont également convertis.

2) Éventuellement, limiter ce nom de fichier encodé à une certaine taille (pour le moment j’ai réduit le nombre de caractères à 100).

3) Ajouter l’ID de la page (pageid chez MediaWiki) comme suffixe. Ceci permet de faire deux fichiers différents pour MaPage et Mapage, car ces deux pages n’auront pas le même ID.

Résultat:
Cela nous donne quelque chose comme:

Alsace-1656128.mediawiki
Bas-Rhin-395.mediawiki
Catégorie%3AArticle_à_illustrer-1316575.mediawiki
Catégorie%3APortail%3AFrance%2FArticles_liés-3065287.mediawiki
Fichier%3ABas-Rhin_(67)_logo_2010.png-6408771.mediawiki
Fichier%3ALogo-hautrhin4.gif-633730.mediawiki
Haut-Rhin-1356.mediawiki
Modèle%3AAbréviation_discrète-4596223.mediawiki
Modèle%3AArticle_détaillé-497377.mediawiki

Ce n’était pas vraiment ce que je m’étais imaginé en me lançant dans cette tâche, mais c’est le moyen le plus «propre» pour obtenir quelque chose qui marche. Pas certains que les outils qui convertissent une instance MediaWiki en répertoire Git se soient donnés autant de mal.

[1] Voir: Sackoverflow – How can I safely encode a string in Java to use as a filename?

Laisser un commentaire