epub2md/CHANGELOG.md
dschlueter 2526ee6789 feat: Sprachlabels für Codeblöcke aus Inhalt und Buchkontext (R1)
- Gedruckte Zeilennummern ("00  #include …") werden für die Erkennung
  ignoriert, bleiben aber im Block stehen.
- Python zusätzlich per ast.parse (Kontrollstrukturen, def/class, Import
  mit Code) und an >>>-Sitzungen erkannt; YAML zählt nicht.
- Vordurchlauf bestimmt die Sprache des Buches aus den sicher erkannten
  Blöcken; passt sie, reichen für kurze Schnipsel schwächere Signale
  (detected_by: "book-context"). Programmausgaben bleiben ohne Label.

Ohne Label: C-Buch 518 -> 132 von 574, Python-Buch 492 -> 326 von 747.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 23:46:50 +02:00

7.7 KiB
Raw Blame History

Änderungsprotokoll

Alle nennenswerten Änderungen an epub2md. Format nach Keep a Changelog, Versionsnummern nach Semantic Versioning.

Unveröffentlicht

Neu

  • tools/qa/: QA-Skripte versioniert (CLI-Matrix mit 89 Fällen, Generator für Test-EPUBs, unabhängiger Markdown-Validator, Wortvergleich gegen Datenverlust, Prüfung des Pandoc-Wegs für HTML, EPUB und PDF). Beschreibung in tools/qa/README.md; erzeugte Daten landen in .qa/.

