Epub 2 Markdown : modernisez vos Epub
Sommaire
Présentation
EPUB est un format complexe dont la production peut être réalisée de façon hétéroclite. Vous vous retrouvez, après quelques années de lecture, devant une bibliothèque numériques truffées de fichiers conçus avec un soin varié, des CSS confuses, des polices d’écriture embarquées plus ou moins heureuses, des véléités de mise en page non pertinentes, voire avec des fichiers datés qui peinent à être affichés sur des appareils récents.
Reprendre techniquement et de façon automatisée un fichier Epub pour le moderniser est aussi - et pour ces mêmes raisons - une gageure.
Le programme que j’ai conçu ici fait donc les choses au plus simple :
- Destruction sélective (Epub2Markdown) : n’est préservé du fichier que sa structure, et des textes que leurs enrichissements les plus basiques. Paragraphes, gras, italique, notes… Les métadonnées sont réduites a minima et stockées en JSON. Un bundle markdown/images/json est ainsi produit.
- Reconstruction a minima (Markdown2Epub) : le contenu est coulé dans un squelette Epub3, le sommaire reconstruit.
Détails
EPUB → Markdown
-
Chapitres extraits dans l’ordre du spine
-
HTML nettoyé : scripts, styles, commentaires, tirets conditionnels, balises vides supprimés
-
Mise en forme conservée : titres, gras, italique, listes, tableaux, citations, images
-
Enrichissements CSS : le CSS de l’EPUB (feuilles de style externes et blocs
<style>embarqués) est parsé pour résoudre les classes sémantiques de l’éditeur. Une classe comme.eme { font-style: italic }est automatiquement convertie en<em>, indépendamment du nom de classe choisi. Les règles à sélecteurs multiples (.a, .b { font-weight: bold }) sont supportées. Les attributsstyleinline sont également pris en compte. -
Notes de bas de page converties en syntaxe Markdown (
[^n]) -
Liens internes entre chapitres réécrits vers les fichiers
.mdde sortie -
Artefacts éditoriaux supprimés : glyphes ornementaux encodés comme
q(cul-de-lampe), barres obliques inverses résiduelles, italiques fragmentés en spans adjacents fusionnés, sauts de ligne (<br>) à l’intérieur d’éléments gras/italique remplacés par un espace (les marqueurs**/*ne peuvent pas franchir un saut de ligne en CommonMark) -
Tirets de dialogue : les tirets de début de paragraphe (
-) sont échappés (\-) pour ne pas être interprétés comme des puces de liste lors de la reconversion en EPUB -
Épigraphes et citations : les blocs détectés via leurs classes CSS (
epigraph,epigraphe,citation,exergue,chapquote…) sont convertis en citations Markdown (>). L’attribution (classeepisource,attribution,source…) est extraite et rendue sur une ligne séparée préfixée par—. La mise en forme inline de l’attribution (italique, etc.) est préservée. Exemple de rendu :> Non so più cosa son. > Cosa facio. > > — MOZART. (*Figaro.*) -
Pages liminaires (page de titre, copyright, table des matières, dédicace, préface…) détectées via l’attribut
epub:typeet marquées avec un bloc YAMLtype: frontmatter
Markdown → EPUB3
- Chaque fichier
.mddevient un chapitre XHTML5 - Table des matières (
nav.xhtml) générée depuis les titres H1 - Feuille de style incluse :
- Chapitres de corps : retrait de première ligne (
text-indent) typographique, sans retrait après les titres et séparateurs - Titres H1/H2 : espacement d’une ligne vide sous le titre (
margin-bottom: 1.6em) - Pages liminaires (
type: frontmatter) : pas de retrait, espacement normal
- Chapitres de corps : retrait de première ligne (
- Archive EPUB3 conforme à la spécification (mimetype non compressé, OPF valide)
Dépendances
| Paquet | Rôle |
|---|---|
| ebooklib | Lecture EPUB |
| beautifulsoup4 + lxml | Nettoyage HTML |
| markdownify | HTML → Markdown |
| markdown-it-py | Markdown → HTML |
| PyYAML | Sérialisation des métadonnées |
| click | Interface en ligne de commande |