Convertir ses signets Firefox en page MediaWiki

De La Mouche VII

Quand j'ai voulu mettre mes liens en ligne, je me suis d'abord tourné du côté des gestionnaires de liens en ligne décrits sur Framasoft.net. Il y a des choses bien (notamment Bookmark4U), mais les essais que j'ai faits ne se sont pas avérés très convaincants (et puis je n'ai pas aimé le logo d'IE sur Bookmark4U met par défaut sur la page d'accueil). Je me suis aussi dit que ça faisait une chose de plus à installer, alors que j'avais déjà un bon MediaWiki.

Malheureusement je n'ai pas trouvé d'outil capable de convertir mes signets Firefox en code wiki. J'ai donc un peu bidouillé, et j'ai opté pour la "solution" décrite ici (il y a sans doute mieux et moins pénible...). Je n'ai pas eu le courage d'écrire un programme automatisant entièrement la manipulation, ça me paraissait faisable mais un peu compliqué. Ca viendra peut-être.

Voici donc les manipulations que j'ai effectuées.

Exporter les signets de Firefox

C'est le plus facile. Il suffit d'ouvrir le menu Marque-pages, puis de cliquer sur Gérer les marque-pages. Dans la fenêtre qui s'affiche, ouvrez le menu Fichier, cliquez sur Exporter, et enregistrez le fichier HTML où bon vous semble.

Je suppose que le format est le même pour d'autres navigateurs (Mozilla par exemple), peut-être même IE (mais qui utilise encore ce navigateur désuet et bourré de failles car propriétaire ?).

Clarifier le fichier HTML

Cette étape est facultative, HTML::WikiConverter (voir plus loin) est capable de traiter le fichier tel qu'il est, mais ça va nous permettre de mieux nous y retrouver pour l'étape suivante. On va donc supprimer du fichier HTML obtenu des choses inutiles (tous les paramètres de la balise <A> mis à part HREF), grâce au merveilleux outil sed :

sed '{s/\(ADD_DATE\)\|\(LAST_MODIFIED\)\|\(ID\)\|\(ICON\)\|\(LAST_CHARSET\)//g ; s/ =".*"//g ;}' bookmarks.html > liens.html

(où bookmarks.html est le fichier exporté par Firefox). Nous obtenons donc un fichier liens.html qui a exatement le même contenu, mais en plus clair !

Pour les feignasses, ceux qui trouvent ça plus esthétique et ceux qui préfèrent télécharger un fichier plutôt que de faire un copier-coller, j'ai fais un petit script shell.

chmod u+x clarificateur_liens_firefox.sh
./clarificateur_liens_firefox.sh bookmarks.html > liens.html

Réorganiser le fichier HTML

Voilà l'étape la plus pénible, qui va consister à réorganiser à la main le fichier. Le problème est que, comme vous pouvez le voir en ouvrant le fichier depuis votre navigateur, les catégories sont affichées avant les liens : si j'ai une catégorie contenant des liens et une sous-catégorie, la sous-catégorie (et les liens qu'elle contient) sera affichée avant les liens de la catégorie parente. Ce n'est peut-être pas très clair, mais si vous regardez le fichier depuis un navigateur vous devriez comprendre.

En quoi est-ce un problème ? Eh bien sautez cette étape et vous verrez bien ! Plus sérieusement, le fait est que nous ne pouvons pas, dans MediaWiki, indenter un niveau de titre et ce qui le suit, comme c'est fait dans notre fichier HTML. En l'état il sera donc impossible de distinguer les liens d'une catégorie des liens de sa dernière sous-catégorie.

Il s'agit donc d'éditer le fichier liens.html et de couper-coller les liens des catégories pour les mettre juste sous le titre de ladite catégorie, et ce à tous les niveaux de profondeur. Oui c'est fastidieux. Oui c'est automatisable. Oui j'ai la flemme de le coder.

Heureusement, les indentations sont là pour nous aider ! Et puis profitez-en pour supprimer le haut du fichier (les huit premières lignes, jusque sous <H1 LAST_MODIFIED="1138713337">Bookmarks</H1>) et les catégories inutiles, ce sera fait.

Convertir le HTML en code wiki

Vous avez fini ? Bien !

On va maintenant utiliser l'outil HTML::WikiConverter pour convertir le code HTML du fichier liens.html modifié en code wiki. Sélectionnez MediaWiki en face de Wiki dialect (en fait c'est le choix par défaut). Copiez-collez le contenu du fichier dans le cadre prévu à cet effet (HTML source), et validez (bouton Convert HTML to wiki markup).

Récupérez le contenu du champ MediaWiki markup et copiez-collez dans un fichier liens.mw par exemple.

Traitement du code wiki

Bizarrement, HTML::WikiConverter met des points-virgules partout au début des lignes. Les niveaux de titres sont également tous les mêmes (seul le nombre de points-virgules au début de la ligne permet de les différencier). On va donc à nouveau utiliser sed pour régler ça. Par la même occasion on va aérer un peu en mettant des interlignes entre les titres. On va aussi convertir les codes HTML correspondant aux caractères accentués par de vrais caractères.

