La transformation des documents, d’un format vers un autre, est facilitée par l’utilisation d’outil comme Pandoc qui fabrique un format intermédiaire, que l’on peut manipuler ensuite. Ex: j’ai un document Word avec des images, je veux produire un fichier markdown ou un powerpoint.
pandoc test.md -o test.html
Pandoc va déterminer les langages de départ et d’arrivée à partir des extensions de fichiers, mais on peut aussi le formuler explicitement:
pandoc --to=html test.md -o test.html
Si on veut ajouter ses propres modifications, on peut utiliser un script en lua, que l’on appelle un « filtre » car il intervient durant la transformation.
pandoc --lua-filter=filter.lua --to=html test.md -o testfiltré.html
Blocks et inlines
Pandoc lit le document de départ et construit une version « abstraite » de celui-ci, appelée l’AST. Il est très important de comprendre que cet arbre est composé de deux types radicalement différents d’éléments: des blocks et des inlines. C’est crucial, car lorsque nous allons ajouter nos propres transformations, nous devons lire l’AST, et nous ne pouvons remplacer un élément de type block que par un block (ou une liste de blocks), et un inline que par un inline (ou une liste de inline).
Un div au départ, qui est un block, ne peut pas donner un span à l’arrivée, qui est un inline. En tous les cas, pas simplement.
Html
Deux codes utiles pour renvoyer du html:
return pandoc.RawInline('html', '<div>'..element.target..'</div>')
pandoc.RawBlock('html', '<div>'..element.target..'</div>')
Concaténation
On remarquera qu’en Lua la concaténation se fait avec point point.
..
AST
Pour voir le code de l’AST (Abstract Syntax Tree) on peut utiliser « native »
pandoc -t native test.md
Meta
Il est important de traiter les meta qui existeraient déjà dans le document, mais surtout, il est crucial de pouvoir en créer de nouvelles pour les transmettre au template si on en utilise un.
Dans l’exemple ci-dessous, je gère les metadata existantes, et j’en ajoute une nouvelle créée à chaque passage d’un titre dans la variable « mytoc » (traduction: « my table of contents »)
Meta = function(metadata)
metadata.toc = pandoc.RawInline('html',mytoc)
if metadata.direction then direction = metadata.direction end
return metadata
end
Je peux ainsi m’en servir dans le template que j’utilise
pandoc --lua-filter=filter.lua --to=html test.md -o testfiltré.html --template test.temp.html
Qui contient les instructions suivantes:
$if(toc)$ $toc$ $endif$
à l’endroit où je veux insérer la liste des liens.