Files
docu_build/lib/build_index.py
T
Michael StanglandClaude Opus 4.8 e7aa3b4e4b feat: Fortna-Extraktion nach chapters/ + Sphinx-PDF-Build
Skripte zum Befuellen der Kapitelstruktur aus dem Fortna-Rohmaterial und
Aufbau eines vollstaendigen Sphinx/LaTeX-Builds (nur Code/Config/Doku,
generierte RST/Bilder/PDFs und Rohmaterial via .gitignore ausgeschlossen).

- lib/fortna_inventory.py: Rohmaterial scannen, Sprache+Zielkapitel+Aktion
  zuordnen, results/fortna_inventory.json schreiben
- lib/fortna_convert_chapters.py: 5 Hauptanleitungen volltextig (Text+Bilder)
  konvertieren, Verzeichnislisten (index.de.rst) fuer uebrige Kapitel
- lib/fortna_init_project.py: projekte/fortna/ (anlage.json, overrides, images)
- lib/build_index.py: index.rst mit toctrees aus chapters/**/*.de.rst generieren
- lib/extract_products.py: Symbolfont-Zeichen (PUA) auf Unicode mappen (clean_pua)
- conf.py: Sphinx-Build (lualatex, babel statt polyglossia, iconpackage=none)
- bin/: .bat/.sh-Wrapper fuer alle Skripte + build_pdf
- doc/: Konzept-Plan (plan_fortna_extraktion.md) und lib-Skript-Uebersicht
- requirements.txt: Sphinx + myst-parser ergaenzt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-23 13:23:32 +02:00

96 lines
3.2 KiB
Python

"""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",
}
# 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/<top>/...
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()