Du bist ein erfahrener Python-Entwickler für Dokumentkonvertierung, EPUB-Interna, XML/HTML-Verarbeitung und semantische Markdown-Pipelines. Entwickle ein vollständiges, robustes Commandline-Programm namens `epub2md.py`.
## Ziel
Das Programm soll DRM-freie EPUB-Dateien lokal in eine strukturierte Sammlung von Markdown-Dateien konvertieren. Es muss für sehr unterschiedliche Buchtypen geeignet sein:
- Romane und Sachbücher
- Bildbände mit Bildern, Bildunterschriften und Bildreferenzen
- Programmierbücher mit Codeblöcken, Einrückungen, Quellcode und Tabellen
- Mathematik- und Naturwissenschaftsbücher mit Formeln, Gleichungen, MathML, TeX/LaTeX, SVG-Formeln und Grafiken
- Technische Fachbücher mit Fußnoten, Endnoten, Zitaten, Quellen, Glossar, Register und Inhaltsverzeichnis
Die Ausgabe soll für folgende Zwecke gut weiterverarbeitbar sein:
- Markdown-Renderer und statische Webseiten
- Pandoc-Konvertierung nach HTML, PDF, DOCX oder EPUB
- Obsidian, Zettelkasten- und Wissensdatenbanken
- Git-Versionierung
- RAG-, Embedding- und Chunking-Pipelines
- Volltextsuche und lokale LLM-Verarbeitung
Die Konvertierung darf keine DRM-Schutzmechanismen umgehen. Unterstütze nur lesbare, DRM-freie EPUB-Dateien.
## Arbeitsverzeichnis und Beispieldaten
Im aktuellen Projektverzeichnis befindet sich ein Verzeichnis:
```text
Beispiele/
```
Darin liegen mehrere Beispiel-EPUB-Dateien unterschiedlicher Art. Nutze diese EPUBs ausschließlich lokal zur Analyse und zum Testen des Programms. Lies zunächst die Verzeichnisstruktur ein und identifiziere vorhandene EPUB-Dateien.
Beispielhafte Zielgruppen der Testbücher können sein:
- Roman mit Kapiteln, Fußnoten und Inhaltsverzeichnis
- Programmierbuch mit Python-, Shell-, C-, JavaScript-, SQL- oder Konfigurationscode
- Mathematikbuch mit Formeln in MathML, TeX, SVG oder als Bild
- Bildband mit JPEG-, PNG-, WebP- oder SVG-Grafiken
- Buch mit Glossar, Bibliografie, Endnoten sowie Personen- und Sachregister
Falls keine EPUB-Beispiele vorhanden sind, implementiere das Programm trotzdem vollständig und lege zusätzlich minimalistische synthetische Testdaten oder Tests an.
## Wichtige technische Anforderungen
Schreibe kein bloßes Proof-of-Concept. Das Ergebnis soll ein benutzbares, nachvollziehbares und fehlertolerantes Werkzeug sein.
Verwende bevorzugt:
- Python 3.12 oder kompatibel mit Ubuntu 24.04
- Standardbibliothek, soweit sinnvoll
- `beautifulsoup4`
- `lxml`
- optional `markdownify`, aber nicht als alleinige Konvertierungslogik
- optional `Pillow` nur für Metadaten oder Bildprüfung
- `pytest` für Tests
Vermeide schwere externe Laufzeitabhängigkeiten, sofern sie nicht klaren Mehrwert bringen. Insbesondere darf das Programm nicht zwingend Calibre, Pandoc, Java, Node.js oder einen Cloud-Dienst benötigen. Eine optionale Integration mit Pandoc darf angeboten werden, aber die Kernfunktion muss ohne Pandoc funktionieren.
Nutze für die EPUB-Verarbeitung die Tatsache, dass EPUB ein ZIP-Archiv mit OPF-, XHTML/HTML-, NCX-, NAV-, CSS-, Bild- und Mediendateien ist. Implementiere die Verarbeitung stabil anhand der OPF-Manifest- und Spine-Reihenfolge. Verlasse dich nicht nur auf Dateinamen oder ein vorhandenes Inhaltsverzeichnis.
## Kommandozeilenschnittstelle
Implementiere mindestens diese Schnittstelle:
```bash
python3 epub2md.py INPUT.epub OUTPUT_VERZEICHNIS
```
Beispiel:
```bash
python3 epub2md.py Beispiele/mathematikbuch.epub output/mathematikbuch
```
Zusätzliche Optionen:
```bash
python3 epub2md.py --help
python3 epub2md.py INPUT.epub OUTPUT_VERZEICHNIS \
--format gfm \
--extract-media \
--copy-original \
--chapter-level 1 \
--toc \
--frontmatter \
--footnotes end-of-chapter \
--math auto \
--images relative \
--slug-language de \
--verbose
```
Implementiere mindestens diese Optionen:
```text
--format {gfm,commonmark}
Ziel-Markdown-Variante, Standard: gfm.
--extract-media / --no-extract-media
Extrahiert Bilder und Medien nach OUTPUT_VERZEICHNIS/media/.
Standard: aktiviert.
--copy-original / --no-copy-original
Kopiert die originale EPUB-Datei optional nach OUTPUT_VERZEICHNIS/source/.
Standard: deaktiviert.
--chapter-level N
Überschriftenebene, ab der neue Markdown-Kapiteldateien erzeugt werden.
Standard: 1.
--toc / --no-toc
Erzeugt eine README.md bzw. index.md mit Inhaltsverzeichnis und Links auf Kapitel.
Standard: aktiviert.
--frontmatter / --no-frontmatter
Fügt YAML-Frontmatter in jede Kapiteldatei ein.
Standard: aktiviert.
--footnotes {keep-links,end-of-chapter,end-of-book,inline}
Strategie zur Ausgabe von Fußnoten und Endnoten.
Standard: end-of-chapter.
--math {auto,tex,mathml,image}
Strategie für Mathematik.
Standard: auto.
--images {relative,flat,original-path}
Strategie für Bildpfade.
Standard: relative.
--slug-language {de,en,none}
Regeln für lesbare Dateinamen und Umlautbehandlung.
Standard: de.
--keep-html
Erhalte nicht zuverlässig konvertierbare HTML-Fragmente als HTML im Markdown,
statt Informationen zu verlieren.
--strict
Brich bei nicht verarbeitbaren kritischen Fehlern ab.
Ohne --strict sollen Warnungen gesammelt und die Konvertierung soweit möglich fortgesetzt werden.
--verbose
Ausführliche Verarbeitungsschritte ausgeben.
--dry-run
Analysiert EPUB-Struktur und geplante Ausgabedateien, schreibt aber nichts.
--report DATEI.json
Schreibt einen maschinenlesbaren Konvertierungsbericht als JSON.
```
Nutze `argparse`. Rückgabecodes:
```text
0 Erfolgreich, möglicherweise mit nichtkritischen Warnungen
1 Ungültige Parameter oder Eingabedatei nicht lesbar
2 EPUB-/ZIP-/Containerfehler
3 OPF-/Spine-/XHTML-Verarbeitungsfehler
4 Unerwarteter interner Fehler
```
## Erwartete Ausgabestruktur
Für eine Eingabe `mein-buch.epub` soll beispielsweise Folgendes entstehen:
```text
output/mein-buch/
├── README.md
├── metadata.yaml
├── conversion-report.json
├── source/
│ └── mein-buch.epub # nur mit --copy-original
├── media/
│ ├── images/
│ │ ├── 0001-cover.jpg
│ │ ├── 0002-abbildung-algorithmus.png
│ │ └── 0003-formel-1.svg
│ ├── audio/
│ └── other/
├── chapters/
│ ├── 000-frontmatter.md
│ ├── 001-vorwort.md
│ ├── 002-kapitel-1-einleitung.md
│ ├── 003-kapitel-2-grundlagen.md
│ ├── 004-anhang.md
│ ├── 005-glossar.md
│ ├── 006-quellen-und-literatur.md
│ ├── 007-sachregister.md
│ └── 008-personenregister.md
└── diagnostics/
├── warnings.md
└── unsupported-elements.md
```
Die genaue Struktur darf verbessert werden, aber sie soll stabil, dokumentiert und skriptfreundlich bleiben.
## EPUB-Analyse
Implementiere eine saubere EPUB-Analyse:
1. Lies `META-INF/container.xml`.
2. Ermittle darüber die OPF-Paketdatei.
3. Lies aus der OPF-Datei mindestens:
- Titel
- Untertitel, falls vorhanden
- Autorinnen/Autoren
- Sprache
- Identifier/ISBN, wenn vorhanden
- Verlag
- Veröffentlichungsdatum
- Beschreibung
- Rechteangaben
- Cover-Referenz
- Manifest
- Spine-Reihenfolge
4. Unterstütze EPUB 2 und EPUB 3.
5. Lies, falls vorhanden:
- EPUB-3-Navigation (`nav.xhtml`)
- NCX-Inhaltsverzeichnis (`.ncx`)
- Guide-Landmarks
- Dokumenteigenschaften wie `epub:type`
6. Verwende die Spine als verbindliche Lesereihenfolge.
7. Nutze NAV/NCX und semantische EPub-Typen zur Erkennung von:
- Titelblatt
- Inhaltsverzeichnis
- Vorwort
- Kapitel
- Teil
- Anhang
- Glossar
- Bibliografie
- Endnoten
- Sachregister
- Personenregister
- Danksagung
- Kolophon
## Kapitelbildung
Die Kapitelbildung muss robust sein. Viele EPUBs enthalten bereits eine XHTML-Datei je Kapitel; andere enthalten ein gesamtes Buch in wenigen Dateien.
Implementiere diese Priorität:
1. Berücksichtige die OPF-Spine-Reihenfolge.
2. Erkenne innerhalb jeder XHTML-Datei Überschriften `h1` bis `h6`.
3. Teile Inhalte anhand von `--chapter-level`.
4. Falls keine geeigneten Überschriften vorhanden sind:
- nutze die XHTML-Datei als Kapitel,
- oder leite einen sinnvollen Titel aus `
`, `epub:type`, Dateiname oder NAV/NCX ab.
5. Erhalte die Reihenfolge exakt.
6. Verwende fortlaufende Dateinummern mit mindestens drei Stellen:
- `001-...md`
- `002-...md`
7. Erzeuge konfliktfreie, stabile Slugs.
8. Entferne keine Kapitel, nur weil sie kurz sind. Titelblatt, Widmung oder Epigraph dürfen als eigene Markdown-Datei erscheinen.
9. Vermeide doppelte Ausgabe desselben Inhalts, etwa wenn das EPUB ein HTML-Inhaltsverzeichnis enthält und zusätzlich NAV/NCX besitzt.
## Markdown-Konvertierung
Erzeuge sauberes, semantisch brauchbares Markdown.
### Überschriften
- XHTML `h1` bis `h6` müssen zu Markdown-Überschriften werden.
- Passe die Überschriftenebenen sinnvoll an die Kapiteldatei an.
- Vermeide mehrere identische H1-Überschriften in derselben Kapiteldatei.
- Gib Kapitelmetadaten im YAML-Frontmatter aus.
Beispiel:
```markdown
***
book_title: "Beispieltitel"
book_author:
- "Max Mustermann"
language: "de"
chapter_number: 3
chapter_title: "Graphenalgorithmen"
source_epub: "beispieltitel.epub"
source_href: "Text/ch03.xhtml"
epub_type:
- "chapter"
conversion_status: "converted"
***
# Graphenalgorithmen
```
### Fließtext und semantische Elemente
Konvertiere mindestens:
```text
p, div, span, section, article, header, footer, aside,
blockquote, q, cite, em, i, strong, b, u, del, s,
br, hr, sup, sub, abbr, kbd, mark
```
Regeln:
- Normaler Fließtext soll keine künstlichen Zeilenumbrüche innerhalb eines Absatzes erhalten.
- `
` soll als echter Markdown-Zeilenumbruch oder, falls semantisch geeigneter, als Absatztrennung erscheinen.
- `blockquote` soll als `>` ausgegeben werden.
- Hervorhebungen sollen semantisch erhalten bleiben.
- `` und `` müssen erhalten werden; falls normales Markdown nicht ausreicht, nutze HTML-Tags innerhalb der Markdown-Datei.
- Unbekannte oder komplexe Elemente sollen nicht stillschweigend verloren gehen. Mit `--keep-html` sollen sie als bereinigtes HTML im Markdown erhalten bleiben.
- Entferne Navigationsreste wie wiederholte „Next“, „Previous“, Seitenzahlen oder Reader-Bedienelemente, aber nur dann, wenn sie zuverlässig als Navigation identifizierbar sind.
### Listen
Unterstütze:
```text
ul, ol, li, dl, dt, dd
```
- Verschachtelte Listen müssen korrekt eingerückt sein.
- Nummerierte Listen müssen ihre Reihenfolge behalten.
- Definitionslisten sollen als gut lesbares Markdown oder gegebenenfalls HTML ausgegeben werden.
### Tabellen
Unterstütze HTML-Tabellen:
```text
table, thead, tbody, tfoot, tr, th, td, caption
```
Regeln:
- Einfache Tabellen sollen als GFM-Tabellen ausgegeben werden.
- Bei `rowspan`, `colspan`, verschachtelten Elementen, mehrzeiligen Zellen oder komplexen Layouttabellen:
- sichere den Inhalt,
- verwende bevorzugt HTML im Markdown,
- vermerke im Report eine Warnung,
- verliere keine Daten.
- Tabellenbeschriftungen müssen erhalten bleiben.
### Links und Anker
- Konvertiere externe Links vollständig.
- Konvertiere interne EPUB-Links in funktionierende relative Links zu Zielkapiteln und, soweit möglich, Zielankern.
- Erzeuge stabile Markdown-Anker oder verwende HTML-Anker, wenn erforderlich.
- Interne Referenzen wie „siehe Kapitel 4“, „siehe Abbildung 3.2“ oder Fußnoten-Backlinks sollen möglichst erhalten bleiben.
- Dokumentiere nicht auflösbare interne Ziele im Report.
## Programmcode
Programmierbücher sind ein zentraler Anwendungsfall.
Erkenne unter anderem:
```text
pre, code, pre > code,
div mit Klassen wie code, programlisting, sourcecode, listing, highlight,
Syntax-Highlighting-Spans von Pygments, Prism, highlight.js oder ähnlichen Systemen.
```
Anforderungen:
1. Ausgabe als fenced code blocks mit dreifachen Backticks oder einer ausreichend langen Backtick-Sequenz, falls der Code selbst Backticks enthält.
2. Erhalte Leerzeichen, Tabs, Einrückung und Zeilenumbrüche exakt.
3. Entferne keine relevanten Zeichen aus Code:
- Backslashes
- Anführungszeichen
- `<`, `>`, `&`
- Pipe-Zeichen
- Hashes
- Dollarzeichen
- Unicode-Zeichen
4. Versuche die Programmiersprache aus Klassen, `type`, `data-language`, Dateinamen oder bekannten Hinweisen zu erkennen.
5. Unterstütze mindestens Sprachlabels wie:
- `python`
- `bash`
- `sh`
- `zsh`
- `c`
- `cpp`
- `java`
- `javascript`
- `typescript`
- `json`
- `yaml`
- `toml`
- `xml`
- `html`
- `css`
- `sql`
- `dockerfile`
- `makefile`
- `ini`
- `text`
6. Wenn die Sprache nicht sicher erkennbar ist, verwende keinen falschen Sprachbezeichner.
7. Inline-Code muss ebenfalls korrekt nach Markdown übersetzt werden.
8. Zeilennummern, Copy-Buttons, Prompt-Dekorationen und rein visuelle Syntax-Highlighting-Tags sollen entfernt werden, sofern sie eindeutig als Präsentationsartefakte erkennbar sind.
9. Wenn Text nicht sicher als Code erkennbar ist, darf er nicht aggressiv in einen Codeblock gezwungen werden.
Beispiel:
````markdown
```python
from pathlib import Path
def read_book(path: Path) -> str:
return path.read_text(encoding="utf-8")
```
````
## Bilder, SVG und Medien
Extrahiere lokale Medien aus dem EPUB.
Unterstütze mindestens:
```text
JPEG, PNG, GIF, WebP, SVG, AVIF, MP3, MP4, WebM, CSS-Dateien, eingebettete Schriftarten
```
Regeln:
1. Speichere Bilder standardmäßig in `media/images/`.
2. Erhalte die ursprüngliche Dateiendung, sofern möglich.
3. Nutze stabile, kollisionsfreie Namen, beispielsweise:
```text
0001-cover.jpg
0002-abbildung-graph.png
0003-formel-01.svg
```
4. Erhalte Bildreferenzen in Markdown relativ:
```markdown

```
5. Übernimm:
- `alt`
- `title`
- `figcaption`
- Bildnummer und Bildunterschrift
- interne Bildanker
6. Nutze für `figure` und `figcaption` eine gut lesbare Struktur, beispielsweise:
```markdown
*Abbildung 3.2: Darstellung eines Graphen.*
```
7. SVG darf nicht gerastert werden. Bewahre SVG möglichst als SVG.
8. Wenn ein SVG eine mathematische Formel darstellt, markiere dies im Report, aber behandle sie visuell korrekt als Bild.
9. Extrahiere Medien nur einmal, auch wenn sie mehrfach referenziert werden.
10. Erhalte Audio- und Video-Referenzen nach Möglichkeit als Links; dokumentiere nicht direkt in Markdown darstellbare Medien im Report.
11. CSS muss nicht zwingend vollständig übernommen werden. Es darf aber für Heuristiken zur Code-, Tabellen- oder Formelklassifikation analysiert werden.
## Mathematik und Formeln
Mathematik ist ein zentraler Anwendungsfall. Formeln dürfen nicht stillschweigend verschwinden.
Erkenne und behandle mindestens:
```text
MathML: