"""Generiert index.rst mit toctrees aus allen vorhandenen chapters/**/*.de.rst. Baut pro Top-Level-Kapitel (00..10) einen Abschnitt mit einer toctree-Direktive, die alle deutschsprachigen RST-Bausteine dieses Kapitels einbindet. So bleibt der Build robust gegenueber neuen/entfernten Bausteinen (kein Handpflegen der toctrees). Verwendung: python build_index.py """ from __future__ import annotations import logging import os import re from pathlib import Path log = logging.getLogger(__name__) # Defekte Altbestaende aus fruehen Testlaeufen, die nicht in die toctree # aufgenommen werden (siehe exclude_patterns in conf.py). Relativ zu chapters/. SKIP = { "02_sicherheit/risikobewertung/rb_fortna_h_m_500592_ev12_20260311.de.rst", "00_inhaltsverzeichnis/contens_obsah_500592_135776_v2_1_en_cz.de.rst", # NORD-Antriebsdoku aus fruehem Testlauf: gehoert als Lieferantendoku in die # Verzeichnisliste 08_lieferantendoku/antriebe, nicht als Volltext ins Anhang. "10_anhang/01_getriebe_loadingloopantr_de.de.rst", "10_anhang/02_motor_loadingloopantr_de.de.rst", } # Lesbare Titel je Top-Level-Kapitelordner CHAPTER_TITLES = { "00_inhaltsverzeichnis": "Inhaltsverzeichnis", "01_zertifikate": "Zertifikate", "02_sicherheit": "Sicherheit", "03_anlagenbeschreibung": "Anlagenbeschreibung", "04_betrieb": "Betrieb", "05_wartung": "Wartung", "06_steuerung": "Steuerung", "07_ersatzteile": "Ersatzteile", "08_lieferantendoku": "Lieferantendokumentation", "09_technische_unterlagen": "Technische Unterlagen", "10_anhang": "Anhang", } def rst_underline(text: str, char: str) -> str: return f"{text}\n{char * max(len(text), 3)}\n" def main() -> None: logging.basicConfig(level=logging.INFO, format="%(levelname)-7s %(message)s") project_root = Path(os.environ.get("PROJECT", Path(__file__).resolve().parent.parent)) chapters = project_root / "chapters" # RST-Dokumentnamen (ohne .rst-Endung, posix, relativ zum project_root) # je Top-Level-Kapitel einsammeln. by_chapter: dict[str, list[str]] = {} for rst in sorted(chapters.rglob("*.de.rst")): rel = rst.relative_to(project_root) if rst.relative_to(chapters).as_posix() in SKIP: continue top = rel.parts[1] # chapters//... docname = rel.as_posix()[: -len(".rst")] # Sphinx-Docname ohne Endung by_chapter.setdefault(top, []).append(docname) lines: list[str] = [] lines.append(".. Automatisch generiert von lib/build_index.py - nicht manuell editieren.") lines.append("") title = "Anlagendokumentation Fortna" lines.append("#" * len(title)) lines.append(title) lines.append("#" * len(title)) lines.append("") lines.append("Projekt 500592 / KA 135776 - H&M Cheb (Eger), CZ") lines.append("") total = 0 for top in sorted(by_chapter): docs = by_chapter[top] total += len(docs) heading = CHAPTER_TITLES.get(top, top) lines.append("") lines.append(rst_underline(heading, "*")) lines.append(".. toctree::") lines.append(" :maxdepth: 2") lines.append("") for doc in sorted(docs): lines.append(f" {doc}") lines.append("") index_path = project_root / "index.rst" index_path.write_text("\n".join(lines) + "\n", encoding="utf-8") log.info("index.rst geschrieben: %d Kapitel, %d Bausteine", len(by_chapter), total) if __name__ == "__main__": main()