#!/usr/bin/env python3 """Zeigt eine BPMN-Datei oder eine Arbeitsschritt-.md als Diagramm im Browser – offline, ohne PICTURE. Grundlage ist werkzeuge/vorschau/vorschau.html mit der lokal eingebetteten Bibliothek bpmn-js (bpmn.io), gestaltet mit Bootstrap und dem Stil der AG (werkzeuge/bootstrap/, werkzeuge/stil/). Das Skript erzeugt daraus eine einzelne, in sich geschlossene HTML-Datei (Bibliotheken, Stile, Icon-Schrift und Diagramm eingebettet) und öffnet sie im Standardbrowser. Es wird nichts übertragen; die Seite lädt nichts aus dem Netz. Aufrufe (aus dem Workspace-Root): python scripts/vorschau.py Prozessbibliothek/antrag-pruefen/antrag-pruefen.bpmn python scripts/vorschau.py entwuerfe/antrag-pruefen.md # .md wird vorher umgewandelt python scripts/vorschau.py --ausgabe vorschau.html --nicht-oeffnen python scripts/vorschau.py --stdin < datei.bpmn > vorschau.html # Filter, z. B. als Gitea-Renderer Ohne Python: werkzeuge/vorschau/vorschau.html direkt im Browser öffnen und eine .bpmn hineinziehen. Exit-Code: 0 = in Ordnung, 1 = Datei fehlt oder lässt sich nicht umwandeln. """ from __future__ import annotations import argparse import base64 import json import re import sys import tempfile import webbrowser from pathlib import Path ROOT = Path(__file__).resolve().parents[1] VORSCHAU = ROOT / "werkzeuge" / "vorschau" VORLAGE = VORSCHAU / "vorschau.html" SKILL = ROOT / ".agents" / "skills" / "sn-bpmn" # Stellen in vorschau.html, die beim Einbetten ersetzt werden. Ein Test prüft, dass es sie gibt. EINBETTUNGEN = { '': ("style", "../bootstrap/bootstrap.min.css"), '': ("style", "../bootstrap/icons/bootstrap-icons.min.css"), '': ("style", "../stil/ag_prozesse.css"), '': ("style", "bpmn-js/diagram-js.css"), '': ("style", "bpmn-js/bpmn-js.css"), '': ("script", "bpmn-js/bpmn-navigated-viewer.production.min.js"), } PLATZHALTER_DIAGRAMM = "const EINGEBETTET = null;" PLATZHALTER_NAME = "const DATEINAME = null;" # Sequenzen, die einen eingebetteten