Ecrire un billet de blog avec Vim et reStructuredText

WordPress offre un éditeur avec deux modes, visuel et html. Je ne me sers jamais du visuel, il a tendance à « casser » ma mise en page, et surtout les blocs de codes. Je utilise donc uniquement l’éditeur html prévu, fournis avec quelques aides clickables pour mettre en place les balises plus facilement, et sans se prendre trop la tête.

Vous pouvez dès à présent Télécharger la version PDF du ce billet ou voir le code source directement

reStructuredText

Mais rien de tel que d’utiliser son éditeur de texte favori, mais comme il serait fastidieux d’écrire toute les balises « à la main », il est préférable d’utiliser une aide prévu pour. Il génèrera d’une part les balises voulu, et d’autre part, rend le texte bien plus lisible. Et c’est là un des avantages de son utilisation. Relire les billets avec le balisage n’est pas des plus agréable, surtout avec des liens hypertext insérés dans les paragraphe. Alors bien sûr on peut prévisualiser, puis recorriger sur l’original, mais il faut retrouver la ligne pour corriger, on perd dans la continuité de la relecture et du temps.

reStructuredText, écrit en python, est une bonne solution, sûrement pas la seule et on pourrait citer txt2tags ou Sphinx qui sont des alternatives, et le choix entre les deux n’est pas des plus évidente lorsqu’on ne les connais pas vraiment (ce qui est mon cas). L’une des chose qui m’a séduit avec ce choix, c’est pouvoir séparer complètement les liens hypertext de l’ensemble du texte, gardant ainsi une bonne lisibilité si un paragraphe en contiens plusieurs. Je ne suis pas certain que ce soit possible avec txt2tags, ou j’ai peut être raté cela. Quoi qu’il en soit, reStructuredText permet de rajouter les liens, par exemple après un paragraphe, ou tout à la fin.

La syntaxe utilisé par celui-ci est plutôt clair, dans l’idée de What you see is what you get on obtient ainsi un résultat clair. De plus est que Vim possède une coloration syntaxique spécifique pour reStructuredTet, et ce n’est sûrement pas le seul éditeur de texte à en avoir.

Le paquet requis sur Debian et Ubuntu est python-docutils, que je n’ai pas essayé cependant. L’installation pour Arch Linux est simple, le paquet pour reStructuredTet est dans les dépôts [extra] et il suffit de l’installer avec la commande suivante

pacman -S docutils

Le paquet vient avec une série d’utilitaires permettant de convertir un document « reST » en divers formats tel que html, xml, pdf, LaTeX… Et c’est exactement ce qu’on souhaite, puisqu’on veut convertir notre billet de blog, écrit avec Vim bien sûr, en document html, afin d’être insérer dans le WordPress une fois obtenu.

Utilisation

L’objectif n’est pas d’obtenir un document très complet, comme pourraît l’être un livre ou une thèse, ni de faire ici un tutoriel complet, mais de fournir suffisamment d’explication afin d’avoir un rendu exploitable pour un billet de blog courant, ou tout autre usage basique.

Fichier de configuration

Plusieurs moyens d’obtenir le résultat voulu, de gérer les options fournis par rst2html. Le fichier de configuration se trouve dans ~/.docutils, mais on pourrait également gérer cela avec un Makefile.

Le fichier de configuration est gérer par le module python ConfigParser, qui suit une syntaxe particulière, mais simple :

[section]
argument1: valeur
argument2: autre_valeur

