Files
docu_build/lib/fortna_init_project.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

118 lines
4.3 KiB
Python

"""Legt den projektspezifischen Ordner projekte/fortna/ an.
Erzeugt das Projekt-Repo-Geruest gemaess doc/Kernkonzepte.md:
projekte/fortna/
anlage.json # Projektmetadaten (Platzhalter, manuell zu schaerfen)
overrides/.gitkeep # projektspezifische Ueberschreibungen (leer)
images/.gitkeep # projektspezifische Bilder (leer)
README.md # kurze Erlaeuterung
Einmaliger Generator, kein Datei-Scan. Bestehende Dateien werden per Default NICHT
ueberschrieben (--force zum Erzwingen).
Verwendung:
python fortna_init_project.py
python fortna_init_project.py --force
"""
from __future__ import annotations
import argparse
import json
import logging
import os
from pathlib import Path
log = logging.getLogger(__name__)
ANLAGE_JSON = {
"projekt": {
"nummer": "500592",
"ka_nummer": "KA 135776",
"kunde": "Fortna / H&M",
"standort": "Cheb (Eger), CZ",
"sprachen": ["de"],
"_kommentar_sprachen": "EN/CZ vorhanden im Rohmaterial, aktuell nur DE gebaut",
"normen_region": "EU",
"_todo_rechtsgrundlage": "MRL 2006/42/EG (Altprojekt) vs. VO (EU) 2023/1230 - klaeren",
"base_version": ">=0.1.0",
},
"quelle": {
"_kommentar": "Rohmaterial-Verzeichnis (ausserhalb des Repos), Basis der Verzeichnislisten",
"rohmaterial": "c:/10-Develop/projekte/Fortna",
},
"maschinen": [
{"_kommentar": "Modul-Liste noch zu befuellen (03_anlagenbeschreibung via meta.yaml)"},
],
"zusatz_kapitel": [],
}
README = """\
# Projekt Fortna (500592 / KA 135776)
Projektspezifischer Ordner fuer die Fortna/H&M-Anlage in Cheb (CZ).
Struktur gemaess `doc/Kernkonzepte.md` (Zwei-Repo-Architektur):
- `anlage.json` - Projektmetadaten, Sprachen, Normenregion, Maschinenliste (ERP-Export-Platzhalter).
- `overrides/` - projektspezifische Ueberschreibungen von Base-Modulen/Kapiteln.
- `images/` - projektspezifische Bilder (Aufstellplan, Abnahmefotos, Kundenlogo).
## Herkunft der Inhalte
Die eigentliche Dokumentation wird aus dem Fortna-Rohmaterial
(`c:/10-Develop/projekte/Fortna`) erzeugt:
1. `lib/fortna_inventory.py` - inventarisiert das Rohmaterial (`results/fortna_inventory.json`).
2. `lib/fortna_convert_chapters.py --apply` - befuellt `chapters/`:
- Volltext + Bilder fuer die 5 Hauptanleitungen (Betriebs-/Wartungsanleitung, Funktionsbeschreibung ILS/OMNIFLO/LoadingLoop).
- Verzeichnislisten (`index.de.rst`) fuer alle uebrigen Kapitel (Zertifikate, Layouts, Schaltplaene, Lieferantendoku, Ersatzteile, Pruefberichte).
Hinweis: Die Verzeichnislisten referenzieren Pfade im Rohmaterial und kopieren keine PDFs.
Fuer einen produktiven PDF-Build mit eingebundenen Downloads muss das Rohmaterial zugaenglich
gemacht bzw. die referenzierten Dokumente ins Projekt uebernommen werden.
"""
def write_if_absent(path: Path, content: str, force: bool) -> None:
if path.exists() and not force:
log.info(" vorhanden (uebersprungen): %s", path.name)
return
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(content, encoding="utf-8")
log.info(" geschrieben: %s", path.name)
def main() -> None:
parser = argparse.ArgumentParser(description="Legt projekte/fortna/ an.")
parser.add_argument("--project-dir", default=None,
help="Zielordner (default: PROJECT/projekte/fortna)")
parser.add_argument("--force", action="store_true",
help="Bestehende Dateien ueberschreiben")
parser.add_argument("--verbose", "-v", action="store_true")
args = parser.parse_args()
logging.basicConfig(
level=logging.DEBUG if args.verbose else logging.INFO,
format="%(levelname)-7s %(message)s",
)
project_root = Path(os.environ.get("PROJECT", Path(__file__).resolve().parent.parent))
target = Path(args.project_dir) if args.project_dir else project_root / "projekte" / "fortna"
log.info("Projektordner: %s", target)
target.mkdir(parents=True, exist_ok=True)
write_if_absent(target / "anlage.json",
json.dumps(ANLAGE_JSON, ensure_ascii=False, indent=2) + "\n", args.force)
write_if_absent(target / "README.md", README, args.force)
write_if_absent(target / "overrides" / ".gitkeep", "", args.force)
write_if_absent(target / "images" / ".gitkeep", "", args.force)
log.info("Fertig.")
if __name__ == "__main__":
main()