feat: Verzeichnisse unterhalb von --chapter-level als eigene Datei

Ü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>
This commit is contained in:
Dieter Schlüter 2026-10-06 00:45:03 +02:00
commit 2125555e2a

View file

@ -164,3 +164,24 @@ def test_adjacent_field_spans_get_a_separator(convert):
assert "J. Liesen, V. Mehrmann Lineare Algebra Springer Studium" in text
assert "Das Wetter war schlecht." in text
assert "Hauptbahnhof und x<sub>i</sub>." in text
def test_special_sections_below_chapter_level_get_own_files(convert):
body = ("<h1>Anhang</h1><p>Vorbemerkung.</p>"
"<h2><em>Quellen</em></h2><ul><li>Archiv A</li><li>Buch B, ISBN 978-0-201-89683-1</li></ul>"
"<h2>Danksagung</h2><p>Danke allen.</p>"
"<h2>Literatur und Film</h2><p>Ein normaler Abschnitt.</p>")
run = convert(Book(docs=[Doc("a.xhtml", body)]))
assert [p.name for p in run.chapters()] == ["001-anhang.md", "002-quellen.md", "003-danksagung.md"]
assert "Literatur und Film" in run.chapter("003") # not a special heading: stays in the chapter
assert "Archiv A" in run.chapter("002") and "Danke" not in run.chapter("002")
assert frontmatter(run.chapter("002"))["epub_type"] == ["bibliography"]
readme = (run.out / "README.md").read_text(encoding="utf-8")
assert "Literatur / Quellen: [Quellen](chapters/002-quellen.md)" in readme
def test_special_chapter_is_not_split_further(convert):
body = ("<h1>Literatur</h1><h2>Quellen</h2><p>Q1</p><h2>Sekundärliteratur</h2><p>S1</p>"
"<h1>Register</h1><h2>A</h2><p>Apfel</p><h2>Index</h2><p>x</p>")
run = convert(Book(docs=[Doc("a.xhtml", body)]))
assert [p.name for p in run.chapters()] == ["001-literatur.md", "002-register.md"]