@p10node/graphviz 0.0.0-stage → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["DiagramError","DiagramError","DiagramError","layered","N","nodes","C","clusters","outs","isSource","i","reversed","edges","state","starts","k","s","stack","top","v","ei","w","sameGroup","g","E","flat","inE","outE","topo","deg","l","queue","rank","propagate","it","moved","order","lo","hi","win","wout","r","o","changed","minRank","a","b","maxRank","chain","out","c","lca","ca","cb","W","n","H","kind","cl","rk","loopX","owner","add","h","up","down","link","budget","chains","labelAt","span","lab","labelRank","dc","at","d","f","cMin","cMax","bl","br","borderChain","V","layers","seen","roots","pos","setPos","key","globalOrder","computeGlobal","sortLayer","layer","root","groups","group","settle","sum","cnt","slots","cs","j","flatten","crossings","total","ls","pairs","tree","le","bary","u","wt","nb","best","bestCross","goingDown","rankH","kids","startExt","endExt","extraStart","extraEnd","ry","height","half","sep","ka","kb","x","pav","off","bs","both","use","uw","L0","varOf","NV","val","adj","indeg","edge","done","pushed","minX","maxX","centre","portX","sides","step","outEdges","dir","t","p","q","pts","straight","band","segs","m","boxes","x0","x1","y0","y1","ASCII","charWidth","cp","textWidth","mono","ch","text","size","bold","lineHeight","measure","lines","wrap","line","max","cur","word","next","esc","NAMED","color","THEME","paint","Svg","y","rx","cx","cy","x2","y2","points","closed","lh","attrs","bg","pathData","cmds","labelText","name","e","DiagramError$1","GraphBuilder","defShape","id","patch","cluster","label","SIZE","SMALL","PX","PY","LH","sectionSize","cols","row","nodeBox","across","ss","tw","th","nodePaint","drawNode","txt","svg","tx","ty","poly","rt","b2","drawSections","HEAD_LEN","unit","dx","dy","drawHead","nx","ny","back","side","col","head","many","trimEnd","last","end","start","len","edgeColor","MARGIN","MAX_NODES","MAX_EDGES","renderGraph","clusterIdx","nodeIdx","parentOf","inCluster","resolve","leaving","labelled","loops","lnodes","spread","SPREAD","ledges","pad","lclusters","same","grp","titleH","LW","LH2","tr","depth","clusterBox","titles","z","cw","st","labels","geom","c1","c2","lp","g2","cv","sample","clip","tail","dHead","first","dTail","tailStart","tl","midpoint","inside","list","atStart","tokenize","src","lineStart","prev","plus","SHAPES","ARROWS","arrow","dflt","dotColor","hsv","htmlLabel","plainLabel","graph","recordRows","parseDot","toks","peek","isP","eat","kw","graphs","directed","nodeAttrs","anon","graphAttrs","clusterAttrs","attrList","nodeRef","scope","stmts","which","setGraph","ends","subgraph","from","to","sname","isCluster","parent","cid","style","applyEdge","applyNode","shapeName","rows","renderDotAll","svgToPng","img","canvas","scale","reject","show","svgs","DiagramError","message","renderEach","source","render","renderTo","ds","target","toPng"],"sources":["../../../src/core/diagram/layout.ts","../../../src/core/diagram/svg.ts","../../../src/core/diagram/graph.ts","../../../src/core/diagram/dot.ts","../../diagram/src/dom.ts","../src/index.ts"],"sourcesContent":["/**\n * Layered (\"hierarchical\") graph layout, in the spirit of Sugiyama's method:\n * cycles broken by reversing DFS back edges → ranks (longest path, then each node moved to where its edges are\n * shortest) → long edges split by dummy nodes (edge labels ride on one) → crossings reduced by barycenter sweeps\n * that keep clusters contiguous → coordinates by weighted isotonic regression per rank (long edges pulled straight)\n * → clusters legalised so no foreign node falls inside a cluster's box.\n *\n * Works in \"layout space\": ranks go down (y), the order within a rank goes right (x). The caller turns LR / BT / RL\n * graphs by swapping or mirroring axes (and node sizes) on the way in and out.\n */\nimport type { Pt } from './svg'\n\nexport interface LNode {\n /** size across the rank (x) and along the rank axis (y) */\n w: number\n h: number\n /** innermost cluster, -1 for none */\n cluster: number\n /** extra room after the node in its rank (self loops) */\n loop?: number\n /** edges meeting a flat side spread out along it (boxes) instead of meeting at its middle */\n spread?: boolean\n}\n\nexport interface LEdge {\n v: number\n w: number\n minlen: number\n weight: number\n label?: { w: number; h: number }\n}\n\nexport interface LCluster {\n parent: number\n /** padding: cross start (left), cross end (right), rank start (top), rank end (bottom) */\n pad: [number, number, number, number]\n /** least width (the title) */\n minW: number\n}\n\nexport interface LayoutOpts {\n nodesep: number\n ranksep: number\n edgesep: number\n /** groups of nodes put on one rank (Graphviz rank=same) */\n sameRank?: number[][]\n}\n\nexport interface Seg {\n c: 'L' | 'C'\n p: Pt[]\n}\n\nexport interface EdgeGeom {\n start: Pt\n segs: Seg[]\n label?: Pt\n}\n\nexport interface Box {\n x: number\n y: number\n w: number\n h: number\n}\n\nexport interface LayoutOut {\n nodes: Pt[]\n /** null for self loops (the caller draws them) */\n edges: (EdgeGeom | null)[]\n /** null for a cluster without nodes */\n clusters: (Box | null)[]\n w: number\n h: number\n}\n\nconst REAL = 0\nconst DUMMY = 1\nconst LEFT = 2\nconst RIGHT = 3\n\ninterface Item {\n node: number\n cluster: number\n key: number\n idx: number\n items: Item[]\n}\n\nexport function layered(nodes: LNode[], edges: LEdge[], clusters: LCluster[], o: LayoutOpts): LayoutOut {\n const N = nodes.length\n const C = clusters.length\n\n // ---------------------------------------------------------------- 1. break cycles\n const outs: number[][] = Array.from({ length: N }, () => [])\n const isSource = new Array(N).fill(true)\n edges.forEach((e, i) => {\n if (e.v === e.w) return\n outs[e.v].push(i)\n isSource[e.w] = false\n })\n const reversed = new Array(edges.length).fill(false)\n const state = new Uint8Array(N)\n const starts = [...Array.from({ length: N }, (_, k) => k).filter((k) => isSource[k]), ...Array.from({ length: N }, (_, k) => k)]\n for (const s of starts) {\n if (state[s]) continue\n state[s] = 1\n const stack: [number, number][] = [[s, 0]]\n while (stack.length) {\n const top = stack[stack.length - 1]\n const v = top[0]\n if (top[1] < outs[v].length) {\n const ei = outs[v][top[1]++]\n const w = edges[ei].w\n if (state[w] === 1) reversed[ei] = true\n else if (!state[w]) {\n state[w] = 1\n stack.push([w, 0])\n }\n } else {\n state[v] = 2\n stack.pop()\n }\n }\n }\n const sameGroup = new Map<number, number>()\n o.sameRank?.forEach((g, k) => g.forEach((v) => sameGroup.set(v, k)))\n const E = edges.map((e, i) => {\n const flat = sameGroup.has(e.v) && sameGroup.get(e.v) === sameGroup.get(e.w)\n return reversed[i] ? { v: e.w, w: e.v, minlen: flat ? 0 : e.minlen, weight: e.weight } : { v: e.v, w: e.w, minlen: flat ? 0 : e.minlen, weight: e.weight }\n })\n\n // ---------------------------------------------------------------- 2. ranks\n const inE: number[][] = Array.from({ length: N }, () => [])\n const outE: number[][] = Array.from({ length: N }, () => [])\n E.forEach((e, i) => {\n if (e.v === e.w) return\n outE[e.v].push(i)\n inE[e.w].push(i)\n })\n const topo: number[] = []\n {\n const deg = inE.map((l) => l.length)\n const queue = Array.from({ length: N }, (_, k) => k).filter((k) => !deg[k])\n while (queue.length) {\n const v = queue.shift()!\n topo.push(v)\n for (const ei of outE[v]) if (!--deg[E[ei].w]) queue.push(E[ei].w)\n }\n // (a cycle left by minlen-0 edges between same-rank nodes: keep the rest in input order)\n if (topo.length < N) for (let k = 0; k < N; k++) if (!topo.includes(k)) topo.push(k)\n }\n const rank = new Array(N).fill(0)\n const propagate = () => {\n for (const v of topo) for (const ei of outE[v]) rank[E[ei].w] = Math.max(rank[E[ei].w], rank[v] + E[ei].minlen)\n }\n propagate()\n for (let it = 0; it < 60; it++) {\n let moved = false\n const order = it % 2 ? [...topo].reverse() : topo\n for (const v of order) {\n if (sameGroup.has(v)) continue\n let lo = -Infinity\n let hi = Infinity\n let win = 0\n let wout = 0\n for (const ei of inE[v]) {\n lo = Math.max(lo, rank[E[ei].v] + E[ei].minlen)\n win += E[ei].weight\n }\n for (const ei of outE[v]) {\n hi = Math.min(hi, rank[E[ei].w] - E[ei].minlen)\n wout += E[ei].weight\n }\n let r = rank[v]\n if (win > wout && lo > -Infinity) r = lo\n else if (wout > win && hi < Infinity) r = hi\n if (r !== rank[v]) {\n rank[v] = r\n moved = true\n }\n }\n if (!moved) break\n }\n if (o.sameRank?.length) {\n for (let it = 0; it < 12; it++) {\n let changed = false\n for (const g of o.sameRank) {\n const r = Math.max(...g.map((v) => rank[v]))\n for (const v of g) if (rank[v] !== r) {\n rank[v] = r\n changed = true\n }\n }\n propagate()\n if (!changed) break\n }\n }\n const minRank = rank.reduce((a, b) => Math.min(a, b), 0)\n for (let v = 0; v < N; v++) rank[v] -= minRank\n let maxRank = rank.reduce((a, b) => Math.max(a, b), 0)\n\n // ---------------------------------------------------------------- 3. dummies, cluster borders\n const chain = (c: number) => {\n const out: number[] = []\n for (let k = c; k >= 0; k = clusters[k].parent) out.unshift(k)\n return out\n }\n const lca = (a: number, b: number) => {\n const ca = chain(a)\n const cb = chain(b)\n let k = 0\n while (k < ca.length && k < cb.length && ca[k] === cb[k]) k++\n return k ? ca[k - 1] : -1\n }\n const W: number[] = nodes.map((n) => n.w)\n const H: number[] = nodes.map((n) => n.h)\n const kind: number[] = nodes.map(() => REAL)\n const cl: number[] = nodes.map((n) => n.cluster)\n const rk: number[] = [...rank]\n const loopX: number[] = nodes.map((n) => n.loop ?? 0)\n const owner: number[] = nodes.map(() => -1)\n const add = (w: number, h: number, k: number, c: number, r: number) => {\n W.push(w)\n H.push(h)\n kind.push(k)\n cl.push(c)\n rk.push(r)\n loopX.push(0)\n owner.push(k === LEFT || k === RIGHT ? c : -1)\n return W.length - 1\n }\n /** neighbours with weights: up (rank - 1) and down (rank + 1) */\n const up: [number, number][][] = []\n const down: [number, number][][] = []\n const link = (a: number, b: number, w: number) => {\n while (up.length < W.length) {\n up.push([])\n down.push([])\n }\n down[a].push([b, w])\n up[b].push([a, w])\n }\n // long edges cost a node per rank they cross: past this the picture is unreadable anyway\n let budget = 60000\n for (const e of E) budget -= Math.max(0, Math.abs(rank[e.w] - rank[e.v]) - 1)\n if (budget < 0) throw new Error('The diagram is too large to draw')\n const chains: (number[] | null)[] = []\n const labelAt: number[] = []\n E.forEach((e, i) => {\n if (e.v === e.w) {\n chains.push(null)\n labelAt.push(-1)\n return\n }\n const c = [e.v]\n const span = rank[e.w] - rank[e.v]\n const lab = edges[i].label\n const labelRank = lab && span >= 2 ? rank[e.v] + Math.floor(span / 2) : -1\n const dc = lca(cl[e.v], cl[e.w])\n let at = -1\n for (let r = rank[e.v] + 1; r < rank[e.w]; r++) {\n const d = r === labelRank ? add(lab!.w, lab!.h, DUMMY, dc, r) : add(0, 0, DUMMY, dc, r)\n if (r === labelRank) at = d\n c.push(d)\n }\n c.push(e.w)\n chains.push(span > 0 ? c : null)\n labelAt.push(at)\n for (let k = 0; k + 1 < c.length; k++) {\n if (span <= 0) break\n const a = c[k]\n const b = c[k + 1]\n const f = (kind[a] === DUMMY ? 1 : 0) + (kind[b] === DUMMY ? 1 : 0)\n link(a, b, e.weight * (f === 2 ? 8 : f === 1 ? 2 : 1))\n }\n })\n // flat edges (same rank): not part of the layering\n const flat = E.map((e, i) => e.v !== e.w && rank[e.v] === rank[e.w] && !chains[i])\n\n const cMin = new Array(C).fill(Infinity)\n const cMax = new Array(C).fill(-Infinity)\n for (let v = 0; v < W.length; v++) {\n for (const c of chain(cl[v])) {\n cMin[c] = Math.min(cMin[c], rk[v])\n cMax[c] = Math.max(cMax[c], rk[v])\n }\n }\n const bl: number[][] = Array.from({ length: C }, () => [])\n const br: number[][] = Array.from({ length: C }, () => [])\n const borderChain: [number, number][][] = []\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n for (let r = cMin[c]; r <= cMax[c]; r++) {\n bl[c][r] = add(0, 0, LEFT, c, r)\n br[c][r] = add(0, 0, RIGHT, c, r)\n }\n }\n while (up.length < W.length) {\n up.push([])\n down.push([])\n }\n for (let v = 0; v < W.length; v++) borderChain.push([])\n for (let c = 0; c < C; c++) {\n for (let r = cMin[c]; r < cMax[c]; r++) {\n borderChain[bl[c][r]].push([bl[c][r + 1], 1])\n borderChain[bl[c][r + 1]].push([bl[c][r], 1])\n borderChain[br[c][r]].push([br[c][r + 1], 1])\n borderChain[br[c][r + 1]].push([br[c][r], 1])\n }\n }\n const V = W.length\n maxRank = rk.reduce((a, b) => Math.max(a, b), maxRank)\n\n // ---------------------------------------------------------------- 4. order within ranks\n let layers: number[][] = Array.from({ length: maxRank + 1 }, () => [])\n {\n const seen = new Uint8Array(V)\n const roots = Array.from({ length: V }, (_, k) => k)\n .filter((k) => kind[k] !== LEFT && kind[k] !== RIGHT)\n .sort((a, b) => rk[a] - rk[b] || a - b)\n for (const s of roots) {\n if (seen[s]) continue\n const stack = [s]\n while (stack.length) {\n const v = stack.pop()!\n if (seen[v]) continue\n seen[v] = 1\n layers[rk[v]].push(v)\n for (let k = down[v].length - 1; k >= 0; k--) if (!seen[down[v][k][0]]) stack.push(down[v][k][0])\n }\n }\n for (let v = 0; v < V; v++) if (kind[v] === LEFT || kind[v] === RIGHT) layers[rk[v]].push(v)\n }\n const pos = new Float64Array(V)\n const setPos = () => layers.forEach((l) => l.forEach((v, k) => (pos[v] = k)))\n setPos()\n const key = new Float64Array(V)\n const globalOrder = new Float64Array(C)\n const computeGlobal = () => {\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n let s = 0\n for (let r = cMin[c]; r <= cMax[c]; r++) s += pos[bl[c][r]] / Math.max(1, layers[r].length)\n globalOrder[c] = s / (cMax[c] - cMin[c] + 1)\n }\n }\n const sortLayer = (layer: number[], r: number): number[] => {\n if (!C) return [...layer].sort((a, b) => key[a] - key[b] || pos[a] - pos[b])\n const root: Item = { node: -1, cluster: -1, key: 0, idx: 0, items: [] }\n const groups = new Map<number, Item>()\n const group = (c: number): Item => {\n if (c < 0) return root\n let g = groups.get(c)\n if (!g) {\n g = { node: -1, cluster: c, key: 0, idx: pos[bl[c][r]] ?? 0, items: [] }\n groups.set(c, g)\n group(clusters[c].parent).items.push(g)\n }\n return g\n }\n for (const v of layer) {\n if (kind[v] === LEFT) group(owner[v])\n else if (kind[v] !== RIGHT) group(cl[v]).items.push({ node: v, cluster: -1, key: key[v], idx: pos[v], items: [] })\n }\n const settle = (g: Item): [number, number] => {\n let sum = 0\n let cnt = 0\n for (const it of g.items) {\n if (it.node >= 0) {\n sum += it.key\n cnt++\n } else {\n const [s, n] = settle(it)\n sum += s\n cnt += n\n }\n }\n if (g.cluster >= 0) g.key = cnt ? sum / cnt : key[bl[g.cluster][r]]\n g.items.sort((a, b) => a.key - b.key || a.idx - b.idx)\n // sibling clusters keep one left-to-right order on every rank\n const slots = g.items.map((it, k) => (it.cluster >= 0 ? k : -1)).filter((k) => k >= 0)\n const cs = slots.map((k) => g.items[k]).sort((a, b) => globalOrder[a.cluster] - globalOrder[b.cluster])\n slots.forEach((k, j) => (g.items[k] = cs[j]))\n return [sum, cnt]\n }\n settle(root)\n const out: number[] = []\n const flatten = (g: Item) => {\n for (const it of g.items) {\n if (it.node >= 0) out.push(it.node)\n else {\n out.push(bl[it.cluster][r])\n flatten(it)\n out.push(br[it.cluster][r])\n }\n }\n }\n flatten(root)\n return out\n }\n const crossings = (ls: number[][]): number => {\n let total = 0\n for (let r = 0; r + 1 < ls.length; r++) {\n const pairs: [number, number][] = []\n for (const v of ls[r]) for (const [w] of down[v]) pairs.push([pos[v], pos[w]])\n pairs.sort((a, b) => a[0] - b[0] || a[1] - b[1])\n const n = ls[r + 1].length + 1\n const tree = new Float64Array(n + 1)\n for (let k = 0; k < pairs.length; k++) {\n // count earlier pairs with a larger bottom position\n let le = 0\n for (let i = pairs[k][1] + 1; i > 0; i -= i & -i) le += tree[i]\n total += k - le\n for (let i = pairs[k][1] + 1; i <= n; i += i & -i) tree[i]++\n }\n }\n return total\n }\n const bary = (v: number, nb: [number, number][][]) => {\n let s = 0\n let w = 0\n for (const [u, wt] of nb[v]) {\n s += pos[u] * wt\n w += wt\n }\n return w ? s / w : pos[v]\n }\n for (const l of layers) {\n for (const v of l) key[v] = pos[v]\n }\n computeGlobal()\n layers = layers.map((l, r) => sortLayer(l, r))\n setPos()\n let best = layers.map((l) => [...l])\n let bestCross = crossings(layers)\n for (let it = 0; it < 24 && bestCross > 0; it++) {\n computeGlobal()\n const goingDown = it % 2 === 0\n for (let k = 1; k <= maxRank; k++) {\n const r = goingDown ? k : maxRank - k\n const nb = goingDown ? up : down\n for (const v of layers[r]) key[v] = bary(v, nb)\n layers[r] = sortLayer(layers[r], r)\n layers[r].forEach((v, j) => (pos[v] = j))\n }\n const c = crossings(layers)\n if (c < bestCross) {\n bestCross = c\n best = layers.map((l) => [...l])\n }\n }\n layers = best\n setPos()\n\n // ---------------------------------------------------------------- 5. rank positions\n const rankH = layers.map((l) => l.reduce((a, v) => Math.max(a, H[v]), 0))\n const kids: number[][] = Array.from({ length: C }, () => [])\n clusters.forEach((c, k) => c.parent >= 0 && kids[c.parent].push(k))\n const startExt = (c: number): number => clusters[c].pad[2] + Math.max(0, ...kids[c].filter((k) => cMin[k] === cMin[c]).map(startExt))\n const endExt = (c: number): number => clusters[c].pad[3] + Math.max(0, ...kids[c].filter((k) => cMax[k] === cMax[c]).map(endExt))\n const extraStart = new Array(maxRank + 1).fill(0)\n const extraEnd = new Array(maxRank + 1).fill(0)\n for (let c = 0; c < C; c++) {\n if (cMin[c] > cMax[c]) continue\n extraStart[cMin[c]] = Math.max(extraStart[cMin[c]], startExt(c))\n extraEnd[cMax[c]] = Math.max(extraEnd[cMax[c]], endExt(c))\n }\n const ry: number[] = []\n for (let r = 0; r <= maxRank; r++) {\n ry[r] = r === 0 ? rankH[0] / 2 + extraStart[0] : ry[r - 1] + rankH[r - 1] / 2 + extraEnd[r - 1] + o.ranksep + extraStart[r] + rankH[r] / 2\n }\n const height = ry[maxRank] + rankH[maxRank] / 2 + extraEnd[maxRank]\n\n // ---------------------------------------------------------------- 6. coordinates across ranks\n const half = (v: number) => (kind[v] === LEFT || kind[v] === RIGHT ? 0 : W[v] / 2)\n const sep = (a: number, b: number) => {\n let g = loopX[a]\n const ka = kind[a]\n const kb = kind[b]\n if (ka === LEFT) g += clusters[owner[a]].pad[0]\n if (ka === RIGHT) g += o.nodesep / 2\n if (kb === RIGHT) g += clusters[owner[b]].pad[1]\n if (kb === LEFT) g += o.nodesep / 2\n if (ka < LEFT && kb < LEFT) g += ka === DUMMY && kb === DUMMY ? o.edgesep : ka === DUMMY || kb === DUMMY ? (o.nodesep + o.edgesep) / 2 : o.nodesep\n return half(a) + half(b) + g\n }\n const x = new Float64Array(V)\n for (const l of layers) for (let k = 1; k < l.length; k++) x[l[k]] = x[l[k - 1]] + sep(l[k - 1], l[k])\n const pav = (layer: number[], d: number[], wt: number[]) => {\n const n = layer.length\n const off = [0]\n for (let k = 1; k < n; k++) off[k] = off[k - 1] + sep(layer[k - 1], layer[k])\n const bs: { s: number; e: number; w: number; wt: number }[] = []\n for (let k = 0; k < n; k++) {\n bs.push({ s: k, e: k, w: wt[k], wt: wt[k] * (d[k] - off[k]) })\n while (bs.length > 1) {\n const a = bs[bs.length - 2]\n const b = bs[bs.length - 1]\n if (a.wt / a.w < b.wt / b.w) break\n a.e = b.e\n a.w += b.w\n a.wt += b.wt\n bs.pop()\n }\n }\n for (const b of bs) for (let k = b.s; k <= b.e; k++) x[layer[k]] = b.wt / b.w + off[k]\n }\n const ITER = 10\n for (let it = 0; it < ITER; it++) {\n const both = it >= ITER - 2\n const goingDown = it % 2 === 0\n for (let k = 0; k <= maxRank; k++) {\n const r = goingDown ? k : maxRank - k\n const l = layers[r]\n if (!l.length) continue\n const d: number[] = []\n const wt: number[] = []\n for (const v of l) {\n let s = 0\n let w = 0\n const use = (nb: [number, number][]) => {\n for (const [u, uw] of nb) {\n s += x[u] * uw\n w += uw\n }\n }\n if (both || goingDown) use(up[v])\n if (both || !goingDown) use(down[v])\n use(borderChain[v])\n d.push(w ? s / w : x[v])\n wt.push(w || 0.01)\n }\n pav(l, d, wt)\n }\n }\n // legalise clusters: one left and one right border per cluster on every rank it spans\n const L0 = V\n const varOf = (v: number) => (kind[v] === LEFT ? L0 + 2 * owner[v] : kind[v] === RIGHT ? L0 + 2 * owner[v] + 1 : v)\n if (C) {\n const NV = V + 2 * C\n const val = new Float64Array(NV)\n for (let v = 0; v < V; v++) val[v] = x[v]\n for (let c = 0; c < C; c++) {\n val[L0 + 2 * c] = Infinity\n val[L0 + 2 * c + 1] = -Infinity\n }\n for (let v = 0; v < V; v++) {\n if (kind[v] === LEFT) val[varOf(v)] = Math.min(val[varOf(v)], x[v])\n if (kind[v] === RIGHT) val[varOf(v)] = Math.max(val[varOf(v)], x[v])\n }\n const adj: [number, number][][] = Array.from({ length: NV }, () => [])\n const indeg = new Int32Array(NV)\n const edge = (a: number, b: number, s: number) => {\n adj[a].push([b, s])\n indeg[b]++\n }\n for (const l of layers) for (let k = 1; k < l.length; k++) edge(varOf(l[k - 1]), varOf(l[k]), sep(l[k - 1], l[k]))\n for (let c = 0; c < C; c++) if (cMin[c] <= cMax[c]) edge(L0 + 2 * c, L0 + 2 * c + 1, Math.max(clusters[c].minW, clusters[c].pad[0] + clusters[c].pad[1]))\n const queue: number[] = []\n for (let v = 0; v < NV; v++) if (!indeg[v]) queue.push(v)\n let done = 0\n const pushed = new Float64Array(val)\n while (queue.length) {\n const v = queue.pop()!\n done++\n for (const [w, s] of adj[v]) {\n if (Number.isFinite(pushed[v])) pushed[w] = Math.max(pushed[w], pushed[v] + s)\n if (!--indeg[w]) queue.push(w)\n }\n }\n if (done === NV) for (let v = 0; v < V; v++) x[v] = pushed[varOf(v)]\n }\n let minX = Infinity\n let maxX = -Infinity\n for (let v = 0; v < V; v++) {\n minX = Math.min(minX, x[v] - half(v))\n maxX = Math.max(maxX, x[v] + half(v) + loopX[v])\n }\n if (!Number.isFinite(minX)) minX = maxX = 0\n for (let v = 0; v < V; v++) x[v] -= minX\n\n // ---------------------------------------------------------------- 7. output\n const centre = (v: number): Pt => ({ x: x[v], y: ry[rk[v]] })\n // where each edge meets its end nodes: the middle of the side, or spread along a box's side by the order of what\n // the edges lead to (the next point on the edge)\n const portX = new Map<string, number>()\n {\n const sides = new Map<string, { i: number; nx: number }[]>()\n const at = (key: string, i: number, nx: number) => {\n let l = sides.get(key)\n if (!l) sides.set(key, (l = []))\n l.push({ i, nx })\n }\n E.forEach((_, i) => {\n const c = chains[i]\n if (!c || flat[i]) return\n if (nodes[c[0]]?.spread) at(`${c[0]}:b`, i, x[c[1]])\n if (nodes[c[c.length - 1]]?.spread) at(`${c[c.length - 1]}:t`, i, x[c[c.length - 2]])\n })\n for (const [key, l] of sides) {\n if (l.length < 2) continue\n const v = Number(key.split(':')[0])\n l.sort((a, b) => a.nx - b.nx || a.i - b.i)\n const step = Math.min(36, (W[v] * 0.7) / (l.length - 1))\n l.forEach((it, k) => portX.set(`${key}:${it.i}`, x[v] + (k - (l.length - 1) / 2) * step))\n }\n }\n const outEdges: (EdgeGeom | null)[] = E.map((e, i) => {\n if (e.v === e.w) return null\n if (flat[i]) {\n const a = centre(e.v)\n const b = centre(e.w)\n const dir = Math.sign(b.x - a.x) || 1\n const s = { x: a.x + (dir * W[e.v]) / 2, y: a.y }\n const t = { x: b.x - (dir * W[e.w]) / 2, y: b.y }\n const [p, q] = reversed[i] ? [t, s] : [s, t]\n return { start: p, segs: [{ c: 'L', p: [q] }], label: edges[i].label ? { x: (p.x + q.x) / 2, y: p.y - 10 } : undefined }\n }\n const c = chains[i]\n if (!c) return null\n const pts: Pt[] = []\n const straight: boolean[] = []\n const a = centre(c[0])\n pts.push({ x: portX.get(`${c[0]}:b:${i}`) ?? a.x, y: a.y + H[c[0]] / 2 })\n for (let k = 1; k + 1 < c.length; k++) {\n const p = centre(c[k])\n const band = rankH[rk[c[k]]] / 2\n if (band > 0.5) {\n pts.push({ x: p.x, y: p.y - band }, { x: p.x, y: p.y + band })\n straight.push(false, true)\n } else {\n pts.push(p)\n straight.push(false)\n }\n }\n const b = centre(c[c.length - 1])\n pts.push({ x: portX.get(`${c[c.length - 1]}:t:${i}`) ?? b.x, y: b.y - H[c[c.length - 1]] / 2 })\n straight.push(false)\n if (reversed[i]) {\n pts.reverse()\n straight.reverse()\n }\n const segs: Seg[] = []\n for (let k = 1; k < pts.length; k++) {\n const p = pts[k - 1]\n const q = pts[k]\n if (straight[k - 1] || Math.abs(p.x - q.x) < 0.5) segs.push({ c: 'L', p: [q] })\n else {\n const m = (p.y + q.y) / 2\n segs.push({ c: 'C', p: [{ x: p.x, y: m }, { x: q.x, y: m }, q] })\n }\n }\n return { start: pts[0], segs, label: labelAt[i] >= 0 ? centre(labelAt[i]) : undefined }\n })\n const boxes: (Box | null)[] = clusters.map((_, c) => {\n if (cMin[c] > cMax[c]) return null\n let x0 = Infinity\n let x1 = -Infinity\n for (let r = cMin[c]; r <= cMax[c]; r++) {\n x0 = Math.min(x0, x[bl[c][r]])\n x1 = Math.max(x1, x[br[c][r]])\n }\n const y0 = ry[cMin[c]] - rankH[cMin[c]] / 2 - startExt(c)\n const y1 = ry[cMax[c]] + rankH[cMax[c]] / 2 + endExt(c)\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 }\n })\n return {\n nodes: Array.from({ length: N }, (_, v) => centre(v)),\n edges: outEdges,\n clusters: boxes,\n w: maxX - minX,\n h: height,\n }\n}\n","/**\n * SVG output for the diagram renderers: text metrics (no DOM: the worker has none), escaping, colors and a small\n * builder. Pictures are self-contained (no scripts, links, external references, markers or CSS) so they show the\n * same in an <img>, in Word and in a PDF export.\n */\n\nexport const FONT = 'Helvetica, Arial, sans-serif'\nexport const MONO = 'Menlo, Consolas, \"Courier New\", monospace'\n\n/** Helvetica advance widths (1/1000 em), U+0020 to U+007E */\nconst ASCII = [\n 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556,\n 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556,\n 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584,\n]\n\nfunction charWidth(cp: number): number {\n if (cp >= 0x20 && cp <= 0x7e) return ASCII[cp - 0x20]\n // combining marks (Vietnamese tones…), zero-width characters\n if ((cp >= 0x300 && cp <= 0x36f) || (cp >= 0x200b && cp <= 0x200f) || cp === 0xfe0f) return 0\n // CJK, Hangul, kana, full-width forms, emoji\n if ((cp >= 0x1100 && cp <= 0x115f) || (cp >= 0x2e80 && cp <= 0xa4cf) || (cp >= 0xac00 && cp <= 0xd7a3) || (cp >= 0xf900 && cp <= 0xfaff) || (cp >= 0xfe30 && cp <= 0xfe4f) || (cp >= 0xff00 && cp <= 0xff60) || cp >= 0x1f000) return 1000\n return 580\n}\n\n/** Width in px of one line of text at `size` px. */\nexport function textWidth(text: string, size = 14, bold = false, mono = false): number {\n let w = 0\n if (mono) {\n for (const ch of text) w += charWidth(ch.codePointAt(0)!) ? 600 : 0\n } else for (const ch of text) w += charWidth(ch.codePointAt(0)!)\n return (w * size * (bold ? 1.08 : 1)) / 1000\n}\n\nexport const lineHeight = (size: number) => Math.round(size * 1.3)\n\n/** Size of a block of lines. */\nexport function measure(lines: string[], size = 14, bold = false): { w: number; h: number } {\n let w = 0\n for (const l of lines) w = Math.max(w, textWidth(l, size, bold))\n return { w, h: lines.length * lineHeight(size) }\n}\n\n/** Breaks lines longer than `max` px at spaces. */\nexport function wrap(lines: string[], max: number, size = 14, bold = false): string[] {\n const out: string[] = []\n for (const line of lines) {\n if (textWidth(line, size, bold) <= max) {\n out.push(line)\n continue\n }\n let cur = ''\n for (const word of line.split(/ +/)) {\n const next = cur ? cur + ' ' + word : word\n if (cur && textWidth(next, size, bold) > max) {\n out.push(cur)\n cur = word\n } else cur = next\n }\n out.push(cur)\n }\n return out\n}\n\nexport const esc = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n\nconst NAMED = /^[a-z]{3,24}$/\n\n/** A color from the source, or undefined when it is not one a picture can carry safely (#rgb, rgb(), a name). */\nexport function color(c: string | undefined): string | undefined {\n if (!c) return undefined\n const v = c.trim().toLowerCase()\n if (/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(v)) return v\n if (/^[0-9a-f]{6}$/.test(v)) return '#' + v\n if (/^rgba?\\(\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*,\\s*[\\d.]+%?\\s*(,\\s*[\\d.]+%?\\s*)?\\)$/.test(v)) return v\n if (/^rgba?\\(\\s*[\\d.]+%?\\s+[\\d.]+%?\\s+[\\d.]+%?\\s*(\\/\\s*[\\d.]+%?\\s*)?\\)$/.test(v)) return v\n if (NAMED.test(v)) return v === 'transparent' ? 'none' : v\n return undefined\n}\n\nexport const THEME = {\n ink: '#1f2937',\n line: '#4b5563',\n fill: '#eef2fb',\n stroke: '#5b6f9a',\n muted: '#6b7280',\n cluster: '#f7f8fb',\n clusterStroke: '#a3adc2',\n note: '#fff6c8',\n noteStroke: '#c9a227',\n label: '#ffffff',\n dark: '#2d3748',\n /** categorical series: pie slices, gantt sections */\n series: ['#5b8def', '#f2994a', '#3fb68b', '#e5596b', '#9b6be0', '#d4b33a', '#3bb3c9', '#e07bb8', '#8c9aaf', '#7cbd4a'],\n}\n\nexport interface Paint {\n fill?: string\n stroke?: string\n sw?: number\n dash?: string\n opacity?: number\n}\n\nconst n = (v: number) => (Number.isFinite(v) ? Math.round(v * 100) / 100 : 0)\n\nfunction paint(p: Paint): string {\n let a = ` fill=\"${p.fill ?? 'none'}\"`\n if (p.stroke) a += ` stroke=\"${p.stroke}\" stroke-width=\"${n(p.sw ?? 1)}\"`\n if (p.stroke && p.dash) a += ` stroke-dasharray=\"${p.dash}\"`\n if (p.opacity !== undefined) a += ` opacity=\"${n(p.opacity)}\"`\n return a\n}\n\nexport interface TextOpts {\n size?: number\n anchor?: 'start' | 'middle' | 'end'\n bold?: boolean\n italic?: boolean\n underline?: boolean\n color?: string\n mono?: boolean\n}\n\nexport class Svg {\n private out: string[] = []\n\n rect(x: number, y: number, w: number, h: number, p: Paint, rx = 0): this {\n this.out.push(`<rect x=\"${n(x)}\" y=\"${n(y)}\" width=\"${n(w)}\" height=\"${n(h)}\"${rx ? ` rx=\"${n(rx)}\"` : ''}${paint(p)}/>`)\n return this\n }\n\n circle(cx: number, cy: number, r: number, p: Paint): this {\n this.out.push(`<circle cx=\"${n(cx)}\" cy=\"${n(cy)}\" r=\"${n(r)}\"${paint(p)}/>`)\n return this\n }\n\n ellipse(cx: number, cy: number, rx: number, ry: number, p: Paint): this {\n this.out.push(`<ellipse cx=\"${n(cx)}\" cy=\"${n(cy)}\" rx=\"${n(rx)}\" ry=\"${n(ry)}\"${paint(p)}/>`)\n return this\n }\n\n line(x1: number, y1: number, x2: number, y2: number, p: Paint): this {\n this.out.push(`<line x1=\"${n(x1)}\" y1=\"${n(y1)}\" x2=\"${n(x2)}\" y2=\"${n(y2)}\"${paint(p)}/>`)\n return this\n }\n\n poly(points: [number, number][], p: Paint, closed = true): this {\n const pts = points.map(([x, y]) => `${n(x)},${n(y)}`).join(' ')\n this.out.push(`<${closed ? 'polygon' : 'polyline'} points=\"${pts}\"${paint(p)}/>`)\n return this\n }\n\n /** `d` uses numbers rounded by the caller (see `pathData`) */\n path(d: string, p: Paint): this {\n this.out.push(`<path d=\"${d}\"${paint(p)}/>`)\n return this\n }\n\n /** Lines of text, the block centered vertically on `y`. */\n text(x: number, y: number, lines: string[] | string, o: TextOpts = {}): this {\n const ls = typeof lines === 'string' ? [lines] : lines\n const size = o.size ?? 14\n const lh = lineHeight(size)\n const top = y - (ls.length * lh) / 2\n let attrs = ` font-family=\"${esc(o.mono ? MONO : FONT)}\" font-size=\"${size}\" fill=\"${o.color ?? THEME.ink}\"`\n if (o.anchor && o.anchor !== 'start') attrs += ` text-anchor=\"${o.anchor}\"`\n if (o.bold) attrs += ' font-weight=\"bold\"'\n if (o.italic) attrs += ' font-style=\"italic\"'\n if (o.underline) attrs += ' text-decoration=\"underline\"'\n ls.forEach((l, k) => {\n if (!l) return\n // baseline: the middle of the line box plus about a third of the font size\n this.out.push(`<text x=\"${n(x)}\" y=\"${n(top + k * lh + lh / 2 + size * 0.35)}\"${attrs}>${esc(l)}</text>`)\n })\n return this\n }\n\n raw(s: string): this {\n this.out.push(s)\n return this\n }\n\n /** the elements drawn so far */\n body(): string {\n return this.out.join('')\n }\n\n /** The picture; `bg` paints the canvas. */\n toString(w: number, h: number, bg = '#ffffff'): string {\n const W = Math.ceil(w)\n const H = Math.ceil(h)\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${W}\" height=\"${H}\" viewBox=\"0 0 ${W} ${H}\">` +\n (bg ? `<rect x=\"0\" y=\"0\" width=\"${W}\" height=\"${H}\" fill=\"${bg}\"/>` : '') +\n this.out.join('') +\n '</svg>'\n )\n }\n}\n\nexport type Pt = { x: number; y: number }\n\nexport function pathData(cmds: { c: 'M' | 'L' | 'C' | 'Q'; p: Pt[] }[]): string {\n return cmds.map((k) => k.c + k.p.map((q) => `${n(q.x)} ${n(q.y)}`).join(' ')).join(' ')\n}\n\n/** Mermaid / PlantUML / DOT label text: entity codes, <br>, markdown-string quotes, tags dropped. */\nexport function labelText(s: string): string {\n return s\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/\\\\n/g, '\\n')\n .replace(/<\\/?[a-z][^>]*>/gi, '')\n .replace(/#(\\d+);/g, (_, d: string) => String.fromCodePoint(Math.min(Number(d), 0x10ffff)))\n .replace(/#([a-z]+);/gi, (m, name: string) => ({ quot: '\"', amp: '&', lt: '<', gt: '>', nbsp: ' ', apos: \"'\" })[name.toLowerCase()] ?? m)\n .replace(/&(quot|amp|lt|gt|nbsp|apos|#\\d+);/g, (m, e: string) =>\n e[0] === '#' ? String.fromCodePoint(Math.min(Number(e.slice(1)), 0x10ffff)) : (({ quot: '\"', amp: '&', lt: '<', gt: '>', nbsp: ' ', apos: \"'\" }) as Record<string, string>)[e] ?? m,\n )\n}\n\n/** Mermaid \"`markdown string`\": the text without the markup */\nexport const unMarkdown = (s: string) => s.replace(/\\*\\*(.+?)\\*\\*|__(.+?)__/g, '$1$2').replace(/(^|\\W)[*_](\\S.*?\\S|\\S)[*_](?=\\W|$)/g, '$1$2')\n\nexport class DiagramError extends Error {}\n","/**\n * Node-and-edge diagrams (flowcharts, class, state, ER, use case, component diagrams, Graphviz graphs): the model the\n * parsers build, node sizes and shapes, and the picture from the layered layout.\n */\nimport { layered, type EdgeGeom, type LCluster, type LEdge, type LNode, type Seg } from './layout'\nimport { DiagramError, lineHeight, measure, pathData, Svg, textWidth, THEME, wrap, type Pt } from './svg'\n\nexport type Dir = 'TB' | 'BT' | 'LR' | 'RL'\n\nexport type Shape =\n | 'rect'\n | 'round'\n | 'stadium'\n | 'subroutine'\n | 'cylinder'\n | 'circle'\n | 'doublecircle'\n | 'ellipse'\n | 'diamond'\n | 'hexagon'\n | 'lean-r'\n | 'lean-l'\n | 'trap-b'\n | 'trap-t'\n | 'flag'\n | 'note'\n | 'folder'\n | 'component'\n | 'box3d'\n | 'cloud'\n | 'octagon'\n | 'triangle'\n | 'actor'\n | 'start'\n | 'end'\n | 'bar'\n | 'point'\n | 'none'\n\nexport type Head = 'none' | 'arrow' | 'open' | 'triangle' | 'diamond' | 'odiamond' | 'circle' | 'ocircle' | 'cross' | 'one' | 'zero-one' | 'one-many' | 'zero-many' | 'many'\n\nexport interface NodeStyle {\n fill?: string\n stroke?: string\n color?: string\n dash?: string\n sw?: number\n bold?: boolean\n italic?: boolean\n hidden?: boolean\n}\n\n/** A compartment of a class / entity / record box: rows of cells (cells line up in columns) */\nexport interface Section {\n rows: string[][]\n bold?: boolean\n italic?: boolean\n center?: boolean\n}\n\nexport interface GNode {\n id: string\n label: string\n shape: Shape\n style?: NodeStyle\n sections?: Section[]\n cluster?: string\n}\n\nexport interface GEdge {\n from: string\n to: string\n label?: string\n head?: Head\n tail?: Head\n line?: 'solid' | 'dashed' | 'dotted' | 'thick' | 'hidden'\n minlen?: number\n headLabel?: string\n tailLabel?: string\n color?: string\n sw?: number\n}\n\nexport interface GCluster {\n id: string\n label: string\n parent?: string\n style?: NodeStyle\n}\n\nexport interface Graph {\n dir: Dir\n nodes: GNode[]\n edges: GEdge[]\n clusters: GCluster[]\n sameRank?: string[][]\n title?: string\n}\n\nexport interface Rendered {\n svg: string\n w: number\n h: number\n}\n\n/** Builds a graph: nodes are created on first mention and refined by later ones. */\nexport class GraphBuilder {\n readonly g: Graph\n private byId = new Map<string, GNode>()\n private clusterIds = new Map<string, GCluster>()\n\n constructor(dir: Dir = 'TB', private defShape: Shape = 'rect') {\n this.g = { dir, nodes: [], edges: [], clusters: [] }\n }\n\n has(id: string) {\n return this.byId.has(id)\n }\n\n get(id: string) {\n return this.byId.get(id)\n }\n\n node(id: string, patch: Partial<GNode> = {}, cluster?: string): GNode {\n let n = this.byId.get(id)\n if (!n) {\n n = { id, label: id, shape: this.defShape, cluster }\n this.byId.set(id, n)\n this.g.nodes.push(n)\n }\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) (n as unknown as Record<string, unknown>)[k] = v\n return n\n }\n\n edge(e: GEdge, cluster?: string): GEdge {\n if (!this.clusterIds.has(e.from)) this.node(e.from, {}, cluster)\n if (!this.clusterIds.has(e.to)) this.node(e.to, {}, cluster)\n this.g.edges.push(e)\n return e\n }\n\n cluster(id: string, label: string, parent?: string): GCluster {\n let c = this.clusterIds.get(id)\n if (!c) {\n c = { id, label, parent }\n this.clusterIds.set(id, c)\n this.g.clusters.push(c)\n } else if (label) c.label = label\n // a node of that name (mentioned before) is the cluster\n const n = this.byId.get(id)\n if (n) {\n this.byId.delete(id)\n this.g.nodes.splice(this.g.nodes.indexOf(n), 1)\n }\n return c\n }\n\n isCluster(id: string) {\n return this.clusterIds.has(id)\n }\n}\n\n// ---------------------------------------------------------------- sizes\n\nconst SIZE = 14\nconst SMALL = 13\nconst PX = 14\nconst PY = 9\nconst LH = lineHeight(SIZE)\n\nconst lines = (s: string) => s.split('\\n')\nconst r = (v: number) => Math.round(v * 100) / 100\n\ninterface Box {\n w: number\n h: number\n text: string[]\n}\n\nfunction sectionSize(s: Section): { w: number; h: number; cols: number[] } {\n const cols: number[] = []\n for (const row of s.rows) row.forEach((c, k) => (cols[k] = Math.max(cols[k] ?? 0, textWidth(c, SMALL, s.bold))))\n const w = cols.reduce((a, b) => a + b, 0) + Math.max(0, cols.length - 1) * 12\n return { w, h: s.rows.length ? s.rows.length * lineHeight(SMALL) + 10 : 8, cols }\n}\n\nfunction nodeBox(n: GNode, dir: Dir): Box {\n const text = n.shape === 'none' || n.label === '' ? lines(n.label) : wrap(lines(n.label), 260, SIZE, n.style?.bold)\n const t = n.label === '' ? { w: 0, h: 0 } : measure(text, SIZE, n.style?.bold)\n const across = dir === 'TB' || dir === 'BT'\n if (n.sections?.length) {\n const ss = n.sections.map(sectionSize)\n return { w: Math.max(90, ...ss.map((s) => s.w + 2 * PX)), h: ss.reduce((a, s) => a + s.h, 0), text }\n }\n const tw = t.w + 2 * PX\n const th = t.h + 2 * PY\n switch (n.shape) {\n case 'start':\n return { w: 20, h: 20, text: [] }\n case 'end':\n return { w: 22, h: 22, text: [] }\n case 'point':\n return { w: 8, h: 8, text: [] }\n case 'bar':\n return across ? { w: 80, h: 7, text: [] } : { w: 7, h: 80, text: [] }\n case 'none':\n return { w: t.w + 8, h: t.h + 6, text }\n case 'circle': {\n const d = Math.max(t.w, t.h) + 2 * PY + 4\n return { w: d, h: d, text }\n }\n case 'doublecircle': {\n const d = Math.max(t.w, t.h) + 2 * PY + 14\n return { w: d, h: d, text }\n }\n case 'ellipse':\n return { w: Math.max(50, (t.w + PX) * 1.42), h: Math.max(36, (t.h + PY) * 1.42), text }\n case 'diamond': {\n const w = tw + th / 0.6\n return { w, h: 0.6 * w, text }\n }\n case 'stadium':\n return { w: t.w + th + PX, h: th, text }\n case 'hexagon':\n case 'octagon':\n return { w: tw + th / 2, h: th, text }\n case 'lean-r':\n case 'lean-l':\n return { w: tw + th / 2, h: th, text }\n case 'trap-b':\n case 'trap-t':\n return { w: tw + th * 0.7, h: th, text }\n case 'flag':\n return { w: tw + th / 3, h: th, text }\n case 'cylinder':\n return { w: Math.max(tw, 50), h: th + 16, text }\n case 'subroutine':\n case 'component':\n return { w: tw + 16, h: th, text }\n case 'note':\n case 'folder':\n return { w: tw + 8, h: th + (n.shape === 'folder' ? 8 : 0), text }\n case 'box3d':\n return { w: tw + 8, h: th + 8, text }\n case 'triangle':\n return { w: tw * 1.6, h: th * 1.7, text }\n case 'actor':\n return { w: Math.max(36, t.w + 8), h: 46 + t.h, text }\n default:\n return { w: Math.max(tw, 40), h: th, text }\n }\n}\n\n// ---------------------------------------------------------------- shapes\n\nfunction nodePaint(n: GNode) {\n const s = n.style ?? {}\n const p = { fill: s.fill ?? THEME.fill, stroke: s.stroke ?? THEME.stroke, sw: s.sw ?? 1.3, dash: s.dash }\n return p\n}\n\nfunction drawNode(svg: Svg, n: GNode, b: Box, cx: number, cy: number) {\n const { w, h } = b\n const x = cx - w / 2\n const y = cy - h / 2\n const p = nodePaint(n)\n const color = n.style?.color ?? THEME.ink\n const txt = (tx = cx, ty = cy) => svg.text(tx, ty, b.text, { anchor: 'middle', color, bold: n.style?.bold, italic: n.style?.italic })\n const poly = (pts: [number, number][]) => svg.poly(pts, p)\n switch (n.shape) {\n case 'start':\n svg.circle(cx, cy, w / 2, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'end':\n svg.circle(cx, cy, w / 2, { fill: '#ffffff', stroke: n.style?.stroke ?? THEME.dark, sw: 1.5 }).circle(cx, cy, w / 2 - 4, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'point':\n svg.circle(cx, cy, w / 2, { fill: n.style?.fill ?? THEME.dark })\n return\n case 'bar':\n svg.rect(x, y, w, h, { fill: n.style?.fill ?? THEME.dark }, 2)\n return\n case 'none':\n return void txt()\n case 'round':\n svg.rect(x, y, w, h, p, 6)\n break\n case 'stadium':\n svg.rect(x, y, w, h, p, h / 2)\n break\n case 'subroutine':\n svg.rect(x, y, w, h, p).line(x + 8, y, x + 8, y + h, p).line(x + w - 8, y, x + w - 8, y + h, p)\n break\n case 'component':\n svg.rect(x + 6, y, w - 6, h, p)\n svg.rect(x, y + h / 2 - 11, 12, 7, p).rect(x, y + h / 2 + 4, 12, 7, p)\n return void txt(cx + 4)\n case 'cylinder': {\n const ry = 7\n svg.path(`M${r(x)} ${r(y + ry)} A${r(w / 2)} ${ry} 0 0 1 ${r(x + w)} ${r(y + ry)} L${r(x + w)} ${r(y + h - ry)} A${r(w / 2)} ${ry} 0 0 1 ${r(x)} ${r(y + h - ry)} Z`, p)\n svg.path(`M${r(x)} ${r(y + ry)} A${r(w / 2)} ${ry} 0 0 0 ${r(x + w)} ${r(y + ry)}`, { ...p, fill: 'none' })\n return void txt(cx, cy + ry / 2)\n }\n case 'circle':\n svg.circle(cx, cy, w / 2, p)\n break\n case 'doublecircle':\n svg.circle(cx, cy, w / 2, p).circle(cx, cy, w / 2 - 5, { ...p, fill: 'none' })\n break\n case 'ellipse':\n svg.ellipse(cx, cy, w / 2, h / 2, p)\n break\n case 'diamond':\n poly([\n [cx, y],\n [x + w, cy],\n [cx, y + h],\n [x, cy],\n ])\n break\n case 'hexagon': {\n const s = h / 4\n poly([\n [x + s, y],\n [x + w - s, y],\n [x + w, cy],\n [x + w - s, y + h],\n [x + s, y + h],\n [x, cy],\n ])\n break\n }\n case 'octagon': {\n const s = h / 4\n poly([\n [x + s, y],\n [x + w - s, y],\n [x + w, y + s],\n [x + w, y + h - s],\n [x + w - s, y + h],\n [x + s, y + h],\n [x, y + h - s],\n [x, y + s],\n ])\n break\n }\n case 'lean-r':\n case 'lean-l': {\n const s = h / 2\n const rt = n.shape === 'lean-r'\n poly([\n [rt ? x + s : x, y],\n [rt ? x + w : x + w - s, y],\n [rt ? x + w - s : x + w, y + h],\n [rt ? x : x + s, y + h],\n ])\n break\n }\n case 'trap-b':\n case 'trap-t': {\n const s = h * 0.35\n const b2 = n.shape === 'trap-b'\n poly([\n [b2 ? x + s : x, y],\n [b2 ? x + w - s : x + w, y],\n [b2 ? x + w : x + w - s, y + h],\n [b2 ? x : x + s, y + h],\n ])\n break\n }\n case 'flag': {\n const s = h / 3\n poly([\n [x, y],\n [x + w, y],\n [x + w, y + h],\n [x, y + h],\n [x + s, cy],\n ])\n return void txt(cx + s / 2)\n }\n case 'note': {\n const f = 10\n poly([\n [x, y],\n [x + w - f, y],\n [x + w, y + f],\n [x + w, y + h],\n [x, y + h],\n ])\n svg.poly(\n [\n [x + w - f, y],\n [x + w - f, y + f],\n [x + w, y + f],\n ],\n { ...p, fill: 'none' },\n false,\n )\n break\n }\n case 'folder':\n svg.rect(x, y, Math.min(w * 0.4, 40), 10, p, 2).rect(x, y + 8, w, h - 8, p)\n return void txt(cx, cy + 4)\n case 'box3d':\n poly([\n [x, y + 8],\n [x + 8, y],\n [x + w, y],\n [x + w, y + h - 8],\n [x + w - 8, y + h],\n [x, y + h],\n ])\n svg.poly(\n [\n [x, y + 8],\n [x + w - 8, y + 8],\n [x + w, y],\n ],\n { ...p, fill: 'none' },\n false,\n ).line(x + w - 8, y + 8, x + w - 8, y + h, p)\n return void txt(cx - 4, cy + 4)\n case 'cloud':\n svg.rect(x, y, w, h, p, Math.min(h / 2, 20))\n break\n case 'triangle':\n poly([\n [cx, y],\n [x + w, y + h],\n [x, y + h],\n ])\n return void txt(cx, cy + h / 6)\n case 'actor': {\n const s = { fill: 'none', stroke: n.style?.stroke ?? THEME.dark, sw: 1.5 }\n const top = y + 2\n svg.circle(cx, top + 7, 7, { ...s, fill: n.style?.fill ?? THEME.fill })\n svg.line(cx, top + 14, cx, top + 28, s).line(cx - 11, top + 19, cx + 11, top + 19, s)\n svg.line(cx, top + 28, cx - 9, top + 40, s).line(cx, top + 28, cx + 9, top + 40, s)\n svg.text(cx, top + 44 + (b.text.length * LH) / 2, b.text, { anchor: 'middle', color })\n return\n }\n default:\n if (n.sections?.length) return drawSections(svg, n, x, y, w)\n svg.rect(x, y, w, h, p)\n }\n txt()\n}\n\nfunction drawSections(svg: Svg, n: GNode, x: number, y: number, w: number) {\n const p = nodePaint(n)\n const ss = n.sections!.map(sectionSize)\n const total = ss.reduce((a, s) => a + s.h, 0)\n svg.rect(x, y, w, total, p, n.shape === 'round' ? 6 : 0)\n let top = y\n n.sections!.forEach((s, k) => {\n if (k) svg.line(x, top, x + w, top, { stroke: p.stroke, sw: 1 })\n const lh = lineHeight(SMALL)\n s.rows.forEach((row, r) => {\n const ty = top + 5 + r * lh + lh / 2\n if (s.center || (row.length === 1 && k === 0)) {\n svg.text(x + w / 2, ty, row.join(' '), { anchor: 'middle', size: SMALL, bold: s.bold, italic: s.italic, color: n.style?.color })\n return\n }\n let cx = x + PX\n row.forEach((c, j) => {\n svg.text(cx, ty, c, { size: SMALL, bold: s.bold, italic: s.italic, color: n.style?.color })\n cx += ss[k].cols[j] + 12\n })\n })\n top += ss[k].h\n })\n}\n\n// ---------------------------------------------------------------- edges\n\nconst HEAD_LEN: Partial<Record<Head, number>> = { arrow: 10, triangle: 13, diamond: 15, odiamond: 15, circle: 8, ocircle: 8 }\n\nfunction unit(a: Pt, b: Pt): Pt {\n const dx = b.x - a.x\n const dy = b.y - a.y\n const l = Math.hypot(dx, dy) || 1\n return { x: dx / l, y: dy / l }\n}\n\n/** marker at `p`, `d` the direction the edge arrives in */\nfunction drawHead(svg: Svg, head: Head, p: Pt, d: Pt, col: string) {\n const nx = -d.y\n const ny = d.x\n const at = (back: number, side: number): [number, number] => [p.x - d.x * back + nx * side, p.y - d.y * back + ny * side]\n const line = (a: [number, number], b: [number, number]) => svg.line(a[0], a[1], b[0], b[1], { stroke: col, sw: 1.3 })\n switch (head) {\n case 'arrow':\n svg.poly([at(0, 0), at(10, 4.5), at(10, -4.5)], { fill: col, stroke: col, sw: 1 })\n break\n case 'open':\n svg.poly([at(10, 5), at(0, 0), at(10, -5)], { stroke: col, sw: 1.4 }, false)\n break\n case 'triangle':\n svg.poly([at(0, 0), at(13, 7), at(13, -7)], { fill: '#ffffff', stroke: col, sw: 1.2 })\n break\n case 'diamond':\n case 'odiamond':\n svg.poly([at(0, 0), at(7.5, 5), at(15, 0), at(7.5, -5)], { fill: head === 'diamond' ? col : '#ffffff', stroke: col, sw: 1.2 })\n break\n case 'circle':\n case 'ocircle': {\n const [cx, cy] = at(4, 0)\n svg.circle(cx, cy, 4, { fill: head === 'circle' ? col : '#ffffff', stroke: col, sw: 1.2 })\n break\n }\n case 'cross':\n line(at(1, 5), at(11, -5))\n line(at(1, -5), at(11, 5))\n break\n case 'one':\n case 'zero-one':\n case 'one-many':\n case 'zero-many':\n case 'many': {\n const many = head.endsWith('many')\n if (many) {\n line(at(0, 7), at(12, 0))\n line(at(0, -7), at(12, 0))\n }\n if (head === 'one' || head === 'one-many') line(at(many ? 16 : 7, 6), at(many ? 16 : 7, -6))\n if (head === 'one') line(at(12, 6), at(12, -6))\n if (head === 'zero-one' || head === 'zero-many') {\n const [cx, cy] = at(many ? 20 : 17, 0)\n svg.circle(cx, cy, 4.5, { fill: '#ffffff', stroke: col, sw: 1.2 })\n }\n if (head === 'zero-one') line(at(7, 6), at(7, -6))\n break\n }\n }\n}\n\n/** shortens the path at its end by `len` along the arriving direction */\nfunction trimEnd(start: Pt, segs: Seg[], len: number): Pt {\n const last = segs[segs.length - 1]\n const end = last.p[last.p.length - 1]\n const prev = last.c === 'C' ? last.p[1] : segs.length > 1 ? segs[segs.length - 2].p[segs[segs.length - 2].p.length - 1] : start\n const d = unit(prev, end)\n if (len) {\n const q = { x: end.x - d.x * len, y: end.y - d.y * len }\n last.p[last.p.length - 1] = q\n if (last.c === 'C') last.p[1] = { x: last.p[1].x - d.x * Math.min(len, 6), y: last.p[1].y - d.y * Math.min(len, 6) }\n }\n return d\n}\n\nfunction edgeColor(e: GEdge) {\n return e.color ?? THEME.line\n}\n\n// ---------------------------------------------------------------- render\n\nconst MARGIN = 16\n\nconst MAX_NODES = 3000\nconst MAX_EDGES = 6000\n\nexport function renderGraph(g: Graph): Rendered {\n if (!g.nodes.length) throw new DiagramError('The diagram has no nodes')\n if (g.nodes.length > MAX_NODES || g.edges.length > MAX_EDGES) throw new DiagramError(`The diagram is too large to draw (${g.nodes.length} nodes, ${g.edges.length} edges)`)\n const dir = g.dir\n const across = dir === 'TB' || dir === 'BT'\n const svg = new Svg()\n // edges to a cluster go to one of its nodes\n const clusterIdx = new Map(g.clusters.map((c, k) => [c.id, k]))\n const nodeIdx = new Map(g.nodes.map((n, k) => [n.id, k]))\n const parentOf = (c: number) => (g.clusters[c].parent !== undefined ? clusterIdx.get(g.clusters[c].parent!) ?? -1 : -1)\n const inCluster = (v: number, c: number) => {\n for (let k = g.nodes[v].cluster !== undefined ? clusterIdx.get(g.nodes[v].cluster!) ?? -1 : -1; k >= 0; k = parentOf(k)) if (k === c) return true\n return false\n }\n /** an edge's end: its node, or for a cluster the member it is laid out to (the first one entering, the last leaving) */\n const resolve = (id: string, leaving: boolean): number => {\n const v = nodeIdx.get(id)\n if (v !== undefined) return v\n const c = clusterIdx.get(id)\n if (c === undefined) return -1\n if (!leaving) return g.nodes.findIndex((_, k) => inCluster(k, c))\n for (let k = g.nodes.length - 1; k >= 0; k--) if (inCluster(k, c)) return k\n return -1\n }\n\n const boxes = g.nodes.map((n) => nodeBox(n, dir))\n const edges = g.edges\n .map((e) => ({ e, v: resolve(e.from, true), w: resolve(e.to, false), cv: nodeIdx.has(e.from) ? -1 : clusterIdx.get(e.from) ?? -1, cw: nodeIdx.has(e.to) ? -1 : clusterIdx.get(e.to) ?? -1 }))\n .filter((x) => x.v >= 0 && x.w >= 0)\n const labelled = edges.some((x) => x.e.label)\n const lab = (s: string | undefined) => (s ? measure(lines(s), SMALL) : undefined)\n const loops = new Map<number, number>()\n for (const { e, v, w } of edges) {\n if (v !== w) continue\n const l = lab(e.label)\n loops.set(v, Math.max(loops.get(v) ?? 0, 40 + (l ? (across ? l.w : l.h) + 6 : 0)))\n }\n const lnodes: LNode[] = g.nodes.map((n, k) => {\n const b = boxes[k]\n const c = n.cluster !== undefined ? clusterIdx.get(n.cluster) ?? -1 : -1\n const spread = !!n.sections?.length || SPREAD.has(n.shape)\n return across ? { w: b.w, h: b.h, cluster: c, loop: loops.get(k), spread } : { w: b.h, h: b.w, cluster: c, loop: loops.get(k), spread }\n })\n const ledges: LEdge[] = edges.map(({ e, v, w }) => {\n const l = lab(e.label)\n const pad = l ? { w: l.w + 8, h: l.h + 4 } : undefined\n return {\n v,\n w,\n minlen: (e.minlen ?? 1) * (labelled ? 2 : 1),\n weight: 1,\n label: pad ? (across ? pad : { w: pad.h, h: pad.w }) : undefined,\n }\n })\n const TITLE_H = 22\n const lclusters: LCluster[] = g.clusters.map((c, k) => {\n const t = c.label ? measure(lines(c.label), SMALL, true) : { w: 0, h: 0 }\n const top = 12 + (c.label ? t.h + 6 : 0)\n const side = 12\n // [cross start, cross end, rank start, rank end] in layout space\n const pad: [number, number, number, number] =\n dir === 'TB' ? [side, side, top, side] : dir === 'BT' ? [side, side, side, top] : dir === 'LR' ? [top, side, side, side] : [top, side, side, side]\n return { parent: parentOf(k), pad, minW: across ? t.w + 2 * side : t.h + top + side }\n })\n const same = g.sameRank?.map((grp) => grp.map((id) => nodeIdx.get(id)).filter((v): v is number => v !== undefined)).filter((grp) => grp.length > 1)\n const out = layered(lnodes, ledges, lclusters, {\n nodesep: across ? 40 : 28,\n ranksep: (across ? 50 : 60) / (labelled ? 2 : 1),\n edgesep: 14,\n sameRank: same,\n })\n\n // layout space → picture\n const titleH = g.title ? TITLE_H + 10 : 0\n const LW = out.w\n const LH2 = out.h\n const tr = (p: Pt): Pt => {\n const q = dir === 'TB' ? p : dir === 'BT' ? { x: p.x, y: LH2 - p.y } : dir === 'LR' ? { x: p.y, y: p.x } : { x: LH2 - p.y, y: p.x }\n return { x: q.x + MARGIN, y: q.y + MARGIN + titleH }\n }\n let W = (across ? LW : LH2) + 2 * MARGIN\n const H = (across ? LH2 : LW) + 2 * MARGIN + titleH\n\n // clusters, outermost first\n const depth = (k: number) => {\n let d = 0\n for (let c = parentOf(k); c >= 0; c = parentOf(c)) d++\n return d\n }\n const order = g.clusters.map((_, k) => k).sort((a, b) => depth(a) - depth(b))\n const clusterBox: ({ x: number; y: number; w: number; h: number } | null)[] = g.clusters.map(() => null)\n // cluster titles go over the edges that cross them\n const titles: { x: number; y: number; text: string[]; color: string; bg: string }[] = []\n for (const k of order) {\n const b = out.clusters[k]\n if (!b) continue\n const c = g.clusters[k]\n const a = tr({ x: b.x, y: b.y })\n const z = tr({ x: b.x + b.w, y: b.y + b.h })\n const x0 = Math.min(a.x, z.x)\n const y0 = Math.min(a.y, z.y)\n const cw = Math.abs(z.x - a.x)\n const ch = Math.abs(z.y - a.y)\n const st = c.style ?? {}\n clusterBox[k] = { x: x0, y: y0, w: cw, h: ch }\n svg.rect(x0, y0, cw, ch, { fill: st.fill ?? THEME.cluster, stroke: st.stroke ?? THEME.clusterStroke, sw: st.sw ?? 1, dash: st.dash }, 4)\n if (c.label) {\n const t = lines(c.label)\n const top = dir === 'BT' ? y0 + ch - 8 - (t.length * lineHeight(SMALL)) / 2 : y0 + 8 + (t.length * lineHeight(SMALL)) / 2\n titles.push({ x: x0 + cw / 2, y: top, text: t, color: st.color ?? THEME.ink, bg: st.fill && st.fill !== 'none' ? st.fill : THEME.cluster })\n }\n }\n\n // edges\n const labels: { p: Pt; text: string[]; color?: string; plain?: boolean }[] = []\n edges.forEach(({ e, v }, i) => {\n if (e.line === 'hidden') return\n const col = edgeColor(e)\n const paint = { stroke: col, sw: e.sw ?? (e.line === 'thick' ? 3 : 1.4), dash: e.line === 'dashed' ? '6 4' : e.line === 'dotted' ? '2 3' : undefined }\n const geom = out.edges[i]\n if (!geom) {\n if (edges[i].v !== edges[i].w) return\n // self loop, on the far side of the rank\n const c = tr(out.nodes[v])\n const b = boxes[v]\n let s: Pt, c1: Pt, c2: Pt, t: Pt, lp: Pt\n if (across) {\n s = { x: c.x + b.w / 2, y: c.y - b.h / 4 }\n t = { x: c.x + b.w / 2, y: c.y + b.h / 4 }\n c1 = { x: s.x + 34, y: s.y - 12 }\n c2 = { x: t.x + 34, y: t.y + 12 }\n lp = { x: c.x + b.w / 2 + 34, y: c.y }\n } else {\n s = { x: c.x - b.w / 4, y: c.y + b.h / 2 }\n t = { x: c.x + b.w / 4, y: c.y + b.h / 2 }\n c1 = { x: s.x - 12, y: s.y + 34 }\n c2 = { x: t.x + 12, y: t.y + 34 }\n lp = { x: c.x, y: c.y + b.h / 2 + 34 }\n }\n const segs: Seg[] = [{ c: 'C', p: [c1, c2, t] }]\n const head = e.head ?? 'arrow'\n const d = trimEnd(s, segs, HEAD_LEN[head] ?? 0)\n svg.path(pathData([{ c: 'M', p: [s] }, ...segs.map((k) => ({ c: k.c, p: k.p }))]), paint)\n drawHead(svg, head, t, d, col)\n if (e.label) {\n const l = measure(lines(e.label), SMALL)\n labels.push({ p: across ? { x: lp.x + l.w / 2 + 4, y: lp.y } : { x: lp.x, y: lp.y + l.h / 2 + 4 }, text: lines(e.label) })\n }\n return\n }\n let g2: EdgeGeom = { start: tr(geom.start), segs: geom.segs.map((s) => ({ c: s.c, p: s.p.map(tr) })), label: geom.label && tr(geom.label) }\n // an edge to / from a cluster stops at the cluster's border\n const { cv, cw } = edges[i]\n if ((cv >= 0 && !inCluster(edges[i].w, cv)) || (cw >= 0 && !inCluster(edges[i].v, cw))) {\n let pts = sample(g2.start, g2.segs)\n if (cv >= 0 && clusterBox[cv]) pts = clip(pts, clusterBox[cv]!, true)\n if (cw >= 0 && clusterBox[cw]) pts = clip(pts, clusterBox[cw]!, false)\n if (pts.length > 1) g2 = { start: pts[0], segs: pts.slice(1).map((p) => ({ c: 'L' as const, p: [p] })), label: g2.label }\n }\n const head = e.head ?? 'none'\n const tail = e.tail ?? 'none'\n const end = g2.segs[g2.segs.length - 1].p[g2.segs[g2.segs.length - 1].p.length - 1]\n const dHead = trimEnd(g2.start, g2.segs, HEAD_LEN[head] ?? 0)\n // the tail: reverse the first segment's direction\n const first = g2.segs[0]\n const toward = first.c === 'C' ? first.p[0] : first.p[0]\n const dTail = unit(toward, g2.start)\n const tailStart = g2.start\n const tl = HEAD_LEN[tail] ?? 0\n const start = tl ? { x: g2.start.x - dTail.x * tl, y: g2.start.y - dTail.y * tl } : g2.start\n if (tl && first.c === 'C') first.p[0] = { x: first.p[0].x - dTail.x * Math.min(tl, 6), y: first.p[0].y - dTail.y * Math.min(tl, 6) }\n svg.path(pathData([{ c: 'M', p: [start] }, ...g2.segs.map((k) => ({ c: k.c, p: k.p }))]), paint)\n if (head !== 'none') drawHead(svg, head, end, dHead, col)\n if (tail !== 'none') drawHead(svg, tail, tailStart, dTail, col)\n if (e.label) {\n const p = g2.label ?? midpoint(g2.start, end)\n labels.push({ p, text: lines(e.label) })\n }\n // multiplicities: beside the line, near its end\n const side = (p: Pt, d: Pt, text: string) => {\n const l = measure(lines(text), SMALL)\n const nx = -d.y\n const ny = d.x\n const off = Math.abs(nx) * (l.w / 2 + 5) + Math.abs(ny) * (l.h / 2 + 3)\n labels.push({ p: { x: p.x - d.x * (16 + l.h / 2) + nx * off, y: p.y - d.y * (14 + l.h / 2) + ny * off }, text: lines(text), plain: true })\n }\n if (e.headLabel) side(end, dHead, e.headLabel)\n if (e.tailLabel) side(tailStart, dTail, e.tailLabel)\n })\n\n for (const t of titles) {\n const m = measure(t.text, SMALL, true)\n svg.rect(t.x - m.w / 2 - 4, t.y - m.h / 2 - 1, m.w + 8, m.h + 2, { fill: t.bg }, 2)\n svg.text(t.x, t.y, t.text, { anchor: 'middle', size: SMALL, bold: true, color: t.color })\n }\n\n // nodes\n g.nodes.forEach((n, k) => {\n if (n.style?.hidden) return\n const c = tr(out.nodes[k])\n drawNode(svg, n, boxes[k], c.x, c.y)\n })\n\n for (const l of labels) {\n const m = measure(l.text, SMALL)\n if (!l.plain) svg.rect(l.p.x - m.w / 2 - 3, l.p.y - m.h / 2 - 1, m.w + 6, m.h + 2, { fill: THEME.label, opacity: 0.92 }, 2)\n svg.text(l.p.x, l.p.y, l.text, { anchor: 'middle', size: SMALL, color: l.color ?? THEME.ink })\n }\n if (g.title) {\n W = Math.max(W, textWidth(g.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + TITLE_H / 2, g.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: svg.toString(W, H), w: Math.ceil(W), h: Math.ceil(H) }\n}\n\nconst midpoint = (a: Pt, b: Pt): Pt => ({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 })\n\n/** shapes whose flat top / bottom edges can take several edges side by side */\nconst SPREAD = new Set<Shape>(['rect', 'round', 'subroutine', 'component', 'note', 'folder', 'box3d', 'cylinder', 'stadium', 'cloud'])\n\n/** the path as a polyline */\nfunction sample(start: Pt, segs: Seg[]): Pt[] {\n const out = [start]\n let cur = start\n for (const s of segs) {\n if (s.c === 'L') out.push(s.p[0])\n else {\n const [c1, c2, e] = s.p\n for (let k = 1; k <= 12; k++) {\n const t = k / 12\n const u = 1 - t\n out.push({\n x: u * u * u * cur.x + 3 * u * u * t * c1.x + 3 * u * t * t * c2.x + t * t * t * e.x,\n y: u * u * u * cur.y + 3 * u * u * t * c1.y + 3 * u * t * t * c2.y + t * t * t * e.y,\n })\n }\n }\n cur = out[out.length - 1]\n }\n return out\n}\n\n/** cuts the part of a polyline inside `b` off its start (or end) */\nfunction clip(pts: Pt[], b: { x: number; y: number; w: number; h: number }, atStart: boolean): Pt[] {\n const inside = (p: Pt) => p.x > b.x && p.x < b.x + b.w && p.y > b.y && p.y < b.y + b.h\n const list = atStart ? pts : [...pts].reverse()\n const k = list.findIndex((p) => !inside(p))\n if (k <= 0) return pts\n const a = list[k - 1]\n const z = list[k]\n // where a→z leaves the box\n let t = 1\n const dx = z.x - a.x\n const dy = z.y - a.y\n if (dx > 0) t = Math.min(t, (b.x + b.w - a.x) / dx)\n if (dx < 0) t = Math.min(t, (b.x - a.x) / dx)\n if (dy > 0) t = Math.min(t, (b.y + b.h - a.y) / dy)\n if (dy < 0) t = Math.min(t, (b.y - a.y) / dy)\n const out = [{ x: a.x + dx * t, y: a.y + dy * t }, ...list.slice(k)]\n return atStart ? out : out.reverse()\n}\n","/**\n * Graphviz DOT: graphs, digraphs, subgraphs and clusters, default attributes, edge chains, rank=same, record and\n * HTML-like labels (as text). Laid out by the layered layout, like `dot`.\n * https://graphviz.org/doc/info/lang.html\n */\nimport { GraphBuilder, renderGraph, type Dir, type GEdge, type GNode, type Graph, type Head, type NodeStyle, type Rendered, type Section, type Shape } from './graph'\nimport { color, DiagramError, labelText } from './svg'\n\ntype Tok = { t: 'id' | 'str' | 'html' | 'p'; v: string }\n\nfunction tokenize(src: string): Tok[] {\n const out: Tok[] = []\n const n = src.length\n let i = 0\n let lineStart = true\n while (i < n) {\n const c = src[i]\n if (c === '\\n') {\n lineStart = true\n i++\n continue\n }\n if (c === ' ' || c === '\\t' || c === '\\r' || c === '') {\n i++\n continue\n }\n if (lineStart && c === '#') {\n while (i < n && src[i] !== '\\n') i++\n continue\n }\n lineStart = false\n if (c === '/' && src[i + 1] === '/') {\n while (i < n && src[i] !== '\\n') i++\n continue\n }\n if (c === '/' && src[i + 1] === '*') {\n const e = src.indexOf('*/', i + 2)\n i = e < 0 ? n : e + 2\n continue\n }\n if (c === '\"') {\n let v = ''\n i++\n while (i < n && src[i] !== '\"') {\n if (src[i] === '\\\\' && src[i + 1] === '\"') {\n v += '\"'\n i += 2\n } else if (src[i] === '\\\\' && src[i + 1] === '\\n') i += 2\n else v += src[i++]\n }\n i++\n // \"a\" + \"b\"\n const prev = out[out.length - 1]\n const plus = out[out.length - 2]\n if (prev?.t === 'p' && prev.v === '+' && plus?.t === 'str') {\n out.pop()\n plus.v += v\n } else out.push({ t: 'str', v })\n continue\n }\n if (c === '<') {\n let depth = 0\n const s = i\n for (; i < n; i++) {\n if (src[i] === '<') depth++\n else if (src[i] === '>' && --depth === 0) break\n }\n out.push({ t: 'html', v: src.slice(s + 1, i) })\n i++\n continue\n }\n if (c === '-' && (src[i + 1] === '>' || src[i + 1] === '-')) {\n out.push({ t: 'p', v: src.slice(i, i + 2) })\n i += 2\n continue\n }\n if ('{}[]=;,:+'.includes(c)) {\n out.push({ t: 'p', v: c })\n i++\n continue\n }\n const m = /^(-?(?:\\.\\d+|\\d+(?:\\.\\d*)?)|[A-Za-z_\\u0080-￿][\\w\\u0080-￿]*)/.exec(src.slice(i, i + 256))\n if (!m) {\n i++\n continue\n }\n out.push({ t: 'id', v: m[0] })\n i += m[0].length\n }\n return out\n}\n\ninterface Scope {\n node: Record<string, string>\n edge: Record<string, string>\n cluster?: string\n members: Set<string>\n name?: string\n}\n\nconst SHAPES: Record<string, Shape> = {\n box: 'rect', rect: 'rect', rectangle: 'rect', square: 'rect', msquare: 'rect', ellipse: 'ellipse', oval: 'ellipse', egg: 'ellipse', circle: 'circle',\n doublecircle: 'doublecircle', point: 'point', plaintext: 'none', plain: 'none', none: 'none', underline: 'none', diamond: 'diamond', mdiamond: 'diamond',\n hexagon: 'hexagon', octagon: 'octagon', doubleoctagon: 'octagon', tripleoctagon: 'octagon', triangle: 'triangle', invtriangle: 'triangle', parallelogram: 'lean-r',\n trapezium: 'trap-b', invtrapezium: 'trap-t', house: 'trap-b', invhouse: 'trap-t', cylinder: 'cylinder', note: 'note', tab: 'folder', folder: 'folder', box3d: 'box3d',\n component: 'component', cds: 'flag', larrow: 'flag', rarrow: 'flag', lpromoter: 'flag', rpromoter: 'flag', star: 'circle', record: 'rect', mrecord: 'round', underlinebox: 'rect',\n}\n\nconst ARROWS: Record<string, Head> = {\n normal: 'arrow', inv: 'arrow', empty: 'triangle', onormal: 'triangle', invempty: 'triangle', oinv: 'triangle', vee: 'open', open: 'open', halfopen: 'open',\n diamond: 'diamond', odiamond: 'odiamond', ediamond: 'odiamond', box: 'diamond', obox: 'odiamond', dot: 'circle', odot: 'ocircle', invdot: 'circle', invodot: 'ocircle',\n none: 'none', crow: 'many', tee: 'one', curve: 'open', icurve: 'open',\n}\n\nfunction arrow(v: string | undefined, dflt: Head): Head {\n if (!v) return dflt\n const k = v.toLowerCase().replace(/^[lr](?=[a-z])/, '')\n return ARROWS[k] ?? ARROWS[k.replace(/^o/, '')] ?? dflt\n}\n\n/** a Graphviz color: names, #rgb(a), \"H S V\" or \"H,S,V\"; the first of a color list */\nfunction dotColor(v: string | undefined): string | undefined {\n if (!v) return undefined\n const first = v.split(/[:;]/)[0].trim()\n const hsv = /^([\\d.]+)[ ,]+([\\d.]+)[ ,]+([\\d.]+)$/.exec(first)\n if (hsv) {\n const [h, s, b] = [Number(hsv[1]), Number(hsv[2]), Number(hsv[3])]\n const f = (k: number) => {\n const x = (k + h * 6) % 6\n return Math.round((b - b * s * Math.max(0, Math.min(x, 4 - x, 1))) * 255)\n }\n return '#' + [f(5), f(3), f(1)].map((x) => x.toString(16).padStart(2, '0')).join('')\n }\n const name = first.replace(/^\\/\\w+\\//, '').toLowerCase()\n // X11 grey levels (gray0 … gray100); numbered variants (red3) as their base color\n const g = /^gr[ae]y(\\d{1,3})$/.exec(name)\n if (g) {\n const x = Math.round((Math.min(100, Number(g[1])) * 255) / 100)\n .toString(16)\n .padStart(2, '0')\n return `#${x}${x}${x}`\n }\n return color(/^[a-z]+\\d+$/.test(name) ? name.replace(/\\d+$/, '') : name)\n}\n\nfunction htmlLabel(v: string): string {\n return labelText(\n v\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/tr>/gi, '\\n')\n .replace(/<\\/td>\\s*<td/gi, ' <td')\n .replace(/<[^>]+>/g, '')\n .replace(/\\n\\s*\\n/g, '\\n'),\n )\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n .join('\\n')\n}\n\n/** text of a plain label: \\n \\l \\r line breaks, \\N the node name */\nfunction plainLabel(v: string, id: string, graph = ''): string {\n return v\n .replace(/\\\\[nlr]/g, '\\n')\n .replace(/\\\\N/g, id)\n .replace(/\\\\G/g, graph)\n .replace(/\\\\(.)/g, '$1')\n .replace(/\\n$/, '')\n}\n\n/** record fields \"{a|<p> b|{c|d}}\" as rows */\nfunction recordRows(v: string, id: string): string[] {\n return plainLabel(v, id)\n .replace(/<[^>]*>/g, '')\n .split(/[|{}]/)\n .map((x) => x.trim())\n .filter(Boolean)\n}\n\nexport function parseDot(src: string): Graph[] {\n const toks = tokenize(src)\n let p = 0\n const peek = (k = 0) => toks[p + k]\n const isP = (v: string, k = 0) => peek(k)?.t === 'p' && peek(k).v === v\n const eat = (v: string) => {\n if (isP(v)) {\n p++\n return true\n }\n return false\n }\n const kw = (v: string) => peek()?.t === 'id' && peek().v.toLowerCase() === v\n const graphs: Graph[] = []\n while (p < toks.length) {\n if (kw('strict')) p++\n if (!kw('graph') && !kw('digraph')) {\n p++\n continue\n }\n const directed = peek().v.toLowerCase() === 'digraph'\n p++\n const name = peek()?.t !== 'p' ? toks[p++].v : ''\n if (!eat('{')) throw new DiagramError('Graphviz: “{” expected after the graph name')\n const b = new GraphBuilder('TB', 'ellipse')\n const nodeAttrs = new Map<string, Record<string, string>>()\n const edges: { e: GEdge; attrs: Record<string, string> }[] = []\n const same: string[][] = []\n let anon = 0\n const graphAttrs: Record<string, string> = {}\n const clusterAttrs = new Map<string, Record<string, string>>()\n\n const attrList = (): Record<string, string> => {\n const a: Record<string, string> = {}\n while (eat('[')) {\n while (p < toks.length && !isP(']')) {\n const k = toks[p++]\n if (k.t === 'p') continue\n if (eat('=')) {\n const v = toks[p++]\n if (v) a[k.v.toLowerCase()] = v.t === 'html' ? '<' + v.v + '>' : v.v\n } else a[k.v.toLowerCase()] = 'true'\n }\n eat(']')\n }\n return a\n }\n const nodeRef = (scope: Scope): string => {\n const id = toks[p++].v\n // port: a:p or a:p:n\n while (isP(':')) p += 2\n if (!nodeAttrs.has(id)) {\n nodeAttrs.set(id, { ...scope.node })\n b.node(id, {}, scope.cluster)\n } else if (scope.cluster && b.get(id) && b.get(id)!.cluster === undefined) b.get(id)!.cluster = scope.cluster\n scope.members.add(id)\n return id\n }\n const stmts = (scope: Scope) => {\n while (p < toks.length && !isP('}')) {\n if (eat(';') || eat(',')) continue\n const t = peek()\n if (t.t === 'id' && ['graph', 'node', 'edge'].includes(t.v.toLowerCase()) && isP('[', 1)) {\n p++\n const a = attrList()\n const which = t.v.toLowerCase()\n if (which === 'node') Object.assign(scope.node, a)\n else if (which === 'edge') Object.assign(scope.edge, a)\n else setGraph(scope, a)\n continue\n }\n if (t.t !== 'p' && isP('=', 1)) {\n const k = t.v.toLowerCase()\n p += 2\n const v = toks[p++]\n setGraph(scope, { [k]: v ? (v.t === 'html' ? '<' + v.v + '>' : v.v) : '' })\n continue\n }\n // a chain of node ids / subgraphs joined by edge operators\n const ends: string[][] = []\n for (;;) {\n if (kw('subgraph') || isP('{')) ends.push([...subgraph(scope)])\n else if (peek() && peek().t !== 'p') ends.push([nodeRef(scope)])\n else {\n p++\n break\n }\n if (isP('->') || isP('--')) p++\n else break\n }\n const a = attrList()\n if (ends.length === 1) {\n for (const id of ends[0]) if (Object.keys(a).length && nodeAttrs.has(id)) Object.assign(nodeAttrs.get(id)!, a)\n continue\n }\n const attrs = { ...scope.edge, ...a }\n for (let k = 0; k + 1 < ends.length; k++) for (const from of ends[k]) for (const to of ends[k + 1]) edges.push({ e: { from, to }, attrs })\n }\n }\n const setGraph = (scope: Scope, a: Record<string, string>) => {\n if (scope.cluster) Object.assign(clusterAttrs.get(scope.cluster)!, a)\n else if (!scope.name) Object.assign(graphAttrs, a)\n if (a.rank && scope.name !== undefined) (scope as Scope & { rank?: string }).rank = a.rank\n }\n const subgraph = (parent: Scope): Set<string> => {\n let sname: string | undefined\n if (kw('subgraph')) {\n p++\n if (peek() && peek().t !== 'p') sname = toks[p++].v\n }\n const isCluster = !!sname && /^cluster/i.test(sname)\n const scope: Scope & { rank?: string } = { node: { ...parent.node }, edge: { ...parent.edge }, cluster: parent.cluster, members: new Set(), name: sname ?? `__anon${anon++}` }\n if (isCluster) {\n const cid = `${sname}`\n b.cluster(cid, '', parent.cluster)\n clusterAttrs.set(cid, {})\n scope.cluster = cid\n }\n if (eat('{')) {\n stmts(scope)\n eat('}')\n }\n if (scope.rank && /^(same|min|max|source|sink)$/.test(scope.rank) && scope.members.size > 1) same.push([...scope.members])\n for (const m of scope.members) parent.members.add(m)\n return scope.members\n }\n const root: Scope = { node: {}, edge: {}, members: new Set() }\n stmts(root)\n eat('}')\n\n // attributes → model\n const dir: Dir = ({ LR: 'LR', RL: 'RL', BT: 'BT', TB: 'TB' } as Record<string, Dir>)[(graphAttrs.rankdir ?? 'TB').toUpperCase()] ?? 'TB'\n b.g.dir = dir\n if (graphAttrs.label) b.g.title = graphAttrs.label.startsWith('<') ? htmlLabel(graphAttrs.label.slice(1, -1)) : plainLabel(graphAttrs.label, '', name)\n for (const n of b.g.nodes) applyNode(n, nodeAttrs.get(n.id) ?? {})\n for (const c of b.g.clusters) {\n const a = clusterAttrs.get(c.id) ?? {}\n c.label = a.label ? (a.label.startsWith('<') ? htmlLabel(a.label.slice(1, -1)) : plainLabel(a.label, '', c.id)) : ''\n const st: NodeStyle = {}\n const style = (a.style ?? '').toLowerCase()\n if (style.includes('filled')) st.fill = dotColor(a.fillcolor ?? a.color ?? a.bgcolor) ?? '#d3d3d3'\n else if (a.bgcolor) st.fill = dotColor(a.bgcolor)\n if (a.color || a.pencolor) st.stroke = dotColor(a.pencolor ?? a.color)\n if (style.includes('dashed')) st.dash = '6 4'\n if (style.includes('dotted')) st.dash = '2 3'\n if (a.fontcolor) st.color = dotColor(a.fontcolor)\n if (style.includes('invis')) st.stroke = st.fill = 'none'\n c.style = st\n }\n for (const { e, attrs } of edges) b.g.edges.push(applyEdge(e, attrs, directed))\n b.g.sameRank = same\n graphs.push(b.g)\n }\n if (!graphs.length) throw new DiagramError('No “graph” or “digraph” found')\n return graphs\n}\n\nfunction applyNode(n: GNode, a: Record<string, string>) {\n const shapeName = (a.shape ?? 'ellipse').toLowerCase()\n n.shape = SHAPES[shapeName] ?? 'ellipse'\n const lab = a.label\n if (lab !== undefined) {\n if (lab.startsWith('<') && lab.endsWith('>')) n.label = htmlLabel(lab.slice(1, -1))\n else if (shapeName === 'record' || shapeName === 'mrecord') {\n const rows = recordRows(lab, n.id)\n n.label = rows.join('\\n')\n if (rows.length > 1) n.sections = rows.map((r) => ({ rows: [[r]], center: true }) as Section)\n } else n.label = plainLabel(lab, n.id)\n }\n if (n.shape === 'point') n.label = ''\n const st: NodeStyle = {}\n const style = (a.style ?? '').toLowerCase()\n if (style.includes('filled') || a.fillcolor) st.fill = dotColor(a.fillcolor ?? a.color) ?? '#d3d3d3'\n else if (n.shape !== 'point') st.fill = '#ffffff'\n if (a.color) st.stroke = dotColor(a.color)\n else st.stroke = '#000000'\n if (a.fontcolor) st.color = dotColor(a.fontcolor)\n if (style.includes('dashed')) st.dash = '6 4'\n if (style.includes('dotted')) st.dash = '2 3'\n if (style.includes('bold')) st.sw = 2.4\n if (a.penwidth) st.sw = Math.min(8, Number(a.penwidth) || 1)\n if (style.includes('invis')) st.hidden = true\n if (style.includes('rounded') && n.shape === 'rect') n.shape = 'round'\n if (n.shape === 'none') st.fill = undefined\n n.style = st\n}\n\nfunction applyEdge(e: GEdge, a: Record<string, string>, directed: boolean): GEdge {\n const style = (a.style ?? '').toLowerCase()\n const dir = (a.dir ?? (directed ? 'forward' : 'none')).toLowerCase()\n const head = arrow(a.arrowhead, 'arrow')\n const tail = arrow(a.arrowtail, 'arrow')\n e.head = dir === 'forward' || dir === 'both' ? head : 'none'\n e.tail = dir === 'back' || dir === 'both' ? tail : 'none'\n const lab = a.label ?? a.xlabel\n if (lab) e.label = lab.startsWith('<') && lab.endsWith('>') ? htmlLabel(lab.slice(1, -1)) : plainLabel(lab, '')\n if (a.headlabel) e.headLabel = plainLabel(a.headlabel, '')\n if (a.taillabel) e.tailLabel = plainLabel(a.taillabel, '')\n e.line = style.includes('invis') ? 'hidden' : style.includes('dashed') ? 'dashed' : style.includes('dotted') ? 'dotted' : style.includes('bold') ? 'thick' : 'solid'\n e.color = dotColor(a.color) ?? '#000000'\n if (a.penwidth) e.sw = Math.min(8, Number(a.penwidth) || 1)\n if (a.minlen) e.minlen = Math.max(1, Math.min(6, Math.round(Number(a.minlen)) || 1))\n return e\n}\n\nexport function renderDot(src: string): Rendered {\n return renderGraph(parseDot(src)[0])\n}\n\nexport function renderDotAll(src: string): Rendered[] {\n return parseDot(src).map(renderGraph)\n}\n","/** Browser helpers shared by the diagram packages (not part of their typed API). */\n\n/** A PNG of an SVG picture, `scale` times its size (2: sharp on high-density screens). Browser only. */\nexport async function svgToPng(svg: string, scale = 2): Promise<Blob> {\n const size = (k: string) => Number(new RegExp(`<svg[^>]*\\\\s${k}=\"([\\\\d.]+)\"`).exec(svg)?.[1] ?? 0)\n const w = size('width')\n const h = size('height')\n if (!w || !h) throw new Error('Not a picture with a size')\n const img = new Image()\n img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n await img.decode()\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(w * scale))\n canvas.height = Math.max(1, Math.round(h * scale))\n const g = canvas.getContext('2d')\n if (!g) throw new Error('No 2D canvas')\n g.scale(scale, scale)\n g.drawImage(img, 0, 0, w, h)\n return new Promise((resolve, reject) => canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('PNG export failed'))), 'image/png'))\n}\n\n/** Puts pictures in an element (the SVG is built by the renderer: text escaped, no scripts or links). */\nexport function show(target: Element, svgs: string[]) {\n target.innerHTML = svgs.join('')\n}\n","/**\n * @p10node/graphviz: Graphviz DOT text → SVG, with no DOM (browser, worker, Node, Bun), no server and no dependency.\n */\nimport { renderDotAll } from '../../../src/core/diagram/dot'\nimport { show, svgToPng } from '../../diagram/src/dom'\n\n/** A drawing: a self-contained SVG document and its size in CSS pixels. */\nexport interface Diagram {\n svg: string\n width: number\n height: number\n}\n\n/** The source cannot be drawn (unsupported diagram kind, syntax the reader does not follow). */\nexport class DiagramError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DiagramError'\n }\n}\n\n/** Every drawing of a source (one per graph). */\nexport function renderEach(source: string): Diagram[] {\n try {\n return renderDotAll(source).map((d) => ({ svg: d.svg, width: d.w, height: d.h }))\n } catch (e) {\n throw new DiagramError((e as Error).message)\n }\n}\n\n/** The (first) drawing of a source. */\nexport function render(source: string): Diagram {\n return renderEach(source)[0]\n}\n\n/** Draws a source into an element (its content is replaced). */\nexport function renderTo(target: Element, source: string): Diagram[] {\n const ds = renderEach(source)\n show(\n target,\n ds.map((d) => d.svg),\n )\n return ds\n}\n\n/** A PNG of a drawing's SVG, `scale` times its size. Browser only. */\nexport function toPng(svg: string, scale = 2): Promise<Blob> {\n return svgToPng(svg, scale)\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,36 @@
1
1
  {
2
2
  "name": "@p10node/graphviz",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.9.0",
4
+ "description": "Graphviz DOT graphs to SVG in the browser or Node, with no WebAssembly, server or dependency",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "main": "./dist/index.js",
11
+ "module": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "sideEffects": false,
20
+ "keywords": [
21
+ "graphviz",
22
+ "dot",
23
+ "graph",
24
+ "diagram",
25
+ "svg"
26
+ ],
27
+ "homepage": "https://github.com/p10node/office-engine/tree/main/packages/graphviz#readme",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/p10node/office-engine.git",
31
+ "directory": "packages/graphviz"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ }
36
+ }