# Chaîne de conversions ## Graphe La logique derrière ce projet est la suivante : 1. Prendre un fichier IDML en entrée, et le donner à [`idml2xml-frontend`](https://github.com/transpect/idml2xml-frontend) pour obtenir un fichier [Hub XML](https://github.com/le-tex/Hub) ; 2. À partir de ce fichier, le "nettoyer" pour obtenir un document dans la spécification DocBook 5.1, supportée par Pandoc ; Ces deux premières étapes sont les objectifs du paquet `idml2docbook` développé pour ce projet. 3. Lire le fichier DocBook produit avec la [version modifiée de Pandoc](https://github.com/yanntrividic/pandoc/) ; 4. Appliquer des filtres Lua pour correctement structurer l'[arbre de syntaxe abstraite](https://fr.wikipedia.org/wiki/Arbre_de_la_syntaxe_abstraite) (AST) de Pandoc ; 5. Utiliser le _writer_ de Pandoc souhaité. ```{graphviz} ../graphs/conversions.dot :caption: _Graphe des conversions à l'œuvre dans ce projet._ :align: center ``` ## Détail des conversions Cette section retrace la série d'opérations effectuées sur le fichier `hello_world.idml` pour arriver jusqu'à sa version en Markdown. Cela commence donc avec le fichier IDML (34 Ko pour un "Hello world!"), qui consiste en un ensemble de fichiers XML dont voici l'arborescence : ``` hello_world.idml ├── designmap.xml ├── MasterSpreads │ └── MasterSpread_ud5.xml ├── META-INF │ ├── container.xml │ └── metadata.xml ├── mimetype ├── Resources │ ├── Fonts.xml │ ├── Graphic.xml │ ├── Preferences.xml │ └── Styles.xml ├── Spreads │ └── Spread_uce.xml ├── Stories │ └── Story_ue7.xml └── XML ├── BackingStory.xml └── Tags.xml ``` Les informations nous intéressant sont d'abord contenues dans le fichier `designmap.xml` : ```xml Minion Pro Arabic Continuous SuperscriptMarker EndnoteDocumentScope NewPage NoPrefixSuffix Black LightBlue
Arabic
Gold $ID/ $ID/ $ID/ $ID/ $ID/ $ID/ Myriad Pro $ID/Regular Minion Pro $ID/Regular Nothing
``` Ce fichier indique l'ordre des _stories_ (blocs chaînés), qui ne peut pas être inféré depuis le dossier `stories` seulement. Dans ce cas, il n'y a qu'un seul bloc, donc une seule _story_, soit le fichier `Story_ue7.xml`, dans lequel figure bien bien `Hello world!` : ```xml Arial Hello world! ``` C'est principalement ces informations qui seront retenues par `idml2xml-frontend`. Le fichier obtenu est déjà bien moins lourd, et contient les informations suivantes : ```xml hello_world file:/home/ytrividic/Desktop/repos/idml-pandoc-reader/hello_world.idml.tmp/ file:/home/ytrividic/Desktop/repos/idml-pandoc-reader/ false true true idml Table des matières 1 523.2755905509999 false false Root Hello world! ``` La conversion vers DocBook par la méthode `hubxml2docbook` donne : ```xml
Hello world!
``` Et ce résultat peut être donné à Pandoc. Son AST est le suivant : ``` [ Div ( "" , [] , [ ( "wrapper" , "1" ) , ( "role" , "NormalParagraphStyle" ) ] ) [ Para [ Str "Hello" , Space , Str "world!" ] ] ] ``` En transformant l'attribut `role` par une classe via un filtre Lua, on obtient : ``` [ Div ( "" , [ "NormalParagraphStyle" ] , [ ( "wrapper" , "1" ) ] ) [ Para [ Str "Hello" , Space , Str "world!" ] ] ] ``` Et ainsi le résultat final : ```markdown ::: {.NormalParagraphStyle wrapper="1"} Hello world! ::: ```