Commit graph

22 commits

Author SHA1 Message Date
ff1a0ae5e4 fix: --report darf keine erzeugte Datei ersetzen, Schreibfehler mit Exit 1 (QA2-07)
--report OUTPUT/manifest.json ersetzte das Manifest stillschweigend durch
den Bericht. Ein nicht beschreibbares --report-Ziel endete nach bereits
geschriebener Ausgabe mit Exit 4 ("Interner Fehler"). Jetzt: Abbruch mit
Exit 1 vor dem Schreiben bzw. verständliche Meldung mit Exit 1;
Überschreibverhalten in der README dokumentiert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:02:50 +02:00
7de7efaaa2 fix: Leerzeilenfolgen innerhalb von Codeblöcken erhalten (QA2-06)
render_chapter reduzierte mehrfache Leerzeilen im gesamten Kapiteltext,
auch innerhalb von Codeblöcken (z. B. zwei Leerzeilen zwischen
Python-Funktionen nach PEP 8). Im Python-Beispielbuch waren 54 von 746
Listings nicht mehr zeichengetreu. Die Normalisierung gilt jetzt nur
außerhalb von Fences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:01:54 +02:00
e9120c84ef fix: Inline-SVG in HTML-Tabellen als <img> ausgeben (QA2-05)
Eingebettete SVGs in komplexen Tabellen wurden als Markdown-Bild
![…](…) in den HTML-Block geschrieben und daher nicht angezeigt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:00:58 +02:00
6be92645f4 fix: Endnotenverweise in HTML-Tabellen als HTML-Link ausgeben (QA2-04)
Mit --footnotes end-of-book wurde ein Verweis innerhalb einer als HTML
erhaltenen Tabelle als Markdown-Link [n](…) geschrieben. In einem
HTML-Block rendert Markdown nicht; der Verweis erschien als Rohtext.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:00:28 +02:00
def1d8b5c0 fix: Sprungziel für Notenverweise aus HTML-Tabellen bei GFM-Fußnoten (QA2-03)
Wird dieselbe Anmerkung aus einer als HTML erhaltenen Tabelle und aus
dem Fließtext referenziert, entstand nur eine [^fn-…]-Definition; der
HTML-Verweis <a href="#fn-…"> lief ins Leere. Die Definition erhält in
diesem Fall zusätzlich den Anker <a id="fn-…">.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:59:46 +02:00
467b070326 fix: Notennummer und Rücklinks nicht an Codeblock-Zeilen anhängen (QA2-02)
Bei Anmerkungen im Anker-Stil (--format commonmark, --footnotes
end-of-book) wurde der Rücklink [↩] an die schließende Fence-Zeile
angehängt. Der Codeblock blieb dadurch offen und verschluckte den Rest
der Datei; epub2md_merge.py schrieb die Links darin nicht mehr um.
Beginnt oder endet eine Anmerkung mit einem Block (Code, Tabelle,
Liste, Formel), stehen Nummer bzw. Rücklinks jetzt in eigenem Absatz.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:59:02 +02:00
8d7f3de3d7 fix: Tabellen mit | in Code, Formel oder Link als HTML ausgeben (QA2-01)
GFM trennt Tabellenzellen an jedem unmaskierten senkrechten Strich, auch
innerhalb von Code-Spans und Link-Zielen. Operator-Tabellen (|, ||, |=)
verloren dadurch Zellinhalte. Solche Tabellen werden jetzt wie andere
komplexe Tabellen als bereinigtes HTML mit Warnung ausgegeben.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:57:42 +02:00
b0421b849c docs: Bildband geprüft, Rezept für Bildbände in der Bedienungsanleitung
Bildband-EPUB (434 Bilder, 246 Figuren) konvertiert und validiert:
- 0 Warnungen, 968 Links/Bilder gültig
- alle 442 img-Elemente ausgegeben, 13/13 Bildunterschriften
- Gesamtdatei per Pandoc nach EPUB mit 433 Bildern
Kein Codefehler gefunden. README-Einschränkungen aktualisiert
(CSS-generierte Inhalte werden nicht übernommen).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:57:35 +02:00
84821a2fcd refactor: pipeline._convert in Teilschritte zerlegt (QA R5)
_convert (zuletzt 153 Zeilen) orchestriert jetzt nur noch die Teilschritte
_prepare_docs, _build_structure, _render (mit _report_wrap_markers und
_collect_remaining_media) und _assemble. Längste Funktion im Modul: 48 Zeilen.
Keine Verhaltensänderung: Die Ausgabe aller vier Beispielbücher (Standard
und end-of-book) ist bis auf Zeitstempel und Pfade byteidentisch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:50:19 +02:00
bdc611eefc feat: Abschnitt Weiterverarbeitung in der Buch-README (QA R7)
Die erzeugte README.md nennt den Merge-Befehl mit dem tatsächlichen
Ausgabeordner und passende Pandoc-Befehle. Bei Büchern mit Formeln
enthalten sie --mathml, ergänzt um einen Hinweis zur Formeldarstellung.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:48:41 +02:00
5f58589c2e feat: Leerzeichen zwischen aneinanderstoßenden Feld-Spans (QA R4)
Zwei <span>-Geschwister mit unterschiedlichen Klassen, ohne Text
dazwischen und mit Großbuchstabe oder Ziffer rechts bekommen ein
trennendes Leerzeichen. Initialen (D|as) und Wortteile (Haupt|bahnhof)
bleiben unberührt. Im Mathebuch werden so 49 Stellen korrigiert, die
anderen drei Beispielbücher bleiben unverändert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:47:40 +02:00
3ac5e1a8cc feat: Titel überschriftsloser Seiten aus dem Inhalt ableiten (QA R3)
Seiten ohne Überschrift, NAV-Eintrag und <title> werden am Inhalt erkannt:
- Bild am Buchanfang -> Cover
- Buchtitel und Autor -> Titelseite
- ©/ISBN/urheberrechtlich -> Impressum
- sonst die ersten acht Wörter
Erst danach greift der Dateiname. Im Roman-Beispiel werden aus
cinnertitle/cimprint so 'Titelseite' und 'Impressum'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:46:34 +02:00
6db834addd feat: Druck-Umbruchzeichen (↪/➥) in Codeblöcken auflösen (QA R6)
Fortsetzungszeilen werden wieder mit genau einem Leerzeichen zur
ursprünglichen Codezeile zusammengefügt. Im Python-Beispielbuch sind das
195 Stellen; danach lassen sich 247 statt 203 von 255 Python-Blöcken
parsen. Abschaltbar mit --keep-wrap-markers; der Bericht enthält
wrap_lines_joined pro Block und einen Hinweis pro Kapitel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:45:16 +02:00
f14e657e29 docs: BEDIENUNGSANLEITUNG.md für Anwender
Schritt-für-Schritt-Anleitung: Einrichtung, Umwandeln, Gesamtdatei,
Rezepte für Roman/Programmier-/Mathebuch/Fußnoten, Weiterverarbeitung
(Obsidian, Pandoc, RAG), erneutes Umwandeln, Warnungen und Fehlermeldungen
mit Abhilfe, FAQ und Optionsübersicht. README verlinkt sie.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:29:46 +02:00
3e44a2d484 docs: README um Schnellstart, Merge-Details, Pandoc-Workflow und Einschränkungen ergänzt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:27:36 +02:00
88888e5587 feat: epub2md_merge.py – Gesamtdatei aus einer epub2md-Ausgabe
Fügt die Kapiteldateien in Lesereihenfolge (manifest.json) zu einer
Markdown-Datei mit dem Original-EPUB-Namen (.md) zusammen. Dabei werden:
- Links zwischen Kapiteln zu Sprunglinks in der Gesamtdatei,
- kollidierende Anker pro Kapitel umbenannt,
- Medienpfade relativ zum Ziel umgeschrieben,
- doppelte Fußnotendefinitionen entfernt,
- Code nie verändert.
Optionen -o, --toc, --no-frontmatter und --force; abschließender
Linkcheck.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:24:47 +02:00
0dad1f7b2d fix: doppelte Tabellen-Anker und Bild-Links im Linkcheck
- Komplexe Tabellen mit verlinkter id erzeugten den Anker zweimal
  (<a id> und <table id>), also ungültiges HTML.
