Je pense que depuis que les hommes peuvent taper du texte sur des ordinateurs, ils ont cherché la manière la plus simple pour mettre ce texte en page, lui appliquer du style et lui donner du sens. De manière générale, cela a conduit à deux grandes approches : celles qui reposent sur des éditeurs de texte qui affichent le résultat final en cours d’édition (les éditeurs WYSIWYG) et celles qui reposent sur les langages de balisage léger.
Je vais m’intéresser à ce deuxième groupe. Pas la peine que je vous fasse un cours. De nos jours, tout le monde a utilisé au moins une fois dans sa vie la syntaxe BBCode (sur n’importe quel forum PHPBB, par exemple) ou une syntaxe de style MediaWiki (sur Wikipedia ou un autre système de wiki).
Avec le temps, on a vu arriver un très grand nombre de langages de ce type. En plus des deux sus-nommés, j’ai en tête ReStructuredText (utilisé dans la documentation Python), AsciiDoc, Textile (utilisé dans les outils de 37signals, par exemple), Markdown (utilisé notoirement par GitHub et StackOverflow), POD (documentation Perl), ou encore Creole.
Je ne compte pas des formats comme Groff, Texinfo, LaTeX ou SGML comme des langages de balisages légers. Il suffit d’essayer de faire un fois un vrai document avec l’un de ces systèmes pour se rendre compte qu’il existe plus simple et moderne (mais moins performant − LaTeX est un vrai système de composition de page, particulièrement complet).
Je vais maintenant m’intéresser à deux de ces syntaxes : Markdown et Creole.
Markdown est rapidement devenu le langage de balisage léger le plus hype sur le web. Je n’ai pas vraiment compris pourquoi. Qu’on ne me dise pas que c’est grâce à ses qualités intrinsèques, chacun des langages existant possède des avantages et des inconvénients. Qu’on ne me dise pas que c’est grâce à sa documentation, qui n’est sincèrement pas terrible.
À côté de ça, la genèse de Creole est assez intéressante. Lors du symposium international des wikis en 2006 − et dans le cadre du Wiki Markup Standard Workshop − les créateurs des principales plate-formes de wiki se sont mis autour d’une table pour essayer d’accorder leurs violons au travers d’une syntaxe commune.
Personnellement, j’apprécie beaucoup la syntaxe de Creole. Elle emprunte un très grand nombre d’éléments communs à la plupart des autres langages équivalents. Et pour le reste, elle fait usage de double-symboles qui évitent toute ambiguïté.
Pour illustrer tout ça, je vais comparer les syntaxes de Markdown et de Creole.
Titres
Markdown utilise une syntaxe à base de dièse :
# Titre de premier niveau ## Titre de deuxième niveau
Creole utilise une syntaxe à base de égale :
= Titre de premier niveau == Titre de deuxième niveau
L’un comme l’autre peuvent être « équilibrés » :
## Sous-titre Markdown ## == Sous-titre Creole ==
Là où je pense que Markdown a fait la différence, c’est en proposant une syntaxe alternative qui correspond à ce qu’on a tous tendance à écrire naturellement quand on tape un fichier texte :
Titre de premier niveau ======================= Titre de second niveau ----------------------
Emphase
Pour mettre en gras et en italique (enfin, <strong> et <em> pour être exact), Markdown utilise indifféremment les étoiles et les underscores. Si on en utilise un seul de chaque côté du texte, ça donne de l’italique ; avec deux de chaque côté, ça fait du gras :
* italique * _ italique _ ** gras ** __ gras __
Avec Creole, on utilise toujours deux caractères spéciaux avec et après le texte. Pour l’italique se sont des slashes, pour le gras ce sont des étoiles :
// italique // ** gras **
Listes
Markdown permet d’écrire des listes non-ordonnées en utilisant les caractères étoile, plus ou tiret. Pour les sous-listes, il faut mettre 4 espaces en début de ligne.
* élément A * élément B * élément B.1 * élément B.2 * élément C + élément A + élément B - élément A - élément B
Du côté de Creole, la syntaxe se fait à base d’étoiles uniquement, et les sous-listes se font en ajoutant des étoiles supplémentaires.
* élément A * élément B ** élément B.1 ** élément B.2 * élément C
Pour les listes ordonnées (numérotées), Markdown impose de mettre un numéro en début de ligne, suivi d’un point :
1. élément A 1. élément B 1. élément B.1 1. élément B.2 1. élément C
Creole utilisé le caractère dièse pour les listes ordonnées :
# élément A # élément B ## élément B.1 ## élément B.2 # élément C
Liens
C’est là que ça commence à être vraiment différent. Markdown a une syntaxe − que je trouve bizarre − qui impose de mettre le titre des liens entre crochets, suivi de l’adresse du lien entre parenthèses :
[Google Reader](http://google.fr/reader)
Creole utilise une syntaxe basée sur des doubles crochets. L’adresse du lien vient en premier (car obligatoire) ; un caractère « pipe » peut être utilisé pour faire suivre le titre du lien :
[[http://google.fr/reader]] [[http://google.fr/reader|Google Reader]]
Images
Avec Markdown, l’insertion d’image est identique à l’insertion de lien, avec juste l’ajout d’un point d’exclamation devant, et le texte alternatif de l’image remplaçant le titre du lien :
![mon logo](http://url/vers/le/logo)
Suis-je le seul à trouver cette syntaxe franchement nase ?
Avec Creole, la syntaxe est là aussi dérivée de celle des liens, en utilisant des accolades à la place des crochets :
{{http://url/vers/le/logo|mon logo}}
Texte préformaté
L’écriture de code préformaté se fait en Markdown par l’ajout de 4 espaces en début de ligne :
Exemple de code : function toto() { // ... }
Dans Créole, cela se fait par l’utilisation de triples accolades :
Exemple de code : {{{ function toto() { // ... } }}}
Là, pour une fois, je ne trouve pas la syntaxe Créole très bien pensée. Dans tous les cas, j’ai été habitué à la syntaxe MediaWiki, qui impose simplement un espace en début de ligne.
Tableaux
Bizarrement, il n’y a pas de syntaxe (du moins, pas de syntaxe officielle) pour faire des tableaux avec Markdown. La documentation indique qu’il faut écrire le code HTML :
<table> <tr> <td>foo</td> </tr> </table>
Creole prévoit une syntaxe à base de caractères pipe :
|=titre col 1|=titre col2| |cellule 1 |cellule 2 | |cellule 3 |cellule 4 |
Je trouve dommage que Markdown ait laissé de côté cet usage. Mais je trouve aussi que la syntaxe Creole est très mauvaise. L’un des points fort de Creole − à mes yeux − est l’utilisation de double-caractères, car cela évite pas mal de problèmes. Là, pour les tableaux, j’aurais préféré une syntaxe utilisant des double-pipes. Sans compter que la syntaxe “pipe-égale” pour les en-têtes de tableau (équivalent aux balises <th>) est vraiment pas terrible − la justification étant que le égale est déjà utilisé pour les titres, ce qui est vrai mais n’apporte rien dans ce contexte.
Les autres éléments
J’ai passé en revue les éléments les plus courant que l’on attend d’un système de balisage léger. En tout cas, ce sont ceux dont j’ai besoin au quotidien.
Je ne parle pas des lignes horizontales (tag <hr/>), de la gestion des paragraphes ou de l’échappement des caractères spéciaux, qui existent dans les deux langages avec des différences minimes. Je dois reconnaître que Markdown propose une gestion assez pointue des paragraphes, notamment au sein des listes. Je dois dire aussi que c’est un besoin que je n’ai jamais eu en 10 ans…
Pour conclure, je pense que mon avis est assez clair. Je préfère la syntaxe de Creole à celle de Markdown ; je la trouve plus claire et plus lisible. Surtout, je me suis moins souvent retrouvé à devoir échapper des séquences pour qu’elles ne soient pas prises en compte (grâce aux double-caractères, qui évitent la plupart des séquences qu’on peut trouver naturellement dans du texte).
En fait, quand je suis tombé sur Creole, j’y ai trouvé ce que je cherchais alors depuis longtemps : une version simplifiée et homogénéisée de la syntaxe MediaWiki.
Je ne comprends toujours pas comment Markdown s’est répandu tel une traînée de poudre à travers le web. Si quelqu’un peut m’éclairer sur ce mystère, je suis preneur. J’ai toujours pensé que sa killer feature réside dans ses titres, dont les deux premiers niveaux peuvent s’écrire de la manière dont les titres ont toujours été écrits dans les fichiers textes depuis la nuit des temps (en les soulignant avec des caractères égale ou des caractères tiret). Est-ce cela qui lui a suffit pour s’imposer ?
L’une des plus grosses critiques que j’adresse à Markdown est sa documentation officielle. On dirait un site de warez, pas un site sérieux qui est référencé par des sites aussi majeurs que StackOverflow ou GitHub. C’est vraiment bizarre, parce que j’aurais tendance à penser qu’il est très difficile d’imposer quelque chose comme une norme lorsque c’est mal documenté. Il faut toutefois remarquer des initiatives récentes qui cherchent à améliorer la documentation de Markdown, tout en voulant standardiser les ajouts et améliorations du langage ; notamment Jeff Atwood, qui en parlait sur son blog et qui a la possibilité de fédérer pas mal d’énergies sur le sujet.
Au final, j’utilise Creole sur GitHub (cf. le projet FineFS). Mais pour mes projets personnels, j’ai fait quelques modifications pour pallier à ce que je considère comme étant des scories (et oui, ça me fait bizarre de remettre en question le boulot de toutes les personnes qui ont travaillé sur Creole). Un jour ou l’autre, je publierai peut-être ma version, on verra.