sed '{s/&Euml;/Ë/g ; s/&Agrave;/À/g ; s/&Aacute;/Á/g ; s/&Acirc;/Â/g ; s/&Atilde;/Ã/g ;\
 s/&Auml;/Ä/g ; s/&Aring;/Å/g ; s/&AElig;/Æ/g ; s/&Ccedil;/Ç/g ; s/&Egrave;/È/g ;\
 s/&Ecirc;/Ê/g ; s/&Euml;/Ë/g ; s/&Igrave;/Ì/g ; s/&Iacute;/Í/g ; s/&Icirc;/Î/g ;\
 s/&Iuml;/Ï/g ; s/&ETH;/Ð/g ; s/&Ntilde;/Ñ/g ; s/&Ograve;/Ò/g ; s/&Oacute;/Ó/g ;\
 s/&Ocirc;/Ô/g ; s/&Otilde;/Õ/g ; s/&Ouml;/Ö/g ; s/&Oslash;/Ø/g ; s/&Ugrave;/Ù/g ;\
 s/&Uacute;/Ú/g ; s/&Ucirc;/Û/g ; s/&Uuml;/Ü/g ; s/&Yacute;/Ý/g ; s/&THORN;/Þ/g ;\
 s/&szlig;/ß/g ; s/&agrave;/à/g ; s/&aacute;/á/g ; s/&acirc;/â/g ; s/&atilde;/ã/g ;\
 s/&auml;/ä/g ; s/&aring;/å/g ; s/&aelig;/æ/g ; s/&euml;/ë/g ; s/&igrave;/ì/g ;\
 s/&iacute;/í/g ; s/&icirc;/î/g ; s/&iuml;/ï/g ; s/&eth;/ð/g ; s/&ntilde;/ñ/g ;\
 s/&ograve;/ò/g ; s/&oacute;/ó/g ; s/&otilde;/õ/g ; s/&ouml;/ö/g ; s/&oslash;/ø/g ;\
 s/&ugrave;/ù/g ; s/&uacute;/ú/g ; s/&ucirc;/û/g ; s/&uuml;/ü/g ; s/&yacute;/ý/g ;\
 s/&thorn;/þ/g ; s/&yuml;/ÿ/g ; s/&Egrave;/È/g ; s/&agrave;/à/g ; s/&Agrave;/À/g ;\
 s/&ugrave;/ù/g ; s/&Ugrave;/Ù/g ; s/&ograve;/ò/g ; s/&Ograve;/Ò/g ; s/&igrave;/ì/g ;\
 s/&Igrave;/Ì/g ; s/&atilde;/ã/g ; s/&Atilde;/Ã/g ; s/&laquo;/«/g ; s/&raquo;/»/g ;\
 s/&reg;/®/g ; s/&lt;/</g ; s/&gt;/>/g ; s/&ccedil;/ç/g ; s/&egrave;/è/g ;\
 s/&ocirc;/ô/g ; s/&ecirc;/ê/g ; s/&copy;/©/g ; s/&Eacute;/É/g ; s/&amp;/&/g ;\
 s/&eacute;/é/g ; s/^; === \(.\+\) ===/\n\n\n\n\n\n== \1 ==/ ; s/^;; ===/\n\n\n\n===/ ;\
 s/^;;; === \(.\+\) ===/\n\n==== \1 ====/ ; s/^;;;; === \(.\+\) ===/===== \1 =====/ ;\
 s/^;* /\n/ ;}' liens.mw > liens2.mw

Ouf ! Pour le coup, un script n'est pas forcément superflu.

chmod u+x traite_code_wiki.sh
./traite_code_wiki.sh liens.mw > liens2.mw

Voilà, il n'y a plus qu'à copier-coller le contenu du fichier liens2.mw sur une page de notre wiki, et c'est gagné. Il reste peut-être quelques corrections mineures à effectuer (par exemple quand le titre d'un lien comporte des crochets) mais ce sera vite fait.

Annexe : Explication de la commande ci-dessus (pour ceux que ça intéresse)

Les 16 premières lignes convertissent les codes HTML correspondant aux caractères accentués les plus courrants (et certains caractères spéciaux) en ces caractères. Par exemple l'expression :

s/&egrave;/è/g

convertit le code &egrave; en un E accent grave tout ce qu'il y a de plus honnête.

Les trois dernières lignes forment des niveaux de titres en fonction du nombre de points-virgules au début de la ligne, en ajoutant des sauts de ligne :

  • s/^; === \(.\+\) ===/\n\n\n\n\n\n== \1 ==/ : remplace un point-virgule au début de la ligne, suivi d'une espace, puis d'une expression quelconque entourée de trois égales, par six interlignes puis l'expression trouvée entourée seulement de deux espaces.
  • s/^;; ===/\n\n\n\n===/ : remplace deux points-virgules suivis d'une espace et de trois égales, par quatre interlignes et trois égales (cela suffit car nous voulons que l'expression soit entourée de trois égales).
  • s/^;;; === \(.\+\) ===/\n\n==== \1 ====/ : même principe que pour le premier niveau de titres, mais avec deux interlignes et quatre égales.
  • s/^;;;; === \(.\+\) ===/===== \1 =====/ : même principe que pour le premier niveau de titres, mais sans interligne et avec cinq égales.
  • s/^;* /\n/ : remplace un nombre quelconque de points-virgules au début d'une ligne en un interligne.

Note : On peut facilement ajouter d'autres niveaux de titres, pour les cas où nos signets ont plus de quatre niveaux de profondeur.