mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-09 14:38:59 +02:00
refactor(diagram): the triplet is one gstack-render call
SVG, PNG and excalidraw from one invocation over the content-addressed bundle staged under /tmp/gstack-render; every diagram type gets an excalidraw export; gstack-render picks the engine and prints ENGINE=; the diagram E2E gates on either engine. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -2,9 +2,13 @@
|
||||
|
||||
Offline diagram rendering for make-pdf and /diagram. One self-contained HTML
|
||||
page (`dist/diagram-render.html`, ~9MB) bundles mermaid, the excalidraw export
|
||||
utilities, and the official mermaid→excalidraw converter. The browse daemon
|
||||
loads it with `load-html`; callers drive it through `browse js` and pull bytes
|
||||
back with `js --out`.
|
||||
utilities, and the official mermaid→excalidraw converter. Callers open it
|
||||
through `lib/aside-render.ts` (the TypeScript API make-pdf embeds) or
|
||||
`bin/gstack-render.ts` (the CLI the /diagram skill runs) — in the Aside browser
|
||||
when it is running, otherwise in gstack's own headless browser (the browse
|
||||
daemon; `ENGINE=` on the CLI's first line says which). Either way the page's
|
||||
directory is served on 127.0.0.1 for one render, `--eval` calls the page API,
|
||||
and `--out` copies each result out (strings verbatim, data URLs as bytes).
|
||||
|
||||
The built page is **committed** (eng-review D2): rendering works with zero
|
||||
network at install time and render time, and there is no npm supply-chain
|
||||
@@ -16,15 +20,15 @@ fails CI if `dist/` is edited by hand or falls out of sync with `BUILD_INFO.json
|
||||
| Function | In → Out |
|
||||
|---|---|
|
||||
| `__renderMermaid(id, text)` | mermaid text → SVG string. `id` must be unique per fence (`mermaid-fence-<n>`) — it namespaces every internal SVG id. |
|
||||
| `__mermaidToExcalidraw(text)` | mermaid text → `.excalidraw` scene JSON (flowcharts fully; other types degrade upstream). |
|
||||
| `__mermaidToExcalidraw(text)` | mermaid text → `.excalidraw` scene JSON (flowcharts and sequence diagrams as editable elements; other types fall back to one image element and log `Error processing Mermaid diagram` to the console). |
|
||||
| `__excalidrawToSvg(sceneJson)` | scene JSON → SVG string (Excalifont embedded, offline). |
|
||||
| `__rasterize(svg, targetWidthPx)` | SVG → PNG data URL. Callers own DPI math: `targetWidthPx = placed width (in) × 300`. Throws on tainted canvas. |
|
||||
| `__downscaleRaster(dataUri, targetWidthPx, mime)` | raster data URI → smaller data URI at `targetWidthPx` (same mime). make-pdf uses it to normalize oversized photos to print resolution. |
|
||||
| `__mountForScreenshot(svg, px)` | taint-proof fallback: mounts SVG at `#raster-stage` for `browse screenshot --selector`. |
|
||||
| `__mountForScreenshot(svg, px)` | taint-proof fallback: mounts SVG at `#raster-stage` for `gstack-render --screenshot out.png --selector '#raster-stage'`. |
|
||||
| `__probeImage(src)` | data URI/URL → `{width, height}` JSON. |
|
||||
| `__bundleInfo` | `{ name, deps }` — pinned dependency versions baked at build. |
|
||||
|
||||
Readiness: poll until `#status` text is `ready` (or `browse wait '#done'`).
|
||||
Readiness: poll until `#status` text is `ready` (or `gstack-render ... --wait-selector '#done'`).
|
||||
Page errors accumulate in `window.__errors`.
|
||||
|
||||
## Updating
|
||||
|
||||
Reference in New Issue
Block a user