"""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 (je eine `- `-Zeile pro Eintrag) gehören zur davorstehenden Funktion. Alt-Format wird weiter gelesen: -Blöcke (einer je Regel) und (heute testen) werden zusammengeführt. Präambel, unbekannte Marker und verwaiste 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 = [] regeln = [] funktionen = [] sonstiges = [] art = [] for schluessel, text in bloecke: if schluessel == "titel": titel.append(text) elif schluessel == "art": art.append(text) elif schluessel == "ziel": # vor der ersten Funktion: Karten-Ziel, danach: Ziel der Funktion (funktionen[-1]["ziel"] if funktionen else ziel).append(text) elif schluessel == "funktion": funktionen.append({"text": text, "ziel": [], "regeln": [], "testen": []}) elif schluessel in ("regel", "regeln"): # vor der ersten Funktion: Karten-Regeln, danach: Regeln der Funktion (funktionen[-1]["regeln"] if funktionen else regeln).append(text) elif schluessel in ("flow", "testen") and funktionen: funktionen[-1]["testen"].append(text) else: # Präambel, unbekannter Marker, regeln/testen ohne funktion sonstiges.append(text) for f in funktionen: f["ziel"] = "\n\n".join(f["ziel"]) f["regeln"] = "\n".join(f["regeln"]) f["testen"] = "\n".join(f["testen"]) # 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), "regeln": "\n".join(regeln), "funktionen": funktionen, "sonstiges": "\n\n".join(sonstiges), }