- _box_type erkennt hinweis/note/notiz/anmerkung/info als NOTE; damit
gewinnt die Klasse "box hinweis" gegen ein Typwort im Titel ("Wichtige …")
- _separate_field_spans setzt kein Leerzeichen, wenn einer der Spans per CSS
display:none ist ("<u>x</u> ." → "<u>x</u>.")
- gefunden mit der neuen QA-Fixture 14-typography (QA-Matrix jetzt 85 Fälle,
inkl. epub2md_merge.py und Pandoc-Filter)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pandoc 3.1.3 kennt '> [!TIP]' nicht und druckt die Marke als Text.
pandoc/callouts.lua macht daraus in HTML/EPUB gerahmte, farbige Kästen
(<div class="callout callout-tip"> + CSS) und in LaTeX/DOCX/ODT einen
Zitatblock mit fettem Titel ("Tipp: …", englisch bei lang: en); auch für
den PDF-Weg über HTML.
- Buch-README: Pandoc-Befehle enthalten --lua-filter, wenn Callouts da sind
- Kastentitel ohne dekorative Symbole (<span class="box_icon">[»]</span>)
- README: css.py/pandoc in der Architektur, veralteter CSS-Hinweis korrigiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Erkennung: epub:type/role pagebreak (aria-label, title, Text) sowie
Seitenanker-IDs page_47, page37, seite-12 und p17 (nur leere a/span)
- Ausgabe: visible = \[S. 123\], comment = <!-- S. 123 -->, none (Standard)
- keine Marker in Code; Marker in Überschriften als Absatz davor;
Layout-Tabellen-Überschriften behalten ihre Seitenmarke
- Bericht: layout.page_markers; interne data-e2m-*-Attribute nie im HTML
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
--styles semantic (Standard): Hintergrundmarkierung wird zu <mark>, sonst
nur bedeutungstragende Gestaltung.
--styles html: Farbe, Hintergrund, Schriftgröße/-art, Kapitälchen und
Ausrichtung bleiben als <span style>/<div style> erhalten,
fremdsprachige Passagen als <span lang>. Übernommen wird nur, was vom
Grundstil abweicht (häufigste Werte aller Absätze, Schriftgröße ab ±15 %);
Formel- und Bildabsätze bekommen keine Ausrichtung; unsichere Werte werden
verworfen. Gilt im Fließtext, für Absätze und in HTML-Tabellen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kästen werden erkannt über aside/epub:type, Klassennamen (box, kasten, tipp,
hinweis, warnung, wichtig, exkurs …) oder einen CSS-Rahmen/-Hintergrund um
kurzen Fließtext. Folgen von Tipp-Absätzen werden gruppiert. Ausgabe:
'> [!TIP]' mit fettem Titel (GitHub-Alert/Obsidian-Callout). Der Typ kommt
aus Klasse, Titel oder erstem Wort; dekorative Symbolbilder entfallen;
umrahmte Codelistings bleiben Code. Option --boxes callout|quote|html|plain.
Beispielbücher: Python-Buch 72, C-Buch 83, Bildband 32 Tipps, Mathebuch 11
MATLAB-Minuten; Code-Treue und Links unverändert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Ein leerer Absatz (nur Leerzeichen/br) zwischen zwei Textabsätzen wird
zu '* * *'; mehrere ergeben einen Wechsel.
- Ornament-Absätze (***, ⁂ …) werden ebenfalls zu '* * *'.
- Leere divs (z. B. Springer ClearBoth) und reine Ankerabsätze zählen nicht.
- Gedichte (poem/verse/gedicht, z3998:poem) werden zum Zitatblock mit einer
Zeile pro Vers und Leerzeile zwischen Strophen.
Roman: 239 Szenenwechsel und 2 Gedichte (vorher verloren bzw. als lose
Absätze); die Sachbücher sind praktisch unverändert. Bericht: layout.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Neues Modul epub2md/css.py: Es wertet die Stylesheets des Buches aus
(Typ-, Klassen- und ID-Selektoren, Nachfahre/Kind, Spezifität,
style-Attribute; @media und Pseudoklassen werden ignoriert). Daraus werden:
- fett/kursiv → **/*, unterstrichen → <u>, durchgestrichen → ~~,
vertical-align super/sub → <sup>/<sub>
- Monospace-Einzelwörter → Inline-Code
- display:none → Element entfällt
Das gilt im Fließtext, für ganze Absätze und in HTML-Tabellen (dort als
HTML-Tags). Direkt aneinanderstoßende gleiche Hervorhebungen werden
zusammengefasst ('*x**y*' brach Markdown; Mathebuch: 305 → 249 Stellen).
Beispiele: C-Buch 799× kursiv und 648× fett, die vorher verloren gingen.
Abschaltbar mit --no-css-emphasis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nullbreiten-Zeichen (U+200B–U+200D, U+2060, U+FEFF) und weiche
Trennstriche (U+00AD) werden aus Fließtext, Alternativtexten und
Kapiteltiteln entfernt; Code bleibt unverändert. Im Mathebuch sind das
198 Zeichen (z. B. '1.1'). Abschaltbar mit --keep-invisible-chars; die
Anzahl steht im Bericht unter text_cleanup.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Überschriften, die genau einem Verzeichnisnamen entsprechen (Quellen,
Literatur, Glossar, Register, Index …), beginnen auch unterhalb von
--chapter-level eine eigene Datei mit passendem Typ. Die nächste Überschrift
gleicher oder höherer Ebene beendet den Abschnitt; innerhalb eines Kapitels,
das selbst ein Verzeichnis ist, wird nicht weiter geteilt. Im Roman-Beispiel
wird 'Quellen' aus dem Anhang so zum Literaturverzeichnis; die anderen vier
Beispielbücher bleiben unverändert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Getestete Befehle für HTML, EPUB, Word, ODT, PDF (LaTeX über HTML bzw.
weasyprint) und Kindle (AZW3 via Calibre), aus der Gesamtdatei wie aus
den Kapiteldateien, mit Installationshinweisen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- QA2-09: Formeln in HTML-Tabellen als MathML/Formelbild statt $…$; Inline-Noten
dort als HTML-Verweis (Markdown wird in HTML-Blöcken nicht gerendert)
- QA2-10: PDF-Weg Markdown → HTML → PDF in README, Bedienungsanleitung und
Buch-README. Beim direkten Weg Markdown → LaTeX verwirft Pandoc HTML-Tabellen
und <a id>-Ziele. Geprüft: C-Buch 405 Seiten, 34 Tabellen, 728/755 Links.
- QA2-11: Hinweis code-language-hint bei einsprachigen Büchern
- QA2-12: --strict bricht bei nicht dekodierbarem XHTML ab (Exit 3);
Hilfetext präzisiert
- QA2-13: verdächtig große Medien werden übersprungen (Fehler media-skipped,
Platzhalter) statt die ganze Konvertierung abzubrechen
- QA2-14: Formelklasse am <img> selbst wird erkannt
- QA2-15: wiederholte Diagnosen werden gezählt (count, ×n); MathML in
HTML-Tabellen zählt im Formelbericht mit
- QA2-16: Unicode-Buchstaben in Ankernamen bleiben erhalten
- QA2-17: keine leeren Links (#) auf den eigenen Kapitelanfang; keine
namespaced Attribute (epub:type → type=) in HTML-Tabellen
- QA2-18: nicht definierte Entitäten werden gemeldet (undefined-entity)
- QA2-19: Bild-Platzhalter ohne Kursivschrift (benachbarte ergaben **)
Regressionstests: tests/test_qa2_open.py (11 Tests, vorher alle rot).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ein Absatz "---" wurde zur Trennlinie, "===" bzw. "---" nach einem
Zeilenumbruch machte die vorige Zeile zur Setext-Überschrift. Solche
Zeilen erhalten jetzt einen Backslash.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
--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>
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>
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>
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>
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>
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>
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>
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>
_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>
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>
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>
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>
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>
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>
- 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
[](ziel) und startete Links an escapten \[-Klammern.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
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>
- 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>
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>