"""Zerlegt den rohen Feature-Text in Sektionen — nur für die Anzeige. Format: titel (eine Zeile), art, ziel, dann wiederholbare -Blöcke; - und -Blöcke gehören zur davorstehenden Funktion. Präambel, unbekannte Marker und verwaiste regel/flow-Blöcke landen in `sonstiges` (wird nicht angezeigt, aber beim Speichern erhalten). Trennzeilen aus Bindestrichen (---) sind reine Optik und werden ignoriert. """ import re MARKER = re.compile(r"^\s*$") TRENNER = re.compile(r"^-{3,}\s*$") def zerlege(roh: str) -> dict: # Erst in Blöcke (schluessel, text) in Dateireihenfolge schneiden bloecke = [] aktuell = None # None = Präambel vor dem ersten Marker puffer = [] def ablegen(): text = "\n".join(z for z in puffer if not TRENNER.match(z)).strip() if text: bloecke.append((aktuell, text)) puffer.clear() for zeile in roh.splitlines(): m = MARKER.match(zeile) if m: ablegen() aktuell = m.group(1) else: puffer.append(zeile) ablegen() titel = [] ziel = [] funktionen = [] sonstiges = [] art = [] for schluessel, text in bloecke: if schluessel == "titel": titel.append(text) elif schluessel == "art": art.append(text) elif schluessel == "ziel": ziel.append(text) elif schluessel == "funktion": funktionen.append({"text": text, "regeln": [], "flow": []}) elif schluessel == "regel" and funktionen: funktionen[-1]["regeln"].append(text) elif schluessel == "flow" and funktionen: funktionen[-1]["flow"].append(text) else: # Präambel, unbekannter Marker, regel/flow ohne funktion sonstiges.append(text) for f in funktionen: f["flow"] = "\n".join(f["flow"]) # Titel ist eine Zeile: erste nicht-leere titel_zeilen = [z.strip() for t in titel for z in t.splitlines() if z.strip()] return { "titel": titel_zeilen[0] if titel_zeilen else "", "art": "optional" if art and art[0].strip().lower() == "optional" else "kern", "ziel": "\n\n".join(ziel), "funktionen": funktionen, "sonstiges": "\n\n".join(sonstiges), }