J’ai pour le moment un fichier de configuration assez simplifié, qui est le suivant (on peut utiliser # ou ; pour y insérer des commentaires)

[general]
initial_header_level: 2
embed-stylesheet: off
doc-title: off

# Retourne la config en console, utile pour tester.
# dump_settings: on

Petite explication des arguments utilisées :

  • initial_header_level : L’idée est d’avoir des balises <h2> au lieu de <h1>, par défaut reStructuredText utilise <h1> pour les titres de paragraphe, on peut se retrouver avec plusieurs <h1>, hors j’ai déjà un <h1> dans l’header du blog, je n’en veux pas d’autre, et donc je souhaite avoir des balises commençant par <h2>, et c’est exactement à quoi cette option répond.
  • embed-stylesheet : Par défaut, le document html généré vient avec un long bloc de feuille de style css, hors j’ai déjà ce qu’il me faut sur mon blog, et je n’ai pas envi de m’en encombrer avec.
  • doc-title : Facultatif par rapport aux autres, je n’ai pas besoin de titre dans le document.

Pour les autres options, et plus de détails sur le fichier de configuration, deux possibilités, consulté l’aide avec rst2html --help, ou bien consulter la documentation spécifique à la configuration.

Premiers essais

Pour vérifier que tout fonctionne comme prévu, et avoir un premier aperçu rapide, nous allons générer une page fort simple, presque un hello world. On édite un fichier avec comme extension .rst avec l’exemple suivant:

vim fichier.rst

==================
Mon billet de blog
==================

Coin
----

Pan !

Autres exemples
---------------

* **C'est** ``tout simple`` *à utiliser*.
* une liste à puce

Pour obtenir le résultat en html, on tape la commande suivante :

rst2html fichier.rst fichier.html

On peut observer le résultat soit avec un éditeur de texte pour voir le balisage obtenu, ou directement avec un navigateur internet puisque c’est un document html, en entrant le chemin quiVaBien™ file:///home/user/path/to/fichier.html. Il peut être pratique de visualiser ainsi avec le navigateur au fur et à mesure de l’avancement du texte, au début pour s’assurer qu’on ne fait pas d’erreur syntaxique, et par la suite pour garder un œil sur la structure global du document ainsi obtenu.

Un billet de blog complet

Comme on ne va pas s’arrêter en si bon chemin, et qu’on souhaite avoir un billet complet, quelques explications supplémentaire s’impose. Pour les plus pressés d’entre vous, plusieurs documents ressources permettant d’avoir un aperçu des syntaxes utilisés.

Les titres

Le principe est de souligner, les titres avec différents caractères selon leur niveau, on peut également souligner et surligner en même temps pour mettre en valeur le titre principal d’un document. Le soulignage doit être au moins aussi long que le titre lui même. Le choix des symboles pour cela est assez libre, choisis entre principalement "= - ` : ' " ~ ^ _ * + # < >", Comme je pense que trois niveaux de titre est largement suffisant (ce qui est utilisé dans ce billet par exemple), l’utilisation par exemple pour les titres pourrait être :

Titre lvl1
==========

Titre lvl2
----------

Titre lvl3
..........

Ce qui donnerais une sorti équivalente à :

<h2>Titre lvl1</h2>

<h3>Titre lvl2</h3>

<h4>Titre lvl3</h4>

On remarque que le niveau 1 correpond à une balise de type <h2>, mais c’est parce que j’ai explicitement demandé dans le fichier de configuration cela, sinon le lvl1 correpondrait bien à une balise <h1>. Il est possible d’obtenir une hiérarchisation numéroté automatiquement, également grâce au fichier de configuration.

Les liens hypertextes

Il y a plusieurs façon de créer un lien externe, et c’est ce que j’aime bien de ne pas être cloîtré sur une seul solution, deux principales possibilités que j’ai retenu, l’une tout en ligne, l’autre séparé de son context

  • Lien en une ligne, consiste à écrire d’une traite le lien et l’ancre en même temps. La syntaxe est simple :
un text avec `Mon lien <http://exemple.tld>`_ qui va bien
  • L’autre possibilité, qui peut parraître redondent et déroutant au premier abord, mais c’est pourtant une façon intéressante de séparer complètement les liens du contenu, gagnant ainsi une meilleur lisibilité. Les liens peuvent être regroupé en fin de texte ou même après un paragraphe par exemple.
je fais un lien sur `ce document important`_ parce qu'il me plaît.

.. _`ce document important`: http://exemple.tld

Les marquages de texte

On peut obtenir du texte en italique, gras ou autre simplement, un exemple rapide ici, pour avoir une liste plus complète, s’en référer à la documentation cité plus haut.

**C'est** `*`tout simple`*` *à utiliser*. aura pour rendu : C’est tout simple à utiliser.

Les bloques de code

Cette fonctionnalité est importante pour moi, écrivant régulièrement des billets comportant du code, avec de la coloration syntaxique, le tout basé sur le plugin wp-syntax. Cependant, cela implique quelques impératif qui demande un peu plus d’attention :

  • Le balisage utilisé est de la forme <pre lang="xxx">. De plus un simple <pre> n’est pas reconnu par le plugin, n’ajoutant pas les div de wp-syntax du coup, utile pour la css et uniformiser le style ;
  • Les caractères échappé ne sont pas retranscrit à l’intérieur de ces balises, et là, tout le monde verra de quoi je parle, on s’est tous retrouvé avec des ‘&lt;‘ ou ‘&gt;‘ au beau milieu d’un code, alors qu’on souhaitait avoir ‘<‘ ou ‘>‘. Donnant ainsi de belle erreurs à la compilation pour personnes qui en auront fait un copier coller ;
  • L’indentation doit être respecter pour le code, il serait risible d’avoir un blog publiant un code non-indenté.

Je n’ai pas trouvé LA solution parfaite, qui d’une commande, d’une config’ ou d’une macro répondrait parfaitement à ma demande. Il y a cependant bien des moyens pour parvenir à ses fins, bien que les besoins peuvent varier d’une personne à l’autre, et même d’un billet à l’autre. Je note ici les quelques solutions qui me semble aller vers le sens qu’on souhaite, sois directement grâce aux moyens fournis par reStructuredTet, soit à base de quelques sed pouvant être facilement rajouté à la commande ou à insérer dans un Makefile

L’insertion d’un bloc est facilement fait avec ::, pouvant s’employer de deux façon, il donnera des balises <pre>, le seul soucis c’est qu’ils associent une classe avec la balise, et ne contient pas le lang="xxx=" que l’on souhaite, mais on s’en arrangera avec un sed après.

::

  mon code () {
    qui sera correctement indenté;
  }

L’autre possibilité est un raccourci lorsqu’on fini son paragraphe par ‘:’ et on se retrouve souvent quand on parle du code , comme le présent exemple

mon texte normal qui fini bien par deux point ::

  mon code () {
    qui sera aussi correct;
  }

Il faut noter que la ligne vide après les ‘::’ n’est pas facultative, la sortie ne serait plus la même sinon. La sortie est de la forme <pre class="literal-block"> ... </pre> mais la commande suivant redonnera le schéma souhaité, en remplaçant text avec le langage souhaité :

sed -i "s/class=\"literal-block\"/lang=\"text\"/g" fichier.html

L’avantage de cette méthode, c’est rapide et simple, tout est respecté, sauf… les caractères d’échappement, comme &gt;, mais on peut également remettre ça en place avec un autre sed :

sed -i "s/&gt;/>/g" fichier.html && sed -i "s/&lt;/</g" fichier.html

Mais je ne suis pas forcément fan de cette solution, qui commence à être un peu lourde je trouve, si j’ai des caractères à échappé, c’est je pense plus simple d’utiliser ce qui suis. L’autre solution, plus « radicale » consiste à passer par la commande raw, tout ce qui suis la commande est retranscrit tel quel dans le fichier de sortie, l’avantage c’est de ne pas avoir de sed à rajouter après, mais par contre, il faut écrire les balises soi-même, encore une fois, ça dépend des usages qu’on en a. Pour mettre ça en place, voici un exemple :

.. raw:: html
    Mon code coloré et indenté ;
    et des < > & propre

Liste à puces et images

Les listes à puces sont on ne peut plus simple à réaliser, il suffit d’utiliser * en début de ligne, et les différent niveau de liste impliqué sont obtenu avec les différentes indentations des puces. Rapide exemple quand même

* puce
  * liste imbriqué
  * autre élément
* retour à la liste principale

Les images ne sont pas bien plus compliqué, alors je n’ai pas vraiment essayé car j’utilise peu d’image sur mon blog, et je me préoccupe plus à présenté correctement les blocs de code :þ

On peut insérer l’image simplement, ou avec des arguments en plus

.. image:: images/tux.png
.. image:: images/tux.png
   :height: 100
   :width: 200
   :scale: 50
   :alt: texte alternatif

Les pièges à éviter

Je n’ai pas trop mis l’accent dessus dans le billet, mais les indentations, ou les lignes vides ont leur importance, il est rapide au début de se faire avoir par une syntaxe pas tout à fait respecter

Pour l’indentation, et lorsqu’on colle tout un code par exemple, il se peut retrouve mal indenté d’un niveau, la petite astuce avec vim pour indenter un bloc entier d’un niveau, il suffit de le surligner en mode visuel, puis de taper > pour indenter d’un cran tout le bloc, et inversement avec <. Ça peut être pratique.

Conclusion

Il y aurait encore bien des choses à dire, ce billet n’a pas pour but d’être un tutoriels de l’utilisation de reStructuredTet, mais il devrait permettre de faire quelques essais, et en une heure de temps, vous pourriez à votre tour écrire un billet pour votre blog, avec Vim ! Je vous invite à consulter le Code source du billet, puisque je pense qu’un exemple concret est toujours intéressant à prendre, c’est le fichier .rst qui m’a servis à publier cet article.

Un petit bonus, puisque c’est Noël, et que reStructuredTet le permet, autant générer une version PDF du billet ! Deux solutions pour cela, passer par un document LaTeX avec rst2latex, ou passer par un autre utilitaire, rst2pdf soit en le récupérant sur le dépôt et en suivant les instructions. Pour les utilisateurs d’Arch Linux, le paquet est disponible sur AUR, et il suffit pour l’installer de passer par notre yaourt nationnal

yaourt -S rst2pdf

On peut maintenant générer d’une commande le PDF convoité, en remplaçant avant les raw:: html, simplement par des ‘::’

rst2pdf fichier.rst -o fichier.pdf

Et voilà le résultat, vous pouvez télécharger le PDF ainsi obtenu :)

Il n’y a pas tant de documentations sur le net et encore moins en français, s’il y a des erreurs ou des imprécision, je serais content d’en avoir les retours afin de les corriger. En espérant que ça puisse servir, et qui sait, donner envie d’essayer à certain. Pour ma part, c’est adopté, et de là que je me serve d’un dépôt de github pour archiver mes billets, il n’y a qu’un pas !

Vus : 1606
Publié par Nicolas Paris : 149