- Der Linkcheck übersah das äußere Ziel von Bild-Links
  [![alt](img)](ziel) und startete Links an escapten \[-Klammern.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:24:47 +02:00
557bbd3b36 chore: alte Pandoc-Hilfsskripte entfernen
convert_epub2md.sh und split-md-chapters.py sind durch epub2md.py ersetzt.
Überflüssige .gitignore-Einträge (buch.*, medien/) entfernt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:01:16 +02:00
cc36372329 feat: Option --code-language für Codeblöcke ohne erkannte Sprache
Weist Blöcken ohne erkannte Sprache ein vom Nutzer gewähltes Label zu.
Aliase wie py werden normalisiert, unbekannte Werte ergeben Exit 1.
Erkannte Labels haben Vorrang; im Bericht detected_by "option"
(QA-Befund R1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:01:07 +02:00
8afa1cc6d4 feat: Warnung chapter-large mit --chapter-level-Empfehlung für sehr große Kapitel
Kapiteldateien über 30 000 Wörtern mit mindestens zwei ##-Unterabschnitten
erzeugen eine Warnung mit der passenden --chapter-level-Empfehlung
(QA-Befund R2, z. B. Roman mit Teilen als h1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:00:02 +02:00
3b07fcf01a fix: Befunde aus der QA-Prüfung (Prompt_Kontrolle.md)
- F1: Nicht beschreibbares Ausgabeziel liefert eine verständliche
  Meldung und Exit 1 statt "Interner Fehler" (Exit 4).
- F2: Anker von <dt id> stehen vor dem fett gesetzten Glossarbegriff
  statt innerhalb der **-Marker.
- F3: Formeln als <img src="*.svg"> erscheinen im Bericht mit
  origin "svg" statt "image".

Regressionstests für alle drei Befunde ergänzt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 19:47:45 +02:00
02449734a2 feat: epub2md – EPUB nach kapitelweisem Markdown
Kommandozeilenwerkzeug, das DRM-freie EPUB-2/3-Dateien offline in
kapitelweise Markdown-Dateien umwandelt. Erzeugt werden außerdem Medien,
metadata.yaml, manifest.json, conversion-report.json und Diagnose-Dateien.

- Spine-basierte Kapitelbildung mit --chapter-level, epub:type-Abschnitten,
  Fortsetzungsdateien und Erkennung von Layout-Überschriften
- Code mit exakter Einrückung, sicheren Fences und konservativer
  Spracherkennung
- MathML->TeX (konservativ), TeX aus alt-Texten, SVG-/Bildformeln
  bleiben Bilder
- Fußnoten-Modi end-of-chapter, end-of-book, inline und keep-links
- Interne Links/Anker werden umgeschrieben, Linkcheck über die Ausgabe
- Sicher: kein Entpacken, Schutz vor Path Traversal und XXE,
  DRM-Erkennung, atomares Schreiben, --force nur für frühere Ausgaben
- 82 pytest-Tests mit synthetischen EPUBs und Invariantentests für Beispiele/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 19:33:42 +02:00