67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
"""Pré-rend les diagrammes Mermaid du guide intégré en PNG (#105).
|
|
|
|
Scanne les blocs ``<pre class="mermaid-code">`` de frontend/index.html,
|
|
extrait leur code, et appelle scripts/render_guide_diagram.mjs (Chromium +
|
|
mermaid v11) pour produire ``backend/assets/guide_diagrams/<sha1>.png``.
|
|
Ces PNG sont commités : le PDF du guide les embarque comme vraies images
|
|
(WeasyPrint ne sait pas exécuter Mermaid).
|
|
|
|
Usage : python scripts/build_guide_diagrams.py
|
|
"""
|
|
import hashlib
|
|
import html
|
|
import json
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
ASSETS = ROOT / "backend" / "assets" / "guide_diagrams"
|
|
|
|
|
|
def extract_mermaid() -> dict[str, str]:
|
|
page_html = (ROOT / "frontend" / "index.html").read_text(encoding="utf-8")
|
|
out: dict[str, str] = {}
|
|
for m in re.finditer(
|
|
r'<pre class="mermaid-code"><code class="language-mermaid">(.*?)</code></pre>',
|
|
page_html,
|
|
re.DOTALL,
|
|
):
|
|
code = m.group(1)
|
|
code = html.unescape(code).strip()
|
|
sha = hashlib.sha1(code.encode("utf-8")).hexdigest()[:16]
|
|
out[sha] = code
|
|
return out
|
|
|
|
|
|
def main() -> int:
|
|
jobs = extract_mermaid()
|
|
if not jobs:
|
|
print("aucun bloc mermaid dans index.html")
|
|
return 1
|
|
todo = {k: v for k, v in jobs.items() if not (ASSETS / f"{k}.png").exists()}
|
|
print("diagrammes:", len(jobs), "| à rendre:", len(todo))
|
|
if not todo:
|
|
return 0
|
|
with tempfile.NamedTemporaryFile("w", suffix=".json", delete=False, encoding="utf-8") as f:
|
|
json.dump(todo, f)
|
|
path = f.name
|
|
r = subprocess.run(
|
|
["node", str(ROOT / "scripts" / "render_guide_diagram.mjs"), path],
|
|
cwd=ROOT,
|
|
capture_output=True,
|
|
check=False,
|
|
text=True,
|
|
timeout=300,
|
|
)
|
|
print(r.stdout[-2000:])
|
|
if r.returncode != 0:
|
|
print(r.stderr[-2000:])
|
|
return r.returncode
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|