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>
96 lines
3.2 KiB
Python
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()
|