import re from pathlib import Path def extract_app_ui_body(source_text: str) -> str: """ Extrahiert den HTML-Block aus der alten app_ui()-Funktion. """ match = re.search(r"def app_ui[^(]*\([^)]*\):\s*\n(\s*)return \"\"\"", source_text) if not match: raise RuntimeError("Konnte def app_ui() mit return \"\"\" nicht finden.") indent = match.group(1) start = match.end() # direkt hinter return \"\"\" beginnt der HTML-Code close_pattern = "\n" + indent + '"""' end = source_text.find(close_pattern, start) if end == -1: raise RuntimeError("Konnte schließende \"\"\" nicht finden.") body = source_text[start:end] return body def build_frontend_studio_file(html_body: str) -> str: """ Baut die vollständige Datei studio.py mit APIRouter + HTML-Block. """ header = ( "from fastapi import APIRouter\n" "from fastapi.responses import HTMLResponse\n\n" "router = APIRouter()\n\n\n" "@router.get(\"/app\", response_class=HTMLResponse)\n" "def app_ui():\n" " return \"\"\"" ) footer = "\n \"\"\"\n" return header + html_body + footer def main(): backend_dir = Path(__file__).parent # 1) Sicherungsdatei bevorzugt backup_path = backend_dir / "frontend_app_backup.py" if backup_path.exists(): source_path = backup_path print(f"Verwende Sicherungsdatei: {source_path}") else: # 2) Fallback auf frontend/app.py candidate = backend_dir / "frontend" / "app.py" if not candidate.exists(): raise RuntimeError( "Keine Quelle gefunden: frontend_app_backup.py oder frontend/app.py fehlen." ) source_path = candidate print(f"Verwende Datei: {source_path}") source_text = source_path.read_text(encoding="utf-8") html_body = extract_app_ui_body(source_text) studio_text = build_frontend_studio_file(html_body) studio_path = backend_dir / "frontend" / "studio.py" studio_path.write_text(studio_text, encoding="utf-8") print(f"frontend/studio.py erfolgreich erzeugt: {studio_path}") if __name__ == "__main__": main()