Verbessert

  • Sprachlabels für Codeblöcke (R1): Gedruckte Zeilennummern (00 #include …) verdecken die Sprache nicht mehr. Python wird zusätzlich per ast.parse erkannt (Kontrollstrukturen, def/class, Import mit Code) sowie an >>>-Sitzungen. Ein Vordurchlauf bestimmt die Sprache des Buches aus den sicher erkannten Blöcken. Passt sie, reichen für kurze Schnipsel schwächere Signale (detected_by: "book-context"); Programmausgaben bleiben ohne Label. Ohne Label waren vorher im C-Buch 518 von 574 Blöcken, jetzt 132 (fast nur Ausgaben). Im Python-Buch waren es 492 von 747, jetzt 326 (Ausgaben).

0.3.0 – 2026-10-06

Neu

  • pandoc/book.lua: Inhaltsverzeichnis wie im gedruckten Buch nach Cover, Titelseite und Impressum statt davor (Pandocs --toc setzt es immer an den Anfang). epub2md_merge.py markiert dafür das Ende des Vorspanns; ohne eigene Titelseite kommt Pandocs Titelkopf hinter das Cover. Jedes Kapitel, auch Cover, Titelseite und Impressum, beginnt mit print.css auf einer neuen Seite; das Inhaltsverzeichnis hat Seitenzahlen. Mit epub2md_merge.py --toc steht dessen Verzeichnis an derselben Stelle. Gilt auch für den PDF-Weg über LaTeX (\tableofcontents hinter dem Vorspann); bei Büchern mit Formeln empfiehlt die Buch-README diesen Weg. Dort setzt der Filter außerdem A4, ein seitengroßes Cover und DejaVu-Schriften, sodass keine Zeichen mehr fehlen (Mathebuch: vorher über 10.000 fehlende Glyphen wie ∈, λ, ≠).
  • Kapitelerkennung: Ein erstes Kapitel nur aus einem Bild ist das Cover (auch „[Titelinfo]“, „Deckblatt“), ein Kapitel „Titel“ die Titelseite. Der Vorspann darf kurze Zwischenseiten enthalten.
  • pandoc/print.css: Druck-Layout für PDFs mit weasyprint (A4, Seitenzahlen, Kapitel auf neuer Seite, Silbentrennung außer in Code, umbrechende Codezeilen). Die Buch-README enthält den passenden Befehl.

Geändert

  • --chapter-level auto ist der neue Standard: Ebene 1 wie bisher, aber Kapitel mit über 30 000 Wörtern und mindestens zwei Unterkapiteln (Teile eines Romans) werden an ihren Unterkapiteln geteilt; alle anderen Kapitel bleiben ganz (Info chapter-split). Der Roman im Test ergibt 78 statt 9 Dateien, die übrigen Beispielbücher bleiben unverändert. Eine feste Zahl verhält sich wie bisher (R2).
  • epub2md_merge.py kürzt ISO-Zeitstempel im Buch-Kopf (2025-01-13T08:00:00+00:00 → 13.01.2025, bei nicht-deutschen Büchern 2025-01-13), damit die Pandoc-Titelseite ein lesbares Datum zeigt.
  • Seitenmarken (--page-markers) aus einem Kastentitel stehen jetzt vor dem Kasten statt im fetten Titel, wie bei Überschriften.

Behoben

  • epub2md_merge.py: Kapitel-Startanker heißen jetzt kap-003-name statt 003-name. Pandocs EPUB-Ausgabe löste Links auf IDs mit führender Ziffer nicht auf (C-Buch 32, Mathebuch 20 tote Links im EPUB). pandoc/book.lua erkennt beide Formen (QA3-05).
  • Buch-README: Der EPUB-Befehl enthält bei Büchern mit Formeln --mathml. Ohne blieben im Mathebuch 1072 Formeln als TeX-Text stehen (QA3-04).
  • TeX aus alt-Texten wird für Pandoc portabel gemacht (\"u → ü, \O → \emptyset, @{…} und \arraycolsep in array, leeres \displaystyle vor Zellenende). Im Mathebuch kann Pandoc damit 4985 statt 4977 Formeln setzen; vorher blieben 9 als TeX-Text stehen (QA3-06).
  • pandoc/print.css und pandoc/book.lua: keine Seitenzahl auf dem Cover.
  • CSS-Auswertung: Es zählen nur noch Stylesheets, die ein Dokument per <link> (oder @import) einbindet. Bisher wirkten alle CSS-Dateien des Manifests, auch mitgelieferte Layouts anderer Buchreihen. Im C-Buch machte das aus fetten Buchstaben Inline-Code (`st`an`d`ard) und setzte falsche <mark>; eine fremde display:none-Regel hätte Text gelöscht (QA3-01, Regressionstests in tests/test_styles.py).
  • pandoc/callouts.lua: Die Kästen blieben ohne Rahmen, wenn man Pandoc zusätzlich -H/--include-in-header übergab, und im EPUB hatten nur die Titelseite, nicht die Kapitel, das Kasten-CSS. Das CSS steht jetzt in pandoc/callouts.css; der Filter setzt es bei HTML an den Anfang des Dokuments und fügt es bei EPUB den Stylesheets hinzu (zusammen mit Pandocs Standard-CSS bzw. zu eigenen css:-Angaben).

Dokumentation

  • --no-css-emphasis lässt <mark>-Markierungen bestehen; diese steuert --styles.

0.2.0 – 2026-10-06

Schwerpunkt: Typografie und Gestaltung des Buches im Markdown abbilden.

Neu

  • Hervorhebungen aus dem CSS des Buches (epub2md/css.py): fett, kursiv, unterstrichen, durchgestrichen, hoch-/tiefgestellt und Festbreitenschrift werden auch übernommen, wenn der Verlag sie nur per Stylesheet setzt. Per CSS ausgeblendete Elemente (display:none) entfallen. Abschaltbar mit --no-css-emphasis.
  • Infokästen (Tipp, Hinweis, Warnung, Exkurs …) als GitHub-/Obsidian-Callouts > [!TIP], wahlweise als Zitatblock, HTML-div oder normaler Text: --boxes {callout,quote,html,plain}.
  • Pandoc-Filter pandoc/callouts.lua: zeichnet die Kästen in HTML/EPUB als gerahmte Kästen, in LaTeX/PDF, Word und ODT als Zitatblock mit Titel. Die Buch-README nennt ihn in den Pandoc-Befehlen.
  • Farben, Schriftarten, Schriftgrößen, Kapitälchen, Ausrichtung und Fremdsprache als HTML-Stil: --styles html. Standard semantic übernimmt nur Hintergrundmarkierungen (<mark>).
  • Szenenwechsel (Leerabsätze, Ornamente) als * * *, Gedichte als Zitatblock mit Zeilenumbrüchen.
  • Seitenzahlen der Druckausgabe als [S. 123] oder <!-- S. 123 -->: --page-markers {none,visible,comment}.
  • Unsichtbare Zeichen (Nullbreiten-Leerzeichen, weiche Trennstriche) werden im Fließtext entfernt, im Code nicht. Abschaltbar mit --keep-invisible-chars.
  • Verzeichnisse (Quellen, Literatur, Register, Glossar) unterhalb von --chapter-level werden eigene Dateien.
  • Bericht: neue Abschnitte text_cleanup, css und layout.

Geändert

  • Kastentitel ohne dekorative Symbole wie [»]. Der Kastentyp aus der Verlagsklasse hat Vorrang vor einem Typwort im Titel.
  • Zwischen Feld-Spans wird kein Leerzeichen mehr eingefügt, wenn einer davon per CSS ausgeblendet ist.

Dokumentation

  • Bedienungsanleitung: Umwandlung in andere Formate (HTML, PDF, EPUB, Word, Kindle), Infokästen, Farben/Schriften, Seitenzahlen.

0.1.0 – 2026-10-06

Erste Fassung.

  • epub2md.py: DRM-freie EPUB 2/3 → kapitelweises Markdown mit Medien, metadata.yaml, manifest.json, conversion-report.json und Diagnose-Dateien; Code zeichengetreu, MathML → TeX, Fußnoten-Modi, sichere ZIP-/XML-Verarbeitung.
  • epub2md_merge.py: Gesamtdatei <Original>.md aus einem Ausgabeordner.
  • Optionen --code-language, --keep-wrap-markers; Warnung chapter-large; Titel überschriftsloser Seiten aus dem Inhalt.
  • Alle Befunde der QA-Prüfungen (R1–R7, QA2-01 bis QA2-19) behoben oder abgemildert.
  • README und Bedienungsanleitung.