# 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 ProArabicContinuousSuperscriptMarkerEndnoteDocumentScopeNewPageNoPrefixSuffixBlackLightBlueArabicGold$ID/$ID/$ID/$ID/$ID/$ID/Myriad Pro$ID/RegularMinion Pro$ID/RegularNothing
```
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
ArialHello 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_worldfile:/home/ytrividic/Desktop/repos/idml-pandoc-reader/hello_world.idml.tmp/file:/home/ytrividic/Desktop/repos/idml-pandoc-reader/falsetruetrueidmlTable des matières1523.2755905509999falsefalseRootHello 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!
:::
```