Bonjour tout le monde,
Avant de partir en congé, où je vais essayer de bosser sur cette ZEP sans forcément de connexions, j'aurais aimé avoir vos avis sur quelques points.
Où en sommes nous ?
Actuellement le fork de Pandoc est capable de parser presque toute notre syntaxe. Il ne reste plus vraiment que les légendes de codes et éventuellement la mise en surbrillance de lignes particulières. A partir de là, aux bugs et nettoyage du code pret, la partie "parsing" du markdown sera normalement terminé.
Etapes suivantes
La route est encore longue avant une mise en prod. Ce qu'il va rester a faire, pas forcément dans l'ordre :
- Nettoyer le code de génération de Latex.
- Nettoyer, refactorer et découper en deux le template Latex (un pour les long contenu type big-tuto, un autre pour articles et mini-tuto).
- Gérer proprement la notion de document constitué de multiples extraits (pour gérer les meta et les décalages de titres, voir plus bas).
- Binder tout ça pour faciliter l'utilisation depuis Python.
A partir de là on devrait avoir une version qui puisse être mise en prod pour la génération de pdf. Ensuite viendra (toujours pas forcément dans l'ordre) :
- La mise a jour du créateur d'ebook/epub pour supporter toute notre syntaxe.
- (optionnellement) Le rajout de l'export d'ebooks au format mobi/kindle (parce que moi je trouverai ça pratique (j'ai un kindle) et pourrait permettre aux auteurs ou au site de proposer le contenu sur Amazon; peut être fait proprement (un nouveau writer pandoc, qui partagera beaucoup avec celui epub) ou niveau python avec des convertisseurs epub <-> mobi existants.
- La prise en charge de notre sémantique dans la sortie HTML (ce qui permetra de passer à un full-pandoc sur le site)
- La prise en charge de notre sémantique dans la sortie markdown (avec mise a jour des autres modules d'entrées de Pandoc) pour permettre plus facilement l'import de contenu (utiliser pandoc avec Html en entrée et markdown en sortie nous permet d'importer plus facilement du contenu d'un peu partout par exemple).
Bref encore pas mal de boulots, les 4 premiers points étant les plus important à court-terme.
Voici pour l'état des lieux.
Les questions en suspent
Il y a plusieurs points sur lesquels j'aimerai avoir votre avis!
Coloration de code
La coloration du code est un point assez important de notre rendu de contenu. J'ai retenu 3 solutions :
- highlighting-kate
- listing
- pygment
Il y en a probablement d'autres, mais ces 3 là sont les plus évidents. Et déjà ces 3 là vont forcément demander du dev pour supporter pleinnement notre fonctionnement.
Les solutions
highlighting-kate
-
Avantages:
- Solution intégré à Pandoc, il n'y a rien à faire pour que ça fonctionne.
- Marche pour html et latex : résultat identique pour les deux. Une configuration pour les deux sorties.
- Une bonne liste de langages supportés, ajout facile depuis une définition de langage de l'éditeur Kate.
- Possibilité d'activer la coloration pour le code inline en rajoutant un truc type
{python}
à la suite de la définition de l'élément inline.
- Tout le rendu reste entièrement dans le monde Haskell, pas d'appel à d'autres technos.
-
Désavantage:
- Probablement le moins complet (au niveau nombre de langages et fonctionnalités) et connu des 3. Inconvénient à relativiser vu ce qui est déjà disponible.
- Ne supporte pas actuellement la mise en évidence des lignes de codes. Mais des tickets en font mention, ce serait facilement accepté upstream (et John MacFarlane est assez rapide à releaser)
- Ne supporte pas le coupure des lignes de codes si elles sortent de la page en Latex. Difficile à régler.
listing
-
Avantages:
- Standart de-facto dans le monde Latex
- Grosse base de langages supportés, pleins d'options de rendu.
- Seul a gérer correctement la césure de lignes de codes pour éviter le dépassement.
- Déjà intégré à Pandoc
- Possibilité d'activer la coloration pour le code inline mais pas actuellement géré coté Pandoc.
- Supporte la mise en évidence de lignes de codes
-
Désavantage:
- Latex seulement. On peut donc avoir quelques incompatibilités entre les deux et un rendu différent.
pygment
-
Avantages:
- Probablement le module de coloration le plus connu, le plus utilisé et le plus complet.
- Peut générer la coloration pour le html et le latex.
- Solution actuellement utilisé sur zds pour le html.
- Gestion partiel des cesures de longues lignes dans le latex.
- Supporte la mise en évidence de lignes de codes
-
Désavantage:
- Pandoc n'est pas prévu pour l'utiliser. Possible mais necessite du dev.
- Aucune idée si il est possible de colorer de l'inline. Probablement en choissant les bonnes options. Dans tous les cas necessite un peu de tests et dev.
- Gestion partiel des cesures de longues lignes dans le latex : ne se fait que sur des espaces et il y a donc des cas pathologique qui rendront très mal (ne peut pas couper une adresse web en commentaire, peut couper au milieu d'une string, etc.)
- Necessite de lancer un process Python supplémentaire dédié à la coloration durant le traitement.
Mon avis
Je reste partagé sur cette question. Actuellement je suis pour une solution pragmatique :
- Ne pas utiliser listing car ça ne résoud le problème que pour le latex, je préfèrerai avoir un seul élément qui gère tout pour m'éviter des bugs foireux ou comportements différents.
- A court terme, utiliser highlighting-kate car intégré nativement. Voir la difficulté que représente la mise en évidence des lignes de codes et la soumettre si facile. Ça liste de langage supporté et sa facilité d'ajout me semble largement suffisant pour nos besoins.
- A moyen terme, envisager Pygment en faisant un POC de son utilisation et voir le résultat obtenu et le coup de mise en place (dev, temps de traitement).
Et votre avis ?
Gestion de documents constitués de multiples extraits
Actuellement nous avons une notion de document représenté par :
- Un dossier contenant les multiples extraits d'un tuto
- Un manifeste qui contient leur agencements, les titres des parties et une parties des meta-informations
- Des données en bases annexe (auteurs, logo, etc.)
Pandoc n'a pas cette notion. Il n'accepte qu'un unique document en entrée. Si plusieurs fichiers lui sont données, il les concatène en entrée.
Pour gérer ça, la solution actuel est sous-optimal :
- Décalage de tous les titres des extraits à coup de regexp (non complète, source de bugs, etc.)
- Assemblage dans un fichier temporaire de ces extraits modifiés en injectant les titres et les meta comme sources markdown
- Passage du tout à Pandoc avec des options permetant de gérer tout ça (en particulier accepter la définition de blocs meta depuis le markdown ce qui pourrait permettre a un auteur de les modifier depuis son code markdown).
La première évidence qui vient ici est le décalage des titres qui peut être faite facilement et proprement au niveau de l'AST de pandoc. Cela demande de changer la gestion de ces multiples extraits.
Solutions possibles
Je vois deux solutions pour gérer ça proprement :
- En Haskell, en créant un nouveau point d'entrée. En gros on rajouterai un executable dans le code de Pandoc qui prendrait en entrée le manifeste et les quelques meta données manquantes et se chargerait de faire l'assemblage propre en manipulant l'AST directement.
- En Python directement. Il prendrait les mêmes types de paramètres et passerait les extraits un à un à Pandoc qui se chargerait aussi du décalage des titres et le module ré-assemblerait tous les extraits latex pour appeler latex et générer le pdf.
Depuis haskell/pandoc
-
Avantages:
- Tout reste dans le monde Haskell qui peut manipuler entièrement et proprement toute l'AST
- Temps de traitements : il sera possible de générer toutes les sorties (pdf, ebook et html "entier") d'un seul coup depuis une source. On économisera autant de temps de parsage de l'entrée markdown qu'il y a de sorties supplémentaire puisqu'une fois transformé, la même AST peut être utilisé pour générer plusieurs sorties.
-
Désavantage:
- Nécessitera obligatoirement le fork pour fonctionner, plus contraignant pour les contributeurs externes
Depuis python
-
Avantages:
- Ce module est dans la techno la mieux maitrisé par le reste de l'équipe
- Je peux me débrouiller pour que le décalage de titre ne necessite pas le fork et donc la génération global de pdf pourra rester compatible avec un pandoc de base.
- Les différents extraits généré devront être assemblés et cela devra être fait avec une techno de template qui du coup pourra être la même que celle utilisé dans le reste du projet. Ainsi tous les templates (html, latex, etc.) utiliseront la même techno de template.
-
Désavantage:
- Necessite de transformer les templates latex et ebook vers la solution du projet.
- Necessite de piloter Latex/xetex depuis le python (pour compiler le nouveau document).
- Plus lent quand génération de plusieurs formats puisque Pandoc ne supporte pas plusieurs sorties simulatanément : on reparssera le tout systématiquement.
Mon avis
Instinctivement je partirai sur la solution en Haskell puisque c'est celle qui demande le moins de nouveau dev (celle python demande de refaire le liens avec les template et l'appel des builders comme latex). La necessité du fork peut être fortement diminuer : dans tous les cas il faudrat un mini-binding python (pour appeler pandoc) et celui-ci peut être fournit sous forme d'un package compatible PIP qui embarque le binaire du fork. Le seul vrais inconvénient est que je suis moins à l'aise en Haskell qu'en Python mais ça me semble jouable d'autant que tout est déjà dispo dans Pandoc (Pandoc inclus déjà un package pour lire les json par exemple).
Votre avis ?
Et maintenant ?
J'aimerai bien des avis ! Puisque c'est moi qui coder tout ça et le maintenir, je trancherai probablement à la fin si aucune solution ne fait consensus mais j'aimerai bien des avis externes. J'ai un peu le nez dans le problème, je loupe probablement des trucs.
De plus, à la rentrée, je ne serais pas contre de l'aide pour maintenir le bouzin et avancer ce qui demande des compétences, soit :
- En haskell pour intervenir sur le coeur de Pandoc (Vayel va participer quand il aura le temps, a priori)
- En latex pour améliorer le rendu des pdf (une fois que ce sera stabilisé)
- En html/css pour améliorer le rendu des ebook (parce que les ebook utilisent les technos web)