- Kje,
Cartouche | |
---|---|
ZEP | 05 |
Titre | Refonte du traitement markdown pour l'export |
Révision | 2 |
Date de création | 15 juillet 2014 |
Dernière révision | 15 Octobre 2014 |
Type | Feature |
Statut | Accepté |
Une Zep un peu particulière peut être car le besoin est assez évident et ne fait pas trop de doute mais il faut une discussion pour décider des choix techniques et du processus qui sera utilisé pour l'améliorer.
Problématique et situation actuelle
Le back-end peut actuellement, à partir des sources markdown, produire trois type de sorties :
- du html, pour l'affichage en ligne
- du pdf pour impression et consultation hors-ligne
- du epub pour lecture sur liseuse et consultation hors-ligne
Le html est généré par Python-zMarkdown, un fork de Python-Markdown principalement constitué d'extensions permettant de supporter nos ajouts de syntaxe. Les deux autres formats sont produit via Pandoc après le passage des sources dans quelques scripts pour les formater a peu pret convenablement pour Pandoc. Principalement ces codes vont, à coup de regex :
- Décaler les titres pour insérer ceux du cours et des chapitres,
- Tout concaténer,
- Télécharger les images et remplacer le contenu de celles-ci pour qu'elles soit dispo en local et incorporable par latex,
- etc.
Comme vous pouvez le remarquer, ce passage fonctionne mais de manière limité. Le rendu est loin d’être parfait et certaines de nos extensions ne sont pas supportés. De plus par sa nature limité, les remplacements automatiques peuvent entraîner des problèmes de transformations car ils ne disposent pas de l'arbre syntaxique complet au moment de la transformation.
Cette Zep cherche donc a trouver un solution permettant de rationaliser ces transformations et corriger les problèmes du rendu actuel.
Le code actuel a ce processus :
1 2 3 4 5 | Source markdown -+-[ parser ]--> Arbre syntaxique 1 (AST) --[Generation]--+-> Html | [zmarkdown] | +-[parser]--> Arbre syntaxique 2 (AST) --[Generation]--+-> (Latex) -> Pdf [pandoc] +-> epub |
Solution idéal
Un solution idéal serait qu'un logiciel comprend entièrement notre syntaxe et se charge de produire les trois types de sorties. Disposant de sa représentation interne, il pourrait en une seule passe, si demandé, produire directement les 3 sorties (évitant de parser plusieurs fois l'entrée) ou simplement le html (pour le forum ou pour les périodes de rédactions).
Le processus de traitement minimal serait alors le suivant :
1 2 3 | Source markdown --[parser]--> Arbre syntaxique (AST) --[Generation]--+-> Html +-> (Latex) -> Pdf +-> epub |
Solutions retenu :
Utiliser Pandoc pour la chaine entière
Au lieu de transformer le zMarkdown pour faire le taf actuel de Pandoc on peut envisager le chemin inverse et chercher à étendre Pandoc pour supporter nos extensions
Avantages :
- Arriver à la solution idéal
- Maîtrise total de la chaîne
- Augmentation des formats de sorties possibles
Désavantages :
- Pas mal de dev pour porter dans Pandoc toutes nos modifs
- Nécessite des ressources de dev en Haskell rare et dont nous ne disposons pas dans l'équipe.
- Changement de parseur donc des changements de comportements sont à prévoir qui devront être cernés et peut être nécessiter des scripts de migrations spécifiques
Autres solutions non retenu
Solutions possibles
Je vais lister toutes les solutions envisageable. Toutes les solutions vont être rapportées ici. Les différents avis de la communauté seront rapporté pour permettre le choix.
Production des sorties depuis zMarkdown
Une première évolution possible, puisque Python-zMarkdown sait déjà interpréter toute notre syntaxe et produire un arbre syntaxique correspondant serait de lui rajouter les modules de générations Latex et epub.
Avantages :
- Arriver à la solution idéal
- Maîtrise total de la chaîne
- On reste sur du 100% Python
Désavantages :
- La structure actuelle de Python-zMarkdown est celle de Python-Markdown et est pensé pour produire du html (ou xhtml), pas autre chose. L'AST est donc en fait un arbre type XML (ElementTree) qu'il est parfois pénible de parcourir pour autre chose que le html.
- Nécessité de créer et maintenir plusieurs modules d'exports en plus du parseur (temps de dev, mise au point et maintenance important).
Production depuis zMarkdown en sorties de markdown-pandoc
En version intermédiaire à la précédente, pour simplifier le travail ou faire un jalon plus rapidement atteignable à moyen terme, une solution serait de faire produire un markdown "compatible pandoc" au zMarkdown. Ainsi on pourrait assurer la qualité de sortie tout en gardant globalement la chaine courante. On arriverai à quelque chose comme :
1 2 3 | Source markdown --[zmarkdown]--+-> Html +-> Markdown-pandoc --[Pandoc]--+-> (Latex) -> Pdf +-> epub |
Avantages :
- Conservation des outils existants
- On reste sur du 100% Python
- Assez rapide à développer vis a vis de la solution précédente
Désavantages :
- Étapes de transformations successives inutiles.
- Nécessité de générer un "markdown-pandoc" spécifique à chaque sortie (même si une grosse partie serait commune).
- La structure actuelle de Python-zMarkdown est celle de Python-Markdown et est pensé pour produire du html (ou xhtml), pas autre chose (voir solution au dessus).
Passer par un module de production de contenu spécifique en Python depuis zMarkdown
Une solution proche de la première et limitant ces inconvénients serait d'utiliser un module existant qui permet, en python, de produire les différentes sorties à partir d'une description du document. Concernant notre processus, l'idée serait de se baser sur un module externe pour le bloc "génération"
Avantages :
- Arriver à la solution idéal, possibilité de le faire par étape (dans un premier temps faire la conversion "AST actuel" -> "Modèle de données du module" puis refaire le contenu de python-zmarkdown pour produire directement le modèle de document du module de sortie)
- Limitation de la maintenance à la partie parseur
- On reste sur du 100% Python
Désavantages :
- Il faut trouver un package qui correspond à nos besoins
Utiliser des transformation XSLT pour produire les sorties depuis zMarkdown
Le zMarkdown peut produire son arbre syntaxique sous forme de XML (en réalité une sorte de HTML5 en XML). Il est donc possible de le transformer vers n'importe quel format avec des XSLT.
Avantages :
- Presque la solution idéal (on passe juste par un format intermédiaire)
- Extensible facilement à d'autres langages
- Technologie assez courante
Désavantages :
- On a pas de ressources de dev actuellement sur ces technos
- Peut prendre du temps à mettre en place
Utiliser un autre parseur qui résout déjà une grosse partie de ces problématiques
Il n'y a pas que ces deux modules qui existent, beaucoup d'autres parseurs existent dont probablement certains répondant à tous nos besoins
Avantages :
- Arriver à la solution idéal
- Maîtrise total de la chaîne
Désavantages :
- Pas mal de dev pour porter toutes nos modifs.
- Choix du module complexe, long tests et études à prévoir.
- Changement de parseur donc des changements de comportements sont à prévoir qui devront être cernés et peut être nécessiter des scripts de migrations spécifiques.
Créer un convertisseur dédié
Refaire un parseur markdown dédié a notre site et nos problématiques.
Avantages :
- Arriver à la solution idéal
- Maîtrise total de la chaîne
Désavantages :
- Beaucoup de dev
- Choix techniques complexes, long tests et études à prévoir.
- Changement de parseur donc des changements de comportements sont à prévoir qui devront être cernés et peut être nécessiter des scripts de migrations spécifiques.
Conclusion
En cours de dev. Toute aide est la bienvenue.