Convertir avec Pandoc et Lua

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.

Partagez: