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>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
eb9237217e
commit
e7aa3b4e4b
@@ -0,0 +1,117 @@
|
||||
"""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()
|
||||
Reference in New Issue
Block a user