@p10node/markdown 0.13.0 → 0.13.1
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.
- package/dist/index.js +335 -321
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["esc","SIZE","lines","MARGIN","MARGIN","r2","sequence","LINK","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","slope","sec","s1","s2","h1","h2","segs","label","back","boxes","x0","x1","y0","y1","ASCII","charWidth","cp","textWidth","mono","ch","text","size","bold","lineHeight","measure","lines","wrap","line","max","cur","word","next","esc$1","NAMED","color","THEME","paint","Svg","y","rx","cx","cy","x2","y2","points","closed","lh","attrs","bg","pathData","cmds","labelText","name","m","e","unMarkdown","DiagramError","GraphBuilder","defShape","id","patch","cluster","SIZE$1","SMALL","PX","PY","LH","lines$1","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","side","col","head","many","trimEnd","last","end","start","len","c2","edgeColor","MARGIN$2","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","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","MARGIN$1","r2$1","renderPie","slices","a0","frac","a1","p0","p1","ly","lw","fmt","HOUR","DAY","pad2","renderGantt","tasks","t0","t1","sectW","chartW","scale","X","bottom","xa","fill","GAP_X","GAP_Y","renderTree","fs","circle","build","right","left","acc","place","yTop","sideSpan","ks","spanR","spanL","minY","maxY","all","walk","title","ox","oy","P","shape","tint","ink","r2","SequenceBuilder","SIZE","MSG","MLH","MARGIN","pbox","drawParticipant","textBelow","arrowHead","renderSequence","ps","idx","gap","leftExtra","rightExtra","need","have","num","count","deepest","frameRoom","width","headH","svgBack","svgMid","svgFront","active","bars","frames","open","ended","touch","actX","activate","deactivate","nw","numberBadge","footer","tab","frameP","el","lifeTop","renderModel","prepare","fm","parseMermaid","body","flowchart","sequence$1","classDiagram","stateDiagram","erDiagram","pie","gantt","mindmap","renderMermaid","DIRS","mText","raw","cssStyle","decl","prop","merge","splitTop","OPENERS","NEW_SHAPES","ID","readNode","closes","shapes","cls","ctx","HEAD","readEdge","rest","run","dotted","pipe","thick","extra","linkStyles","statements","inline","st2","pending","amp","def","ids","SEQ_ARROWS","P_KIND","blocks","arrowRe","typ","generic","MARK","info","ns","member","inBody","notes","relRe","la","ma","mb","lb","header","sections","desc","defs","classes","noteLines","noteFor","sid","asTarget","target","CARD","CARD_WORDS","inEntity","entity","words","symRe","wordRe","shown","showData","UNIT","parseDate","re","year","byId","today","parts","task","tag","startRaw","endRaw","after","dur","until","TREE_SHAPES","indent","sh","node","plantUmlBlocks","parsePlantUml","parseBlock","renderPlantUml","clean","umlKind","activity","sequence","description","pText","skip","titleLines","inComment","has","KIND","calls","note","pid","as1","as2","who","msg","seqMessage","act","ARROW","dashed","headOf","ELEMENT","CLASSES","MARKS","END","LINK$1","stackKinds","noteTarget","noteId","element","ensure","nid","stereo","ra","lm","l1","dirWord","l2","rm","rz","hl","mem","ins","rev","pendingLabel","exits","cond","block","put","stop","d2","bm","fork","wbs","clear","FENCE_LANG","DIAGRAM_NAME","LIMIT","renderDiagrams","lang","SAFE_SCHEMES","safeHref","href","url","scheme","esc","FENCE","ATX","SETEXT","HR","QUOTE","LIST","DELIM","REF","markdownToHtml","md","opts","kept","fence","startsBlock","para","flush","html","tight","mark","close","code","heading","inner","empty","table","ordered","delim","items","loose","item","blank","trailing","startNo","box","cells","align","cell","level","base","diagram","safeSrc","PUNCT","LINK_TAIL","IMAGE","LINK","REF_LINK","hold","unwrap","image","alt","t2","t3","emphasis","ref","bang","pre","render","markdown","options","renderTo"],"sources":["../../../src/core/diagram/layout.ts","../../../src/core/diagram/svg.ts","../../../src/core/diagram/graph.ts","../../../src/core/diagram/dot.ts","../../../src/core/diagram/charts.ts","../../../src/core/diagram/sequence.ts","../../../src/core/diagram/model.ts","../../../src/core/diagram/mermaid.ts","../../../src/core/diagram/plantuml.ts","../../../src/core/diagram/index.ts","../../../src/core/url.ts","../src/markdown.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 // one smooth curve through the waypoints, the across coordinate a function of the rank coordinate: square-on at\n // the ports and at a straight piece, a monotone (Fritsch–Carlson) slope at the other waypoints, so the curve never\n // swings out past one (a dummy next to an end would otherwise bend the whole offset into a short piece)\n const n = pts.length\n const slope = new Array<number>(n).fill(0)\n const sec = (k: number) => (pts[k + 1].x - pts[k].x) / Math.max(0.5, pts[k + 1].y - pts[k].y)\n for (let k = 1; k + 1 < n; k++) {\n if (straight[k - 1] || straight[k]) continue\n const s1 = sec(k - 1)\n const s2 = sec(k)\n if (s1 * s2 <= 0) continue\n const h1 = pts[k].y - pts[k - 1].y\n const h2 = pts[k + 1].y - pts[k].y\n slope[k] = (3 * (h1 + h2)) / ((2 * h2 + h1) / s1 + (h2 + 2 * h1) / s2)\n }\n const segs: Seg[] = []\n for (let k = 1; k < n; k++) {\n const p = pts[k - 1]\n const q = pts[k]\n const h = (q.y - p.y) / 3\n if (straight[k - 1] || (Math.abs(p.x - q.x) < 0.5 && !slope[k - 1] && !slope[k])) segs.push({ c: 'L', p: [q] })\n else segs.push({ c: 'C', p: [{ x: p.x + slope[k - 1] * h, y: p.y + h }, { x: q.x - slope[k] * h, y: q.y - h }, q] })\n }\n const label = labelAt[i] >= 0 ? centre(labelAt[i]) : undefined\n if (!reversed[i]) return { start: pts[0], segs, label }\n // drawn from the other end: the pieces in reverse, each cubic's control points swapped\n const back: Seg[] = []\n for (let k = n - 1; k >= 1; k--) {\n const s = segs[k - 1]\n back.push(s.c === 'C' ? { c: 'C', p: [s.p[1], s.p[0], pts[k - 1]] } : { c: 'L', p: [pts[k - 1]] })\n }\n return { start: pts[n - 1], segs: back, label }\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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\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') {\n const c2 = { x: last.p[1].x - d.x * Math.min(len, 6), y: last.p[1].y - d.y * Math.min(len, 6) }\n // a short last piece: the control point stays ahead of the first one, or the curve would loop back\n const k = Math.min(0, (c2.x - last.p[0].x) * d.x + (c2.y - last.p[0].y) * d.y)\n last.p[1] = { x: c2.x - d.x * k, y: c2.y - d.y * k }\n }\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') {\n const c1 = { x: first.p[0].x - dTail.x * Math.min(tl, 6), y: first.p[0].y - dTail.y * Math.min(tl, 6) }\n const k = Math.max(0, (first.p[1].x - c1.x) * dTail.x + (first.p[1].y - c1.y) * dTail.y)\n first.p[0] = { x: c1.x + dTail.x * k, y: c1.y + dTail.y * k }\n }\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","/** Pie charts, Gantt charts and mind maps / work breakdown trees. */\nimport type { Rendered } from './graph'\nimport { measure, pathData, Svg, textWidth, THEME, wrap, type Pt } from './svg'\n\nconst MARGIN = 16\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\n// ---------------------------------------------------------------- pie\n\nexport interface Pie {\n title?: string\n showData?: boolean\n slices: { label: string; value: number }[]\n}\n\nexport function renderPie(p: Pie): Rendered {\n const slices = p.slices.filter((s) => s.value > 0 && Number.isFinite(s.value))\n if (!slices.length) throw new Error('The pie chart has no values')\n const total = slices.reduce((a, s) => a + s.value, 0)\n const R = 130\n const svg = new Svg()\n const titleH = p.title ? 36 : 0\n const cx = MARGIN + R\n const cy = MARGIN + titleH + R\n const color = (k: number) => THEME.series[k % THEME.series.length]\n let a0 = -Math.PI / 2\n const at = (a: number, r: number): Pt => ({ x: cx + Math.cos(a) * r, y: cy + Math.sin(a) * r })\n slices.forEach((s, k) => {\n const frac = s.value / total\n const a1 = a0 + frac * 2 * Math.PI\n if (frac >= 0.9999) svg.circle(cx, cy, R, { fill: color(k), stroke: '#ffffff', sw: 2 })\n else {\n const p0 = at(a0, R)\n const p1 = at(a1, R)\n svg.path(`M${r2(cx)} ${r2(cy)} L${r2(p0.x)} ${r2(p0.y)} A${R} ${R} 0 ${frac > 0.5 ? 1 : 0} 1 ${r2(p1.x)} ${r2(p1.y)} Z`, { fill: color(k), stroke: '#ffffff', sw: 2 })\n }\n if (frac >= 0.06) {\n const m = at((a0 + a1) / 2, R * 0.66)\n svg.text(m.x, m.y, `${Math.round(frac * 1000) / 10}%`, { anchor: 'middle', size: 13, bold: true, color: '#ffffff' })\n }\n a0 = a1\n })\n // legend\n const lx = cx + R + 30\n const lh = 24\n const ly = cy - (slices.length * lh) / 2 + lh / 2\n let lw = 0\n slices.forEach((s, k) => {\n const text = p.showData ? `${s.label} [${fmt(s.value)}]` : s.label\n svg.rect(lx, ly + k * lh - 8, 16, 16, { fill: color(k) }, 3)\n svg.text(lx + 24, ly + k * lh, text)\n lw = Math.max(lw, textWidth(text, 14))\n })\n let W = lx + 24 + lw + MARGIN\n const H = Math.max(cy + R, ly + slices.length * lh) + MARGIN\n if (p.title) {\n W = Math.max(W, textWidth(p.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, p.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 fmt = (v: number) => (Number.isInteger(v) ? String(v) : String(Math.round(v * 100) / 100))\n\n// ---------------------------------------------------------------- gantt\n\nexport interface GanttTask {\n name: string\n start: number\n end: number\n done?: boolean\n active?: boolean\n crit?: boolean\n milestone?: boolean\n}\n\nexport interface Gantt {\n title?: string\n sections: { name: string; tasks: GanttTask[] }[]\n}\n\nconst HOUR = 3600e3\nconst DAY = 24 * HOUR\n\nconst pad2 = (v: number) => String(v).padStart(2, '0')\n\nexport function renderGantt(g: Gantt): Rendered {\n const tasks = g.sections.flatMap((s) => s.tasks)\n if (!tasks.length) throw new Error('The Gantt chart has no tasks')\n const t0 = Math.min(...tasks.map((t) => t.start))\n const t1 = Math.max(...tasks.map((t) => Math.max(t.end, t.start)))\n const span = Math.max(t1 - t0, HOUR)\n const sectW = Math.min(180, Math.max(0, ...g.sections.map((s) => textWidth(s.name, 13, true))) + 24)\n const chartW = Math.max(560, Math.min(1100, tasks.length * 60))\n const scale = chartW / span\n const titleH = g.title ? 36 : 0\n const ROW = 28\n const axisH = 24\n const x0 = MARGIN + sectW\n const y0 = MARGIN + titleH\n const X = (t: number) => x0 + (t - t0) * scale\n const svg = new Svg()\n const H = y0 + tasks.length * ROW + axisH + MARGIN + 6\n // ticks\n const steps = [HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR, DAY, 2 * DAY, 7 * DAY, 14 * DAY, 30 * DAY, 91 * DAY, 365 * DAY]\n const step = steps.find((st) => span / st <= 12) ?? 365 * DAY\n const first = Math.ceil(t0 / step) * step\n const label = (t: number) => {\n const d = new Date(t)\n if (step < DAY) return `${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`\n if (step >= 365 * DAY) return String(d.getUTCFullYear())\n if (step >= 30 * DAY) return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}`\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`\n }\n const bottom = y0 + tasks.length * ROW + 4\n for (let t = first; t <= t1; t += step) {\n const x = X(t)\n svg.line(x, y0, x, bottom, { stroke: '#e3e6ec', sw: 1 })\n svg.text(x, bottom + 12, label(t), { anchor: 'middle', size: 11, color: THEME.muted })\n }\n let row = 0\n g.sections.forEach((s, k) => {\n const color = THEME.series[k % THEME.series.length]\n const top = y0 + row * ROW\n if (k % 2 === 0) svg.rect(MARGIN, top, sectW + chartW, s.tasks.length * ROW, { fill: '#f6f7fa' })\n if (s.name) svg.text(MARGIN + 6, top + (s.tasks.length * ROW) / 2, wrap([s.name], sectW - 12, 13, true), { size: 13, bold: true })\n for (const t of s.tasks) {\n const y = y0 + row * ROW + ROW / 2\n if (t.milestone) {\n const x = X(t.start)\n svg.poly(\n [\n [x, y - 8],\n [x + 8, y],\n [x, y + 8],\n [x - 8, y],\n ],\n { fill: t.crit ? '#e5596b' : THEME.dark },\n )\n svg.text(x + 14, y, t.name, { size: 12 })\n } else {\n const xa = X(t.start)\n const w = Math.max(3, X(t.end) - xa)\n const fill = t.done ? '#c7ccd6' : color\n svg.rect(xa, y - 9, w, 18, { fill, stroke: t.crit ? '#c0392b' : t.active ? THEME.dark : undefined, sw: t.crit || t.active ? 2 : 0 }, 3)\n const tw = textWidth(t.name, 12)\n if (tw + 10 < w) svg.text(xa + w / 2, y, t.name, { anchor: 'middle', size: 12, color: t.done ? THEME.ink : '#ffffff' })\n else if (xa + w + 6 + tw < x0 + chartW + 200) svg.text(xa + w + 6, y, t.name, { size: 12 })\n else svg.text(xa - 6, y, t.name, { anchor: 'end', size: 12 })\n }\n row++\n }\n })\n let W = x0 + chartW + MARGIN\n // labels to the right of the last bars\n for (const t of tasks) W = Math.max(W, X(t.end) + 12 + textWidth(t.name, 12) + MARGIN)\n if (g.title) {\n W = Math.max(W, textWidth(g.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, 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\n// ---------------------------------------------------------------- mind maps / trees\n\nexport interface TreeNode {\n label: string\n shape?: 'rect' | 'round' | 'circle' | 'cloud' | 'hexagon' | 'none'\n side?: 'left' | 'right'\n children: TreeNode[]\n}\n\ninterface Placed {\n n: TreeNode\n w: number\n h: number\n text: string[]\n x: number\n y: number\n color: string\n depth: number\n kids: Placed[]\n span: number\n}\n\nconst GAP_X = 44\nconst GAP_Y = 12\n\nexport function renderTree(root: TreeNode, title?: string): Rendered {\n const svg = new Svg()\n const size = (n: TreeNode, depth: number) => {\n const fs = depth === 0 ? 16 : depth === 1 ? 14 : 13\n const text = wrap(n.label.split('\\n'), 220, fs, depth === 0)\n const t = measure(text, fs, depth === 0)\n const circle = n.shape === 'circle'\n const d = Math.max(t.w, t.h) + 20\n return { text, w: circle ? d : t.w + (n.shape === 'none' ? 8 : 24), h: circle ? d : t.h + (n.shape === 'none' ? 6 : 14), fs }\n }\n const build = (n: TreeNode, depth: number, color: string): Placed => {\n const s = size(n, depth)\n const kids = n.children.map((c, k) => build(c, depth + 1, depth === 0 ? THEME.series[k % THEME.series.length] : color))\n const span = Math.max(s.h, kids.reduce((a, c) => a + c.span, 0) + Math.max(0, kids.length - 1) * GAP_Y)\n return { n, w: s.w, h: s.h, text: s.text, x: 0, y: 0, color, depth, kids, span }\n }\n const top = build(root, 0, THEME.dark)\n // sides: explicit, else balanced by size\n let right: Placed[] = []\n let left: Placed[] = []\n if (top.kids.some((k) => k.n.side)) {\n right = top.kids.filter((k) => k.n.side !== 'left')\n left = top.kids.filter((k) => k.n.side === 'left')\n } else if (top.kids.length > 3) {\n const total = top.kids.reduce((a, k) => a + k.span, 0)\n let acc = 0\n for (const k of top.kids) {\n if (acc < total / 2) right.push(k)\n else left.push(k)\n acc += k.span\n }\n } else right = top.kids\n const place = (p: Placed, x: number, yTop: number, dir: number) => {\n p.x = x\n let y = yTop + (p.span - (p.kids.reduce((a, c) => a + c.span, 0) + Math.max(0, p.kids.length - 1) * GAP_Y)) / 2\n for (const c of p.kids) {\n place(c, x + dir * (p.w / 2 + GAP_X + c.w / 2), y, dir)\n y += c.span + GAP_Y\n }\n p.y = p.kids.length ? (p.kids[0].y + p.kids[p.kids.length - 1].y) / 2 : yTop + p.span / 2\n }\n const sideSpan = (ks: Placed[]) => ks.reduce((a, c) => a + c.span, 0) + Math.max(0, ks.length - 1) * GAP_Y\n const spanR = sideSpan(right)\n const spanL = sideSpan(left)\n const height = Math.max(top.h, spanR, spanL)\n let y = (height - spanR) / 2\n for (const c of right) {\n place(c, top.w / 2 + GAP_X + c.w / 2, y, 1)\n y += c.span + GAP_Y\n }\n y = (height - spanL) / 2\n for (const c of left) {\n place(c, -(top.w / 2 + GAP_X + c.w / 2), y, -1)\n y += c.span + GAP_Y\n }\n top.x = 0\n top.y = height / 2\n // bounds\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n const all: Placed[] = []\n const walk = (p: Placed) => {\n all.push(p)\n minX = Math.min(minX, p.x - p.w / 2)\n maxX = Math.max(maxX, p.x + p.w / 2)\n minY = Math.min(minY, p.y - p.h / 2)\n maxY = Math.max(maxY, p.y + p.h / 2)\n p.kids.forEach(walk)\n }\n walk(top)\n const titleH = title ? 36 : 0\n const ox = MARGIN - minX\n const oy = MARGIN + titleH - minY\n const P = (p: Placed): Pt => ({ x: p.x + ox, y: p.y + oy })\n for (const p of all) {\n for (const c of p.kids) {\n const a = P(p)\n const b = P(c)\n const dir = Math.sign(b.x - a.x) || 1\n const s = { x: a.x + (dir * p.w) / 2, y: a.y }\n const t = { x: b.x - (dir * c.w) / 2, y: b.y }\n const m = (s.x + t.x) / 2\n svg.path(pathData([{ c: 'M', p: [s] }, { c: 'C', p: [{ x: m, y: s.y }, { x: m, y: t.y }, t] }]), { stroke: c.color, sw: Math.max(1.2, 3.2 - c.depth * 0.6) })\n }\n }\n for (const p of all) {\n const c = P(p)\n const fs = p.depth === 0 ? 16 : p.depth === 1 ? 14 : 13\n const x = c.x - p.w / 2\n const y = c.y - p.h / 2\n const shape = p.n.shape ?? (p.depth === 0 ? 'round' : 'round')\n const fill = p.depth === 0 ? THEME.dark : p.depth === 1 ? p.color : tint(p.color)\n const ink = p.depth <= 1 ? '#ffffff' : THEME.ink\n if (shape === 'none') {\n svg.line(x, y + p.h, x + p.w, y + p.h, { stroke: p.color, sw: 1.5 })\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs })\n continue\n }\n if (shape === 'circle') svg.circle(c.x, c.y, p.w / 2, { fill, stroke: p.color, sw: 1.2 })\n else if (shape === 'hexagon') {\n const s = p.h / 4\n svg.poly(\n [\n [x + s, y],\n [x + p.w - s, y],\n [x + p.w, c.y],\n [x + p.w - s, y + p.h],\n [x + s, y + p.h],\n [x, c.y],\n ],\n { fill, stroke: p.color, sw: 1.2 },\n )\n } else svg.rect(x, y, p.w, p.h, { fill, stroke: p.depth === 0 ? undefined : p.color, sw: 1.2 }, shape === 'rect' ? 2 : shape === 'cloud' ? p.h / 2 : 8)\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs, bold: p.depth === 0, color: ink })\n }\n let W = maxX - minX + 2 * MARGIN\n const H = maxY - minY + 2 * MARGIN + titleH\n if (title) {\n W = Math.max(W, textWidth(title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, 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\n/** a light version of a #rrggbb color */\nfunction tint(c: string): string {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(c)\n if (!m) return '#f1f3f7'\n return '#' + [m[1], m[2], m[3]].map((h) => Math.round(parseInt(h, 16) * 0.22 + 255 * 0.78).toString(16).padStart(2, '0')).join('')\n}\n","/**\n * Sequence diagrams (Mermaid sequenceDiagram, PlantUML): participants across, messages down, with activations,\n * notes, fragments (loop / alt / opt / par…), dividers and delays.\n */\nimport type { Rendered } from './graph'\nimport { DiagramError, lineHeight, measure, Svg, textWidth, THEME } from './svg'\n\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\nexport type PKind = 'participant' | 'actor' | 'database' | 'boundary' | 'control' | 'entity' | 'collections' | 'queue'\n\nexport interface Participant {\n id: string\n label: string\n kind: PKind\n fill?: string\n}\n\nexport type MsgHead = 'filled' | 'open' | 'cross' | 'half' | 'none'\n\nexport type SeqEvent =\n | { t: 'msg'; from: string; to: string; text: string; dashed: boolean; head: MsgHead; both?: boolean; activate?: boolean; deactivate?: boolean }\n | { t: 'act'; who: string; on: boolean }\n | { t: 'note'; pos: 'left' | 'right' | 'over'; who: string[]; text: string }\n | { t: 'block'; kind: string; label: string; fill?: string }\n | { t: 'else'; label: string }\n | { t: 'end' }\n | { t: 'divider'; text: string }\n | { t: 'delay'; text: string }\n | { t: 'space'; h: number }\n | { t: 'destroy'; who: string }\n\nexport interface Sequence {\n title?: string\n participants: Participant[]\n events: SeqEvent[]\n autonumber?: boolean\n /** participants drawn again at the bottom (default true) */\n footer?: boolean\n}\n\nexport class SequenceBuilder {\n readonly s: Sequence = { participants: [], events: [] }\n private ids = new Map<string, Participant>()\n\n participant(id: string, patch: Partial<Participant> = {}): Participant {\n let p = this.ids.get(id)\n if (!p) {\n p = { id, label: id, kind: 'participant' }\n this.ids.set(id, p)\n this.s.participants.push(p)\n }\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) (p as unknown as Record<string, unknown>)[k] = v\n return p\n }\n\n has(id: string) {\n return this.ids.has(id)\n }\n\n push(e: SeqEvent) {\n if (e.t === 'msg') {\n this.participant(e.from)\n this.participant(e.to)\n } else if (e.t === 'note') e.who.forEach((w) => this.participant(w))\n else if (e.t === 'act' || e.t === 'destroy') this.participant(e.who)\n this.s.events.push(e)\n }\n}\n\nconst SIZE = 14\nconst MSG = 13\nconst MLH = lineHeight(MSG)\nconst MARGIN = 16\nconst lines = (s: string) => (s ? s.split('\\n') : [])\n\ninterface PBox {\n w: number\n h: number\n text: string[]\n}\n\nfunction pbox(p: Participant): PBox {\n const text = lines(p.label)\n const t = measure(text, SIZE)\n switch (p.kind) {\n case 'actor':\n return { w: Math.max(44, t.w + 8), h: 44 + t.h, text }\n case 'boundary':\n case 'control':\n case 'entity':\n return { w: Math.max(44, t.w + 8), h: 34 + t.h, text }\n case 'database':\n return { w: Math.max(64, t.w + 24), h: t.h + 30, text }\n default:\n return { w: Math.max(64, t.w + 24), h: t.h + 18, text }\n }\n}\n\nfunction drawParticipant(svg: Svg, p: Participant, b: PBox, cx: number, y: number) {\n const fill = p.fill ?? THEME.fill\n const st = { fill, stroke: THEME.stroke, sw: 1.3 }\n const ink = { fill: 'none', stroke: THEME.dark, sw: 1.5 }\n const textBelow = (top: number) => svg.text(cx, top + (b.text.length * lineHeight(SIZE)) / 2, b.text, { anchor: 'middle' })\n const x = cx - b.w / 2\n switch (p.kind) {\n case 'actor':\n svg.circle(cx, y + 8, 7, { ...ink, fill })\n svg.line(cx, y + 15, cx, y + 29, ink).line(cx - 11, y + 20, cx + 11, y + 20, ink)\n svg.line(cx, y + 29, cx - 9, y + 41, ink).line(cx, y + 29, cx + 9, y + 41, ink)\n textBelow(y + 44)\n return\n case 'boundary':\n svg.circle(cx + 4, y + 14, 12, st).line(cx - 14, y + 4, cx - 14, y + 24, ink).line(cx - 14, y + 14, cx - 8, y + 14, ink)\n textBelow(y + 32)\n return\n case 'control':\n svg.circle(cx, y + 15, 12, st).poly(\n [\n [cx + 4, y - 1],\n [cx - 2, y + 3],\n [cx + 4, y + 7],\n ],\n ink,\n false,\n )\n textBelow(y + 32)\n return\n case 'entity':\n svg.circle(cx, y + 13, 12, st).line(cx - 12, y + 27, cx + 12, y + 27, ink)\n textBelow(y + 32)\n return\n case 'database': {\n const ry = 6\n const w = b.w\n const h = b.h\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x + w)} ${r2(y + ry)} L${r2(x + w)} ${r2(y + h - ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x)} ${r2(y + h - ry)} Z`, st)\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 0 ${r2(x + w)} ${r2(y + ry)}`, { ...st, fill: 'none' })\n svg.text(cx, y + h / 2 + ry / 2, b.text, { anchor: 'middle' })\n return\n }\n case 'collections':\n svg.rect(x + 4, y - 4, b.w, b.h, st, 3)\n svg.rect(x, y, b.w, b.h, st, 3)\n break\n case 'queue':\n svg.rect(x, y, b.w, b.h, st, b.h / 2)\n break\n default:\n svg.rect(x, y, b.w, b.h, st, 3)\n }\n svg.text(cx, y + b.h / 2, b.text, { anchor: 'middle' })\n}\n\nfunction arrowHead(svg: Svg, head: MsgHead, x: number, y: number, dir: number) {\n const col = THEME.line\n switch (head) {\n case 'filled':\n svg.poly(\n [\n [x, y],\n [x - dir * 10, y - 4.5],\n [x - dir * 10, y + 4.5],\n ],\n { fill: col, stroke: col, sw: 1 },\n )\n break\n case 'open':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n [x - dir * 10, y + 5],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'half':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'cross':\n svg.line(x - 5 - dir * 4, y - 5, x + 5 - dir * 4, y + 5, { stroke: col, sw: 1.6 }).line(x - 5 - dir * 4, y + 5, x + 5 - dir * 4, y - 5, { stroke: col, sw: 1.6 })\n break\n }\n}\n\ninterface Frame {\n kind: string\n label: string\n fill?: string\n y0: number\n y1: number\n lo: number\n hi: number\n depth: number\n elses: { y: number; label: string }[]\n}\n\nexport function renderSequence(s: Sequence): Rendered {\n const ps = s.participants\n if (!ps.length) throw new DiagramError('The sequence diagram has no participants')\n if (ps.length > 300 || s.events.length > 8000) throw new DiagramError('The sequence diagram is too large to draw')\n const idx = new Map(ps.map((p, k) => [p.id, k]))\n const boxes = ps.map(pbox)\n const n = ps.length\n // ---- horizontal: gaps between neighbouring lifelines\n const gap = new Array(n).fill(0)\n for (let k = 1; k < n; k++) gap[k] = (boxes[k - 1].w + boxes[k].w) / 2 + 28\n let leftExtra = 0\n let rightExtra = 0\n const need = (a: number, b: number, v: number) => {\n if (a > b) [a, b] = [b, a]\n if (a === b) return\n let have = 0\n for (let k = a + 1; k <= b; k++) have += gap[k]\n if (have >= v) return\n const add = (v - have) / (b - a)\n for (let k = a + 1; k <= b; k++) gap[k] += add\n }\n const num = (k: number) => (s.autonumber ? textWidth(String(k), 10) + 14 : 0)\n let count = 0\n for (const e of s.events) {\n if (e.t === 'msg') {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const tw = Math.max(0, ...lines(e.text).map((l) => textWidth(l, MSG))) + num(count)\n if (a === b) {\n if (a + 1 < n) need(a, a + 1, boxes[a + 1].w / 2 + tw + 44)\n else rightExtra = Math.max(rightExtra, tw + 44 - boxes[a].w / 2)\n } else need(a, b, tw + 30)\n } else if (e.t === 'note') {\n const tw = measure(lines(e.text), MSG).w + 20\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n if (e.pos === 'over') {\n if (a !== b) need(a, b, tw - 50)\n } else if (e.pos === 'left') {\n if (a > 0) need(a - 1, a, tw + 16 + boxes[a - 1].w / 2)\n else leftExtra = Math.max(leftExtra, tw + 16 - boxes[0].w / 2)\n } else if (b + 1 < n) need(b, b + 1, tw + 16 + boxes[b + 1].w / 2)\n else rightExtra = Math.max(rightExtra, tw + 16 - boxes[b].w / 2)\n }\n }\n const cx: number[] = []\n // frames add a margin on the outer lifelines\n const deepest = (() => {\n let d = 0\n let m = 0\n for (const e of s.events) {\n if (e.t === 'block') m = Math.max(m, ++d)\n else if (e.t === 'end') d = Math.max(0, d - 1)\n }\n return m\n })()\n const frameRoom = deepest ? 12 + deepest * 8 : 0\n cx[0] = MARGIN + Math.max(boxes[0].w / 2, leftExtra + boxes[0].w / 2, frameRoom + 10)\n for (let k = 1; k < n; k++) cx[k] = cx[k - 1] + gap[k]\n let width = cx[n - 1] + Math.max(boxes[n - 1].w / 2, rightExtra + boxes[n - 1].w / 2, frameRoom + 10) + MARGIN\n\n // ---- vertical\n const titleH = s.title ? 34 : 0\n const top = MARGIN + titleH\n const headH = Math.max(...boxes.map((b) => b.h))\n let y = top + headH + 18\n const svgBack = new Svg()\n const svgMid = new Svg()\n const svgFront = new Svg()\n const active: number[][] = ps.map(() => [])\n const bars: { k: number; y0: number; y1: number; depth: number }[] = []\n const frames: Frame[] = []\n const open: Frame[] = []\n const ended = new Map<number, number>()\n const touch = (lo: number, hi: number) => {\n for (const f of open) {\n f.lo = Math.min(f.lo, lo)\n f.hi = Math.max(f.hi, hi)\n }\n }\n const actX = (k: number, side: number) => {\n const d = active[k].length\n return cx[k] + (d ? side * 5 + (d - 1) * 5 : 0)\n }\n const activate = (k: number, at: number) => active[k].push(at)\n const deactivate = (k: number, at: number) => {\n const y0 = active[k].pop()\n if (y0 !== undefined) bars.push({ k, y0, y1: at, depth: active[k].length })\n }\n count = 0\n for (const e of s.events) {\n switch (e.t) {\n case 'msg': {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const text = lines(e.text)\n const th = text.length * MLH\n const paint = { stroke: THEME.line, sw: 1.4, dash: e.dashed ? '6 4' : undefined }\n const nw = num(count)\n if (a === b) {\n y += th + 4\n const x0 = actX(a, 1)\n const loopW = 34\n svgMid.poly(\n [\n [x0, y],\n [x0 + loopW, y],\n [x0 + loopW, y + 20],\n [x0 + 2, y + 20],\n ],\n paint,\n false,\n )\n arrowHead(svgMid, e.head, x0, y + 20, -1)\n svgFront.text(x0 + 6 + nw, y - 4 - th / 2, text, { size: MSG })\n if (s.autonumber) numberBadge(svgFront, x0, y, count)\n touch(cx[a] - 10, x0 + loopW + 6 + nw + Math.max(...text.map((l) => textWidth(l, MSG))))\n y += 20\n if (e.activate) activate(b, y)\n if (e.deactivate) deactivate(a, y)\n y += 14\n break\n }\n y += th + 6\n const dir = b > a ? 1 : -1\n if (e.activate) activate(b, y)\n const x1 = actX(a, dir)\n const x2 = actX(b, -dir)\n svgMid.line(x1, y, x2, y, paint)\n arrowHead(svgMid, e.head, x2, y, dir)\n if (e.both) arrowHead(svgMid, e.head, x1, y, -dir)\n svgFront.text((x1 + x2) / 2 + (dir * nw) / 2, y - 5 - th / 2, text, { anchor: 'middle', size: MSG })\n if (s.autonumber) numberBadge(svgFront, x1, y, count)\n if (e.deactivate) deactivate(a, y)\n touch(Math.min(cx[a], cx[b]), Math.max(cx[a], cx[b]))\n y += 14\n break\n }\n case 'act': {\n const k = idx.get(e.who)!\n if (e.on) activate(k, y - 6)\n else deactivate(k, y - 6)\n break\n }\n case 'note': {\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n const text = lines(e.text)\n const t = measure(text, MSG)\n const w = Math.max(t.w + 20, e.pos === 'over' && a !== b ? cx[b] - cx[a] + 50 : 0, 60)\n const h = t.h + 12\n y += 6\n const x = e.pos === 'left' ? cx[a] - 12 - w : e.pos === 'right' ? cx[b] + 12 : (cx[a] + cx[b]) / 2 - w / 2\n svgFront.poly(\n [\n [x, y],\n [x + w - 8, y],\n [x + w, y + 8],\n [x + w, y + h],\n [x, y + h],\n ],\n { fill: THEME.note, stroke: THEME.noteStroke, sw: 1 },\n )\n svgFront.text(x + 10, y + h / 2, text, { size: MSG })\n touch(x, x + w)\n y += h + 8\n break\n }\n case 'block': {\n y += 10\n const f: Frame = { kind: e.kind, label: e.label, fill: e.fill, y0: y, y1: y, lo: Infinity, hi: -Infinity, depth: open.length, elses: [] }\n frames.push(f)\n open.push(f)\n y += e.kind === 'rect' ? 8 : 26\n break\n }\n case 'else': {\n const f = open[open.length - 1]\n if (!f) break\n y += 8\n f.elses.push({ y, label: e.label })\n y += 24\n break\n }\n case 'end': {\n const f = open.pop()\n if (!f) break\n y += 10\n f.y1 = y\n y += 6\n break\n }\n case 'divider': {\n y += 16\n const t = measure(lines(e.text), MSG)\n svgFront.line(MARGIN / 2, y - 2, width - MARGIN / 2, y - 2, { stroke: THEME.muted, sw: 1 }).line(MARGIN / 2, y + 2, width - MARGIN / 2, y + 2, { stroke: THEME.muted, sw: 1 })\n if (e.text) {\n svgFront.rect(width / 2 - t.w / 2 - 10, y - t.h / 2 - 4, t.w + 20, t.h + 8, { fill: '#ffffff', stroke: THEME.muted, sw: 1 }, 3)\n svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, bold: true })\n }\n y += 22\n break\n }\n case 'delay':\n y += 14\n if (e.text) svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, italic: true, color: THEME.muted })\n y += 18\n break\n case 'space':\n y += e.h\n break\n case 'destroy': {\n const k = idx.get(e.who)!\n y += 6\n svgFront.line(cx[k] - 8, y - 8, cx[k] + 8, y + 8, { stroke: '#c0392b', sw: 2 }).line(cx[k] - 8, y + 8, cx[k] + 8, y - 8, { stroke: '#c0392b', sw: 2 })\n ended.set(k, y)\n y += 14\n break\n }\n }\n }\n for (let k = 0; k < n; k++) while (active[k].length) deactivate(k, y)\n for (const f of open.splice(0)) f.y1 = y\n y += 14\n const footer = s.footer !== false\n const height = y + (footer ? headH : 0) + MARGIN\n\n // frames: widths from what they contain (or the whole width when empty)\n for (const f of frames) {\n const pad = 12 + (deepest - f.depth) * 8\n if (f.lo > f.hi) {\n f.lo = cx[0]\n f.hi = cx[n - 1]\n }\n const x0 = Math.max(4, f.lo - pad)\n // wide enough for its title and branch labels (the picture grows if need be)\n const tab = textWidth(f.kind, 12, true) + 16\n const titles = [f.label ? tab + 8 + textWidth(`[${f.label}]`, 12) : tab, ...f.elses.map((e) => 10 + textWidth(`[${e.label}]`, 12))]\n const x1 = Math.max(Math.min(width - 4, f.hi + pad), f.kind === 'rect' ? 0 : x0 + Math.max(...titles) + 10)\n width = Math.max(width, x1 + 4)\n if (f.kind === 'rect') {\n svgBack.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, { fill: f.fill ?? 'rgba(200, 210, 230, 0.35)' }, 2)\n continue\n }\n const frameP = { stroke: THEME.muted, sw: 1.2 }\n svgMid.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, frameP)\n const tw = tab\n svgMid.poly(\n [\n [x0, f.y0],\n [x0 + tw, f.y0],\n [x0 + tw, f.y0 + 12],\n [x0 + tw - 7, f.y0 + 19],\n [x0, f.y0 + 19],\n ],\n { fill: '#eef0f4', stroke: THEME.muted, sw: 1.2 },\n )\n svgMid.text(x0 + 7, f.y0 + 10, f.kind, { size: 12, bold: true })\n if (f.label) svgMid.text(x0 + tw + 8, f.y0 + 11, `[${f.label}]`, { size: 12, color: THEME.ink, italic: true })\n for (const el of f.elses) {\n svgMid.line(x0, el.y, x1, el.y, { ...frameP, dash: '5 4' })\n if (el.label) svgMid.text(x0 + 10, el.y + 12, `[${el.label}]`, { size: 12, italic: true })\n }\n }\n\n // lifelines, activations, participants\n const out = new Svg()\n const lifeTop = top + headH\n for (let k = 0; k < n; k++) out.line(cx[k], lifeTop, cx[k], ended.get(k) ?? (footer ? y : y - 6), { stroke: '#9aa3b2', sw: 1, dash: '5 4' })\n out.raw(svgBack.body())\n for (const b of bars) {\n const x = cx[b.k] - 5 + b.depth * 5\n out.rect(x, b.y0, 10, Math.max(8, b.y1 - b.y0), { fill: '#f3f4f6', stroke: THEME.stroke, sw: 1 })\n }\n out.raw(svgMid.body())\n out.raw(svgFront.body())\n ps.forEach((p, k) => {\n drawParticipant(out, p, boxes[k], cx[k], top + headH - boxes[k].h)\n if (footer && !ended.has(k)) drawParticipant(out, p, boxes[k], cx[k], y)\n })\n if (s.title) {\n width = Math.max(width, textWidth(s.title, 16, true) + 2 * MARGIN)\n out.text(width / 2, MARGIN + 12, s.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: out.toString(width, height), w: Math.ceil(width), h: Math.ceil(height) }\n}\n\nfunction numberBadge(svg: Svg, x: number, y: number, k: number) {\n const r = Math.max(8, textWidth(String(k), 10) / 2 + 4)\n svg.circle(x, y, r, { fill: THEME.dark })\n svg.text(x, y, String(k), { anchor: 'middle', size: 10, color: '#ffffff', bold: true })\n}\n","/** What a diagram source parses to, and its picture. */\nimport { renderGantt, renderPie, renderTree, type Gantt, type Pie, type TreeNode } from './charts'\nimport { renderGraph, type Graph, type Rendered } from './graph'\nimport { renderSequence, type Sequence } from './sequence'\n\nexport type Model =\n | { t: 'graph'; graph: Graph }\n | { t: 'sequence'; seq: Sequence }\n | { t: 'pie'; pie: Pie }\n | { t: 'gantt'; gantt: Gantt }\n | { t: 'tree'; root: TreeNode; title?: string }\n\nexport function renderModel(m: Model): Rendered {\n switch (m.t) {\n case 'graph':\n return renderGraph(m.graph)\n case 'sequence':\n return renderSequence(m.seq)\n case 'pie':\n return renderPie(m.pie)\n case 'gantt':\n return renderGantt(m.gantt)\n case 'tree':\n return renderTree(m.root, m.title)\n }\n}\n","/**\n * Mermaid: flowchart / graph, sequenceDiagram, classDiagram, stateDiagram, erDiagram, pie, gantt and mindmap.\n * https://mermaid.js.org/intro/syntax-reference.html\n */\nimport type { GanttTask, TreeNode } from './charts'\nimport { GraphBuilder, type Dir, type GEdge, type GNode, type Graph, type Head, type NodeStyle, type Rendered, type Section, type Shape } from './graph'\nimport { renderModel, type Model } from './model'\nimport { SequenceBuilder, type MsgHead, type PKind } from './sequence'\nimport { color, DiagramError, labelText, unMarkdown } from './svg'\n\n/** Lines without comments and directives; the front matter title. */\nfunction prepare(src: string): { lines: string[]; title?: string } {\n let text = src.replace(/^/, '').replace(/\\r\\n?/g, '\\n')\n let title: string | undefined\n const fm = /^\\s*---\\n([\\s\\S]*?)\\n---[ \\t]*(\\n|$)/.exec(text)\n if (fm) {\n title = /^title:\\s*(.+)$/m.exec(fm[1])?.[1].trim().replace(/^([\"'])(.*)\\1$/, '$2')\n text = text.slice(fm[0].length)\n }\n text = text.replace(/%%\\{[\\s\\S]*?\\}%%/g, '')\n const lines = text.split('\\n').filter((l) => !/^\\s*%%/.test(l))\n return { lines, title }\n}\n\nexport function parseMermaid(src: string): Model {\n const { lines, title } = prepare(src)\n const k = lines.findIndex((l) => l.trim())\n if (k < 0) throw new DiagramError('The diagram is empty')\n const head = lines[k].trim()\n const kw = /^[\\w-]+/.exec(head)?.[0] ?? head\n const body = lines.slice(k + 1)\n switch (kw) {\n case 'graph':\n case 'flowchart':\n case 'flowchart-elk':\n return { t: 'graph', graph: flowchart(head, body, title) }\n case 'sequenceDiagram':\n return { t: 'sequence', seq: sequence(body, title) }\n case 'classDiagram':\n case 'classDiagram-v2':\n return { t: 'graph', graph: classDiagram(body, title) }\n case 'stateDiagram':\n case 'stateDiagram-v2':\n return { t: 'graph', graph: stateDiagram(body, title) }\n case 'erDiagram':\n return { t: 'graph', graph: erDiagram(body, title) }\n case 'pie':\n return { t: 'pie', pie: pie(head, body, title) }\n case 'gantt':\n return { t: 'gantt', gantt: gantt(body, title) }\n case 'mindmap':\n return { t: 'tree', root: mindmap(body), title }\n default:\n throw new DiagramError(`Mermaid “${kw}” diagrams are not supported yet`)\n }\n}\n\nexport const renderMermaid = (src: string): Rendered => renderModel(parseMermaid(src))\n\n// ---------------------------------------------------------------- shared\n\nconst DIRS: Record<string, Dir> = { TB: 'TB', TD: 'TB', BT: 'BT', LR: 'LR', RL: 'RL' }\n\n/** Mermaid label text: quotes, markdown strings, icons, entities and <br> */\nexport function mText(raw: string): string {\n let s = raw.trim()\n if (/^\".*\"$/s.test(s)) s = s.slice(1, -1)\n if (/^`.*`$/s.test(s)) s = unMarkdown(s.slice(1, -1))\n s = s.replace(/\\bfa[bkrs]?:fa-[\\w-]+\\s*/g, '')\n return labelText(s).trim()\n}\n\n/** `fill:#f9f,stroke:#333,stroke-width:4px,color:#fff,stroke-dasharray: 5 5` */\nfunction cssStyle(s: string): NodeStyle {\n const st: NodeStyle = {}\n for (const decl of s.split(/,(?![^(]*\\))/)) {\n const k = decl.indexOf(':')\n if (k < 0) continue\n const prop = decl.slice(0, k).trim().toLowerCase()\n const v = decl.slice(k + 1).trim().replace(/;$/, '')\n if (prop === 'fill' || prop === 'background') st.fill = color(v)\n else if (prop === 'stroke') st.stroke = color(v)\n else if (prop === 'color') st.color = color(v)\n else if (prop === 'stroke-width') st.sw = Math.min(8, parseFloat(v) || 1)\n else if (prop === 'stroke-dasharray') st.dash = /^[\\d.\\s]+$/.test(v) ? v : '5 5'\n else if (prop === 'font-weight') st.bold = /bold|[6-9]00/.test(v)\n else if (prop === 'font-style') st.italic = v === 'italic'\n }\n return st\n}\n\nconst merge = (a: NodeStyle | undefined, b: NodeStyle): NodeStyle => {\n const out: NodeStyle = { ...a }\n for (const [k, v] of Object.entries(b)) if (v !== undefined) (out as Record<string, unknown>)[k] = v\n return out\n}\n\n/** splits at `sep` outside quotes and brackets */\nfunction splitTop(s: string, sep: string): string[] {\n const out: string[] = []\n let depth = 0\n let q = ''\n let cur = ''\n for (const ch of s) {\n if (q) {\n if (ch === q) q = ''\n } else if (ch === '\"' || ch === '`') q = ch\n else if ('([{'.includes(ch)) depth++\n else if (')]}'.includes(ch)) depth = Math.max(0, depth - 1)\n else if (ch === sep && !depth) {\n out.push(cur)\n cur = ''\n continue\n }\n cur += ch\n }\n out.push(cur)\n return out\n}\n\n// ---------------------------------------------------------------- flowchart\n\nconst OPENERS: [string, string[], Shape[]][] = [\n ['(((', [')))'], ['doublecircle']],\n ['((', ['))'], ['circle']],\n ['([', ['])'], ['stadium']],\n ['[[', [']]'], ['subroutine']],\n ['[(', [')]'], ['cylinder']],\n ['{{', ['}}'], ['hexagon']],\n ['[/', ['/]', '\\\\]'], ['lean-r', 'trap-b']],\n ['[\\\\', ['\\\\]', '/]'], ['lean-l', 'trap-t']],\n ['[', [']'], ['rect']],\n ['(', [')'], ['round']],\n ['{', ['}'], ['diamond']],\n ['>', [']'], ['flag']],\n]\n\nconst NEW_SHAPES: Record<string, Shape> = {\n rect: 'rect', rectangle: 'rect', proc: 'rect', process: 'rect', rounded: 'round', event: 'round', stadium: 'stadium', pill: 'stadium', terminal: 'stadium',\n subproc: 'subroutine', subprocess: 'subroutine', subroutine: 'subroutine', 'fr-rect': 'subroutine', cyl: 'cylinder', cylinder: 'cylinder', database: 'cylinder', db: 'cylinder',\n circle: 'circle', circ: 'circle', 'dbl-circ': 'doublecircle', 'double-circle': 'doublecircle', diam: 'diamond', diamond: 'diamond', decision: 'diamond', question: 'diamond',\n hex: 'hexagon', hexagon: 'hexagon', prepare: 'hexagon', 'lean-r': 'lean-r', 'lean-right': 'lean-r', 'in-out': 'lean-r', 'lean-l': 'lean-l', 'lean-left': 'lean-l', 'out-in': 'lean-l',\n 'trap-b': 'trap-b', trapezoid: 'trap-b', priority: 'trap-b', 'trap-t': 'trap-t', 'inv-trapezoid': 'trap-t', manual: 'trap-t', odd: 'flag', flag: 'flag', doc: 'note', document: 'note',\n 'sm-circ': 'start', start: 'start', 'small-circle': 'start', 'fr-circ': 'end', stop: 'end', 'framed-circle': 'end', fork: 'bar', join: 'bar', text: 'none', 'notch-rect': 'note', card: 'note',\n 'f-circ': 'point', junction: 'point',\n}\n\ninterface FlowCtx {\n b: GraphBuilder\n clusters: string[]\n classes: Map<string, string[]>\n defs: Map<string, NodeStyle>\n}\n\nconst ID = /^[\\p{L}\\p{N}_$]+(?:-[\\p{L}\\p{N}_$]+)*/u\n\n/** reads a node at `i`: id, shape and text, `:::class`, `@{…}`; returns its id and the next index */\nfunction readNode(s: string, i: number, ctx: FlowCtx): [string, number] | null {\n while (s[i] === ' ' || s[i] === '\\t') i++\n const m = ID.exec(s.slice(i))\n if (!m) return null\n const id = m[0]\n i += id.length\n let patch: Partial<GNode> = {}\n if (s.startsWith('@{', i)) {\n const end = s.indexOf('}', i)\n if (end > 0) {\n const body = s.slice(i + 2, end)\n const shape = /shape\\s*:\\s*[\"']?([\\w-]+)/.exec(body)?.[1]\n const label = /label\\s*:\\s*(\"([^\"]*)\"|'([^']*)'|[^,]+)/.exec(body)\n if (shape && NEW_SHAPES[shape]) patch.shape = NEW_SHAPES[shape]\n if (label) patch.label = mText(label[2] ?? label[3] ?? label[1])\n i = end + 1\n }\n } else {\n for (const [open, closes, shapes] of OPENERS) {\n if (!s.startsWith(open, i)) continue\n let j = i + open.length\n let text = ''\n while (s[j] === ' ') j++\n if (s[j] === '\"') {\n const e = s.indexOf('\"', j + 1)\n if (e < 0) break\n text = s.slice(j, e + 1)\n j = e + 1\n while (s[j] === ' ') j++\n }\n let best = -1\n let which = 0\n closes.forEach((c, k) => {\n const at = s.indexOf(c, j)\n if (at >= 0 && (best < 0 || at < best)) {\n best = at\n which = k\n }\n })\n if (best < 0) break\n if (!text) text = s.slice(j, best)\n patch = { label: mText(text), shape: shapes[which] }\n i = best + closes[which].length\n break\n }\n }\n const cls = /^:::([\\w-]+)/.exec(s.slice(i))\n if (cls) {\n ctx.classes.set(id, [...(ctx.classes.get(id) ?? []), cls[1]])\n i += cls[0].length\n }\n if (!ctx.b.isCluster(id)) {\n const n = ctx.b.node(id, patch)\n const cur = ctx.clusters[ctx.clusters.length - 1]\n if (cur !== undefined && cur !== id && (n.cluster === undefined || ctx.clusters.includes(n.cluster))) n.cluster = cur\n }\n return [id, i]\n}\n\nconst HEAD: Record<string, Head> = { '>': 'arrow', o: 'circle', x: 'cross' }\n\n/** reads an edge at `i` */\nfunction readEdge(s: string, i: number): [Omit<GEdge, 'from' | 'to'>, number] | null {\n const rest = s.slice(i)\n // text form: -- text -->, == text ==>, -. text .->\n let m = /^\\s*([<ox]?)(--|==|-\\.)\\s+(.+?)\\s*(-{2,}|={2,}|\\.+-)([>ox]?)(?=[\\s\\p{L}\\p{N}_$\"]|$)/u.exec(rest)\n let text: string | undefined\n let tail = ''\n let run = ''\n let head = ''\n let dotted = false\n if (m) {\n ;[, tail, , text, run, head] = m\n dotted = m[2] === '-.'\n } else {\n m = /^\\s*(~{3,})/.exec(rest)\n if (m) return [{ line: 'hidden', minlen: 1 }, i + m[0].length]\n m = /^\\s*([<ox]?)(-{2,}|={2,}|-\\.+-)([>ox]?)(?![-=.])/.exec(rest)\n if (!m) return null\n ;[, tail, run, head] = m\n dotted = run.includes('.')\n }\n let len = m[0].length\n const pipe = /^\\s*\\|([^|]*)\\|/.exec(rest.slice(len))\n if (pipe) {\n text = pipe[1]\n len += pipe[0].length\n }\n // `x` / `o` starting the next node name: only a head when followed by a space or the end\n if ((head === 'x' || head === 'o') && /^[\\p{L}\\p{N}_]/u.test(rest.slice(len)) && !pipe) {\n head = ''\n len--\n }\n const thick = run.includes('=')\n // the longer the arrow, the more ranks it spans: --> / --- / -.-> are one\n const extra = dotted ? (run.match(/\\./g)?.length ?? 1) - 1 : run.length - (head ? 2 : 3)\n return [\n {\n label: text !== undefined && text.trim() ? mText(text) : undefined,\n head: HEAD[head] ?? 'none',\n tail: tail === '<' ? 'arrow' : tail === 'o' ? 'circle' : tail === 'x' ? 'cross' : 'none',\n line: thick ? 'thick' : dotted ? 'dashed' : 'solid',\n minlen: 1 + Math.max(0, Math.min(extra, 6)),\n },\n i + len,\n ]\n}\n\nfunction flowchart(head: string, body: string[], title?: string): Graph {\n const d = /^\\w+\\s+(\\w+)/.exec(head)?.[1]?.toUpperCase()\n const b = new GraphBuilder(DIRS[d ?? 'TB'] ?? 'TB', 'rect')\n const ctx: FlowCtx = { b, clusters: [], classes: new Map(), defs: new Map() }\n const linkStyles: [string, NodeStyle][] = []\n const statements = body.flatMap((l) => splitTop(l, ';')).map((l) => l.trim()).filter(Boolean)\n // a header written on one line: \"graph LR; A --> B\"\n const inline = splitTop(head, ';').slice(1).map((l) => l.trim()).filter(Boolean)\n for (const st of [...inline, ...statements]) {\n let m: RegExpExecArray | null\n if ((m = /^subgraph\\s+(.*)$/.exec(st))) {\n const rest = m[1].trim()\n let id = rest\n let label = rest\n const br = /^([^\\s[]+)\\s*\\[(.*)\\]$/.exec(rest)\n if (br) {\n id = br[1]\n label = br[2]\n }\n label = mText(label)\n id = id.replace(/^\"(.*)\"$/, '$1')\n const parent = ctx.clusters[ctx.clusters.length - 1]\n b.cluster(id, label, parent)\n ctx.clusters.push(id)\n continue\n }\n if (st === 'end') {\n ctx.clusters.pop()\n continue\n }\n if (/^direction\\s+\\w+$/.test(st)) continue\n if ((m = /^classDef\\s+([\\w,-]+)\\s+(.+)$/.exec(st))) {\n for (const name of m[1].split(',')) ctx.defs.set(name.trim(), merge(ctx.defs.get(name.trim()), cssStyle(m[2])))\n continue\n }\n if ((m = /^class\\s+([^\\s]+)\\s+([\\w-]+)$/.exec(st))) {\n for (const id of m[1].split(',')) ctx.classes.set(id.trim(), [...(ctx.classes.get(id.trim()) ?? []), m[2]])\n continue\n }\n if ((m = /^style\\s+([^\\s]+)\\s+(.+)$/.exec(st))) {\n const st2 = cssStyle(m[2])\n for (const id of m[1].split(',')) {\n if (b.isCluster(id)) {\n const c = b.g.clusters.find((x) => x.id === id)!\n c.style = merge(c.style, st2)\n } else b.node(id).style = merge(b.get(id)?.style, st2)\n }\n continue\n }\n if ((m = /^linkStyle\\s+([\\d,\\s]+|default)\\s+(.+)$/.exec(st))) {\n linkStyles.push([m[1].trim(), cssStyle(m[2])])\n continue\n }\n if (/^(click|accTitle|accDescr|callback)\\b/.test(st)) continue\n // chain: nodes (& nodes) (edge nodes)*\n let i = 0\n let prev: string[] = []\n let pending: Omit<GEdge, 'from' | 'to'> | null = null\n for (;;) {\n const group: string[] = []\n for (;;) {\n const r = readNode(st, i, ctx)\n if (!r) break\n group.push(r[0])\n i = r[1]\n const amp = /^\\s*&\\s*/.exec(st.slice(i))\n if (!amp) break\n i += amp[0].length\n }\n if (!group.length) break\n if (pending) for (const a of prev) for (const z of group) b.edge({ ...pending, from: a, to: z })\n prev = group\n const e = readEdge(st, i)\n if (!e) break\n pending = e[0]\n i = e[1]\n }\n }\n // classes\n const def = ctx.defs.get('default')\n for (const n of b.g.nodes) {\n let st = def ? merge(undefined, def) : n.style\n if (def && n.style) st = merge(st, n.style)\n for (const c of ctx.classes.get(n.id) ?? []) st = merge(st, ctx.defs.get(c) ?? {})\n if (st) n.style = st\n }\n for (const c of b.g.clusters) for (const k of ctx.classes.get(c.id) ?? []) c.style = merge(c.style, ctx.defs.get(k) ?? {})\n for (const [which, st] of linkStyles) {\n const ids = which === 'default' ? b.g.edges.map((_, k) => k) : which.split(',').map((x) => Number(x.trim()))\n for (const k of ids) {\n const e = b.g.edges[k]\n if (!e) continue\n if (st.stroke) e.color = st.stroke\n if (st.sw) e.sw = st.sw\n if (st.dash) e.line = 'dashed'\n }\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- sequence\n\nconst SEQ_ARROWS: [string, boolean, MsgHead, boolean][] = [\n ['<<-->>', true, 'filled', true],\n ['<<->>', false, 'filled', true],\n ['-->>', true, 'filled', false],\n ['->>', false, 'filled', false],\n ['--x', true, 'cross', false],\n ['-x', false, 'cross', false],\n ['--)', true, 'open', false],\n ['-)', false, 'open', false],\n ['-->', true, 'none', false],\n ['->', false, 'none', false],\n]\n\nconst P_KIND: Record<string, PKind> = { participant: 'participant', actor: 'actor', boundary: 'boundary', control: 'control', entity: 'entity', database: 'database', collections: 'collections', queue: 'queue' }\n\nfunction sequence(body: string[], title?: string) {\n const b = new SequenceBuilder()\n b.s.title = title\n const blocks: ('box' | 'frag')[] = []\n const arrowRe = new RegExp(`^(.+?)\\\\s*(${SEQ_ARROWS.map(([a]) => a.replace(/[()|]/g, '\\\\$&')).join('|')})\\\\s*([+-]?)\\\\s*([^:]+?)\\\\s*(?::(.*))?$`)\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n let m: RegExpExecArray | null\n if ((m = /^(?:create\\s+)?(participant|actor)\\s+(.+?)(?:@\\{(.*)\\})?(?:\\s+as\\s+(.+))?$/.exec(l))) {\n const id = m[2].trim()\n const typ = m[3] ? /\"type\"\\s*:\\s*\"(\\w+)\"/.exec(m[3])?.[1] : undefined\n b.participant(id, { kind: P_KIND[typ ?? m[1]] ?? 'participant', label: m[4] ? mText(m[4]) : id })\n continue\n }\n if ((m = /^destroy\\s+(.+)$/.exec(l))) {\n b.push({ t: 'destroy', who: m[1].trim() })\n continue\n }\n if (/^autonumber\\b/.test(l)) {\n b.s.autonumber = !/\\boff\\b/.test(l)\n continue\n }\n if ((m = /^title\\s*:?\\s*(.+)$/.exec(l))) {\n b.s.title = mText(m[1])\n continue\n }\n if ((m = /^(activate|deactivate)\\s+(.+)$/.exec(l))) {\n b.push({ t: 'act', who: m[2].trim(), on: m[1] === 'activate' })\n continue\n }\n if ((m = /^note\\s+(left of|right of|over)\\s+([^:]+):(.*)$/i.exec(l))) {\n const pos = m[1].toLowerCase().startsWith('left') ? 'left' : m[1].toLowerCase().startsWith('right') ? 'right' : 'over'\n b.push({ t: 'note', pos, who: m[2].split(',').map((x) => x.trim()), text: mText(m[3]) })\n continue\n }\n if ((m = /^box\\b/.exec(l))) {\n blocks.push('box')\n continue\n }\n if ((m = /^(loop|alt|opt|par|par_over|critical|break|rect)\\b\\s*(.*)$/.exec(l))) {\n blocks.push('frag')\n const kind = m[1] === 'par_over' ? 'par' : m[1]\n b.push({ t: 'block', kind, label: kind === 'rect' ? '' : mText(m[2]), fill: kind === 'rect' ? color(m[2]) : undefined })\n continue\n }\n if ((m = /^(else|and|option)\\b\\s*(.*)$/.exec(l))) {\n b.push({ t: 'else', label: mText(m[2]) })\n continue\n }\n if (l === 'end') {\n if (blocks.pop() === 'frag') b.push({ t: 'end' })\n continue\n }\n if ((m = arrowRe.exec(l))) {\n const arrow = SEQ_ARROWS.find(([a]) => a === m![2])!\n b.push({\n t: 'msg',\n from: m[1].trim(),\n to: m[4].trim(),\n text: mText(m[5] ?? ''),\n dashed: arrow[1],\n head: arrow[2],\n both: arrow[3],\n activate: m[3] === '+',\n deactivate: m[3] === '-',\n })\n continue\n }\n }\n return b.s\n}\n\n// ---------------------------------------------------------------- class diagram\n\ninterface ClassInfo {\n label?: string\n stereo?: string\n attrs: string[]\n methods: string[]\n}\n\nconst generic = (s: string) => s.replace(/~([^~]*)~/g, '<$1>')\n\nconst MARK: Record<string, Head> = { '<|': 'triangle', '|>': 'triangle', '*': 'diamond', o: 'odiamond', '<': 'open', '>': 'open', '()': 'ocircle' }\n\nfunction classDiagram(body: string[], title?: string) {\n const b = new GraphBuilder('TB', 'rect')\n const info = new Map<string, ClassInfo>()\n const ns: string[] = []\n const cls = (name: string) => {\n const id = name.replace(/~.*~$/, '')\n if (!info.has(id)) info.set(id, { attrs: [], methods: [], label: name !== id ? generic(name) : undefined })\n b.node(id, {}, ns[ns.length - 1])\n return info.get(id)!\n }\n const member = (c: ClassInfo, raw: string) => {\n const t = generic(raw.trim())\n if (!t) return\n const st = /^<<(.+)>>$/.exec(t)\n if (st) c.stereo = st[1]\n else if (t.includes('(')) c.methods.push(t.replace(/[$*]$/, ''))\n else c.attrs.push(t.replace(/[$*]$/, ''))\n }\n let inBody: ClassInfo | null = null\n let notes = 0\n const relRe = /^([^\\s\"]+?)\\s*(?:\"([^\"]*)\"\\s*)?(<\\||\\*|o|<|\\(\\))?(--|\\.\\.)(\\|>|\\*|o|>|\\(\\))?\\s*(?:\"([^\"]*)\"\\s*)?([^\\s\":]+)\\s*(?::\\s*(.*))?$/\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n if (inBody) {\n if (l === '}') inBody = null\n else member(inBody, l)\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^direction\\s+(\\w+)$/.exec(l))) {\n b.g.dir = DIRS[m[1].toUpperCase()] ?? 'TB'\n continue\n }\n if ((m = /^namespace\\s+([\\w.]+)\\s*\\{$/.exec(l))) {\n b.cluster(m[1], m[1], ns[ns.length - 1])\n ns.push(m[1])\n continue\n }\n if (l === '}' && ns.length) {\n ns.pop()\n continue\n }\n if ((m = /^class\\s+([\\w$~,<>.-]+?)(?:\\[\"([^\"]*)\"\\])?(?::::[\\w-]+)?\\s*(\\{)?\\s*(\\})?$/.exec(l))) {\n const c = cls(m[1])\n if (m[2]) c.label = m[2]\n if (m[3] && !m[4]) inBody = c\n continue\n }\n if ((m = /^<<(.+)>>\\s+(\\S+)$/.exec(l))) {\n cls(m[2]).stereo = m[1]\n continue\n }\n if ((m = /^note\\s+(?:for\\s+(\\S+)\\s+)?\"(.*)\"$/.exec(l))) {\n const id = `__note${notes++}`\n b.node(id, { label: mText(m[2]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } })\n if (m[1]) b.edge({ from: id, to: m[1].replace(/~.*~$/, ''), line: 'dashed', head: 'none' })\n continue\n }\n if (/^(classDef|cssClass|click|callback|link|style)\\b/.test(l)) continue\n if ((m = relRe.exec(l))) {\n const [, a, la, ma, line, mb, lb, z, label] = m\n cls(a)\n cls(z)\n b.edge({\n from: a.replace(/~.*~$/, ''),\n to: z.replace(/~.*~$/, ''),\n tail: ma ? MARK[ma] : 'none',\n head: mb ? MARK[mb] : 'none',\n line: line === '..' ? 'dashed' : 'solid',\n label: label ? mText(label) : undefined,\n tailLabel: la || undefined,\n headLabel: lb || undefined,\n })\n continue\n }\n if ((m = /^([\\w$~.-]+)\\s*:\\s*(.+)$/.exec(l))) {\n member(cls(m[1]), m[2])\n continue\n }\n }\n for (const n of b.g.nodes) {\n const c = info.get(n.id)\n if (!c) continue\n const header: string[][] = []\n if (c.stereo) header.push([`«${c.stereo}»`])\n header.push([c.label ?? n.id])\n const sections: Section[] = [{ rows: header, bold: true, center: true }]\n if (c.attrs.length || c.methods.length) sections.push({ rows: c.attrs.map((a) => [a]) }, { rows: c.methods.map((a) => [a]) })\n n.sections = sections\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- state diagram\n\nfunction stateDiagram(body: string[], title?: string) {\n const b = new GraphBuilder('TB', 'round')\n const scope: string[] = []\n const desc = new Map<string, string[]>()\n const defs = new Map<string, NodeStyle>()\n const classes = new Map<string, string[]>()\n let notes = 0\n let noteLines: string[] | null = null\n let noteFor: { id: string } | null = null\n const cur = () => scope[scope.length - 1]\n const state = (raw: string, asTarget: boolean): string => {\n let id = raw.trim()\n const cls = /:::([\\w-]+)$/.exec(id)\n if (cls) {\n id = id.slice(0, cls.index)\n classes.set(id, [...(classes.get(id) ?? []), cls[1]])\n }\n if (id === '[*]') {\n const sid = `${cur() ?? ''}__${asTarget ? 'end' : 'start'}`\n b.node(sid, { label: '', shape: asTarget ? 'end' : 'start' }, cur())\n return sid\n }\n if (!b.isCluster(id)) b.node(id, {}, cur())\n return id\n }\n for (const raw of body) {\n const l = raw.trim()\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n const id = `__note${notes++}`\n b.node(id, { label: noteLines.join('\\n'), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteFor) b.edge({ from: noteFor.id, to: id, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (!l || l === '--') continue\n let m: RegExpExecArray | null\n if ((m = /^direction\\s+(\\w+)$/.exec(l))) {\n if (!scope.length) b.g.dir = DIRS[m[1].toUpperCase()] ?? 'TB'\n continue\n }\n if ((m = /^state\\s+(?:\"([^\"]+)\"\\s+as\\s+)?([\\w.-]+)\\s*(<<(fork|join|choice)>>)?\\s*(\\{)?$/.exec(l))) {\n const id = m[2]\n if (m[5]) {\n b.cluster(id, m[1] ? mText(m[1]) : id, cur())\n scope.push(id)\n continue\n }\n const kind = m[4]\n b.node(id, kind === 'fork' || kind === 'join' ? { shape: 'bar', label: '' } : kind === 'choice' ? { shape: 'diamond', label: '' } : m[1] ? { label: mText(m[1]) } : {}, cur())\n continue\n }\n if ((m = /^state\\s+\"([^\"]+)\"\\s+as\\s+([\\w.-]+)\\s*\\{$/.exec(l))) {\n b.cluster(m[2], mText(m[1]), cur())\n scope.push(m[2])\n continue\n }\n if (l === '}') {\n scope.pop()\n continue\n }\n if ((m = /^note\\s+(left of|right of|over)\\s+([\\w.-]+)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const target = m[2]\n if (m[3] !== undefined) {\n const id = `__note${notes++}`\n b.node(id, { label: mText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: target, to: id, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteFor = { id: target }\n }\n continue\n }\n if ((m = /^classDef\\s+([\\w-]+)\\s+(.+)$/.exec(l))) {\n defs.set(m[1], cssStyle(m[2]))\n continue\n }\n if ((m = /^class\\s+([\\w,\\s-]+?)\\s+([\\w-]+)$/.exec(l))) {\n for (const id of m[1].split(',')) classes.set(id.trim(), [...(classes.get(id.trim()) ?? []), m[2]])\n continue\n }\n if ((m = /^(.+?)\\s*-->\\s*([^:]+?)\\s*(?::\\s*(.*))?$/.exec(l))) {\n const a = state(m[1], false)\n const z = state(m[2], true)\n b.edge({ from: a, to: z, head: 'arrow', label: m[3] ? mText(m[3]) : undefined })\n continue\n }\n if ((m = /^([\\w.-]+)\\s*:\\s*(.+)$/.exec(l))) {\n state(m[1], false)\n desc.set(m[1], [...(desc.get(m[1]) ?? []), mText(m[2])])\n continue\n }\n if ((m = /^([\\w.-]+)$/.exec(l))) state(m[1], false)\n }\n for (const n of b.g.nodes) {\n const d = desc.get(n.id)\n if (d && n.shape === 'round') n.sections = [{ rows: [[n.label]], bold: true, center: true }, { rows: d.map((x) => [x]) }]\n for (const c of classes.get(n.id) ?? []) n.style = merge(n.style, defs.get(c) ?? {})\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- ER diagram\n\nconst CARD: Record<string, Head> = { '|o': 'zero-one', 'o|': 'zero-one', '||': 'one', '}o': 'zero-many', 'o{': 'zero-many', '}|': 'one-many', '|{': 'one-many' }\nconst CARD_WORDS: Record<string, Head> = {\n 'one or zero': 'zero-one', 'zero or one': 'zero-one', 'one or more': 'one-many', 'one or many': 'one-many', 'many(1)': 'one-many', '1+': 'one-many',\n 'zero or more': 'zero-many', 'zero or many': 'zero-many', 'many(0)': 'zero-many', '0+': 'zero-many', 'only one': 'one', '1': 'one',\n}\n\nfunction erDiagram(body: string[], title?: string) {\n const b = new GraphBuilder('TB', 'rect')\n const attrs = new Map<string, string[][]>()\n const labels = new Map<string, string>()\n let inEntity: string | null = null\n const entity = (raw: string) => {\n const m = /^([\\w-]+)(?:\\[\\s*\"?([^\"\\]]*)\"?\\s*\\])?$/.exec(raw.trim().replace(/^\"(.*)\"$/, '$1'))\n const id = m ? m[1] : raw.trim().replace(/^\"(.*)\"$/, '$1')\n if (m?.[2]) labels.set(id, m[2])\n b.node(id)\n if (!attrs.has(id)) attrs.set(id, [])\n return id\n }\n const words = Object.keys(CARD_WORDS)\n .sort((x, y) => y.length - x.length)\n .map((w) => w.replace(/[()+]/g, '\\\\$&'))\n .join('|')\n const symRe = /^(\\S+)\\s+(\\|o|\\|\\||\\}o|\\}\\|)(--|\\.\\.)(o\\||\\|\\||o\\{|\\|\\{)\\s+(\\S+)\\s*:\\s*(.*)$/\n const wordRe = new RegExp(`^(\\\\S+)\\\\s+(${words})\\\\s+(to|optionally to)\\\\s+(${words})\\\\s+(\\\\S+)\\\\s*:\\\\s*(.*)$`, 'i')\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n if (inEntity) {\n if (l === '}') {\n inEntity = null\n continue\n }\n const m = /^(\\S+)\\s+(\\S+)((?:\\s+(?:PK|FK|UK)\\s*,?)*)\\s*(?:\"(.*)\")?$/.exec(l)\n if (m) attrs.get(inEntity)!.push([m[1].replace(/~([^~]*)~/g, '<$1>'), m[2], m[3].replace(/\\s+/g, ' ').trim(), m[4] ?? ''])\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^direction\\s+(\\w+)$/.exec(l))) {\n b.g.dir = DIRS[m[1].toUpperCase()] ?? 'TB'\n continue\n }\n if ((m = /^(.+?)\\s*\\{$/.exec(l))) {\n inEntity = entity(m[1])\n continue\n }\n if ((m = symRe.exec(l))) {\n const a = entity(m[1])\n const z = entity(m[5])\n b.edge({ from: a, to: z, tail: CARD[m[2]], head: CARD[m[4]], line: m[3] === '..' ? 'dashed' : 'solid', label: mText(m[6]) || undefined })\n continue\n }\n if ((m = wordRe.exec(l))) {\n const a = entity(m[1])\n const z = entity(m[5])\n b.edge({ from: a, to: z, tail: CARD_WORDS[m[2].toLowerCase()], head: CARD_WORDS[m[4].toLowerCase()], line: m[3].toLowerCase() === 'to' ? 'solid' : 'dashed', label: mText(m[6]) || undefined })\n continue\n }\n if ((m = /^([\\w-]+(?:\\[[^\\]]*\\])?)$/.exec(l))) entity(m[1])\n }\n for (const n of b.g.nodes) {\n const rows = attrs.get(n.id) ?? []\n const shown = rows.map((r) => r.filter((c, k) => k < 2 || c))\n n.sections = [{ rows: [[labels.get(n.id) ?? n.id]], bold: true, center: true }]\n if (rows.length) n.sections.push({ rows: shown })\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- pie\n\nfunction pie(head: string, body: string[], title?: string) {\n const showData = /\\bshowData\\b/.test(head)\n let t = /\\btitle\\s+(.+)$/.exec(head)?.[1] ?? title\n const slices: { label: string; value: number }[] = []\n for (const raw of body) {\n const l = raw.trim()\n let m: RegExpExecArray | null\n if ((m = /^title\\s+(.+)$/.exec(l))) t = m[1]\n else if ((m = /^\"([^\"]*)\"\\s*:\\s*([-\\d.eE+]+)$/.exec(l))) slices.push({ label: mText(m[1]), value: Number(m[2]) })\n }\n return { title: t ? mText(t) : undefined, showData, slices }\n}\n\n// ---------------------------------------------------------------- gantt\n\nconst UNIT: Record<string, number> = { ms: 1, s: 1e3, m: 60e3, h: 3600e3, d: 864e5, w: 7 * 864e5, M: 30 * 864e5, y: 365 * 864e5 }\n\n/** a date in `fmt` (dayjs-style tokens), UTC */\nexport function parseDate(s: string, fmt: string): number | undefined {\n s = s.trim()\n if (fmt === 'X') return Number(s) * 1000\n if (fmt === 'x') return Number(s)\n const order: string[] = []\n const re = fmt.replace(/YYYY|YY|MM|M|DD|D|HH|H|mm|ss|SSS|[.*+?^${}()|[\\]\\\\]/g, (t) => {\n if (/^[.*+?^${}()|[\\]\\\\]$/.test(t)) return '\\\\' + t\n order.push(t)\n return t === 'YYYY' ? '(\\\\d{4})' : t === 'SSS' ? '(\\\\d{3})' : t.length === 1 ? '(\\\\d{1,2})' : '(\\\\d{2})'\n })\n const m = new RegExp(`^${re}$`).exec(s)\n if (!m) {\n const t = Date.parse(s.length === 10 ? s + 'T00:00:00Z' : s)\n return Number.isFinite(t) ? t : undefined\n }\n const v: Record<string, number> = {}\n order.forEach((t, k) => (v[t[0]] = Number(m[k + 1])))\n const year = v.Y !== undefined ? (order.includes('YY') ? 2000 + v.Y : v.Y) : 1970\n return Date.UTC(year, (v.M ?? 1) - 1, v.D ?? 1, v.H ?? 0, v.m ?? 0, v.s ?? 0, v.S ?? 0)\n}\n\nfunction gantt(body: string[], title?: string) {\n let fmt = 'YYYY-MM-DD'\n let t = title\n const sections: { name: string; tasks: GanttTask[] }[] = []\n const byId = new Map<string, GanttTask>()\n let last: GanttTask | undefined\n const today = (() => {\n const d = new Date()\n return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())\n })()\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n let m: RegExpExecArray | null\n if ((m = /^dateFormat\\s+(.+)$/.exec(l))) fmt = m[1].trim()\n else if ((m = /^title\\s+(.+)$/.exec(l))) t = m[1]\n else if (/^(axisFormat|tickInterval|excludes|includes|todayMarker|weekday|inclusiveEndDates|topAxis|displayMode)\\b/.test(l)) continue\n else if ((m = /^section\\s+(.*)$/.exec(l))) sections.push({ name: mText(m[1]), tasks: [] })\n else if ((m = /^(.+?)\\s*:\\s*(.+)$/.exec(l))) {\n const name = mText(m[1])\n const parts = m[2].split(',').map((x) => x.trim()).filter(Boolean)\n const task: GanttTask = { name, start: 0, end: 0 }\n while (parts.length && /^(done|active|crit|milestone)$/.test(parts[0])) {\n const tag = parts.shift() as 'done' | 'active' | 'crit' | 'milestone'\n task[tag] = true\n }\n let id: string | undefined\n if (parts.length >= 3) id = parts.shift()\n let startRaw: string | undefined\n let endRaw: string | undefined\n if (parts.length >= 2) [startRaw, endRaw] = parts\n else endRaw = parts[0]\n // \"id, duration\": an id is a word that is not a duration, a date or a dependency\n const startAt = (s: string | undefined): number => {\n if (!s) return last ? last.end : today\n const after = /^after\\s+(.+)$/.exec(s)\n if (after) {\n const ends = after[1].split(/\\s+/).map((x) => byId.get(x)?.end).filter((x): x is number => x !== undefined)\n return ends.length ? Math.max(...ends) : last ? last.end : today\n }\n return parseDate(s, fmt) ?? (last ? last.end : today)\n }\n if (parts.length === 2 && !/^after\\s/.test(startRaw!) && parseDate(startRaw!, fmt) === undefined && !/^\\d/.test(startRaw!)) {\n id = startRaw\n startRaw = undefined\n }\n task.start = startAt(startRaw)\n const dur = endRaw && /^([\\d.]+)\\s*(ms|s|m|h|d|w|M|y)$/.exec(endRaw)\n const until = endRaw && /^until\\s+(.+)$/.exec(endRaw)\n if (dur) task.end = task.start + Number(dur[1]) * UNIT[dur[2]]\n else if (until) task.end = byId.get(until[1].trim())?.start ?? task.start\n else if (endRaw) task.end = parseDate(endRaw, fmt) ?? task.start + 864e5\n else task.end = task.start + 864e5\n if (task.milestone) task.end = task.start\n if (id) byId.set(id, task)\n if (!sections.length) sections.push({ name: '', tasks: [] })\n sections[sections.length - 1].tasks.push(task)\n last = task\n }\n }\n return { title: t ? mText(t) : undefined, sections }\n}\n\n// ---------------------------------------------------------------- mindmap\n\nconst TREE_SHAPES: [RegExp, TreeNode['shape']][] = [\n [/^[\\w-]*\\(\\((.*)\\)\\)$/, 'circle'],\n [/^[\\w-]*\\)\\)(.*)\\(\\($/, 'cloud'],\n [/^[\\w-]*\\)(.*)\\($/, 'cloud'],\n [/^[\\w-]*\\{\\{(.*)\\}\\}$/, 'hexagon'],\n [/^[\\w-]*\\[(.*)\\]$/, 'rect'],\n [/^[\\w-]*\\((.*)\\)$/, 'round'],\n]\n\nfunction mindmap(body: string[]): TreeNode {\n const stack: { indent: number; n: TreeNode }[] = []\n let root: TreeNode | undefined\n for (const raw of body) {\n if (!raw.trim()) continue\n const text = raw.trim().replace(/:::[\\w\\s-]+$/, '').trim()\n if (/^::icon\\(/.test(text) || !text) continue\n const indent = raw.replace(/\\t/g, ' ').search(/\\S/)\n let label = text\n let shape: TreeNode['shape'] = undefined\n for (const [re, sh] of TREE_SHAPES) {\n const m = re.exec(text)\n if (m) {\n label = m[1]\n shape = sh\n break\n }\n }\n const node: TreeNode = { label: mText(label), shape, children: [] }\n if (!root) {\n root = node\n stack.push({ indent, n: node })\n continue\n }\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) stack.pop()\n stack[stack.length - 1].n.children.push(node)\n stack.push({ indent, n: node })\n }\n if (!root) throw new DiagramError('The mind map is empty')\n return root\n}\n","/**\n * PlantUML: sequence, class / object, use case, component / deployment, state and activity diagrams, mind maps and\n * work breakdown structures; @startdot hands over to the Graphviz reader. A file may hold several diagrams.\n * https://plantuml.com\n */\nimport type { TreeNode } from './charts'\nimport { parseDot } from './dot'\nimport { GraphBuilder, type GEdge, type Head, type Rendered, type Section, type Shape } from './graph'\nimport { renderModel, type Model } from './model'\nimport { SequenceBuilder, type MsgHead, type PKind } from './sequence'\nimport { color, DiagramError, labelText } from './svg'\n\n/** the diagrams of a file: the text of each @startX … @endX block (the whole text when there is none) */\nexport function plantUmlBlocks(src: string): { kind: string; lines: string[] }[] {\n const text = src.replace(/^/, '').replace(/\\r\\n?/g, '\\n')\n const out: { kind: string; lines: string[] }[] = []\n const re = /^[ \\t]*@start(\\w+)[^\\n]*\\n([\\s\\S]*?)^[ \\t]*@end\\1\\b/gm\n let m: RegExpExecArray | null\n while ((m = re.exec(text))) out.push({ kind: m[1].toLowerCase(), lines: m[2].split('\\n') })\n if (!out.length) out.push({ kind: 'uml', lines: text.split('\\n') })\n return out\n}\n\nexport function parsePlantUml(src: string): Model[] {\n return plantUmlBlocks(src).map(({ kind, lines }) => parseBlock(kind, lines))\n}\n\nexport const renderPlantUml = (src: string): Rendered[] => parsePlantUml(src).map(renderModel)\n\nfunction parseBlock(kind: string, raw: string[]): Model {\n if (kind === 'dot') return { t: 'graph', graph: parseDot(raw.join('\\n'))[0] }\n const { lines, title, dir } = clean(raw)\n switch (kind) {\n case 'uml':\n break\n case 'mindmap':\n case 'wbs':\n return { t: 'tree', root: tree(lines, kind === 'wbs'), title }\n default:\n throw new DiagramError(`PlantUML @start${kind} diagrams are not supported yet`)\n }\n switch (umlKind(lines)) {\n case 'activity':\n return { t: 'graph', graph: { ...activity(lines), title } }\n case 'sequence':\n return { t: 'sequence', seq: { ...sequence(lines), title } }\n case 'state':\n return { t: 'graph', graph: { ...state(lines, dir), title } }\n default:\n return { t: 'graph', graph: { ...description(lines, dir), title } }\n }\n}\n\n/** creole / HTML markup out of a label */\nexport function pText(s: string): string {\n return labelText(\n s\n .trim()\n .replace(/^\"(.*)\"$/s, '$1')\n .replace(/\\*\\*(.+?)\\*\\*|\\/\\/(.+?)\\/\\/|\"\"(.+?)\"\"|__(.+?)__|~~(.+?)~~|--(.+?)--/g, (...m) => m.slice(1, 7).find((x) => x !== undefined) ?? '')\n .replace(/<\\/?(?:b|i|u|s|font|color|size|back|code|plain|strike|w|sub|sup)\\b[^>]*>/gi, '')\n .replace(/<&[\\w-]+>/g, '')\n .replace(/\\\\t/g, ' '),\n )\n}\n\n/** comments, skinparams, legends, headers out; the title and the direction */\nfunction clean(raw: string[]): { lines: string[]; title?: string; dir?: 'LR' | 'TB' } {\n const lines: string[] = []\n let title: string | undefined\n let dir: 'LR' | 'TB' | undefined\n let skip: RegExp | null = null\n let titleLines: string[] | null = null\n let inComment = false\n for (let l of raw) {\n if (inComment) {\n const e = l.indexOf(\"'/\")\n if (e < 0) continue\n l = l.slice(e + 2)\n inComment = false\n }\n l = l.replace(/\\/'.*?'\\//g, '')\n const c = l.indexOf(\"/'\")\n if (c >= 0) {\n l = l.slice(0, c)\n inComment = true\n }\n const t = l.trim()\n if (skip) {\n if (skip.test(t)) skip = null\n continue\n }\n if (titleLines) {\n if (/^end\\s*title$/i.test(t)) {\n title = pText(titleLines.join('\\n'))\n titleLines = null\n } else titleLines.push(t)\n continue\n }\n if (!t || t.startsWith(\"'\")) continue\n let m: RegExpExecArray | null\n if (/^skinparam\\b.*\\{$/i.test(t) || /^(legend|header|footer)\\b(?!.*:)/i.test(t) && !/^(header|footer)\\s+\\S/i.test(t)) {\n skip = /^(\\}|end\\s*legend|endlegend|end\\s*header|endheader|end\\s*footer|endfooter)$/i\n continue\n }\n if (/^(skinparam|!|hide|show|scale|caption|header|footer|newpage|allowmixing|autoactivate|set\\s+namespaceSeparator|page|mainframe|sprite|remove|restore|together|left\\s+header|right\\s+footer)\\b/i.test(t)) continue\n if ((m = /^title\\s*:?\\s*(.*)$/i.exec(t))) {\n if (m[1]) title = pText(m[1])\n else titleLines = []\n continue\n }\n if (/^left\\s+to\\s+right\\s+direction$/i.test(t)) {\n dir = 'LR'\n continue\n }\n if (/^top\\s+to\\s+bottom\\s+direction$/i.test(t)) {\n dir = 'TB'\n continue\n }\n lines.push(t)\n }\n return { lines, title, dir }\n}\n\nfunction umlKind(lines: string[]): 'activity' | 'sequence' | 'state' | 'description' {\n const has = (re: RegExp) => lines.some((l) => re.test(l))\n if (has(/^(start|stop)$/) || has(/^:[\\s\\S]*[;|<>/\\]}]$/) || has(/^:/) || has(/^(if\\s*\\(.*\\)\\s*then|while\\s*\\(|repeat\\b|fork$|endif$)/)) return 'activity'\n if (has(/\\[\\*\\]/) || has(/^state\\s/)) return 'state'\n if (has(/^(participant|boundary|control|collections|queue|autonumber|activate|deactivate|alt|loop|return|ref\\s+over)\\b/) || has(/^(==.*==|\\.\\.\\.|\\|\\|\\d*\\|\\|)$/)) return 'sequence'\n if (has(/^(abstract|class|interface|enum|annotation|struct|protocol|object|map|json|usecase|component|node|cloud|package|namespace|folder|frame|rectangle|artifact|storage|card|file|agent|person|hexagon|together)\\b/)) return 'description'\n if (has(/\\([^)]*\\)|\\[[^\\]*]+\\]|<\\|--|--\\|>|\\*--|o--|\\.\\.>/)) return 'description'\n if (has(/^(actor|database|entity)\\b/) || has(/^\\S+\\s*<?-{1,2}>?>?\\s*\\S+\\s*:/)) return 'sequence'\n return 'description'\n}\n\n// ---------------------------------------------------------------- sequence\n\nconst KIND: Record<string, PKind> = { participant: 'participant', actor: 'actor', boundary: 'boundary', control: 'control', entity: 'entity', database: 'database', collections: 'collections', queue: 'queue' }\n\nfunction sequence(lines: string[]) {\n const b = new SequenceBuilder()\n const calls: { from: string; to: string }[] = []\n let noteLines: string[] | null = null\n let note: { pos: 'left' | 'right' | 'over'; who: string[] } | null = null\n let last: { from: string; to: string } | null = null\n const id = (s: string) => {\n const t = s.trim().replace(/^\"(.*)\"$/, '$1')\n return t\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*(note|ref|rnote|hnote)$/i.test(l)) {\n if (note && note.who.length) b.push({ t: 'note', pos: note.pos, who: note.who, text: pText(noteLines.join('\\n')) })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^(?:create\\s+)?(participant|actor|boundary|control|entity|database|collections|queue)\\s+(.+)$/.exec(l))) {\n let rest = m[2].replace(/\\s+order\\s+-?\\d+/, '').trim()\n const col = /\\s+(#\\w+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n rest = rest.replace(/<<[^>]*>>/g, '').trim()\n let pid = rest\n let label = rest\n const as1 = /^\"([^\"]+)\"\\s+as\\s+(\\S+)$/.exec(rest)\n const as2 = /^(\\S+)\\s+as\\s+\"?([^\"]+)\"?$/.exec(rest)\n if (as1) [pid, label] = [as1[2], as1[1]]\n else if (as2) [pid, label] = [as2[1], as2[2]]\n else pid = label = id(rest)\n b.participant(pid, { kind: KIND[m[1].toLowerCase()], label: pText(label), fill: col ? color(col[1].slice(1)) ?? color(col[1]) : undefined })\n continue\n }\n if (/^hide\\s+footbox$/i.test(l)) {\n b.s.footer = false\n continue\n }\n if (/^autonumber\\b/i.test(l)) {\n b.s.autonumber = !/\\bstop\\b/i.test(l)\n continue\n }\n if ((m = /^(activate|deactivate|destroy)\\s+(\\S+)/i.exec(l))) {\n const who = id(m[2])\n if (m[1].toLowerCase() === 'destroy') b.push({ t: 'destroy', who })\n else b.push({ t: 'act', who, on: m[1].toLowerCase() === 'activate' })\n continue\n }\n if ((m = /^return\\b\\s*(.*)$/i.exec(l))) {\n const c = calls.pop() ?? (last ? { from: last.from, to: last.to } : null)\n if (c) b.push({ t: 'msg', from: c.to, to: c.from, text: pText(m[1]), dashed: true, head: 'filled', deactivate: true })\n continue\n }\n if ((m = /^[rh]?note\\s+(left|right|over)(?:\\s+of)?\\s*([^:]*?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l)) || (m = /^ref\\s+over\\s+()([^:]+?)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const pos = (m[1] || 'over').toLowerCase() as 'left' | 'right' | 'over'\n let who = m[2] ? m[2].split(',').map(id).filter(Boolean) : []\n if (!who.length && last) who = [pos === 'left' ? last.from : last.to]\n if (!who.length && b.s.participants.length) who = [b.s.participants[0].id]\n if (m[3] !== undefined) {\n if (who.length) b.push({ t: 'note', pos, who, text: pText(m[3]) })\n } else {\n noteLines = []\n note = { pos, who }\n }\n continue\n }\n if ((m = /^note\\s+across\\s*:\\s*(.*)$/i.exec(l))) {\n const ps = b.s.participants\n if (ps.length) b.push({ t: 'note', pos: 'over', who: [ps[0].id, ps[ps.length - 1].id], text: pText(m[1]) })\n continue\n }\n if ((m = /^(alt|opt|loop|par|break|critical|group)\\b\\s*(.*)$/i.exec(l))) {\n const kind = m[1].toLowerCase()\n b.push({ t: 'block', kind: kind === 'group' ? pText(m[2]) || 'group' : kind, label: kind === 'group' ? '' : pText(m[2]) })\n continue\n }\n if ((m = /^else\\b\\s*(.*)$/i.exec(l))) {\n b.push({ t: 'else', label: pText(m[1]) })\n continue\n }\n if (/^end$/i.test(l)) {\n b.push({ t: 'end' })\n continue\n }\n if (/^(box\\b|end\\s*box)/i.test(l)) continue\n if ((m = /^==\\s*(.*?)\\s*==$/.exec(l))) {\n b.push({ t: 'divider', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\.\\.\\.\\s*(.*?)\\s*(?:\\.\\.\\.)?$/.exec(l))) {\n b.push({ t: 'delay', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\|\\|(\\d*)\\|\\|$/.exec(l)) || l === '|||') {\n b.push({ t: 'space', h: m?.[1] ? Math.min(400, Number(m[1])) : 20 })\n continue\n }\n const msg = seqMessage(l)\n if (msg) {\n const { from, to, dashed, head, both, act, text } = msg\n b.push({ t: 'msg', from, to, text, dashed, head, both, activate: act === '++', deactivate: act === '--' })\n last = { from, to }\n if (act === '++') calls.push({ from, to })\n if (act === '--' && calls.length) calls.pop()\n if (act === '**') b.participant(to)\n if (act === '!!') b.push({ t: 'destroy', who: to })\n }\n }\n return b.s\n}\n\nconst ARROW = /^(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(<<?|[\\\\/]{1,2})?(-{1,2}|\\.{1,2})(?:\\[[^\\]]*\\])?(-?)(>>?|[\\\\/]{1,2})?\\s*([ox])?\\s*(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(\\+\\+|--|\\*\\*|!!)?\\s*(?::\\s*(.*))?$/u\n\nfunction seqMessage(l: string) {\n // \"o->\", \"x<-\": lost / found markers before the arrow\n const m = ARROW.exec(l.replace(/^(\\S+)\\s*([ox])(?=<|-)/, '$1 '))\n if (!m) return null\n const [, a, left, line, , right, , z, act, text] = m\n if (!left && !right) return null\n if (!a || !z) return null\n const clean = (s: string) => s.replace(/^\"(.*)\"$/, '$1')\n let from = clean(a)\n let to = clean(z)\n if (from === '[' || from === ']' || to === '[' || to === ']') return null\n const dashed = line === '--' || line.startsWith('.')\n const headOf = (s: string | undefined): MsgHead => (!s ? 'none' : s === '>>' || s === '<<' ? 'open' : s.length && /[\\\\/]/.test(s) ? 'half' : 'filled')\n let head: MsgHead\n let both = false\n if (left && right) {\n head = headOf(right)\n both = true\n } else if (left) {\n ;[from, to] = [to, from]\n head = headOf(left)\n } else head = headOf(right)\n if (/x\\s*$/.test(l.split(':')[0].replace(z, '').trim()) && !left) head = 'cross'\n return { from, to, dashed, head, both, act, text: pText(text ?? '') }\n}\n\n// ---------------------------------------------------------------- class, use case, component… (description diagrams)\n\nconst ELEMENT: Record<string, Shape> = {\n actor: 'actor', person: 'actor', usecase: 'ellipse', component: 'component', node: 'box3d', database: 'cylinder', cloud: 'cloud', folder: 'folder', frame: 'folder',\n package: 'folder', artifact: 'note', file: 'note', storage: 'stadium', queue: 'stadium', stack: 'rect', card: 'rect', rectangle: 'rect', agent: 'rect', label: 'none',\n boundary: 'circle', control: 'circle', entity: 'rect', collections: 'rect', hexagon: 'hexagon', interface: 'rect', circle: 'circle', port: 'point', portin: 'point', portout: 'point',\n action: 'rect', process: 'round', usecase_: 'ellipse', object: 'rect', map: 'rect', json: 'rect', diamond: 'diamond', state: 'round',\n}\nconst CLASSES = new Set(['class', 'abstract', 'abstract class', 'interface', 'enum', 'annotation', 'struct', 'protocol', 'entity', 'exception', 'metaclass', 'stereotype', 'object', 'map', 'json'])\n\nconst MARKS: Record<string, Head> = {\n '>': 'arrow', '<': 'arrow', '|>': 'triangle', '<|': 'triangle', '^': 'triangle', '*': 'diamond', o: 'odiamond', '#': 'odiamond', x: 'cross', '+': 'ocircle',\n '{': 'many', '}': 'many', '>>': 'open', '<<': 'open', '|o': 'zero-one', 'o|': 'zero-one', '||': 'one', '}o': 'zero-many', 'o{': 'zero-many', '}|': 'one-many', '|{': 'one-many',\n}\n\nconst END = String.raw`\\[\\*\\]|\\[[^\\]]+\\]|\\([^)]*\\)|:[^:]+:|\"[^\"]+\"|\\(\\)\\s*\"[^\"]+\"|\\(\\)\\s*[\\w.]+|[\\w.$À--]+`\nconst LINK = new RegExp(\n String.raw`^(${END})\\s*(?:\"([^\"]*)\"\\s*)?((?:<\\||<<|\\}o|\\}\\||\\|o|\\|\\||[<*o#x+^}])?)([-.=~]+)(?:\\[([^\\]]*)\\])?((?:up|down|left|right|u|d|l|r|le|ri|do)?)([-.=~]*)(?:\\[([^\\]]*)\\])?((?:\\|>|>>|o\\{|\\|\\{|o\\||\\|\\||[>*#+^{]|[ox](?=\\s|\\[|\\(|\"|:|$))?)\\s*(?:\"([^\"]*)\"\\s*)?(${END})\\s*(?::\\s*(.*))?$`,\n 'u',\n)\n\ninterface ClassInfo {\n kind: string\n stereo?: string\n sections: string[][]\n}\n\nfunction description(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'rect')\n const info = new Map<string, ClassInfo>()\n const ns: string[] = []\n const stackKinds: string[] = []\n let body: { id: string; c: ClassInfo } | null = null\n let noteLines: string[] | null = null\n let noteTarget: string | undefined\n let noteId = ''\n let notes = 0\n let anon = 0\n const cur = () => ns[ns.length - 1]\n /** an element written in a link or a declaration: its id (created when new) */\n const element = (raw: string): string => {\n let t = raw.trim()\n let m: RegExpExecArray | null\n if (t === '(*)') return 'start'\n if ((m = /^\\[(.+)\\]$/.exec(t))) return ensure(m[1], 'component')\n if ((m = /^\\((.*)\\)$/.exec(t))) return ensure(m[1], 'ellipse')\n if ((m = /^:(.+):$/.exec(t))) return ensure(m[1], 'actor')\n if ((m = /^\\(\\)\\s*\"?([^\"]+)\"?$/.exec(t))) return ensure(m[1], 'circle')\n t = t.replace(/^\"(.*)\"$/, '$1')\n if (!b.has(t) && !b.isCluster(t)) b.node(t, { label: pText(t) }, cur())\n return t\n }\n const ensure = (name: string, shape: Shape) => {\n const id = name.trim()\n if (!b.has(id) && !b.isCluster(id)) b.node(id, { label: pText(id), shape }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n b.node(noteId, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteTarget) b.edge({ from: noteTarget, to: noteId, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (body) {\n if (l === '}') {\n body = null\n continue\n }\n if (/^(--|==|\\.\\.|__)(.*?)(--|==|\\.\\.|__)?$/.test(l)) body.c.sections.push([])\n else body.c.sections[body.c.sections.length - 1].push(pText(l.replace(/\\{(static|abstract|classifier|field|method)\\}\\s*/g, '')))\n continue\n }\n let m: RegExpExecArray | null\n if (l === '}' || /^end\\s*(package|namespace|rectangle|node|folder|frame|together)$/i.test(l)) {\n ns.pop()\n stackKinds.pop()\n continue\n }\n // note\n if ((m = /^note\\s+(left|right|top|bottom)(?:\\s+of)?\\s+(\\S+?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const target = element(m[2])\n const nid = `__note${notes++}`\n if (m[3] !== undefined) {\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: target, to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteTarget = target\n noteId = nid\n }\n continue\n }\n if ((m = /^note\\s+\"([^\"]*)\"\\s+as\\s+(\\S+)$/i.exec(l))) {\n b.node(m[2], { label: pText(m[1]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n continue\n }\n if ((m = /^note\\s+as\\s+(\\S+)$/i.exec(l))) {\n noteLines = []\n noteTarget = undefined\n noteId = m[1]\n continue\n }\n // container: package \"Name\" { / rectangle System {\n if ((m = /^(package|namespace|rectangle|node|folder|frame|cloud|database|component|card|storage|artifact|file|stack|queue|agent|hexagon|together)\\s*(?:\"([^\"]*)\"|([^\\s{<#]+))?\\s*(?:as\\s+(\\S+))?\\s*(<<[^>]*>>)?\\s*(#\\S+)?\\s*\\{$/.exec(l))) {\n const kind = m[1].toLowerCase()\n const label = m[2] ?? m[3] ?? ''\n const cid = m[4] ?? (m[3] || m[2] || `__group${anon++}`)\n const c = b.cluster(cid, kind === 'together' ? '' : pText(label), cur())\n const fill = m[6] ? color(m[6].slice(1)) ?? color(m[6]) : undefined\n if (fill) c.style = { fill }\n if (kind === 'together') c.style = { fill: 'none', stroke: 'none' }\n ns.push(cid)\n stackKinds.push(kind)\n continue\n }\n // class-like declaration\n if ((m = /^(abstract\\s+class|abstract|class|interface|enum|annotation|struct|protocol|entity|exception|metaclass|stereotype|object|map|json)\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+)|(\\S+)\\s+as\\s+\"([^\"]+)\"|([^\\s{<#]+))(?:\\s*<([^>]+)>)?\\s*(<<.+?>>)?\\s*(#\\S+)?\\s*(\\{)?\\s*(\\})?$/.exec(l)) && CLASSES.has(m[1].toLowerCase().replace(/\\s+/, ' '))) {\n const kind = m[1].toLowerCase().replace(/\\s+/, ' ')\n const cid = m[3] ?? m[4] ?? m[6]\n const label = m[2] ?? m[5] ?? cid\n const generic = m[7] ? `<${m[7]}>` : ''\n b.node(cid, { label: pText(label) + generic, shape: 'rect' }, cur())\n const c: ClassInfo = info.get(cid) ?? { kind, sections: [[], []] }\n c.kind = kind\n if (m[8]) c.stereo = m[8].replace(/^<<|>>$/g, '').trim()\n const fill = m[9] ? color(m[9].slice(1)) ?? color(m[9]) : undefined\n if (fill) b.node(cid).style = { fill }\n info.set(cid, c)\n if (m[10] && !m[11]) {\n c.sections = [[]]\n body = { id: cid, c }\n }\n continue\n }\n // element declaration\n if ((m = /^(actor\\/?|usecase\\/?|component|node|database|cloud|folder|frame|package|artifact|file|storage|queue|stack|card|rectangle|agent|label|boundary|control|entity|collections|hexagon|interface|circle|person|port|portin|portout|action|process|diamond)\\s+(.+)$/.exec(l))) {\n const kind = m[1].toLowerCase().replace('/', '')\n let rest = m[2].trim()\n const col = /\\s+(#[\\w]+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n const stereo = /\\s*<<(.+?)>>\\s*$/.exec(rest)\n if (stereo) rest = rest.slice(0, stereo.index).trim()\n let id = rest\n let label = rest\n const a1 = /^(.+?)\\s+as\\s+(.+)$/.exec(rest)\n if (a1) {\n const [x, y] = [a1[1].trim(), a1[2].trim()]\n // the quoted / bracketed side is the label\n if (/^[\"([:]/.test(x)) [label, id] = [x, y]\n else [id, label] = [x, y]\n }\n label = label.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3')\n id = id.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3').replace(/^\"(.*)\"$/, '$1')\n const shape = kind === 'usecase' ? 'ellipse' : kind === 'actor' ? 'actor' : (ELEMENT[kind] ?? 'rect')\n const n = b.node(id, { label: pText(label) + (stereo ? `\\n«${stereo[1]}»` : ''), shape }, cur())\n const fill = col ? color(col[1].slice(1)) ?? color(col[1]) : undefined\n if (fill) n.style = { ...n.style, fill }\n continue\n }\n // shorthand elements alone on a line\n if ((m = /^(\\[[^\\]]+\\]|\\([^)]+\\)|:[^:]+:)(?:\\s+as\\s+(\\S+))?$/.exec(l))) {\n const id = element(m[1])\n if (m[2]) {\n const n = b.get(id)!\n b.node(m[2], { label: n.label, shape: n.shape }, cur())\n b.g.nodes.splice(b.g.nodes.indexOf(n), 1)\n }\n continue\n }\n if ((m = LINK.exec(l))) {\n const [, ra, la, lm, l1, , dirWord, l2, , rm, lb, rz, label] = m\n let a = element(ra)\n let z = element(rz)\n const line = l1 + l2\n let tail = lm ? MARKS[lm] ?? 'none' : 'none'\n let head = rm ? MARKS[rm] ?? 'none' : 'none'\n let tl = la\n let hl = lb\n // \"up\" / \"left\": laid out the other way round\n if (/^(up|u|left|l|le)$/i.test(dirWord)) {\n ;[a, z] = [z, a]\n ;[tail, head] = [head, tail]\n ;[tl, hl] = [hl, tl]\n }\n const e: GEdge = { from: a, to: z, head, tail, line: line.includes('.') ? 'dashed' : line.includes('=') ? 'thick' : line.includes('~') ? 'dotted' : 'solid' }\n if (label) e.label = pText(label.replace(/\\s*[<>]\\s*$|^\\s*[<>]\\s*/g, ''))\n if (tl) e.tailLabel = tl\n if (hl) e.headLabel = hl\n b.edge(e)\n continue\n }\n // Class : member\n if ((m = /^([\\w.$]+)\\s*:\\s*(.+)$/.exec(l)) && (info.has(m[1]) || b.has(m[1]))) {\n const c = info.get(m[1]) ?? { kind: 'class', sections: [[], []] }\n info.set(m[1], c)\n const mem = pText(m[2])\n if (mem.includes('(') && c.sections.length > 1) c.sections[1].push(mem)\n else c.sections[0].push(mem)\n continue\n }\n }\n // start / end of old-style activity links\n const start = b.get('start')\n if (start && start.label === 'start' && b.g.edges.some((e) => e.from === 'start' || e.to === 'start')) {\n start.shape = 'start'\n start.label = ''\n const ins = b.g.edges.filter((e) => e.to === 'start')\n if (ins.length) {\n b.node('__end', { shape: 'end', label: '' })\n for (const e of ins) e.to = '__end'\n }\n }\n for (const n of b.g.nodes) {\n const c = info.get(n.id)\n if (!c) continue\n const header: string[][] = []\n const stereo = c.stereo ?? (c.kind === 'interface' ? 'interface' : c.kind === 'enum' ? 'enumeration' : c.kind === 'annotation' ? 'annotation' : c.kind === 'abstract' || c.kind === 'abstract class' ? 'abstract' : undefined)\n if (stereo) header.push([`«${stereo}»`])\n header.push([n.label])\n const sections: Section[] = [{ rows: header, bold: true, center: true, italic: c.kind.startsWith('abstract') }]\n for (const s of c.sections) sections.push({ rows: s.map((x) => [x]) })\n n.sections = sections\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- state\n\nfunction state(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'round')\n const scope: string[] = []\n const desc = new Map<string, string[]>()\n let notes = 0\n let noteLines: string[] | null = null\n let noteFor: string | undefined\n const cur = () => scope[scope.length - 1]\n const st = (raw: string, asTarget: boolean): string => {\n const id = raw.trim().replace(/^\"(.*)\"$/, '$1')\n if (id === '[*]') {\n const sid = `${cur() ?? ''}__${asTarget ? 'end' : 'start'}`\n b.node(sid, { label: '', shape: asTarget ? 'end' : 'start' }, cur())\n return sid\n }\n if (!b.isCluster(id) && !b.has(id)) b.node(id, { label: id }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteFor) b.edge({ from: noteFor, to: nid, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (l === '--' || l === '||') continue\n let m: RegExpExecArray | null\n if ((m = /^state\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+?)|(\\S+?)\\s+as\\s+\"([^\"]+)\"|(\"[^\"]+\"|[^\\s{<#]+))\\s*(<<(\\w+)>>)?\\s*(#\\S+)?\\s*(\\{)?$/i.exec(l))) {\n const id = (m[2] ?? m[3] ?? m[5]).replace(/^\"(.*)\"$/, '$1')\n const label = m[1] ?? m[4] ?? id\n const kind = m[7]?.toLowerCase()\n if (m[9]) {\n b.cluster(id, pText(label), cur())\n scope.push(id)\n continue\n }\n const shape: Shape | undefined =\n kind === 'fork' || kind === 'join' ? 'bar' : kind === 'choice' ? 'diamond' : kind === 'start' || kind === 'entrypoint' ? 'start' : kind === 'end' || kind === 'exitpoint' ? 'end' : undefined\n b.node(id, { label: shape ? '' : pText(label), shape }, cur())\n const fill = m[8] ? color(m[8].slice(1)) ?? color(m[8]) : undefined\n if (fill) b.node(id).style = { fill }\n continue\n }\n if (l === '}') {\n scope.pop()\n continue\n }\n if ((m = /^note\\s+(left|right|top|bottom)\\s+of\\s+(\\S+)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n if (m[3] !== undefined) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: st(m[2], false), to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteFor = st(m[2], false)\n }\n continue\n }\n if ((m = /^(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(-+|\\.+)(?:\\[[^\\]]*\\])?((?:up|down|left|right|u|d|l|r)?)(-*|\\.*)(?:\\[[^\\]]*\\])?>\\s*(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(?::\\s*(.*))?$/u.exec(l))) {\n let a = st(m[1], false)\n let z = st(m[5], true)\n let rev = false\n if (/^(up|u|left|l)$/i.test(m[3])) {\n ;[a, z] = [z, a]\n rev = true\n }\n b.edge({ from: a, to: z, head: rev ? 'none' : 'arrow', tail: rev ? 'arrow' : 'none', line: m[2].includes('.') ? 'dashed' : 'solid', label: m[6] ? pText(m[6]) : undefined })\n continue\n }\n if ((m = /^([\\w.$À-]+)\\s*:\\s*(.+)$/u.exec(l))) {\n st(m[1], false)\n desc.set(m[1], [...(desc.get(m[1]) ?? []), pText(m[2])])\n }\n }\n for (const n of b.g.nodes) {\n const d = desc.get(n.id)\n if (d && n.shape === 'round') n.sections = [{ rows: [[n.label]], bold: true, center: true }, { rows: d.map((x) => [x]) }]\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- activity (new syntax)\n\ninterface Exit {\n from: string\n label?: string\n}\n\nfunction activity(raw: string[]) {\n const b = new GraphBuilder('TB', 'round')\n // join multi-line actions \":…;\"\n const lines: string[] = []\n for (let k = 0; k < raw.length; k++) {\n let l = raw[k]\n if (/^:/.test(l) && !/[;|<>/\\]}]$/.test(l)) {\n while (k + 1 < raw.length && !/[;|<>/\\]}]$/.test(l)) l += '\\n' + raw[++k]\n }\n lines.push(l)\n }\n let i = 0\n let n = 0\n const scope: string[] = []\n const node = (shape: Shape, label = '') => {\n const id = `a${n++}`\n b.node(id, { shape, label }, scope[scope.length - 1])\n return id\n }\n let pendingLabel: string | undefined\n const link = (exits: Exit[], to: string) => {\n for (const e of exits) b.edge({ from: e.from, to, head: 'arrow', label: e.label })\n }\n const cond = (s: string) => pText(s.replace(/^\\((.*)\\)$/, '$1'))\n /** statements until a line matching `stop` (left unread); returns the open ends */\n const block = (start: Exit[], stop: RegExp): Exit[] => {\n let cur = start\n const put = (id: string) => {\n if (pendingLabel !== undefined) cur = cur.map((e) => ({ ...e, label: e.label ?? pendingLabel }))\n pendingLabel = undefined\n link(cur, id)\n }\n while (i < lines.length) {\n const l = lines[i]\n if (stop.test(l)) return cur\n i++\n let m: RegExpExecArray | null\n if (/^start$/i.test(l)) {\n const id = node('start')\n put(id)\n cur = [{ from: id }]\n } else if (/^(stop|end)$/i.test(l)) {\n const id = node('end')\n put(id)\n cur = []\n } else if (/^(kill|detach|break)$/i.test(l)) cur = []\n else if ((m = /^:([\\s\\S]*?)[;|<>/\\]}]$/.exec(l))) {\n const id = node('round', pText(m[1]))\n put(id)\n cur = [{ from: id }]\n } else if ((m = /^->\\s*(.*?);?$/.exec(l))) pendingLabel = pText(m[1]) || undefined\n else if ((m = /^if\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?\\s*$/i.exec(l)) || (m = /^if\\s*(\\(.*\\))\\s*(?:is\\s*\\((.*)\\))?\\s*then\\s*$/i.exec(l))) {\n let d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = block([{ from: d, label: m[2] ? pText(m[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i)\n let open = true\n while (i < lines.length) {\n const t = lines[i++]\n let e: RegExpExecArray | null\n if ((e = /^(?:elseif|else\\s*if)\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?$/i.exec(t))) {\n const d2 = node('diamond', cond(e[1]))\n b.edge({ from: d, to: d2, head: 'arrow' })\n d = d2\n out = out.concat(block([{ from: d2, label: e[2] ? pText(e[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i))\n } else if ((e = /^else\\s*(?:\\((.*)\\))?$/i.exec(t))) {\n out = out.concat(block([{ from: d, label: e[1] ? pText(e[1]) : undefined }], /^(endif|end\\s*if)\\b/i))\n open = false\n } else break\n }\n if (open) out.push({ from: d })\n cur = out\n } else if ((m = /^switch\\s*(\\(.*\\))$/i.exec(l))) {\n const d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = []\n while (i < lines.length) {\n const t = lines[i++]\n const e = /^case\\s*(\\(.*\\))$/i.exec(t)\n if (!e) break\n out = out.concat(block([{ from: d, label: cond(e[1]) }], /^(case\\s*\\(|endswitch)/i))\n }\n cur = out\n } else if ((m = /^while\\s*(\\(.*?\\))\\s*(?:is\\s*\\((.*)\\))?$/i.exec(l))) {\n const w = node('diamond', cond(m[1]))\n put(w)\n const body = block([{ from: w, label: m[2] ? pText(m[2]) : undefined }], /^(endwhile|end\\s*while)\\b/i)\n link(body, w)\n const e = /^(?:endwhile|end\\s*while)\\s*(?:\\((.*)\\))?$/i.exec(lines[i++] ?? '')\n cur = [{ from: w, label: e?.[1] ? pText(e[1]) : undefined }]\n } else if ((m = /^repeat\\s*(?::([\\s\\S]*?)[;|<>/\\]}])?$/i.exec(l)) && !/^repeat\\s*while/i.test(l)) {\n const r = m[1] !== undefined ? node('round', pText(m[1])) : node('diamond', '')\n put(r)\n const body = block([{ from: r }], /^(repeat\\s*while|backward)/i)\n let back: string | undefined\n let bm: RegExpExecArray | null\n if ((bm = /^backward\\s*:([\\s\\S]*?)[;|<>/\\]}]$/i.exec(lines[i] ?? ''))) {\n back = node('round', pText(bm[1]))\n i++\n }\n const e = /^repeat\\s*while\\s*(\\(.*?\\))?\\s*(?:is\\s*\\((.*?)\\))?\\s*(?:not\\s*\\((.*?)\\))?$/i.exec(lines[i++] ?? '')\n const d = node('diamond', e?.[1] ? cond(e[1]) : '')\n link(body, d)\n if (back) {\n b.edge({ from: d, to: back, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n b.edge({ from: back, to: r, head: 'arrow' })\n } else b.edge({ from: d, to: r, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n cur = [{ from: d, label: e?.[3] ? pText(e[3]) : undefined }]\n } else if (/^(fork|split)$/i.test(l)) {\n const fork = /^fork$/i.test(l)\n let f: string | undefined\n let starts = cur\n if (fork) {\n f = node('bar')\n put(f)\n starts = [{ from: f }]\n } else if (pendingLabel !== undefined) pendingLabel = undefined\n let out: Exit[] = []\n for (;;) {\n out = out.concat(block(starts, /^(fork\\s+again|split\\s+again|end\\s*fork|end\\s*merge|end\\s*split)\\b/i))\n const t = lines[i++] ?? ''\n if (!/again/i.test(t)) break\n }\n if (fork) {\n const j = node('bar')\n link(out, j)\n cur = [{ from: j }]\n } else cur = out\n } else if ((m = /^(?:partition|group|package|rectangle|card)\\s+(?:\"([^\"]*)\"|(\\S[^{]*?))\\s*(?:#\\S+)?\\s*\\{?$/i.exec(l))) {\n const name = (m[1] ?? m[2]).trim()\n const cid = `__p${n++}`\n b.cluster(cid, pText(name), scope[scope.length - 1])\n scope.push(cid)\n } else if (l === '}' || /^end\\s*group$/i.test(l)) scope.pop()\n else if (/^[rh]?note\\b/i.test(l) || /^floating\\s+note\\b/i.test(l)) {\n if (!/:/.test(l)) while (i < lines.length && !/^end\\s*note$/i.test(lines[i++]));\n }\n // swimlanes, arrows styles, labels we do not draw\n }\n return cur\n }\n block([], /^\\u0000$/)\n return b.g\n}\n\n// ---------------------------------------------------------------- mind map / WBS\n\nfunction tree(lines: string[], wbs: boolean): TreeNode {\n const stack: { depth: number; n: TreeNode }[] = []\n let root: TreeNode | undefined\n for (let k = 0; k < lines.length; k++) {\n const l = lines[k]\n const m = /^([*+\\-#]+)(_)?\\s*(?:\\[#[\\w]+\\])?\\s*(.*)$/.exec(l)\n if (!m) continue\n let text = m[3]\n // \":multi\\nline;\" nodes\n if (text.startsWith(':')) {\n text = text.slice(1)\n while (!/;\\s*$/.test(text) && k + 1 < lines.length) text += '\\n' + lines[++k]\n text = text.replace(/;\\s*$/, '')\n }\n const depth = m[1].length\n const side = m[1][0] === '-' ? 'left' : 'right'\n const node: TreeNode = { label: pText(text), shape: m[2] ? 'none' : undefined, side: wbs ? undefined : side, children: [] }\n if (!root) {\n root = node\n stack.push({ depth, n: node })\n continue\n }\n while (stack.length > 1 && stack[stack.length - 1].depth >= depth) stack.pop()\n stack[stack.length - 1].n.children.push(node)\n stack.push({ depth, n: node })\n }\n if (!root) throw new DiagramError('The mind map is empty')\n // only the root's children choose a side\n const clear = (n: TreeNode, top: boolean) => n.children.forEach((c) => (top ? clear(c, false) : ((c.side = undefined), clear(c, false))))\n clear(root, true)\n return root\n}\n","/**\n * Diagrams as code, drawn without a browser, a server or a library: Mermaid, PlantUML and Graphviz DOT text in,\n * self-contained SVG pictures out. Runs in the worker (no DOM) and on the main thread.\n */\nimport { renderDotAll } from './dot'\nimport type { Rendered } from './graph'\nimport { renderMermaid } from './mermaid'\nimport { renderPlantUml } from './plantuml'\nimport { DiagramError } from './svg'\n\nexport type DiagramLang = 'mermaid' | 'plantuml' | 'graphviz'\nexport type { Rendered as DiagramImage } from './graph'\nexport { DiagramError } from './svg'\n\n/** file extensions of diagram sources */\nexport const DIAGRAM_EXT: Record<string, DiagramLang> = {\n mmd: 'mermaid',\n mermaid: 'mermaid',\n puml: 'plantuml',\n plantuml: 'plantuml',\n pu: 'plantuml',\n iuml: 'plantuml',\n wsd: 'plantuml',\n dot: 'graphviz',\n gv: 'graphviz',\n}\n\n/** Markdown code fence languages */\nexport const FENCE_LANG: Record<string, DiagramLang> = {\n mermaid: 'mermaid',\n mmd: 'mermaid',\n plantuml: 'plantuml',\n puml: 'plantuml',\n uml: 'plantuml',\n dot: 'graphviz',\n graphviz: 'graphviz',\n gv: 'graphviz',\n}\n\nexport const DIAGRAM_NAME: Record<DiagramLang, string> = { mermaid: 'Mermaid', plantuml: 'PlantUML', graphviz: 'Graphviz' }\n\n/** a Mermaid header line: the diagram keyword alone (prose that starts with \"pie\" or \"timeline\" is not one) */\nconst MERMAID_START =\n /^(?:(?:graph|flowchart)(?:\\s+(?:TB|TD|BT|RL|LR))?\\s*(?:;.*)?|(?:sequenceDiagram|classDiagram(?:-v2)?|stateDiagram(?:-v2)?|erDiagram|gantt|mindmap|journey|gitGraph|timeline|quadrantChart|requirementDiagram|C4Context|C4Container|C4Component|C4Dynamic|C4Deployment|sankey-beta|xychart-beta|block-beta|packet-beta|kanban|architecture-beta)\\s*|pie(?:\\s+showData)?(?:\\s+title\\s+.*)?\\s*)$/\nconst DOT_START = /^(strict\\s+)?(di)?graph(\\s+(\"[^\"]*\"|[\\w.]+))?\\s*\\{/i\n\n/** the diagram language of a text without a name: @startuml, digraph { }, a Mermaid header */\nexport function sniffDiagram(text: string): DiagramLang | null {\n if (/^\\s*@start(uml|mindmap|wbs|dot|salt|gantt|json|yaml)\\b/m.test(text.slice(0, 2000))) return 'plantuml'\n const lines = text\n .replace(/^/, '')\n .replace(/^\\s*---\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*\\r?\\n/, '')\n .replace(/%%\\{[\\s\\S]*?\\}%%/g, '')\n .split(/\\r?\\n/)\n const trimmed = lines.map((l) => l.trim())\n // DOT: comments (//, /* */, # lines) may come first\n const dot = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').split(/\\r?\\n/).map((l) => l.trim()).find((l) => l && !l.startsWith('//') && !l.startsWith('#'))\n if (dot && (DOT_START.test(dot) || (/^(strict\\s+)?(di)?graph(\\s+(\"[^\"]*\"|[\\w.]+))?\\s*$/i.test(dot) && /^\\s*\\{/m.test(text) && !MERMAID_START.test(dot)))) return 'graphviz'\n const first = trimmed.find((l) => l && !l.startsWith('%%'))\n return first && MERMAID_START.test(first) ? 'mermaid' : null\n}\n\nconst LIMIT = 2_000_000\n\n/** The pictures a diagram source draws (PlantUML and DOT files may hold several). Throws a DiagramError. */\nexport function renderDiagrams(lang: DiagramLang, text: string): Rendered[] {\n if (text.length > LIMIT) throw new DiagramError('The diagram is too large to draw')\n try {\n switch (lang) {\n case 'mermaid':\n return [renderMermaid(text)]\n case 'plantuml':\n return renderPlantUml(text)\n case 'graphviz':\n return renderDotAll(text)\n }\n } catch (e) {\n if (e instanceof DiagramError) throw e\n throw new DiagramError((e as Error)?.message || String(e))\n }\n}\n","/** Link schemes a document may open; any other (javascript:, data:, vbscript:, file:…) is shown as plain text. */\nconst SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel', 'sms', 'ftp', 'ftps'])\n\n/**\n * A document's link target, or undefined when following it could run code: web, mail, phone and FTP links, and\n * relative or in-document (`#bookmark`) targets are kept. The scheme is read the way a browser reads it.\n */\nexport function safeHref(href: string | null | undefined): string | undefined {\n if (!href) return undefined\n // browsers drop leading / trailing controls and spaces, and tabs / newlines anywhere: \"java\\tscript:\" is a script link\n const url = href.replace(/^[\\u0000- ]+|[\\u0000- ]+$/g, '').replace(/[\\t\\n\\r]/g, '')\n const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(url)?.[1].toLowerCase()\n return !scheme || SAFE_SCHEMES.has(scheme) ? href : undefined\n}\n","/**\n * Markdown → HTML for showing in a page: CommonMark blocks (headings, paragraphs, nested lists, quotes, code,\n * rules) and GitHub's tables, task lists, strikethrough and bare links. The HTML is safe to set as innerHTML:\n * text is escaped, raw HTML in the source is shown as text, and links / images keep only harmless URLs.\n * ```mermaid / ```plantuml / ```dot code blocks become SVG drawings.\n */\nimport { DIAGRAM_NAME, FENCE_LANG, renderDiagrams } from '../../../src/core/diagram'\nimport { safeHref } from '../../../src/core/url'\n\nexport interface MarkdownOptions {\n /** Draw ```mermaid, ```plantuml / ```puml and ```dot / ```graphviz code blocks as SVG. Default true. */\n diagrams?: boolean\n /** `id` attributes on headings (from their text) so `#links` reach them. Default true. */\n headingIds?: boolean\n}\n\ninterface Ctx {\n refs: Map<string, { href: string; title?: string }>\n diagrams: boolean\n ids: boolean\n slugs: Map<string, number>\n}\n\nconst esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n\nconst FENCE = /^( {0,3})(`{3,}|~{3,})[ \\t]*([^\\s`]*)[^`\\n]*$/\nconst ATX = /^ {0,3}(#{1,6})(?:[ \\t]+(.*?))?(?:[ \\t]+#+)?[ \\t]*$/\nconst SETEXT = /^ {0,3}(=+|-+)[ \\t]*$/\nconst HR = /^ {0,3}([-*_])(?:[ \\t]*\\1){2,}[ \\t]*$/\nconst QUOTE = /^ {0,3}> ?(.*)$/\nconst LIST = /^( {0,3})([-*+]|\\d{1,9}[.)])(?:([ \\t]{1,4})(.*)|[ \\t]*)$/\nconst DELIM = /^ {0,3}\\|?[ \\t]*:?-+:?[ \\t]*(?:\\|[ \\t]*:?-+:?[ \\t]*)*\\|?[ \\t]*$/\nconst REF = /^ {0,3}\\[([^\\]]+)\\]:[ \\t]*<?([^\\s>]+)>?(?:[ \\t]+(?:\"([^\"]*)\"|'([^']*)'|\\(([^)]*)\\)))?[ \\t]*$/\n\nconst label = (s: string) => s.trim().replace(/\\s+/g, ' ').toLowerCase()\n\n/** Markdown text → HTML. */\nexport function markdownToHtml(md: string, opts: MarkdownOptions = {}): string {\n const lines = md.replace(/^/, '').replace(/\\r\\n?/g, '\\n').replace(/\\t/g, ' ').split('\\n')\n const ctx: Ctx = { refs: new Map(), diagrams: opts.diagrams !== false, ids: opts.headingIds !== false, slugs: new Map() }\n // link reference definitions (outside code blocks) are read first and leave no text\n const kept: string[] = []\n let fence: string | null = null\n for (const l of lines) {\n const f = FENCE.exec(l)\n if (fence) {\n if (f && f[2][0] === fence[0] && f[2].length >= fence.length && !f[3]) fence = null\n kept.push(l)\n continue\n }\n if (f) fence = f[2]\n const r = !fence && REF.exec(l)\n if (r) {\n const key = label(r[1])\n if (!ctx.refs.has(key)) ctx.refs.set(key, { href: r[2], title: r[3] ?? r[4] ?? r[5] })\n continue\n }\n kept.push(l)\n }\n return blocks(kept, ctx, false)\n}\n\n/** a line that starts a block other than a paragraph (ends a lazy continuation) */\nconst startsBlock = (l: string) => FENCE.test(l) || ATX.test(l) || HR.test(l) || QUOTE.test(l) || LIST.test(l)\n\nfunction blocks(lines: string[], ctx: Ctx, tight: boolean): string {\n const out: string[] = []\n let para: string[] = []\n const flush = () => {\n if (!para.length) return\n const html = inline(para.map((l) => l.replace(/^ +/, '')).join('\\n').replace(/\\s+$/, ''), ctx)\n out.push(tight ? html : `<p>${html}</p>`)\n para = []\n }\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n if (!line.trim()) {\n flush()\n i++\n continue\n }\n let m: RegExpExecArray | null\n if ((m = FENCE.exec(line))) {\n flush()\n const indent = m[1].length\n const mark = m[2]\n const close = new RegExp(`^ {0,3}${mark[0] === '`' ? '`' : '~'}{${mark.length},}[ \\\\t]*$`)\n const body: string[] = []\n i++\n while (i < lines.length && !close.test(lines[i])) body.push(lines[i++].replace(new RegExp(`^ {0,${indent}}`), ''))\n i++\n out.push(code(body.join('\\n'), m[3], ctx))\n continue\n }\n if (!para.length && /^ {4}/.test(line)) {\n const body: string[] = []\n while (i < lines.length && (/^ {4}/.test(lines[i]) || !lines[i].trim())) body.push(lines[i++].slice(4))\n while (body.length && !body[body.length - 1].trim()) body.pop()\n out.push(`<pre><code>${esc(body.join('\\n'))}\\n</code></pre>`)\n continue\n }\n if ((m = ATX.exec(line))) {\n flush()\n out.push(heading(m[1].length, m[2] ?? '', ctx))\n i++\n continue\n }\n if (para.length && (m = SETEXT.exec(line))) {\n const text = para.join('\\n')\n para = []\n out.push(heading(m[1][0] === '=' ? 1 : 2, text, ctx))\n i++\n continue\n }\n if (HR.test(line)) {\n flush()\n out.push('<hr>')\n i++\n continue\n }\n if (QUOTE.test(line)) {\n flush()\n const inner: string[] = []\n while (i < lines.length) {\n const q = QUOTE.exec(lines[i])\n if (q) inner.push(q[1])\n // lazy continuation of a paragraph in the quote\n else if (lines[i].trim() && inner.length && inner[inner.length - 1].trim() && !startsBlock(lines[i])) inner.push(lines[i])\n else break\n i++\n }\n out.push(`<blockquote>\\n${blocks(inner, ctx, false)}\\n</blockquote>`)\n continue\n }\n if ((m = LIST.exec(line))) {\n // a list interrupts a paragraph only with content, and (numbered) from 1\n const empty = m[4] === undefined || !m[4].trim()\n if (!para.length || (!empty && (!/\\d/.test(m[2]) || parseInt(m[2], 10) === 1))) {\n flush()\n i = list(lines, i, out, ctx)\n continue\n }\n }\n if (line.includes('|') && i + 1 < lines.length && DELIM.test(lines[i + 1]) && (lines[i + 1].includes('|') || !line.trim().startsWith('|'))) {\n flush()\n i = table(lines, i, out, ctx)\n continue\n }\n para.push(line)\n i++\n }\n flush()\n return out.join('\\n')\n}\n\nfunction list(lines: string[], start: number, out: string[], ctx: Ctx): number {\n const first = LIST.exec(lines[start])!\n const ordered = /\\d/.test(first[2])\n const delim = first[2].slice(-1)\n const items: string[][] = []\n let loose = false\n let i = start\n while (i < lines.length) {\n const m = LIST.exec(lines[i])\n if (!m || /\\d/.test(m[2]) !== ordered || m[2].slice(-1) !== delim) break\n // content starts after the marker and 1–4 spaces (more: one space, the rest is indented code)\n const gap = m[3] === undefined ? 1 : m[3].length > 4 ? 1 : m[3].length\n const width = m[1].length + m[2].length + gap\n const item = [m[3] === undefined ? '' : m[3].length > 4 ? m[3].slice(1) + m[4] : m[4]]\n i++\n let blank = false\n while (i < lines.length) {\n const l = lines[i]\n if (!l.trim()) {\n item.push('')\n blank = true\n i++\n continue\n }\n const lead = l.length - l.trimStart().length\n if (lead >= width) {\n item.push(l.slice(width))\n blank = false\n i++\n continue\n }\n if (blank) break\n // lazy continuation of the item's paragraph\n if (!startsBlock(l) && item[item.length - 1].trim()) {\n item.push(l)\n i++\n continue\n }\n break\n }\n let trailing = false\n while (item.length > 1 && !item[item.length - 1].trim()) {\n item.pop()\n trailing = true\n }\n // a blank line between two blocks of the item: a loose list (paragraphs)\n for (let k = 1; k + 1 < item.length; k++) if (!item[k].trim() && item[k + 1].trim() && !/^\\s/.test(item[k + 1]) && !LIST.test(item[k + 1])) loose = true\n items.push(item)\n if (trailing) {\n const next = i < lines.length ? LIST.exec(lines[i]) : null\n if (next && /\\d/.test(next[2]) === ordered && next[2].slice(-1) === delim) loose = true\n }\n }\n const startNo = ordered ? parseInt(first[2], 10) : 1\n out.push(ordered ? `<ol${startNo !== 1 ? ` start=\"${startNo}\"` : ''}>` : '<ul>')\n for (const item of items) {\n const task = /^\\[([ xX])\\][ \\t]+/.exec(item[0])\n if (task) item[0] = item[0].slice(task[0].length)\n const body = blocks(item, ctx, !loose)\n const box = task ? `<input type=\"checkbox\" disabled${task[1] === ' ' ? '' : ' checked'}> ` : ''\n out.push(task ? `<li class=\"task-list-item\">${box}${body}</li>` : `<li>${body}</li>`)\n }\n out.push(ordered ? '</ol>' : '</ul>')\n return i\n}\n\nfunction table(lines: string[], i: number, out: string[], ctx: Ctx): number {\n const cells = (l: string) => {\n let s = l.trim()\n if (s.startsWith('|')) s = s.slice(1)\n if (s.endsWith('|') && !s.endsWith('\\\\|')) s = s.slice(0, -1)\n return s.split(/(?<!\\\\)\\|/).map((c) => c.trim().replace(/\\\\\\|/g, '|'))\n }\n const head = cells(lines[i])\n const align = cells(lines[i + 1]).map((c) => (c.startsWith(':') && c.endsWith(':') ? 'center' : c.endsWith(':') ? 'right' : c.startsWith(':') ? 'left' : ''))\n i += 2\n const rows: string[][] = []\n while (i < lines.length && lines[i].trim() && !startsBlock(lines[i])) rows.push(cells(lines[i++]))\n const cell = (tag: string, c: string | undefined, k: number) => `<${tag}${align[k] ? ` style=\"text-align:${align[k]}\"` : ''}>${inline(c ?? '', ctx)}</${tag}>`\n let html = `<table>\\n<thead>\\n<tr>${head.map((c, k) => cell('th', c, k)).join('')}</tr>\\n</thead>`\n if (rows.length) html += `\\n<tbody>\\n${rows.map((r) => `<tr>${head.map((_, k) => cell('td', r[k], k)).join('')}</tr>`).join('\\n')}\\n</tbody>`\n out.push(html + '\\n</table>')\n return i\n}\n\nfunction heading(level: number, text: string, ctx: Ctx): string {\n const html = inline(text.trim(), ctx)\n if (!ctx.ids) return `<h${level}>${html}</h${level}>`\n const base =\n html\n .replace(/<[^>]*>/g, '')\n .replace(/&\\w+;|&#\\d+;/g, '')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s_-]/gu, '')\n .trim()\n .replace(/\\s+/g, '-') || 'section'\n const n = ctx.slugs.get(base) ?? 0\n ctx.slugs.set(base, n + 1)\n return `<h${level} id=\"${esc(n ? `${base}-${n}` : base)}\">${html}</h${level}>`\n}\n\nfunction code(body: string, info: string, ctx: Ctx): string {\n const lang = info.toLowerCase().replace(/[^\\w+#.-]/g, '')\n const diagram = FENCE_LANG[lang]\n if (diagram && ctx.diagrams) {\n try {\n return renderDiagrams(diagram, body)\n .map((d) => `<figure class=\"md-diagram md-${diagram}\">${d.svg}</figure>`)\n .join('\\n')\n } catch (e) {\n return (\n `<div class=\"md-diagram-error\"><p>${esc(DIAGRAM_NAME[diagram])} diagram not drawn: ${esc((e as Error).message)}</p>` +\n `<pre><code class=\"language-${lang}\">${esc(body)}\\n</code></pre></div>`\n )\n }\n }\n return `<pre><code${lang ? ` class=\"language-${lang}\"` : ''}>${esc(body)}${body ? '\\n' : ''}</code></pre>`\n}\n\n/** URLs a picture may load: web, relative, and data: images */\nfunction safeSrc(src: string): string | undefined {\n const s = src.trim()\n if (/^data:image\\/(png|jpe?g|gif|webp|svg\\+xml|avif|bmp);/i.test(s)) return s\n const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(s.replace(/[\\u0000- ]/g, ''))?.[1].toLowerCase()\n return !scheme || scheme === 'http' || scheme === 'https' ? s : undefined\n}\n\nconst PUNCT = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst LINK_TAIL = String.raw`\\(\\s*(<[^>\\n]*>|[^\\s()]*(?:\\([^\\s()]*\\)[^\\s()]*)*)(?:\\s+(?:\"([^\"]*)\"|'([^']*)'|\\(([^)]*)\\)))?\\s*\\)`\nconst IMAGE = new RegExp(String.raw`!\\[((?:[^\\[\\]\\\\]|\\\\.|\\[[^\\]]*\\])*)\\]` + LINK_TAIL, 'g')\nconst LINK = new RegExp(String.raw`\\[((?:[^\\[\\]\\\\]|\\\\.|\\[[^\\]]*\\])*)\\]` + LINK_TAIL, 'g')\nconst REF_LINK = /(!?)\\[((?:[^[\\]\\\\]|\\\\.)*)\\](?:\\[((?:[^[\\]\\\\]|\\\\.)*)\\])?/g\n\nfunction inline(src: string, ctx: Ctx): string {\n const slots: string[] = []\n const hold = (html: string) => `\\u0000${slots.push(html) - 1}\\u0001`\n const unwrap = (u: string) => u.replace(/^<|>$/g, '')\n const link = (href: string, html: string, title?: string) => {\n const h = safeHref(href.replace(PUNCT, '$1'))\n // `html` is markup already: held whole so it is not escaped again\n return hold(h ? `<a href=\"${esc(h)}\"${title ? ` title=\"${esc(title)}\"` : ''}>${html}</a>` : html)\n }\n const image = (src: string, alt: string, title?: string) => {\n const s = safeSrc(src.replace(PUNCT, '$1'))\n const a = esc(alt.replace(PUNCT, '$1').replace(/[*_~`]/g, ''))\n return hold(s ? `<img src=\"${esc(s)}\" alt=\"${a}\"${title ? ` title=\"${esc(title)}\"` : ''}>` : a)\n }\n let s = src.replace(/[\\u0000\\u0001]/g, '�')\n // code spans first: nothing inside them is markup\n s = s.replace(/(`+)(?!`)([\\s\\S]*?[^`])\\1(?!`)/g, (_, _t: string, c: string) => {\n const t = c.replace(/\\n/g, ' ')\n return hold(`<code>${esc(/^ .* $/.test(t) && t.trim() ? t.slice(1, -1) : t)}</code>`)\n })\n s = s.replace(/\\\\\\n/g, () => hold('<br>\\n'))\n s = s.replace(PUNCT, (_, c: string) => hold(esc(c)))\n s = s.replace(/<((?:https?|ftp):\\/\\/[^\\s<>]+|mailto:[^\\s<>]+)>/gi, (_, u: string) => link(u, esc(u)))\n s = s.replace(/<([\\w.+-]+@[\\w-]+(?:\\.[\\w-]+)+)>/g, (_, e: string) => link('mailto:' + e, esc(e)))\n s = s.replace(IMAGE, (_, alt: string, u: string, t1?: string, t2?: string, t3?: string) => image(unwrap(u), alt, t1 ?? t2 ?? t3))\n s = s.replace(LINK, (_, text: string, u: string, t1?: string, t2?: string, t3?: string) => link(unwrap(u), emphasis(text), t1 ?? t2 ?? t3))\n s = s.replace(REF_LINK, (m, bang: string, text: string, ref?: string) => {\n const def = ctx.refs.get(label(ref || text))\n if (!def) return m\n return bang ? image(def.href, text, def.title) : link(def.href, emphasis(text), def.title)\n })\n // bare web addresses\n s = s.replace(/(^|[\\s(*_~])((?:https?:\\/\\/|www\\.)[^\\s<\\u0000]*[^\\s<\\u0000.,:;\"')\\]!?*_~])/g, (_, pre: string, u: string) => pre + link(u.startsWith('www.') ? 'http://' + u : u, esc(u)))\n s = emphasis(s)\n // put the held parts back (they may hold others)\n for (let k = 0; k < 4 && s.includes('\\u0000'); k++) s = s.replace(/\\u0000(\\d+)\\u0001/g, (_, n: string) => slots[Number(n)])\n return s\n}\n\n/** escapes text (held parts aside) and marks strong / emphasis / strikethrough and hard breaks */\nfunction emphasis(t: string): string {\n return esc(t)\n .replace(/\\*\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*\\*/g, '<strong><em>$1</em></strong>')\n .replace(/\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*/g, '<strong>$1</strong>')\n .replace(/(?<![\\p{L}\\p{N}_])__(?=\\S)([\\s\\S]*?\\S)__(?![\\p{L}\\p{N}_])/gu, '<strong>$1</strong>')\n .replace(/\\*(?=[^\\s*])([\\s\\S]*?[^\\s*])\\*/g, '<em>$1</em>')\n .replace(/(?<![\\p{L}\\p{N}_])_(?=[^\\s_])([\\s\\S]*?[^\\s_])_(?![\\p{L}\\p{N}_])/gu, '<em>$1</em>')\n .replace(/~~(?=\\S)([\\s\\S]*?\\S)~~/g, '<del>$1</del>')\n .replace(/ {2,}\\n/g, '<br>\\n')\n}\n","/**\n * @p10node/markdown: Markdown → safe HTML (CommonMark blocks, GitHub tables, task lists, strikethrough, bare links),\n * with ```mermaid / ```plantuml / ```dot code blocks drawn as SVG. No DOM needed, no dependency.\n */\nimport { markdownToHtml } from './markdown'\n\nexport interface MarkdownOptions {\n /** Draw ```mermaid, ```plantuml / ```puml and ```dot / ```graphviz code blocks as SVG. Default true. */\n diagrams?: boolean\n /** `id` attributes on headings (from their text) so `#links` reach them. Default true. */\n headingIds?: boolean\n}\n\n/**\n * HTML of a Markdown text, safe to set as `innerHTML`: text is escaped, HTML written in the Markdown is shown as\n * text, links keep web / mail / relative targets only and pictures web, relative or data: images.\n */\nexport function render(markdown: string, options: MarkdownOptions = {}): string {\n return markdownToHtml(markdown, options)\n}\n\n/** Renders Markdown into an element (its content is replaced). */\nexport function renderTo(target: Element, markdown: string, options: MarkdownOptions = {}): void {\n target.innerHTML = markdownToHtml(markdown, options)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["esc","SIZE","lines","MARGIN","MARGIN","r2","sequence","LINK","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","slope","sec","s1","s2","h1","h2","segs","label","back","boxes","x0","x1","y0","y1","ASCII","charWidth","cp","textWidth","mono","ch","text","size","bold","lineHeight","measure","lines","wrap","line","max","cur","word","next","esc$1","NAMED","color","THEME","paint","Svg","y","rx","cx","cy","x2","y2","points","closed","lh","attrs","bg","pathData","cmds","labelText","name","m","e","unMarkdown","DiagramError","GraphBuilder","defShape","id","patch","cluster","SIZE$1","SMALL","PX","PY","LH","lines$1","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","side","col","head","many","trimEnd","last","end","start","len","c2","edgeColor","MARGIN$2","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","lp","g2","cv","sample","clip","tail","dHead","first","dTail","tailStart","tl","midpoint","inside","list","atStart","dict","table","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","MARGIN$1","r2$1","renderPie","slices","a0","frac","a1","p0","p1","ly","lw","fmt","HOUR","DAY","pad2","renderGantt","tasks","t0","t1","sectW","chartW","scale","X","bottom","xa","fill","GAP_X","GAP_Y","renderTree","fs","circle","build","right","left","acc","place","yTop","sideSpan","ks","spanR","spanL","minY","maxY","all","walk","title","ox","oy","P","shape","tint","ink","r2","SequenceBuilder","SIZE","MSG","MLH","MARGIN","pbox","drawParticipant","textBelow","arrowHead","renderSequence","ps","idx","gap","leftExtra","rightExtra","need","have","num","count","deepest","frameRoom","width","headH","svgBack","svgMid","svgFront","active","bars","frames","open","ended","touch","actX","activate","deactivate","nw","numberBadge","footer","tab","frameP","el","lifeTop","renderModel","prepare","fm","parseMermaid","body","flowchart","sequence$1","classDiagram","stateDiagram","erDiagram","pie","gantt","mindmap","renderMermaid","DIRS","mText","raw","cssStyle","decl","prop","merge","splitTop","OPENERS","NEW_SHAPES","ID","readNode","closes","shapes","cls","ctx","HEAD","readEdge","rest","run","dotted","pipe","thick","extra","linkStyles","statements","inline","st2","pending","amp","def","ids","SEQ_ARROWS","P_KIND","blocks","arrowRe","typ","generic","MARK","info","ns","member","inBody","notes","relRe","la","ma","mb","lb","header","sections","desc","defs","classes","noteLines","noteFor","sid","asTarget","target","CARD","CARD_WORDS","inEntity","entity","words","symRe","wordRe","shown","showData","UNIT","parseDate","re","year","byId","today","parts","task","tag","startRaw","endRaw","after","dur","until","TREE_SHAPES","indent","sh","node","plantUmlBlocks","parsePlantUml","parseBlock","renderPlantUml","clean","umlKind","activity","sequence","description","pText","skip","titleLines","inComment","has","KIND","calls","note","pid","as1","as2","who","msg","seqMessage","act","ARROW","dashed","headOf","ELEMENT","CLASSES","MARKS","END","LINK$1","stackKinds","noteTarget","noteId","element","ensure","nid","stereo","ra","lm","l1","dirWord","l2","rm","rz","hl","mem","ins","rev","pendingLabel","exits","cond","block","put","stop","d2","bm","fork","wbs","clear","FENCE_LANG","DIAGRAM_NAME","LIMIT","renderDiagrams","lang","SAFE_SCHEMES","safeHref","href","url","scheme","esc","FENCE","ATX","SETEXT","HR","QUOTE","LIST","DELIM","REF","markdownToHtml","md","opts","kept","fence","startsBlock","para","flush","html","tight","mark","close","code","heading","inner","empty","ordered","delim","items","loose","item","blank","trailing","startNo","box","cells","align","cell","level","base","diagram","safeSrc","PUNCT","LINK_TAIL","IMAGE","LINK","REF_LINK","hold","unwrap","image","alt","t2","t3","emphasis","ref","bang","pre","render","markdown","options","renderTo"],"sources":["../../../src/core/diagram/layout.ts","../../../src/core/diagram/svg.ts","../../../src/core/diagram/graph.ts","../../../src/core/dict.ts","../../../src/core/diagram/dot.ts","../../../src/core/diagram/charts.ts","../../../src/core/diagram/sequence.ts","../../../src/core/diagram/model.ts","../../../src/core/diagram/mermaid.ts","../../../src/core/diagram/plantuml.ts","../../../src/core/diagram/index.ts","../../../src/core/url.ts","../src/markdown.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 // one smooth curve through the waypoints, the across coordinate a function of the rank coordinate: square-on at\n // the ports and at a straight piece, a monotone (Fritsch–Carlson) slope at the other waypoints, so the curve never\n // swings out past one (a dummy next to an end would otherwise bend the whole offset into a short piece)\n const n = pts.length\n const slope = new Array<number>(n).fill(0)\n const sec = (k: number) => (pts[k + 1].x - pts[k].x) / Math.max(0.5, pts[k + 1].y - pts[k].y)\n for (let k = 1; k + 1 < n; k++) {\n if (straight[k - 1] || straight[k]) continue\n const s1 = sec(k - 1)\n const s2 = sec(k)\n if (s1 * s2 <= 0) continue\n const h1 = pts[k].y - pts[k - 1].y\n const h2 = pts[k + 1].y - pts[k].y\n slope[k] = (3 * (h1 + h2)) / ((2 * h2 + h1) / s1 + (h2 + 2 * h1) / s2)\n }\n const segs: Seg[] = []\n for (let k = 1; k < n; k++) {\n const p = pts[k - 1]\n const q = pts[k]\n const h = (q.y - p.y) / 3\n if (straight[k - 1] || (Math.abs(p.x - q.x) < 0.5 && !slope[k - 1] && !slope[k])) segs.push({ c: 'L', p: [q] })\n else segs.push({ c: 'C', p: [{ x: p.x + slope[k - 1] * h, y: p.y + h }, { x: q.x - slope[k] * h, y: q.y - h }, q] })\n }\n const label = labelAt[i] >= 0 ? centre(labelAt[i]) : undefined\n if (!reversed[i]) return { start: pts[0], segs, label }\n // drawn from the other end: the pieces in reverse, each cubic's control points swapped\n const back: Seg[] = []\n for (let k = n - 1; k >= 1; k--) {\n const s = segs[k - 1]\n back.push(s.c === 'C' ? { c: 'C', p: [s.p[1], s.p[0], pts[k - 1]] } : { c: 'L', p: [pts[k - 1]] })\n }\n return { start: pts[n - 1], segs: back, label }\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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\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') {\n const c2 = { x: last.p[1].x - d.x * Math.min(len, 6), y: last.p[1].y - d.y * Math.min(len, 6) }\n // a short last piece: the control point stays ahead of the first one, or the curve would loop back\n const k = Math.min(0, (c2.x - last.p[0].x) * d.x + (c2.y - last.p[0].y) * d.y)\n last.p[1] = { x: c2.x - d.x * k, y: c2.y - d.y * k }\n }\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') {\n const c1 = { x: first.p[0].x - dTail.x * Math.min(tl, 6), y: first.p[0].y - dTail.y * Math.min(tl, 6) }\n const k = Math.max(0, (first.p[1].x - c1.x) * dTail.x + (first.p[1].y - c1.y) * dTail.y)\n first.p[0] = { x: c1.x + dTail.x * k, y: c1.y + dTail.y * k }\n }\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 * Lookups by a key read from a file (an attribute value, an element name, a style id).\n *\n * A plain object answers \"constructor\", \"toString\" or \"__proto__\" with what it inherits: a function or an object,\n * which then travels as a color, a border style, an alignment… and can't be sent out of the worker (the document\n * comes out blank) or breaks the code that expects a string.\n */\n\n/** A lookup table with no inherited keys: a key the table was not given is undefined. */\nexport function dict<T extends object>(table: T): T {\n return Object.assign(Object.create(null) as T, table)\n}\n\n/** `obj[key]`, only when the object itself holds the key: for objects built elsewhere (XML attributes, cloned models). */\nexport function own<T>(obj: Record<string, T> | undefined, key: string | undefined): T | undefined {\n return obj !== undefined && key !== undefined && Object.hasOwn(obj, key) ? obj[key] : undefined\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'\nimport { dict } from '../dict'\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> = dict({\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> = dict({\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","/** Pie charts, Gantt charts and mind maps / work breakdown trees. */\nimport type { Rendered } from './graph'\nimport { measure, pathData, Svg, textWidth, THEME, wrap, type Pt } from './svg'\n\nconst MARGIN = 16\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\n// ---------------------------------------------------------------- pie\n\nexport interface Pie {\n title?: string\n showData?: boolean\n slices: { label: string; value: number }[]\n}\n\nexport function renderPie(p: Pie): Rendered {\n const slices = p.slices.filter((s) => s.value > 0 && Number.isFinite(s.value))\n if (!slices.length) throw new Error('The pie chart has no values')\n const total = slices.reduce((a, s) => a + s.value, 0)\n const R = 130\n const svg = new Svg()\n const titleH = p.title ? 36 : 0\n const cx = MARGIN + R\n const cy = MARGIN + titleH + R\n const color = (k: number) => THEME.series[k % THEME.series.length]\n let a0 = -Math.PI / 2\n const at = (a: number, r: number): Pt => ({ x: cx + Math.cos(a) * r, y: cy + Math.sin(a) * r })\n slices.forEach((s, k) => {\n const frac = s.value / total\n const a1 = a0 + frac * 2 * Math.PI\n if (frac >= 0.9999) svg.circle(cx, cy, R, { fill: color(k), stroke: '#ffffff', sw: 2 })\n else {\n const p0 = at(a0, R)\n const p1 = at(a1, R)\n svg.path(`M${r2(cx)} ${r2(cy)} L${r2(p0.x)} ${r2(p0.y)} A${R} ${R} 0 ${frac > 0.5 ? 1 : 0} 1 ${r2(p1.x)} ${r2(p1.y)} Z`, { fill: color(k), stroke: '#ffffff', sw: 2 })\n }\n if (frac >= 0.06) {\n const m = at((a0 + a1) / 2, R * 0.66)\n svg.text(m.x, m.y, `${Math.round(frac * 1000) / 10}%`, { anchor: 'middle', size: 13, bold: true, color: '#ffffff' })\n }\n a0 = a1\n })\n // legend\n const lx = cx + R + 30\n const lh = 24\n const ly = cy - (slices.length * lh) / 2 + lh / 2\n let lw = 0\n slices.forEach((s, k) => {\n const text = p.showData ? `${s.label} [${fmt(s.value)}]` : s.label\n svg.rect(lx, ly + k * lh - 8, 16, 16, { fill: color(k) }, 3)\n svg.text(lx + 24, ly + k * lh, text)\n lw = Math.max(lw, textWidth(text, 14))\n })\n let W = lx + 24 + lw + MARGIN\n const H = Math.max(cy + R, ly + slices.length * lh) + MARGIN\n if (p.title) {\n W = Math.max(W, textWidth(p.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, p.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 fmt = (v: number) => (Number.isInteger(v) ? String(v) : String(Math.round(v * 100) / 100))\n\n// ---------------------------------------------------------------- gantt\n\nexport interface GanttTask {\n name: string\n start: number\n end: number\n done?: boolean\n active?: boolean\n crit?: boolean\n milestone?: boolean\n}\n\nexport interface Gantt {\n title?: string\n sections: { name: string; tasks: GanttTask[] }[]\n}\n\nconst HOUR = 3600e3\nconst DAY = 24 * HOUR\n\nconst pad2 = (v: number) => String(v).padStart(2, '0')\n\nexport function renderGantt(g: Gantt): Rendered {\n const tasks = g.sections.flatMap((s) => s.tasks)\n if (!tasks.length) throw new Error('The Gantt chart has no tasks')\n const t0 = Math.min(...tasks.map((t) => t.start))\n const t1 = Math.max(...tasks.map((t) => Math.max(t.end, t.start)))\n const span = Math.max(t1 - t0, HOUR)\n const sectW = Math.min(180, Math.max(0, ...g.sections.map((s) => textWidth(s.name, 13, true))) + 24)\n const chartW = Math.max(560, Math.min(1100, tasks.length * 60))\n const scale = chartW / span\n const titleH = g.title ? 36 : 0\n const ROW = 28\n const axisH = 24\n const x0 = MARGIN + sectW\n const y0 = MARGIN + titleH\n const X = (t: number) => x0 + (t - t0) * scale\n const svg = new Svg()\n const H = y0 + tasks.length * ROW + axisH + MARGIN + 6\n // ticks\n const steps = [HOUR, 3 * HOUR, 6 * HOUR, 12 * HOUR, DAY, 2 * DAY, 7 * DAY, 14 * DAY, 30 * DAY, 91 * DAY, 365 * DAY]\n const step = steps.find((st) => span / st <= 12) ?? 365 * DAY\n const first = Math.ceil(t0 / step) * step\n const label = (t: number) => {\n const d = new Date(t)\n if (step < DAY) return `${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`\n if (step >= 365 * DAY) return String(d.getUTCFullYear())\n if (step >= 30 * DAY) return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}`\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`\n }\n const bottom = y0 + tasks.length * ROW + 4\n for (let t = first; t <= t1; t += step) {\n const x = X(t)\n svg.line(x, y0, x, bottom, { stroke: '#e3e6ec', sw: 1 })\n svg.text(x, bottom + 12, label(t), { anchor: 'middle', size: 11, color: THEME.muted })\n }\n let row = 0\n g.sections.forEach((s, k) => {\n const color = THEME.series[k % THEME.series.length]\n const top = y0 + row * ROW\n if (k % 2 === 0) svg.rect(MARGIN, top, sectW + chartW, s.tasks.length * ROW, { fill: '#f6f7fa' })\n if (s.name) svg.text(MARGIN + 6, top + (s.tasks.length * ROW) / 2, wrap([s.name], sectW - 12, 13, true), { size: 13, bold: true })\n for (const t of s.tasks) {\n const y = y0 + row * ROW + ROW / 2\n if (t.milestone) {\n const x = X(t.start)\n svg.poly(\n [\n [x, y - 8],\n [x + 8, y],\n [x, y + 8],\n [x - 8, y],\n ],\n { fill: t.crit ? '#e5596b' : THEME.dark },\n )\n svg.text(x + 14, y, t.name, { size: 12 })\n } else {\n const xa = X(t.start)\n const w = Math.max(3, X(t.end) - xa)\n const fill = t.done ? '#c7ccd6' : color\n svg.rect(xa, y - 9, w, 18, { fill, stroke: t.crit ? '#c0392b' : t.active ? THEME.dark : undefined, sw: t.crit || t.active ? 2 : 0 }, 3)\n const tw = textWidth(t.name, 12)\n if (tw + 10 < w) svg.text(xa + w / 2, y, t.name, { anchor: 'middle', size: 12, color: t.done ? THEME.ink : '#ffffff' })\n else if (xa + w + 6 + tw < x0 + chartW + 200) svg.text(xa + w + 6, y, t.name, { size: 12 })\n else svg.text(xa - 6, y, t.name, { anchor: 'end', size: 12 })\n }\n row++\n }\n })\n let W = x0 + chartW + MARGIN\n // labels to the right of the last bars\n for (const t of tasks) W = Math.max(W, X(t.end) + 12 + textWidth(t.name, 12) + MARGIN)\n if (g.title) {\n W = Math.max(W, textWidth(g.title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, 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\n// ---------------------------------------------------------------- mind maps / trees\n\nexport interface TreeNode {\n label: string\n shape?: 'rect' | 'round' | 'circle' | 'cloud' | 'hexagon' | 'none'\n side?: 'left' | 'right'\n children: TreeNode[]\n}\n\ninterface Placed {\n n: TreeNode\n w: number\n h: number\n text: string[]\n x: number\n y: number\n color: string\n depth: number\n kids: Placed[]\n span: number\n}\n\nconst GAP_X = 44\nconst GAP_Y = 12\n\nexport function renderTree(root: TreeNode, title?: string): Rendered {\n const svg = new Svg()\n const size = (n: TreeNode, depth: number) => {\n const fs = depth === 0 ? 16 : depth === 1 ? 14 : 13\n const text = wrap(n.label.split('\\n'), 220, fs, depth === 0)\n const t = measure(text, fs, depth === 0)\n const circle = n.shape === 'circle'\n const d = Math.max(t.w, t.h) + 20\n return { text, w: circle ? d : t.w + (n.shape === 'none' ? 8 : 24), h: circle ? d : t.h + (n.shape === 'none' ? 6 : 14), fs }\n }\n const build = (n: TreeNode, depth: number, color: string): Placed => {\n const s = size(n, depth)\n const kids = n.children.map((c, k) => build(c, depth + 1, depth === 0 ? THEME.series[k % THEME.series.length] : color))\n const span = Math.max(s.h, kids.reduce((a, c) => a + c.span, 0) + Math.max(0, kids.length - 1) * GAP_Y)\n return { n, w: s.w, h: s.h, text: s.text, x: 0, y: 0, color, depth, kids, span }\n }\n const top = build(root, 0, THEME.dark)\n // sides: explicit, else balanced by size\n let right: Placed[] = []\n let left: Placed[] = []\n if (top.kids.some((k) => k.n.side)) {\n right = top.kids.filter((k) => k.n.side !== 'left')\n left = top.kids.filter((k) => k.n.side === 'left')\n } else if (top.kids.length > 3) {\n const total = top.kids.reduce((a, k) => a + k.span, 0)\n let acc = 0\n for (const k of top.kids) {\n if (acc < total / 2) right.push(k)\n else left.push(k)\n acc += k.span\n }\n } else right = top.kids\n const place = (p: Placed, x: number, yTop: number, dir: number) => {\n p.x = x\n let y = yTop + (p.span - (p.kids.reduce((a, c) => a + c.span, 0) + Math.max(0, p.kids.length - 1) * GAP_Y)) / 2\n for (const c of p.kids) {\n place(c, x + dir * (p.w / 2 + GAP_X + c.w / 2), y, dir)\n y += c.span + GAP_Y\n }\n p.y = p.kids.length ? (p.kids[0].y + p.kids[p.kids.length - 1].y) / 2 : yTop + p.span / 2\n }\n const sideSpan = (ks: Placed[]) => ks.reduce((a, c) => a + c.span, 0) + Math.max(0, ks.length - 1) * GAP_Y\n const spanR = sideSpan(right)\n const spanL = sideSpan(left)\n const height = Math.max(top.h, spanR, spanL)\n let y = (height - spanR) / 2\n for (const c of right) {\n place(c, top.w / 2 + GAP_X + c.w / 2, y, 1)\n y += c.span + GAP_Y\n }\n y = (height - spanL) / 2\n for (const c of left) {\n place(c, -(top.w / 2 + GAP_X + c.w / 2), y, -1)\n y += c.span + GAP_Y\n }\n top.x = 0\n top.y = height / 2\n // bounds\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n const all: Placed[] = []\n const walk = (p: Placed) => {\n all.push(p)\n minX = Math.min(minX, p.x - p.w / 2)\n maxX = Math.max(maxX, p.x + p.w / 2)\n minY = Math.min(minY, p.y - p.h / 2)\n maxY = Math.max(maxY, p.y + p.h / 2)\n p.kids.forEach(walk)\n }\n walk(top)\n const titleH = title ? 36 : 0\n const ox = MARGIN - minX\n const oy = MARGIN + titleH - minY\n const P = (p: Placed): Pt => ({ x: p.x + ox, y: p.y + oy })\n for (const p of all) {\n for (const c of p.kids) {\n const a = P(p)\n const b = P(c)\n const dir = Math.sign(b.x - a.x) || 1\n const s = { x: a.x + (dir * p.w) / 2, y: a.y }\n const t = { x: b.x - (dir * c.w) / 2, y: b.y }\n const m = (s.x + t.x) / 2\n svg.path(pathData([{ c: 'M', p: [s] }, { c: 'C', p: [{ x: m, y: s.y }, { x: m, y: t.y }, t] }]), { stroke: c.color, sw: Math.max(1.2, 3.2 - c.depth * 0.6) })\n }\n }\n for (const p of all) {\n const c = P(p)\n const fs = p.depth === 0 ? 16 : p.depth === 1 ? 14 : 13\n const x = c.x - p.w / 2\n const y = c.y - p.h / 2\n const shape = p.n.shape ?? (p.depth === 0 ? 'round' : 'round')\n const fill = p.depth === 0 ? THEME.dark : p.depth === 1 ? p.color : tint(p.color)\n const ink = p.depth <= 1 ? '#ffffff' : THEME.ink\n if (shape === 'none') {\n svg.line(x, y + p.h, x + p.w, y + p.h, { stroke: p.color, sw: 1.5 })\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs })\n continue\n }\n if (shape === 'circle') svg.circle(c.x, c.y, p.w / 2, { fill, stroke: p.color, sw: 1.2 })\n else if (shape === 'hexagon') {\n const s = p.h / 4\n svg.poly(\n [\n [x + s, y],\n [x + p.w - s, y],\n [x + p.w, c.y],\n [x + p.w - s, y + p.h],\n [x + s, y + p.h],\n [x, c.y],\n ],\n { fill, stroke: p.color, sw: 1.2 },\n )\n } else svg.rect(x, y, p.w, p.h, { fill, stroke: p.depth === 0 ? undefined : p.color, sw: 1.2 }, shape === 'rect' ? 2 : shape === 'cloud' ? p.h / 2 : 8)\n svg.text(c.x, c.y, p.text, { anchor: 'middle', size: fs, bold: p.depth === 0, color: ink })\n }\n let W = maxX - minX + 2 * MARGIN\n const H = maxY - minY + 2 * MARGIN + titleH\n if (title) {\n W = Math.max(W, textWidth(title, 16, true) + 2 * MARGIN)\n svg.text(W / 2, MARGIN + 12, 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\n/** a light version of a #rrggbb color */\nfunction tint(c: string): string {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(c)\n if (!m) return '#f1f3f7'\n return '#' + [m[1], m[2], m[3]].map((h) => Math.round(parseInt(h, 16) * 0.22 + 255 * 0.78).toString(16).padStart(2, '0')).join('')\n}\n","/**\n * Sequence diagrams (Mermaid sequenceDiagram, PlantUML): participants across, messages down, with activations,\n * notes, fragments (loop / alt / opt / par…), dividers and delays.\n */\nimport type { Rendered } from './graph'\nimport { DiagramError, lineHeight, measure, Svg, textWidth, THEME } from './svg'\n\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\nexport type PKind = 'participant' | 'actor' | 'database' | 'boundary' | 'control' | 'entity' | 'collections' | 'queue'\n\nexport interface Participant {\n id: string\n label: string\n kind: PKind\n fill?: string\n}\n\nexport type MsgHead = 'filled' | 'open' | 'cross' | 'half' | 'none'\n\nexport type SeqEvent =\n | { t: 'msg'; from: string; to: string; text: string; dashed: boolean; head: MsgHead; both?: boolean; activate?: boolean; deactivate?: boolean }\n | { t: 'act'; who: string; on: boolean }\n | { t: 'note'; pos: 'left' | 'right' | 'over'; who: string[]; text: string }\n | { t: 'block'; kind: string; label: string; fill?: string }\n | { t: 'else'; label: string }\n | { t: 'end' }\n | { t: 'divider'; text: string }\n | { t: 'delay'; text: string }\n | { t: 'space'; h: number }\n | { t: 'destroy'; who: string }\n\nexport interface Sequence {\n title?: string\n participants: Participant[]\n events: SeqEvent[]\n autonumber?: boolean\n /** participants drawn again at the bottom (default true) */\n footer?: boolean\n}\n\nexport class SequenceBuilder {\n readonly s: Sequence = { participants: [], events: [] }\n private ids = new Map<string, Participant>()\n\n participant(id: string, patch: Partial<Participant> = {}): Participant {\n let p = this.ids.get(id)\n if (!p) {\n p = { id, label: id, kind: 'participant' }\n this.ids.set(id, p)\n this.s.participants.push(p)\n }\n for (const [k, v] of Object.entries(patch)) if (v !== undefined) (p as unknown as Record<string, unknown>)[k] = v\n return p\n }\n\n has(id: string) {\n return this.ids.has(id)\n }\n\n push(e: SeqEvent) {\n if (e.t === 'msg') {\n this.participant(e.from)\n this.participant(e.to)\n } else if (e.t === 'note') e.who.forEach((w) => this.participant(w))\n else if (e.t === 'act' || e.t === 'destroy') this.participant(e.who)\n this.s.events.push(e)\n }\n}\n\nconst SIZE = 14\nconst MSG = 13\nconst MLH = lineHeight(MSG)\nconst MARGIN = 16\nconst lines = (s: string) => (s ? s.split('\\n') : [])\n\ninterface PBox {\n w: number\n h: number\n text: string[]\n}\n\nfunction pbox(p: Participant): PBox {\n const text = lines(p.label)\n const t = measure(text, SIZE)\n switch (p.kind) {\n case 'actor':\n return { w: Math.max(44, t.w + 8), h: 44 + t.h, text }\n case 'boundary':\n case 'control':\n case 'entity':\n return { w: Math.max(44, t.w + 8), h: 34 + t.h, text }\n case 'database':\n return { w: Math.max(64, t.w + 24), h: t.h + 30, text }\n default:\n return { w: Math.max(64, t.w + 24), h: t.h + 18, text }\n }\n}\n\nfunction drawParticipant(svg: Svg, p: Participant, b: PBox, cx: number, y: number) {\n const fill = p.fill ?? THEME.fill\n const st = { fill, stroke: THEME.stroke, sw: 1.3 }\n const ink = { fill: 'none', stroke: THEME.dark, sw: 1.5 }\n const textBelow = (top: number) => svg.text(cx, top + (b.text.length * lineHeight(SIZE)) / 2, b.text, { anchor: 'middle' })\n const x = cx - b.w / 2\n switch (p.kind) {\n case 'actor':\n svg.circle(cx, y + 8, 7, { ...ink, fill })\n svg.line(cx, y + 15, cx, y + 29, ink).line(cx - 11, y + 20, cx + 11, y + 20, ink)\n svg.line(cx, y + 29, cx - 9, y + 41, ink).line(cx, y + 29, cx + 9, y + 41, ink)\n textBelow(y + 44)\n return\n case 'boundary':\n svg.circle(cx + 4, y + 14, 12, st).line(cx - 14, y + 4, cx - 14, y + 24, ink).line(cx - 14, y + 14, cx - 8, y + 14, ink)\n textBelow(y + 32)\n return\n case 'control':\n svg.circle(cx, y + 15, 12, st).poly(\n [\n [cx + 4, y - 1],\n [cx - 2, y + 3],\n [cx + 4, y + 7],\n ],\n ink,\n false,\n )\n textBelow(y + 32)\n return\n case 'entity':\n svg.circle(cx, y + 13, 12, st).line(cx - 12, y + 27, cx + 12, y + 27, ink)\n textBelow(y + 32)\n return\n case 'database': {\n const ry = 6\n const w = b.w\n const h = b.h\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x + w)} ${r2(y + ry)} L${r2(x + w)} ${r2(y + h - ry)} A${r2(w / 2)} ${ry} 0 0 1 ${r2(x)} ${r2(y + h - ry)} Z`, st)\n svg.path(`M${r2(x)} ${r2(y + ry)} A${r2(w / 2)} ${ry} 0 0 0 ${r2(x + w)} ${r2(y + ry)}`, { ...st, fill: 'none' })\n svg.text(cx, y + h / 2 + ry / 2, b.text, { anchor: 'middle' })\n return\n }\n case 'collections':\n svg.rect(x + 4, y - 4, b.w, b.h, st, 3)\n svg.rect(x, y, b.w, b.h, st, 3)\n break\n case 'queue':\n svg.rect(x, y, b.w, b.h, st, b.h / 2)\n break\n default:\n svg.rect(x, y, b.w, b.h, st, 3)\n }\n svg.text(cx, y + b.h / 2, b.text, { anchor: 'middle' })\n}\n\nfunction arrowHead(svg: Svg, head: MsgHead, x: number, y: number, dir: number) {\n const col = THEME.line\n switch (head) {\n case 'filled':\n svg.poly(\n [\n [x, y],\n [x - dir * 10, y - 4.5],\n [x - dir * 10, y + 4.5],\n ],\n { fill: col, stroke: col, sw: 1 },\n )\n break\n case 'open':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n [x - dir * 10, y + 5],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'half':\n svg.poly(\n [\n [x - dir * 10, y - 5],\n [x, y],\n ],\n { stroke: col, sw: 1.4 },\n false,\n )\n break\n case 'cross':\n svg.line(x - 5 - dir * 4, y - 5, x + 5 - dir * 4, y + 5, { stroke: col, sw: 1.6 }).line(x - 5 - dir * 4, y + 5, x + 5 - dir * 4, y - 5, { stroke: col, sw: 1.6 })\n break\n }\n}\n\ninterface Frame {\n kind: string\n label: string\n fill?: string\n y0: number\n y1: number\n lo: number\n hi: number\n depth: number\n elses: { y: number; label: string }[]\n}\n\nexport function renderSequence(s: Sequence): Rendered {\n const ps = s.participants\n if (!ps.length) throw new DiagramError('The sequence diagram has no participants')\n if (ps.length > 300 || s.events.length > 8000) throw new DiagramError('The sequence diagram is too large to draw')\n const idx = new Map(ps.map((p, k) => [p.id, k]))\n const boxes = ps.map(pbox)\n const n = ps.length\n // ---- horizontal: gaps between neighbouring lifelines\n const gap = new Array(n).fill(0)\n for (let k = 1; k < n; k++) gap[k] = (boxes[k - 1].w + boxes[k].w) / 2 + 28\n let leftExtra = 0\n let rightExtra = 0\n const need = (a: number, b: number, v: number) => {\n if (a > b) [a, b] = [b, a]\n if (a === b) return\n let have = 0\n for (let k = a + 1; k <= b; k++) have += gap[k]\n if (have >= v) return\n const add = (v - have) / (b - a)\n for (let k = a + 1; k <= b; k++) gap[k] += add\n }\n const num = (k: number) => (s.autonumber ? textWidth(String(k), 10) + 14 : 0)\n let count = 0\n for (const e of s.events) {\n if (e.t === 'msg') {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const tw = Math.max(0, ...lines(e.text).map((l) => textWidth(l, MSG))) + num(count)\n if (a === b) {\n if (a + 1 < n) need(a, a + 1, boxes[a + 1].w / 2 + tw + 44)\n else rightExtra = Math.max(rightExtra, tw + 44 - boxes[a].w / 2)\n } else need(a, b, tw + 30)\n } else if (e.t === 'note') {\n const tw = measure(lines(e.text), MSG).w + 20\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n if (e.pos === 'over') {\n if (a !== b) need(a, b, tw - 50)\n } else if (e.pos === 'left') {\n if (a > 0) need(a - 1, a, tw + 16 + boxes[a - 1].w / 2)\n else leftExtra = Math.max(leftExtra, tw + 16 - boxes[0].w / 2)\n } else if (b + 1 < n) need(b, b + 1, tw + 16 + boxes[b + 1].w / 2)\n else rightExtra = Math.max(rightExtra, tw + 16 - boxes[b].w / 2)\n }\n }\n const cx: number[] = []\n // frames add a margin on the outer lifelines\n const deepest = (() => {\n let d = 0\n let m = 0\n for (const e of s.events) {\n if (e.t === 'block') m = Math.max(m, ++d)\n else if (e.t === 'end') d = Math.max(0, d - 1)\n }\n return m\n })()\n const frameRoom = deepest ? 12 + deepest * 8 : 0\n cx[0] = MARGIN + Math.max(boxes[0].w / 2, leftExtra + boxes[0].w / 2, frameRoom + 10)\n for (let k = 1; k < n; k++) cx[k] = cx[k - 1] + gap[k]\n let width = cx[n - 1] + Math.max(boxes[n - 1].w / 2, rightExtra + boxes[n - 1].w / 2, frameRoom + 10) + MARGIN\n\n // ---- vertical\n const titleH = s.title ? 34 : 0\n const top = MARGIN + titleH\n const headH = Math.max(...boxes.map((b) => b.h))\n let y = top + headH + 18\n const svgBack = new Svg()\n const svgMid = new Svg()\n const svgFront = new Svg()\n const active: number[][] = ps.map(() => [])\n const bars: { k: number; y0: number; y1: number; depth: number }[] = []\n const frames: Frame[] = []\n const open: Frame[] = []\n const ended = new Map<number, number>()\n const touch = (lo: number, hi: number) => {\n for (const f of open) {\n f.lo = Math.min(f.lo, lo)\n f.hi = Math.max(f.hi, hi)\n }\n }\n const actX = (k: number, side: number) => {\n const d = active[k].length\n return cx[k] + (d ? side * 5 + (d - 1) * 5 : 0)\n }\n const activate = (k: number, at: number) => active[k].push(at)\n const deactivate = (k: number, at: number) => {\n const y0 = active[k].pop()\n if (y0 !== undefined) bars.push({ k, y0, y1: at, depth: active[k].length })\n }\n count = 0\n for (const e of s.events) {\n switch (e.t) {\n case 'msg': {\n count++\n const a = idx.get(e.from)!\n const b = idx.get(e.to)!\n const text = lines(e.text)\n const th = text.length * MLH\n const paint = { stroke: THEME.line, sw: 1.4, dash: e.dashed ? '6 4' : undefined }\n const nw = num(count)\n if (a === b) {\n y += th + 4\n const x0 = actX(a, 1)\n const loopW = 34\n svgMid.poly(\n [\n [x0, y],\n [x0 + loopW, y],\n [x0 + loopW, y + 20],\n [x0 + 2, y + 20],\n ],\n paint,\n false,\n )\n arrowHead(svgMid, e.head, x0, y + 20, -1)\n svgFront.text(x0 + 6 + nw, y - 4 - th / 2, text, { size: MSG })\n if (s.autonumber) numberBadge(svgFront, x0, y, count)\n touch(cx[a] - 10, x0 + loopW + 6 + nw + Math.max(...text.map((l) => textWidth(l, MSG))))\n y += 20\n if (e.activate) activate(b, y)\n if (e.deactivate) deactivate(a, y)\n y += 14\n break\n }\n y += th + 6\n const dir = b > a ? 1 : -1\n if (e.activate) activate(b, y)\n const x1 = actX(a, dir)\n const x2 = actX(b, -dir)\n svgMid.line(x1, y, x2, y, paint)\n arrowHead(svgMid, e.head, x2, y, dir)\n if (e.both) arrowHead(svgMid, e.head, x1, y, -dir)\n svgFront.text((x1 + x2) / 2 + (dir * nw) / 2, y - 5 - th / 2, text, { anchor: 'middle', size: MSG })\n if (s.autonumber) numberBadge(svgFront, x1, y, count)\n if (e.deactivate) deactivate(a, y)\n touch(Math.min(cx[a], cx[b]), Math.max(cx[a], cx[b]))\n y += 14\n break\n }\n case 'act': {\n const k = idx.get(e.who)!\n if (e.on) activate(k, y - 6)\n else deactivate(k, y - 6)\n break\n }\n case 'note': {\n const ks = e.who.map((w) => idx.get(w)!)\n const a = Math.min(...ks)\n const b = Math.max(...ks)\n const text = lines(e.text)\n const t = measure(text, MSG)\n const w = Math.max(t.w + 20, e.pos === 'over' && a !== b ? cx[b] - cx[a] + 50 : 0, 60)\n const h = t.h + 12\n y += 6\n const x = e.pos === 'left' ? cx[a] - 12 - w : e.pos === 'right' ? cx[b] + 12 : (cx[a] + cx[b]) / 2 - w / 2\n svgFront.poly(\n [\n [x, y],\n [x + w - 8, y],\n [x + w, y + 8],\n [x + w, y + h],\n [x, y + h],\n ],\n { fill: THEME.note, stroke: THEME.noteStroke, sw: 1 },\n )\n svgFront.text(x + 10, y + h / 2, text, { size: MSG })\n touch(x, x + w)\n y += h + 8\n break\n }\n case 'block': {\n y += 10\n const f: Frame = { kind: e.kind, label: e.label, fill: e.fill, y0: y, y1: y, lo: Infinity, hi: -Infinity, depth: open.length, elses: [] }\n frames.push(f)\n open.push(f)\n y += e.kind === 'rect' ? 8 : 26\n break\n }\n case 'else': {\n const f = open[open.length - 1]\n if (!f) break\n y += 8\n f.elses.push({ y, label: e.label })\n y += 24\n break\n }\n case 'end': {\n const f = open.pop()\n if (!f) break\n y += 10\n f.y1 = y\n y += 6\n break\n }\n case 'divider': {\n y += 16\n const t = measure(lines(e.text), MSG)\n svgFront.line(MARGIN / 2, y - 2, width - MARGIN / 2, y - 2, { stroke: THEME.muted, sw: 1 }).line(MARGIN / 2, y + 2, width - MARGIN / 2, y + 2, { stroke: THEME.muted, sw: 1 })\n if (e.text) {\n svgFront.rect(width / 2 - t.w / 2 - 10, y - t.h / 2 - 4, t.w + 20, t.h + 8, { fill: '#ffffff', stroke: THEME.muted, sw: 1 }, 3)\n svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, bold: true })\n }\n y += 22\n break\n }\n case 'delay':\n y += 14\n if (e.text) svgFront.text(width / 2, y, lines(e.text), { anchor: 'middle', size: MSG, italic: true, color: THEME.muted })\n y += 18\n break\n case 'space':\n y += e.h\n break\n case 'destroy': {\n const k = idx.get(e.who)!\n y += 6\n svgFront.line(cx[k] - 8, y - 8, cx[k] + 8, y + 8, { stroke: '#c0392b', sw: 2 }).line(cx[k] - 8, y + 8, cx[k] + 8, y - 8, { stroke: '#c0392b', sw: 2 })\n ended.set(k, y)\n y += 14\n break\n }\n }\n }\n for (let k = 0; k < n; k++) while (active[k].length) deactivate(k, y)\n for (const f of open.splice(0)) f.y1 = y\n y += 14\n const footer = s.footer !== false\n const height = y + (footer ? headH : 0) + MARGIN\n\n // frames: widths from what they contain (or the whole width when empty)\n for (const f of frames) {\n const pad = 12 + (deepest - f.depth) * 8\n if (f.lo > f.hi) {\n f.lo = cx[0]\n f.hi = cx[n - 1]\n }\n const x0 = Math.max(4, f.lo - pad)\n // wide enough for its title and branch labels (the picture grows if need be)\n const tab = textWidth(f.kind, 12, true) + 16\n const titles = [f.label ? tab + 8 + textWidth(`[${f.label}]`, 12) : tab, ...f.elses.map((e) => 10 + textWidth(`[${e.label}]`, 12))]\n const x1 = Math.max(Math.min(width - 4, f.hi + pad), f.kind === 'rect' ? 0 : x0 + Math.max(...titles) + 10)\n width = Math.max(width, x1 + 4)\n if (f.kind === 'rect') {\n svgBack.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, { fill: f.fill ?? 'rgba(200, 210, 230, 0.35)' }, 2)\n continue\n }\n const frameP = { stroke: THEME.muted, sw: 1.2 }\n svgMid.rect(x0, f.y0, x1 - x0, f.y1 - f.y0, frameP)\n const tw = tab\n svgMid.poly(\n [\n [x0, f.y0],\n [x0 + tw, f.y0],\n [x0 + tw, f.y0 + 12],\n [x0 + tw - 7, f.y0 + 19],\n [x0, f.y0 + 19],\n ],\n { fill: '#eef0f4', stroke: THEME.muted, sw: 1.2 },\n )\n svgMid.text(x0 + 7, f.y0 + 10, f.kind, { size: 12, bold: true })\n if (f.label) svgMid.text(x0 + tw + 8, f.y0 + 11, `[${f.label}]`, { size: 12, color: THEME.ink, italic: true })\n for (const el of f.elses) {\n svgMid.line(x0, el.y, x1, el.y, { ...frameP, dash: '5 4' })\n if (el.label) svgMid.text(x0 + 10, el.y + 12, `[${el.label}]`, { size: 12, italic: true })\n }\n }\n\n // lifelines, activations, participants\n const out = new Svg()\n const lifeTop = top + headH\n for (let k = 0; k < n; k++) out.line(cx[k], lifeTop, cx[k], ended.get(k) ?? (footer ? y : y - 6), { stroke: '#9aa3b2', sw: 1, dash: '5 4' })\n out.raw(svgBack.body())\n for (const b of bars) {\n const x = cx[b.k] - 5 + b.depth * 5\n out.rect(x, b.y0, 10, Math.max(8, b.y1 - b.y0), { fill: '#f3f4f6', stroke: THEME.stroke, sw: 1 })\n }\n out.raw(svgMid.body())\n out.raw(svgFront.body())\n ps.forEach((p, k) => {\n drawParticipant(out, p, boxes[k], cx[k], top + headH - boxes[k].h)\n if (footer && !ended.has(k)) drawParticipant(out, p, boxes[k], cx[k], y)\n })\n if (s.title) {\n width = Math.max(width, textWidth(s.title, 16, true) + 2 * MARGIN)\n out.text(width / 2, MARGIN + 12, s.title, { anchor: 'middle', size: 16, bold: true })\n }\n return { svg: out.toString(width, height), w: Math.ceil(width), h: Math.ceil(height) }\n}\n\nfunction numberBadge(svg: Svg, x: number, y: number, k: number) {\n const r = Math.max(8, textWidth(String(k), 10) / 2 + 4)\n svg.circle(x, y, r, { fill: THEME.dark })\n svg.text(x, y, String(k), { anchor: 'middle', size: 10, color: '#ffffff', bold: true })\n}\n","/** What a diagram source parses to, and its picture. */\nimport { renderGantt, renderPie, renderTree, type Gantt, type Pie, type TreeNode } from './charts'\nimport { renderGraph, type Graph, type Rendered } from './graph'\nimport { renderSequence, type Sequence } from './sequence'\n\nexport type Model =\n | { t: 'graph'; graph: Graph }\n | { t: 'sequence'; seq: Sequence }\n | { t: 'pie'; pie: Pie }\n | { t: 'gantt'; gantt: Gantt }\n | { t: 'tree'; root: TreeNode; title?: string }\n\nexport function renderModel(m: Model): Rendered {\n switch (m.t) {\n case 'graph':\n return renderGraph(m.graph)\n case 'sequence':\n return renderSequence(m.seq)\n case 'pie':\n return renderPie(m.pie)\n case 'gantt':\n return renderGantt(m.gantt)\n case 'tree':\n return renderTree(m.root, m.title)\n }\n}\n","/**\n * Mermaid: flowchart / graph, sequenceDiagram, classDiagram, stateDiagram, erDiagram, pie, gantt and mindmap.\n * https://mermaid.js.org/intro/syntax-reference.html\n */\nimport type { GanttTask, TreeNode } from './charts'\nimport { GraphBuilder, type Dir, type GEdge, type GNode, type Graph, type Head, type NodeStyle, type Rendered, type Section, type Shape } from './graph'\nimport { renderModel, type Model } from './model'\nimport { SequenceBuilder, type MsgHead, type PKind } from './sequence'\nimport { color, DiagramError, labelText, unMarkdown } from './svg'\nimport { dict } from '../dict'\n\n/** Lines without comments and directives; the front matter title. */\nfunction prepare(src: string): { lines: string[]; title?: string } {\n let text = src.replace(/^/, '').replace(/\\r\\n?/g, '\\n')\n let title: string | undefined\n const fm = /^\\s*---\\n([\\s\\S]*?)\\n---[ \\t]*(\\n|$)/.exec(text)\n if (fm) {\n title = /^title:\\s*(.+)$/m.exec(fm[1])?.[1].trim().replace(/^([\"'])(.*)\\1$/, '$2')\n text = text.slice(fm[0].length)\n }\n text = text.replace(/%%\\{[\\s\\S]*?\\}%%/g, '')\n const lines = text.split('\\n').filter((l) => !/^\\s*%%/.test(l))\n return { lines, title }\n}\n\nexport function parseMermaid(src: string): Model {\n const { lines, title } = prepare(src)\n const k = lines.findIndex((l) => l.trim())\n if (k < 0) throw new DiagramError('The diagram is empty')\n const head = lines[k].trim()\n const kw = /^[\\w-]+/.exec(head)?.[0] ?? head\n const body = lines.slice(k + 1)\n switch (kw) {\n case 'graph':\n case 'flowchart':\n case 'flowchart-elk':\n return { t: 'graph', graph: flowchart(head, body, title) }\n case 'sequenceDiagram':\n return { t: 'sequence', seq: sequence(body, title) }\n case 'classDiagram':\n case 'classDiagram-v2':\n return { t: 'graph', graph: classDiagram(body, title) }\n case 'stateDiagram':\n case 'stateDiagram-v2':\n return { t: 'graph', graph: stateDiagram(body, title) }\n case 'erDiagram':\n return { t: 'graph', graph: erDiagram(body, title) }\n case 'pie':\n return { t: 'pie', pie: pie(head, body, title) }\n case 'gantt':\n return { t: 'gantt', gantt: gantt(body, title) }\n case 'mindmap':\n return { t: 'tree', root: mindmap(body), title }\n default:\n throw new DiagramError(`Mermaid “${kw}” diagrams are not supported yet`)\n }\n}\n\nexport const renderMermaid = (src: string): Rendered => renderModel(parseMermaid(src))\n\n// ---------------------------------------------------------------- shared\n\nconst DIRS: Record<string, Dir> = dict({ TB: 'TB', TD: 'TB', BT: 'BT', LR: 'LR', RL: 'RL' })\n\n/** Mermaid label text: quotes, markdown strings, icons, entities and <br> */\nexport function mText(raw: string): string {\n let s = raw.trim()\n if (/^\".*\"$/s.test(s)) s = s.slice(1, -1)\n if (/^`.*`$/s.test(s)) s = unMarkdown(s.slice(1, -1))\n s = s.replace(/\\bfa[bkrs]?:fa-[\\w-]+\\s*/g, '')\n return labelText(s).trim()\n}\n\n/** `fill:#f9f,stroke:#333,stroke-width:4px,color:#fff,stroke-dasharray: 5 5` */\nfunction cssStyle(s: string): NodeStyle {\n const st: NodeStyle = {}\n for (const decl of s.split(/,(?![^(]*\\))/)) {\n const k = decl.indexOf(':')\n if (k < 0) continue\n const prop = decl.slice(0, k).trim().toLowerCase()\n const v = decl.slice(k + 1).trim().replace(/;$/, '')\n if (prop === 'fill' || prop === 'background') st.fill = color(v)\n else if (prop === 'stroke') st.stroke = color(v)\n else if (prop === 'color') st.color = color(v)\n else if (prop === 'stroke-width') st.sw = Math.min(8, parseFloat(v) || 1)\n else if (prop === 'stroke-dasharray') st.dash = /^[\\d.\\s]+$/.test(v) ? v : '5 5'\n else if (prop === 'font-weight') st.bold = /bold|[6-9]00/.test(v)\n else if (prop === 'font-style') st.italic = v === 'italic'\n }\n return st\n}\n\nconst merge = (a: NodeStyle | undefined, b: NodeStyle): NodeStyle => {\n const out: NodeStyle = { ...a }\n for (const [k, v] of Object.entries(b)) if (v !== undefined) (out as Record<string, unknown>)[k] = v\n return out\n}\n\n/** splits at `sep` outside quotes and brackets */\nfunction splitTop(s: string, sep: string): string[] {\n const out: string[] = []\n let depth = 0\n let q = ''\n let cur = ''\n for (const ch of s) {\n if (q) {\n if (ch === q) q = ''\n } else if (ch === '\"' || ch === '`') q = ch\n else if ('([{'.includes(ch)) depth++\n else if (')]}'.includes(ch)) depth = Math.max(0, depth - 1)\n else if (ch === sep && !depth) {\n out.push(cur)\n cur = ''\n continue\n }\n cur += ch\n }\n out.push(cur)\n return out\n}\n\n// ---------------------------------------------------------------- flowchart\n\nconst OPENERS: [string, string[], Shape[]][] = [\n ['(((', [')))'], ['doublecircle']],\n ['((', ['))'], ['circle']],\n ['([', ['])'], ['stadium']],\n ['[[', [']]'], ['subroutine']],\n ['[(', [')]'], ['cylinder']],\n ['{{', ['}}'], ['hexagon']],\n ['[/', ['/]', '\\\\]'], ['lean-r', 'trap-b']],\n ['[\\\\', ['\\\\]', '/]'], ['lean-l', 'trap-t']],\n ['[', [']'], ['rect']],\n ['(', [')'], ['round']],\n ['{', ['}'], ['diamond']],\n ['>', [']'], ['flag']],\n]\n\nconst NEW_SHAPES: Record<string, Shape> = dict({\n rect: 'rect', rectangle: 'rect', proc: 'rect', process: 'rect', rounded: 'round', event: 'round', stadium: 'stadium', pill: 'stadium', terminal: 'stadium',\n subproc: 'subroutine', subprocess: 'subroutine', subroutine: 'subroutine', 'fr-rect': 'subroutine', cyl: 'cylinder', cylinder: 'cylinder', database: 'cylinder', db: 'cylinder',\n circle: 'circle', circ: 'circle', 'dbl-circ': 'doublecircle', 'double-circle': 'doublecircle', diam: 'diamond', diamond: 'diamond', decision: 'diamond', question: 'diamond',\n hex: 'hexagon', hexagon: 'hexagon', prepare: 'hexagon', 'lean-r': 'lean-r', 'lean-right': 'lean-r', 'in-out': 'lean-r', 'lean-l': 'lean-l', 'lean-left': 'lean-l', 'out-in': 'lean-l',\n 'trap-b': 'trap-b', trapezoid: 'trap-b', priority: 'trap-b', 'trap-t': 'trap-t', 'inv-trapezoid': 'trap-t', manual: 'trap-t', odd: 'flag', flag: 'flag', doc: 'note', document: 'note',\n 'sm-circ': 'start', start: 'start', 'small-circle': 'start', 'fr-circ': 'end', stop: 'end', 'framed-circle': 'end', fork: 'bar', join: 'bar', text: 'none', 'notch-rect': 'note', card: 'note',\n 'f-circ': 'point', junction: 'point',\n})\n\ninterface FlowCtx {\n b: GraphBuilder\n clusters: string[]\n classes: Map<string, string[]>\n defs: Map<string, NodeStyle>\n}\n\nconst ID = /^[\\p{L}\\p{N}_$]+(?:-[\\p{L}\\p{N}_$]+)*/u\n\n/** reads a node at `i`: id, shape and text, `:::class`, `@{…}`; returns its id and the next index */\nfunction readNode(s: string, i: number, ctx: FlowCtx): [string, number] | null {\n while (s[i] === ' ' || s[i] === '\\t') i++\n const m = ID.exec(s.slice(i))\n if (!m) return null\n const id = m[0]\n i += id.length\n let patch: Partial<GNode> = {}\n if (s.startsWith('@{', i)) {\n const end = s.indexOf('}', i)\n if (end > 0) {\n const body = s.slice(i + 2, end)\n const shape = /shape\\s*:\\s*[\"']?([\\w-]+)/.exec(body)?.[1]\n const label = /label\\s*:\\s*(\"([^\"]*)\"|'([^']*)'|[^,]+)/.exec(body)\n if (shape && NEW_SHAPES[shape]) patch.shape = NEW_SHAPES[shape]\n if (label) patch.label = mText(label[2] ?? label[3] ?? label[1])\n i = end + 1\n }\n } else {\n for (const [open, closes, shapes] of OPENERS) {\n if (!s.startsWith(open, i)) continue\n let j = i + open.length\n let text = ''\n while (s[j] === ' ') j++\n if (s[j] === '\"') {\n const e = s.indexOf('\"', j + 1)\n if (e < 0) break\n text = s.slice(j, e + 1)\n j = e + 1\n while (s[j] === ' ') j++\n }\n let best = -1\n let which = 0\n closes.forEach((c, k) => {\n const at = s.indexOf(c, j)\n if (at >= 0 && (best < 0 || at < best)) {\n best = at\n which = k\n }\n })\n if (best < 0) break\n if (!text) text = s.slice(j, best)\n patch = { label: mText(text), shape: shapes[which] }\n i = best + closes[which].length\n break\n }\n }\n const cls = /^:::([\\w-]+)/.exec(s.slice(i))\n if (cls) {\n ctx.classes.set(id, [...(ctx.classes.get(id) ?? []), cls[1]])\n i += cls[0].length\n }\n if (!ctx.b.isCluster(id)) {\n const n = ctx.b.node(id, patch)\n const cur = ctx.clusters[ctx.clusters.length - 1]\n if (cur !== undefined && cur !== id && (n.cluster === undefined || ctx.clusters.includes(n.cluster))) n.cluster = cur\n }\n return [id, i]\n}\n\nconst HEAD: Record<string, Head> = dict({ '>': 'arrow', o: 'circle', x: 'cross' })\n\n/** reads an edge at `i` */\nfunction readEdge(s: string, i: number): [Omit<GEdge, 'from' | 'to'>, number] | null {\n const rest = s.slice(i)\n // text form: -- text -->, == text ==>, -. text .->\n let m = /^\\s*([<ox]?)(--|==|-\\.)\\s+(.+?)\\s*(-{2,}|={2,}|\\.+-)([>ox]?)(?=[\\s\\p{L}\\p{N}_$\"]|$)/u.exec(rest)\n let text: string | undefined\n let tail = ''\n let run = ''\n let head = ''\n let dotted = false\n if (m) {\n ;[, tail, , text, run, head] = m\n dotted = m[2] === '-.'\n } else {\n m = /^\\s*(~{3,})/.exec(rest)\n if (m) return [{ line: 'hidden', minlen: 1 }, i + m[0].length]\n m = /^\\s*([<ox]?)(-{2,}|={2,}|-\\.+-)([>ox]?)(?![-=.])/.exec(rest)\n if (!m) return null\n ;[, tail, run, head] = m\n dotted = run.includes('.')\n }\n let len = m[0].length\n const pipe = /^\\s*\\|([^|]*)\\|/.exec(rest.slice(len))\n if (pipe) {\n text = pipe[1]\n len += pipe[0].length\n }\n // `x` / `o` starting the next node name: only a head when followed by a space or the end\n if ((head === 'x' || head === 'o') && /^[\\p{L}\\p{N}_]/u.test(rest.slice(len)) && !pipe) {\n head = ''\n len--\n }\n const thick = run.includes('=')\n // the longer the arrow, the more ranks it spans: --> / --- / -.-> are one\n const extra = dotted ? (run.match(/\\./g)?.length ?? 1) - 1 : run.length - (head ? 2 : 3)\n return [\n {\n label: text !== undefined && text.trim() ? mText(text) : undefined,\n head: HEAD[head] ?? 'none',\n tail: tail === '<' ? 'arrow' : tail === 'o' ? 'circle' : tail === 'x' ? 'cross' : 'none',\n line: thick ? 'thick' : dotted ? 'dashed' : 'solid',\n minlen: 1 + Math.max(0, Math.min(extra, 6)),\n },\n i + len,\n ]\n}\n\nfunction flowchart(head: string, body: string[], title?: string): Graph {\n const d = /^\\w+\\s+(\\w+)/.exec(head)?.[1]?.toUpperCase()\n const b = new GraphBuilder(DIRS[d ?? 'TB'] ?? 'TB', 'rect')\n const ctx: FlowCtx = { b, clusters: [], classes: new Map(), defs: new Map() }\n const linkStyles: [string, NodeStyle][] = []\n const statements = body.flatMap((l) => splitTop(l, ';')).map((l) => l.trim()).filter(Boolean)\n // a header written on one line: \"graph LR; A --> B\"\n const inline = splitTop(head, ';').slice(1).map((l) => l.trim()).filter(Boolean)\n for (const st of [...inline, ...statements]) {\n let m: RegExpExecArray | null\n if ((m = /^subgraph\\s+(.*)$/.exec(st))) {\n const rest = m[1].trim()\n let id = rest\n let label = rest\n const br = /^([^\\s[]+)\\s*\\[(.*)\\]$/.exec(rest)\n if (br) {\n id = br[1]\n label = br[2]\n }\n label = mText(label)\n id = id.replace(/^\"(.*)\"$/, '$1')\n const parent = ctx.clusters[ctx.clusters.length - 1]\n b.cluster(id, label, parent)\n ctx.clusters.push(id)\n continue\n }\n if (st === 'end') {\n ctx.clusters.pop()\n continue\n }\n if (/^direction\\s+\\w+$/.test(st)) continue\n if ((m = /^classDef\\s+([\\w,-]+)\\s+(.+)$/.exec(st))) {\n for (const name of m[1].split(',')) ctx.defs.set(name.trim(), merge(ctx.defs.get(name.trim()), cssStyle(m[2])))\n continue\n }\n if ((m = /^class\\s+([^\\s]+)\\s+([\\w-]+)$/.exec(st))) {\n for (const id of m[1].split(',')) ctx.classes.set(id.trim(), [...(ctx.classes.get(id.trim()) ?? []), m[2]])\n continue\n }\n if ((m = /^style\\s+([^\\s]+)\\s+(.+)$/.exec(st))) {\n const st2 = cssStyle(m[2])\n for (const id of m[1].split(',')) {\n if (b.isCluster(id)) {\n const c = b.g.clusters.find((x) => x.id === id)!\n c.style = merge(c.style, st2)\n } else b.node(id).style = merge(b.get(id)?.style, st2)\n }\n continue\n }\n if ((m = /^linkStyle\\s+([\\d,\\s]+|default)\\s+(.+)$/.exec(st))) {\n linkStyles.push([m[1].trim(), cssStyle(m[2])])\n continue\n }\n if (/^(click|accTitle|accDescr|callback)\\b/.test(st)) continue\n // chain: nodes (& nodes) (edge nodes)*\n let i = 0\n let prev: string[] = []\n let pending: Omit<GEdge, 'from' | 'to'> | null = null\n for (;;) {\n const group: string[] = []\n for (;;) {\n const r = readNode(st, i, ctx)\n if (!r) break\n group.push(r[0])\n i = r[1]\n const amp = /^\\s*&\\s*/.exec(st.slice(i))\n if (!amp) break\n i += amp[0].length\n }\n if (!group.length) break\n if (pending) for (const a of prev) for (const z of group) b.edge({ ...pending, from: a, to: z })\n prev = group\n const e = readEdge(st, i)\n if (!e) break\n pending = e[0]\n i = e[1]\n }\n }\n // classes\n const def = ctx.defs.get('default')\n for (const n of b.g.nodes) {\n let st = def ? merge(undefined, def) : n.style\n if (def && n.style) st = merge(st, n.style)\n for (const c of ctx.classes.get(n.id) ?? []) st = merge(st, ctx.defs.get(c) ?? {})\n if (st) n.style = st\n }\n for (const c of b.g.clusters) for (const k of ctx.classes.get(c.id) ?? []) c.style = merge(c.style, ctx.defs.get(k) ?? {})\n for (const [which, st] of linkStyles) {\n const ids = which === 'default' ? b.g.edges.map((_, k) => k) : which.split(',').map((x) => Number(x.trim()))\n for (const k of ids) {\n const e = b.g.edges[k]\n if (!e) continue\n if (st.stroke) e.color = st.stroke\n if (st.sw) e.sw = st.sw\n if (st.dash) e.line = 'dashed'\n }\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- sequence\n\nconst SEQ_ARROWS: [string, boolean, MsgHead, boolean][] = [\n ['<<-->>', true, 'filled', true],\n ['<<->>', false, 'filled', true],\n ['-->>', true, 'filled', false],\n ['->>', false, 'filled', false],\n ['--x', true, 'cross', false],\n ['-x', false, 'cross', false],\n ['--)', true, 'open', false],\n ['-)', false, 'open', false],\n ['-->', true, 'none', false],\n ['->', false, 'none', false],\n]\n\nconst P_KIND: Record<string, PKind> = dict({ participant: 'participant', actor: 'actor', boundary: 'boundary', control: 'control', entity: 'entity', database: 'database', collections: 'collections', queue: 'queue' })\n\nfunction sequence(body: string[], title?: string) {\n const b = new SequenceBuilder()\n b.s.title = title\n const blocks: ('box' | 'frag')[] = []\n const arrowRe = new RegExp(`^(.+?)\\\\s*(${SEQ_ARROWS.map(([a]) => a.replace(/[()|]/g, '\\\\$&')).join('|')})\\\\s*([+-]?)\\\\s*([^:]+?)\\\\s*(?::(.*))?$`)\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n let m: RegExpExecArray | null\n if ((m = /^(?:create\\s+)?(participant|actor)\\s+(.+?)(?:@\\{(.*)\\})?(?:\\s+as\\s+(.+))?$/.exec(l))) {\n const id = m[2].trim()\n const typ = m[3] ? /\"type\"\\s*:\\s*\"(\\w+)\"/.exec(m[3])?.[1] : undefined\n b.participant(id, { kind: P_KIND[typ ?? m[1]] ?? 'participant', label: m[4] ? mText(m[4]) : id })\n continue\n }\n if ((m = /^destroy\\s+(.+)$/.exec(l))) {\n b.push({ t: 'destroy', who: m[1].trim() })\n continue\n }\n if (/^autonumber\\b/.test(l)) {\n b.s.autonumber = !/\\boff\\b/.test(l)\n continue\n }\n if ((m = /^title\\s*:?\\s*(.+)$/.exec(l))) {\n b.s.title = mText(m[1])\n continue\n }\n if ((m = /^(activate|deactivate)\\s+(.+)$/.exec(l))) {\n b.push({ t: 'act', who: m[2].trim(), on: m[1] === 'activate' })\n continue\n }\n if ((m = /^note\\s+(left of|right of|over)\\s+([^:]+):(.*)$/i.exec(l))) {\n const pos = m[1].toLowerCase().startsWith('left') ? 'left' : m[1].toLowerCase().startsWith('right') ? 'right' : 'over'\n b.push({ t: 'note', pos, who: m[2].split(',').map((x) => x.trim()), text: mText(m[3]) })\n continue\n }\n if ((m = /^box\\b/.exec(l))) {\n blocks.push('box')\n continue\n }\n if ((m = /^(loop|alt|opt|par|par_over|critical|break|rect)\\b\\s*(.*)$/.exec(l))) {\n blocks.push('frag')\n const kind = m[1] === 'par_over' ? 'par' : m[1]\n b.push({ t: 'block', kind, label: kind === 'rect' ? '' : mText(m[2]), fill: kind === 'rect' ? color(m[2]) : undefined })\n continue\n }\n if ((m = /^(else|and|option)\\b\\s*(.*)$/.exec(l))) {\n b.push({ t: 'else', label: mText(m[2]) })\n continue\n }\n if (l === 'end') {\n if (blocks.pop() === 'frag') b.push({ t: 'end' })\n continue\n }\n if ((m = arrowRe.exec(l))) {\n const arrow = SEQ_ARROWS.find(([a]) => a === m![2])!\n b.push({\n t: 'msg',\n from: m[1].trim(),\n to: m[4].trim(),\n text: mText(m[5] ?? ''),\n dashed: arrow[1],\n head: arrow[2],\n both: arrow[3],\n activate: m[3] === '+',\n deactivate: m[3] === '-',\n })\n continue\n }\n }\n return b.s\n}\n\n// ---------------------------------------------------------------- class diagram\n\ninterface ClassInfo {\n label?: string\n stereo?: string\n attrs: string[]\n methods: string[]\n}\n\nconst generic = (s: string) => s.replace(/~([^~]*)~/g, '<$1>')\n\nconst MARK: Record<string, Head> = dict({ '<|': 'triangle', '|>': 'triangle', '*': 'diamond', o: 'odiamond', '<': 'open', '>': 'open', '()': 'ocircle' })\n\nfunction classDiagram(body: string[], title?: string) {\n const b = new GraphBuilder('TB', 'rect')\n const info = new Map<string, ClassInfo>()\n const ns: string[] = []\n const cls = (name: string) => {\n const id = name.replace(/~.*~$/, '')\n if (!info.has(id)) info.set(id, { attrs: [], methods: [], label: name !== id ? generic(name) : undefined })\n b.node(id, {}, ns[ns.length - 1])\n return info.get(id)!\n }\n const member = (c: ClassInfo, raw: string) => {\n const t = generic(raw.trim())\n if (!t) return\n const st = /^<<(.+)>>$/.exec(t)\n if (st) c.stereo = st[1]\n else if (t.includes('(')) c.methods.push(t.replace(/[$*]$/, ''))\n else c.attrs.push(t.replace(/[$*]$/, ''))\n }\n let inBody: ClassInfo | null = null\n let notes = 0\n const relRe = /^([^\\s\"]+?)\\s*(?:\"([^\"]*)\"\\s*)?(<\\||\\*|o|<|\\(\\))?(--|\\.\\.)(\\|>|\\*|o|>|\\(\\))?\\s*(?:\"([^\"]*)\"\\s*)?([^\\s\":]+)\\s*(?::\\s*(.*))?$/\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n if (inBody) {\n if (l === '}') inBody = null\n else member(inBody, l)\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^direction\\s+(\\w+)$/.exec(l))) {\n b.g.dir = DIRS[m[1].toUpperCase()] ?? 'TB'\n continue\n }\n if ((m = /^namespace\\s+([\\w.]+)\\s*\\{$/.exec(l))) {\n b.cluster(m[1], m[1], ns[ns.length - 1])\n ns.push(m[1])\n continue\n }\n if (l === '}' && ns.length) {\n ns.pop()\n continue\n }\n if ((m = /^class\\s+([\\w$~,<>.-]+?)(?:\\[\"([^\"]*)\"\\])?(?::::[\\w-]+)?\\s*(\\{)?\\s*(\\})?$/.exec(l))) {\n const c = cls(m[1])\n if (m[2]) c.label = m[2]\n if (m[3] && !m[4]) inBody = c\n continue\n }\n if ((m = /^<<(.+)>>\\s+(\\S+)$/.exec(l))) {\n cls(m[2]).stereo = m[1]\n continue\n }\n if ((m = /^note\\s+(?:for\\s+(\\S+)\\s+)?\"(.*)\"$/.exec(l))) {\n const id = `__note${notes++}`\n b.node(id, { label: mText(m[2]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } })\n if (m[1]) b.edge({ from: id, to: m[1].replace(/~.*~$/, ''), line: 'dashed', head: 'none' })\n continue\n }\n if (/^(classDef|cssClass|click|callback|link|style)\\b/.test(l)) continue\n if ((m = relRe.exec(l))) {\n const [, a, la, ma, line, mb, lb, z, label] = m\n cls(a)\n cls(z)\n b.edge({\n from: a.replace(/~.*~$/, ''),\n to: z.replace(/~.*~$/, ''),\n tail: ma ? MARK[ma] : 'none',\n head: mb ? MARK[mb] : 'none',\n line: line === '..' ? 'dashed' : 'solid',\n label: label ? mText(label) : undefined,\n tailLabel: la || undefined,\n headLabel: lb || undefined,\n })\n continue\n }\n if ((m = /^([\\w$~.-]+)\\s*:\\s*(.+)$/.exec(l))) {\n member(cls(m[1]), m[2])\n continue\n }\n }\n for (const n of b.g.nodes) {\n const c = info.get(n.id)\n if (!c) continue\n const header: string[][] = []\n if (c.stereo) header.push([`«${c.stereo}»`])\n header.push([c.label ?? n.id])\n const sections: Section[] = [{ rows: header, bold: true, center: true }]\n if (c.attrs.length || c.methods.length) sections.push({ rows: c.attrs.map((a) => [a]) }, { rows: c.methods.map((a) => [a]) })\n n.sections = sections\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- state diagram\n\nfunction stateDiagram(body: string[], title?: string) {\n const b = new GraphBuilder('TB', 'round')\n const scope: string[] = []\n const desc = new Map<string, string[]>()\n const defs = new Map<string, NodeStyle>()\n const classes = new Map<string, string[]>()\n let notes = 0\n let noteLines: string[] | null = null\n let noteFor: { id: string } | null = null\n const cur = () => scope[scope.length - 1]\n const state = (raw: string, asTarget: boolean): string => {\n let id = raw.trim()\n const cls = /:::([\\w-]+)$/.exec(id)\n if (cls) {\n id = id.slice(0, cls.index)\n classes.set(id, [...(classes.get(id) ?? []), cls[1]])\n }\n if (id === '[*]') {\n const sid = `${cur() ?? ''}__${asTarget ? 'end' : 'start'}`\n b.node(sid, { label: '', shape: asTarget ? 'end' : 'start' }, cur())\n return sid\n }\n if (!b.isCluster(id)) b.node(id, {}, cur())\n return id\n }\n for (const raw of body) {\n const l = raw.trim()\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n const id = `__note${notes++}`\n b.node(id, { label: noteLines.join('\\n'), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteFor) b.edge({ from: noteFor.id, to: id, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (!l || l === '--') continue\n let m: RegExpExecArray | null\n if ((m = /^direction\\s+(\\w+)$/.exec(l))) {\n if (!scope.length) b.g.dir = DIRS[m[1].toUpperCase()] ?? 'TB'\n continue\n }\n if ((m = /^state\\s+(?:\"([^\"]+)\"\\s+as\\s+)?([\\w.-]+)\\s*(<<(fork|join|choice)>>)?\\s*(\\{)?$/.exec(l))) {\n const id = m[2]\n if (m[5]) {\n b.cluster(id, m[1] ? mText(m[1]) : id, cur())\n scope.push(id)\n continue\n }\n const kind = m[4]\n b.node(id, kind === 'fork' || kind === 'join' ? { shape: 'bar', label: '' } : kind === 'choice' ? { shape: 'diamond', label: '' } : m[1] ? { label: mText(m[1]) } : {}, cur())\n continue\n }\n if ((m = /^state\\s+\"([^\"]+)\"\\s+as\\s+([\\w.-]+)\\s*\\{$/.exec(l))) {\n b.cluster(m[2], mText(m[1]), cur())\n scope.push(m[2])\n continue\n }\n if (l === '}') {\n scope.pop()\n continue\n }\n if ((m = /^note\\s+(left of|right of|over)\\s+([\\w.-]+)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const target = m[2]\n if (m[3] !== undefined) {\n const id = `__note${notes++}`\n b.node(id, { label: mText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: target, to: id, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteFor = { id: target }\n }\n continue\n }\n if ((m = /^classDef\\s+([\\w-]+)\\s+(.+)$/.exec(l))) {\n defs.set(m[1], cssStyle(m[2]))\n continue\n }\n if ((m = /^class\\s+([\\w,\\s-]+?)\\s+([\\w-]+)$/.exec(l))) {\n for (const id of m[1].split(',')) classes.set(id.trim(), [...(classes.get(id.trim()) ?? []), m[2]])\n continue\n }\n if ((m = /^(.+?)\\s*-->\\s*([^:]+?)\\s*(?::\\s*(.*))?$/.exec(l))) {\n const a = state(m[1], false)\n const z = state(m[2], true)\n b.edge({ from: a, to: z, head: 'arrow', label: m[3] ? mText(m[3]) : undefined })\n continue\n }\n if ((m = /^([\\w.-]+)\\s*:\\s*(.+)$/.exec(l))) {\n state(m[1], false)\n desc.set(m[1], [...(desc.get(m[1]) ?? []), mText(m[2])])\n continue\n }\n if ((m = /^([\\w.-]+)$/.exec(l))) state(m[1], false)\n }\n for (const n of b.g.nodes) {\n const d = desc.get(n.id)\n if (d && n.shape === 'round') n.sections = [{ rows: [[n.label]], bold: true, center: true }, { rows: d.map((x) => [x]) }]\n for (const c of classes.get(n.id) ?? []) n.style = merge(n.style, defs.get(c) ?? {})\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- ER diagram\n\nconst CARD: Record<string, Head> = dict({ '|o': 'zero-one', 'o|': 'zero-one', '||': 'one', '}o': 'zero-many', 'o{': 'zero-many', '}|': 'one-many', '|{': 'one-many' })\nconst CARD_WORDS: Record<string, Head> = dict({\n 'one or zero': 'zero-one', 'zero or one': 'zero-one', 'one or more': 'one-many', 'one or many': 'one-many', 'many(1)': 'one-many', '1+': 'one-many',\n 'zero or more': 'zero-many', 'zero or many': 'zero-many', 'many(0)': 'zero-many', '0+': 'zero-many', 'only one': 'one', '1': 'one',\n})\n\nfunction erDiagram(body: string[], title?: string) {\n const b = new GraphBuilder('TB', 'rect')\n const attrs = new Map<string, string[][]>()\n const labels = new Map<string, string>()\n let inEntity: string | null = null\n const entity = (raw: string) => {\n const m = /^([\\w-]+)(?:\\[\\s*\"?([^\"\\]]*)\"?\\s*\\])?$/.exec(raw.trim().replace(/^\"(.*)\"$/, '$1'))\n const id = m ? m[1] : raw.trim().replace(/^\"(.*)\"$/, '$1')\n if (m?.[2]) labels.set(id, m[2])\n b.node(id)\n if (!attrs.has(id)) attrs.set(id, [])\n return id\n }\n const words = Object.keys(CARD_WORDS)\n .sort((x, y) => y.length - x.length)\n .map((w) => w.replace(/[()+]/g, '\\\\$&'))\n .join('|')\n const symRe = /^(\\S+)\\s+(\\|o|\\|\\||\\}o|\\}\\|)(--|\\.\\.)(o\\||\\|\\||o\\{|\\|\\{)\\s+(\\S+)\\s*:\\s*(.*)$/\n const wordRe = new RegExp(`^(\\\\S+)\\\\s+(${words})\\\\s+(to|optionally to)\\\\s+(${words})\\\\s+(\\\\S+)\\\\s*:\\\\s*(.*)$`, 'i')\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n if (inEntity) {\n if (l === '}') {\n inEntity = null\n continue\n }\n const m = /^(\\S+)\\s+(\\S+)((?:\\s+(?:PK|FK|UK)\\s*,?)*)\\s*(?:\"(.*)\")?$/.exec(l)\n if (m) attrs.get(inEntity)!.push([m[1].replace(/~([^~]*)~/g, '<$1>'), m[2], m[3].replace(/\\s+/g, ' ').trim(), m[4] ?? ''])\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^direction\\s+(\\w+)$/.exec(l))) {\n b.g.dir = DIRS[m[1].toUpperCase()] ?? 'TB'\n continue\n }\n if ((m = /^(.+?)\\s*\\{$/.exec(l))) {\n inEntity = entity(m[1])\n continue\n }\n if ((m = symRe.exec(l))) {\n const a = entity(m[1])\n const z = entity(m[5])\n b.edge({ from: a, to: z, tail: CARD[m[2]], head: CARD[m[4]], line: m[3] === '..' ? 'dashed' : 'solid', label: mText(m[6]) || undefined })\n continue\n }\n if ((m = wordRe.exec(l))) {\n const a = entity(m[1])\n const z = entity(m[5])\n b.edge({ from: a, to: z, tail: CARD_WORDS[m[2].toLowerCase()], head: CARD_WORDS[m[4].toLowerCase()], line: m[3].toLowerCase() === 'to' ? 'solid' : 'dashed', label: mText(m[6]) || undefined })\n continue\n }\n if ((m = /^([\\w-]+(?:\\[[^\\]]*\\])?)$/.exec(l))) entity(m[1])\n }\n for (const n of b.g.nodes) {\n const rows = attrs.get(n.id) ?? []\n const shown = rows.map((r) => r.filter((c, k) => k < 2 || c))\n n.sections = [{ rows: [[labels.get(n.id) ?? n.id]], bold: true, center: true }]\n if (rows.length) n.sections.push({ rows: shown })\n }\n b.g.title = title\n return b.g\n}\n\n// ---------------------------------------------------------------- pie\n\nfunction pie(head: string, body: string[], title?: string) {\n const showData = /\\bshowData\\b/.test(head)\n let t = /\\btitle\\s+(.+)$/.exec(head)?.[1] ?? title\n const slices: { label: string; value: number }[] = []\n for (const raw of body) {\n const l = raw.trim()\n let m: RegExpExecArray | null\n if ((m = /^title\\s+(.+)$/.exec(l))) t = m[1]\n else if ((m = /^\"([^\"]*)\"\\s*:\\s*([-\\d.eE+]+)$/.exec(l))) slices.push({ label: mText(m[1]), value: Number(m[2]) })\n }\n return { title: t ? mText(t) : undefined, showData, slices }\n}\n\n// ---------------------------------------------------------------- gantt\n\nconst UNIT: Record<string, number> = dict({ ms: 1, s: 1e3, m: 60e3, h: 3600e3, d: 864e5, w: 7 * 864e5, M: 30 * 864e5, y: 365 * 864e5 })\n\n/** a date in `fmt` (dayjs-style tokens), UTC */\nexport function parseDate(s: string, fmt: string): number | undefined {\n s = s.trim()\n if (fmt === 'X') return Number(s) * 1000\n if (fmt === 'x') return Number(s)\n const order: string[] = []\n const re = fmt.replace(/YYYY|YY|MM|M|DD|D|HH|H|mm|ss|SSS|[.*+?^${}()|[\\]\\\\]/g, (t) => {\n if (/^[.*+?^${}()|[\\]\\\\]$/.test(t)) return '\\\\' + t\n order.push(t)\n return t === 'YYYY' ? '(\\\\d{4})' : t === 'SSS' ? '(\\\\d{3})' : t.length === 1 ? '(\\\\d{1,2})' : '(\\\\d{2})'\n })\n const m = new RegExp(`^${re}$`).exec(s)\n if (!m) {\n const t = Date.parse(s.length === 10 ? s + 'T00:00:00Z' : s)\n return Number.isFinite(t) ? t : undefined\n }\n const v: Record<string, number> = {}\n order.forEach((t, k) => (v[t[0]] = Number(m[k + 1])))\n const year = v.Y !== undefined ? (order.includes('YY') ? 2000 + v.Y : v.Y) : 1970\n return Date.UTC(year, (v.M ?? 1) - 1, v.D ?? 1, v.H ?? 0, v.m ?? 0, v.s ?? 0, v.S ?? 0)\n}\n\nfunction gantt(body: string[], title?: string) {\n let fmt = 'YYYY-MM-DD'\n let t = title\n const sections: { name: string; tasks: GanttTask[] }[] = []\n const byId = new Map<string, GanttTask>()\n let last: GanttTask | undefined\n const today = (() => {\n const d = new Date()\n return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())\n })()\n for (const raw of body) {\n const l = raw.trim()\n if (!l) continue\n let m: RegExpExecArray | null\n if ((m = /^dateFormat\\s+(.+)$/.exec(l))) fmt = m[1].trim()\n else if ((m = /^title\\s+(.+)$/.exec(l))) t = m[1]\n else if (/^(axisFormat|tickInterval|excludes|includes|todayMarker|weekday|inclusiveEndDates|topAxis|displayMode)\\b/.test(l)) continue\n else if ((m = /^section\\s+(.*)$/.exec(l))) sections.push({ name: mText(m[1]), tasks: [] })\n else if ((m = /^(.+?)\\s*:\\s*(.+)$/.exec(l))) {\n const name = mText(m[1])\n const parts = m[2].split(',').map((x) => x.trim()).filter(Boolean)\n const task: GanttTask = { name, start: 0, end: 0 }\n while (parts.length && /^(done|active|crit|milestone)$/.test(parts[0])) {\n const tag = parts.shift() as 'done' | 'active' | 'crit' | 'milestone'\n task[tag] = true\n }\n let id: string | undefined\n if (parts.length >= 3) id = parts.shift()\n let startRaw: string | undefined\n let endRaw: string | undefined\n if (parts.length >= 2) [startRaw, endRaw] = parts\n else endRaw = parts[0]\n // \"id, duration\": an id is a word that is not a duration, a date or a dependency\n const startAt = (s: string | undefined): number => {\n if (!s) return last ? last.end : today\n const after = /^after\\s+(.+)$/.exec(s)\n if (after) {\n const ends = after[1].split(/\\s+/).map((x) => byId.get(x)?.end).filter((x): x is number => x !== undefined)\n return ends.length ? Math.max(...ends) : last ? last.end : today\n }\n return parseDate(s, fmt) ?? (last ? last.end : today)\n }\n if (parts.length === 2 && !/^after\\s/.test(startRaw!) && parseDate(startRaw!, fmt) === undefined && !/^\\d/.test(startRaw!)) {\n id = startRaw\n startRaw = undefined\n }\n task.start = startAt(startRaw)\n const dur = endRaw && /^([\\d.]+)\\s*(ms|s|m|h|d|w|M|y)$/.exec(endRaw)\n const until = endRaw && /^until\\s+(.+)$/.exec(endRaw)\n if (dur) task.end = task.start + Number(dur[1]) * UNIT[dur[2]]\n else if (until) task.end = byId.get(until[1].trim())?.start ?? task.start\n else if (endRaw) task.end = parseDate(endRaw, fmt) ?? task.start + 864e5\n else task.end = task.start + 864e5\n if (task.milestone) task.end = task.start\n if (id) byId.set(id, task)\n if (!sections.length) sections.push({ name: '', tasks: [] })\n sections[sections.length - 1].tasks.push(task)\n last = task\n }\n }\n return { title: t ? mText(t) : undefined, sections }\n}\n\n// ---------------------------------------------------------------- mindmap\n\nconst TREE_SHAPES: [RegExp, TreeNode['shape']][] = [\n [/^[\\w-]*\\(\\((.*)\\)\\)$/, 'circle'],\n [/^[\\w-]*\\)\\)(.*)\\(\\($/, 'cloud'],\n [/^[\\w-]*\\)(.*)\\($/, 'cloud'],\n [/^[\\w-]*\\{\\{(.*)\\}\\}$/, 'hexagon'],\n [/^[\\w-]*\\[(.*)\\]$/, 'rect'],\n [/^[\\w-]*\\((.*)\\)$/, 'round'],\n]\n\nfunction mindmap(body: string[]): TreeNode {\n const stack: { indent: number; n: TreeNode }[] = []\n let root: TreeNode | undefined\n for (const raw of body) {\n if (!raw.trim()) continue\n const text = raw.trim().replace(/:::[\\w\\s-]+$/, '').trim()\n if (/^::icon\\(/.test(text) || !text) continue\n const indent = raw.replace(/\\t/g, ' ').search(/\\S/)\n let label = text\n let shape: TreeNode['shape'] = undefined\n for (const [re, sh] of TREE_SHAPES) {\n const m = re.exec(text)\n if (m) {\n label = m[1]\n shape = sh\n break\n }\n }\n const node: TreeNode = { label: mText(label), shape, children: [] }\n if (!root) {\n root = node\n stack.push({ indent, n: node })\n continue\n }\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) stack.pop()\n stack[stack.length - 1].n.children.push(node)\n stack.push({ indent, n: node })\n }\n if (!root) throw new DiagramError('The mind map is empty')\n return root\n}\n","/**\n * PlantUML: sequence, class / object, use case, component / deployment, state and activity diagrams, mind maps and\n * work breakdown structures; @startdot hands over to the Graphviz reader. A file may hold several diagrams.\n * https://plantuml.com\n */\nimport type { TreeNode } from './charts'\nimport { parseDot } from './dot'\nimport { GraphBuilder, type GEdge, type Head, type Rendered, type Section, type Shape } from './graph'\nimport { renderModel, type Model } from './model'\nimport { SequenceBuilder, type MsgHead, type PKind } from './sequence'\nimport { color, DiagramError, labelText } from './svg'\nimport { dict } from '../dict'\n\n/** the diagrams of a file: the text of each @startX … @endX block (the whole text when there is none) */\nexport function plantUmlBlocks(src: string): { kind: string; lines: string[] }[] {\n const text = src.replace(/^/, '').replace(/\\r\\n?/g, '\\n')\n const out: { kind: string; lines: string[] }[] = []\n const re = /^[ \\t]*@start(\\w+)[^\\n]*\\n([\\s\\S]*?)^[ \\t]*@end\\1\\b/gm\n let m: RegExpExecArray | null\n while ((m = re.exec(text))) out.push({ kind: m[1].toLowerCase(), lines: m[2].split('\\n') })\n if (!out.length) out.push({ kind: 'uml', lines: text.split('\\n') })\n return out\n}\n\nexport function parsePlantUml(src: string): Model[] {\n return plantUmlBlocks(src).map(({ kind, lines }) => parseBlock(kind, lines))\n}\n\nexport const renderPlantUml = (src: string): Rendered[] => parsePlantUml(src).map(renderModel)\n\nfunction parseBlock(kind: string, raw: string[]): Model {\n if (kind === 'dot') return { t: 'graph', graph: parseDot(raw.join('\\n'))[0] }\n const { lines, title, dir } = clean(raw)\n switch (kind) {\n case 'uml':\n break\n case 'mindmap':\n case 'wbs':\n return { t: 'tree', root: tree(lines, kind === 'wbs'), title }\n default:\n throw new DiagramError(`PlantUML @start${kind} diagrams are not supported yet`)\n }\n switch (umlKind(lines)) {\n case 'activity':\n return { t: 'graph', graph: { ...activity(lines), title } }\n case 'sequence':\n return { t: 'sequence', seq: { ...sequence(lines), title } }\n case 'state':\n return { t: 'graph', graph: { ...state(lines, dir), title } }\n default:\n return { t: 'graph', graph: { ...description(lines, dir), title } }\n }\n}\n\n/** creole / HTML markup out of a label */\nexport function pText(s: string): string {\n return labelText(\n s\n .trim()\n .replace(/^\"(.*)\"$/s, '$1')\n .replace(/\\*\\*(.+?)\\*\\*|\\/\\/(.+?)\\/\\/|\"\"(.+?)\"\"|__(.+?)__|~~(.+?)~~|--(.+?)--/g, (...m) => m.slice(1, 7).find((x) => x !== undefined) ?? '')\n .replace(/<\\/?(?:b|i|u|s|font|color|size|back|code|plain|strike|w|sub|sup)\\b[^>]*>/gi, '')\n .replace(/<&[\\w-]+>/g, '')\n .replace(/\\\\t/g, ' '),\n )\n}\n\n/** comments, skinparams, legends, headers out; the title and the direction */\nfunction clean(raw: string[]): { lines: string[]; title?: string; dir?: 'LR' | 'TB' } {\n const lines: string[] = []\n let title: string | undefined\n let dir: 'LR' | 'TB' | undefined\n let skip: RegExp | null = null\n let titleLines: string[] | null = null\n let inComment = false\n for (let l of raw) {\n if (inComment) {\n const e = l.indexOf(\"'/\")\n if (e < 0) continue\n l = l.slice(e + 2)\n inComment = false\n }\n l = l.replace(/\\/'.*?'\\//g, '')\n const c = l.indexOf(\"/'\")\n if (c >= 0) {\n l = l.slice(0, c)\n inComment = true\n }\n const t = l.trim()\n if (skip) {\n if (skip.test(t)) skip = null\n continue\n }\n if (titleLines) {\n if (/^end\\s*title$/i.test(t)) {\n title = pText(titleLines.join('\\n'))\n titleLines = null\n } else titleLines.push(t)\n continue\n }\n if (!t || t.startsWith(\"'\")) continue\n let m: RegExpExecArray | null\n if (/^skinparam\\b.*\\{$/i.test(t) || /^(legend|header|footer)\\b(?!.*:)/i.test(t) && !/^(header|footer)\\s+\\S/i.test(t)) {\n skip = /^(\\}|end\\s*legend|endlegend|end\\s*header|endheader|end\\s*footer|endfooter)$/i\n continue\n }\n if (/^(skinparam|!|hide|show|scale|caption|header|footer|newpage|allowmixing|autoactivate|set\\s+namespaceSeparator|page|mainframe|sprite|remove|restore|together|left\\s+header|right\\s+footer)\\b/i.test(t)) continue\n if ((m = /^title\\s*:?\\s*(.*)$/i.exec(t))) {\n if (m[1]) title = pText(m[1])\n else titleLines = []\n continue\n }\n if (/^left\\s+to\\s+right\\s+direction$/i.test(t)) {\n dir = 'LR'\n continue\n }\n if (/^top\\s+to\\s+bottom\\s+direction$/i.test(t)) {\n dir = 'TB'\n continue\n }\n lines.push(t)\n }\n return { lines, title, dir }\n}\n\nfunction umlKind(lines: string[]): 'activity' | 'sequence' | 'state' | 'description' {\n const has = (re: RegExp) => lines.some((l) => re.test(l))\n if (has(/^(start|stop)$/) || has(/^:[\\s\\S]*[;|<>/\\]}]$/) || has(/^:/) || has(/^(if\\s*\\(.*\\)\\s*then|while\\s*\\(|repeat\\b|fork$|endif$)/)) return 'activity'\n if (has(/\\[\\*\\]/) || has(/^state\\s/)) return 'state'\n if (has(/^(participant|boundary|control|collections|queue|autonumber|activate|deactivate|alt|loop|return|ref\\s+over)\\b/) || has(/^(==.*==|\\.\\.\\.|\\|\\|\\d*\\|\\|)$/)) return 'sequence'\n if (has(/^(abstract|class|interface|enum|annotation|struct|protocol|object|map|json|usecase|component|node|cloud|package|namespace|folder|frame|rectangle|artifact|storage|card|file|agent|person|hexagon|together)\\b/)) return 'description'\n if (has(/\\([^)]*\\)|\\[[^\\]*]+\\]|<\\|--|--\\|>|\\*--|o--|\\.\\.>/)) return 'description'\n if (has(/^(actor|database|entity)\\b/) || has(/^\\S+\\s*<?-{1,2}>?>?\\s*\\S+\\s*:/)) return 'sequence'\n return 'description'\n}\n\n// ---------------------------------------------------------------- sequence\n\nconst KIND: Record<string, PKind> = dict({ participant: 'participant', actor: 'actor', boundary: 'boundary', control: 'control', entity: 'entity', database: 'database', collections: 'collections', queue: 'queue' })\n\nfunction sequence(lines: string[]) {\n const b = new SequenceBuilder()\n const calls: { from: string; to: string }[] = []\n let noteLines: string[] | null = null\n let note: { pos: 'left' | 'right' | 'over'; who: string[] } | null = null\n let last: { from: string; to: string } | null = null\n const id = (s: string) => {\n const t = s.trim().replace(/^\"(.*)\"$/, '$1')\n return t\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*(note|ref|rnote|hnote)$/i.test(l)) {\n if (note && note.who.length) b.push({ t: 'note', pos: note.pos, who: note.who, text: pText(noteLines.join('\\n')) })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n let m: RegExpExecArray | null\n if ((m = /^(?:create\\s+)?(participant|actor|boundary|control|entity|database|collections|queue)\\s+(.+)$/.exec(l))) {\n let rest = m[2].replace(/\\s+order\\s+-?\\d+/, '').trim()\n const col = /\\s+(#\\w+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n rest = rest.replace(/<<[^>]*>>/g, '').trim()\n let pid = rest\n let label = rest\n const as1 = /^\"([^\"]+)\"\\s+as\\s+(\\S+)$/.exec(rest)\n const as2 = /^(\\S+)\\s+as\\s+\"?([^\"]+)\"?$/.exec(rest)\n if (as1) [pid, label] = [as1[2], as1[1]]\n else if (as2) [pid, label] = [as2[1], as2[2]]\n else pid = label = id(rest)\n b.participant(pid, { kind: KIND[m[1].toLowerCase()], label: pText(label), fill: col ? color(col[1].slice(1)) ?? color(col[1]) : undefined })\n continue\n }\n if (/^hide\\s+footbox$/i.test(l)) {\n b.s.footer = false\n continue\n }\n if (/^autonumber\\b/i.test(l)) {\n b.s.autonumber = !/\\bstop\\b/i.test(l)\n continue\n }\n if ((m = /^(activate|deactivate|destroy)\\s+(\\S+)/i.exec(l))) {\n const who = id(m[2])\n if (m[1].toLowerCase() === 'destroy') b.push({ t: 'destroy', who })\n else b.push({ t: 'act', who, on: m[1].toLowerCase() === 'activate' })\n continue\n }\n if ((m = /^return\\b\\s*(.*)$/i.exec(l))) {\n const c = calls.pop() ?? (last ? { from: last.from, to: last.to } : null)\n if (c) b.push({ t: 'msg', from: c.to, to: c.from, text: pText(m[1]), dashed: true, head: 'filled', deactivate: true })\n continue\n }\n if ((m = /^[rh]?note\\s+(left|right|over)(?:\\s+of)?\\s*([^:]*?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l)) || (m = /^ref\\s+over\\s+()([^:]+?)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const pos = (m[1] || 'over').toLowerCase() as 'left' | 'right' | 'over'\n let who = m[2] ? m[2].split(',').map(id).filter(Boolean) : []\n if (!who.length && last) who = [pos === 'left' ? last.from : last.to]\n if (!who.length && b.s.participants.length) who = [b.s.participants[0].id]\n if (m[3] !== undefined) {\n if (who.length) b.push({ t: 'note', pos, who, text: pText(m[3]) })\n } else {\n noteLines = []\n note = { pos, who }\n }\n continue\n }\n if ((m = /^note\\s+across\\s*:\\s*(.*)$/i.exec(l))) {\n const ps = b.s.participants\n if (ps.length) b.push({ t: 'note', pos: 'over', who: [ps[0].id, ps[ps.length - 1].id], text: pText(m[1]) })\n continue\n }\n if ((m = /^(alt|opt|loop|par|break|critical|group)\\b\\s*(.*)$/i.exec(l))) {\n const kind = m[1].toLowerCase()\n b.push({ t: 'block', kind: kind === 'group' ? pText(m[2]) || 'group' : kind, label: kind === 'group' ? '' : pText(m[2]) })\n continue\n }\n if ((m = /^else\\b\\s*(.*)$/i.exec(l))) {\n b.push({ t: 'else', label: pText(m[1]) })\n continue\n }\n if (/^end$/i.test(l)) {\n b.push({ t: 'end' })\n continue\n }\n if (/^(box\\b|end\\s*box)/i.test(l)) continue\n if ((m = /^==\\s*(.*?)\\s*==$/.exec(l))) {\n b.push({ t: 'divider', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\.\\.\\.\\s*(.*?)\\s*(?:\\.\\.\\.)?$/.exec(l))) {\n b.push({ t: 'delay', text: pText(m[1]) })\n continue\n }\n if ((m = /^\\|\\|(\\d*)\\|\\|$/.exec(l)) || l === '|||') {\n b.push({ t: 'space', h: m?.[1] ? Math.min(400, Number(m[1])) : 20 })\n continue\n }\n const msg = seqMessage(l)\n if (msg) {\n const { from, to, dashed, head, both, act, text } = msg\n b.push({ t: 'msg', from, to, text, dashed, head, both, activate: act === '++', deactivate: act === '--' })\n last = { from, to }\n if (act === '++') calls.push({ from, to })\n if (act === '--' && calls.length) calls.pop()\n if (act === '**') b.participant(to)\n if (act === '!!') b.push({ t: 'destroy', who: to })\n }\n }\n return b.s\n}\n\nconst ARROW = /^(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(<<?|[\\\\/]{1,2})?(-{1,2}|\\.{1,2})(?:\\[[^\\]]*\\])?(-?)(>>?|[\\\\/]{1,2})?\\s*([ox])?\\s*(\\[|\\]|[\\w.$À-]+|\"[^\"]+\")?\\s*(\\+\\+|--|\\*\\*|!!)?\\s*(?::\\s*(.*))?$/u\n\nfunction seqMessage(l: string) {\n // \"o->\", \"x<-\": lost / found markers before the arrow\n const m = ARROW.exec(l.replace(/^(\\S+)\\s*([ox])(?=<|-)/, '$1 '))\n if (!m) return null\n const [, a, left, line, , right, , z, act, text] = m\n if (!left && !right) return null\n if (!a || !z) return null\n const clean = (s: string) => s.replace(/^\"(.*)\"$/, '$1')\n let from = clean(a)\n let to = clean(z)\n if (from === '[' || from === ']' || to === '[' || to === ']') return null\n const dashed = line === '--' || line.startsWith('.')\n const headOf = (s: string | undefined): MsgHead => (!s ? 'none' : s === '>>' || s === '<<' ? 'open' : s.length && /[\\\\/]/.test(s) ? 'half' : 'filled')\n let head: MsgHead\n let both = false\n if (left && right) {\n head = headOf(right)\n both = true\n } else if (left) {\n ;[from, to] = [to, from]\n head = headOf(left)\n } else head = headOf(right)\n if (/x\\s*$/.test(l.split(':')[0].replace(z, '').trim()) && !left) head = 'cross'\n return { from, to, dashed, head, both, act, text: pText(text ?? '') }\n}\n\n// ---------------------------------------------------------------- class, use case, component… (description diagrams)\n\nconst ELEMENT: Record<string, Shape> = dict({\n actor: 'actor', person: 'actor', usecase: 'ellipse', component: 'component', node: 'box3d', database: 'cylinder', cloud: 'cloud', folder: 'folder', frame: 'folder',\n package: 'folder', artifact: 'note', file: 'note', storage: 'stadium', queue: 'stadium', stack: 'rect', card: 'rect', rectangle: 'rect', agent: 'rect', label: 'none',\n boundary: 'circle', control: 'circle', entity: 'rect', collections: 'rect', hexagon: 'hexagon', interface: 'rect', circle: 'circle', port: 'point', portin: 'point', portout: 'point',\n action: 'rect', process: 'round', usecase_: 'ellipse', object: 'rect', map: 'rect', json: 'rect', diamond: 'diamond', state: 'round',\n})\nconst CLASSES = new Set(['class', 'abstract', 'abstract class', 'interface', 'enum', 'annotation', 'struct', 'protocol', 'entity', 'exception', 'metaclass', 'stereotype', 'object', 'map', 'json'])\n\nconst MARKS: Record<string, Head> = dict({\n '>': 'arrow', '<': 'arrow', '|>': 'triangle', '<|': 'triangle', '^': 'triangle', '*': 'diamond', o: 'odiamond', '#': 'odiamond', x: 'cross', '+': 'ocircle',\n '{': 'many', '}': 'many', '>>': 'open', '<<': 'open', '|o': 'zero-one', 'o|': 'zero-one', '||': 'one', '}o': 'zero-many', 'o{': 'zero-many', '}|': 'one-many', '|{': 'one-many',\n})\n\nconst END = String.raw`\\[\\*\\]|\\[[^\\]]+\\]|\\([^)]*\\)|:[^:]+:|\"[^\"]+\"|\\(\\)\\s*\"[^\"]+\"|\\(\\)\\s*[\\w.]+|[\\w.$À--]+`\nconst LINK = new RegExp(\n String.raw`^(${END})\\s*(?:\"([^\"]*)\"\\s*)?((?:<\\||<<|\\}o|\\}\\||\\|o|\\|\\||[<*o#x+^}])?)([-.=~]+)(?:\\[([^\\]]*)\\])?((?:up|down|left|right|u|d|l|r|le|ri|do)?)([-.=~]*)(?:\\[([^\\]]*)\\])?((?:\\|>|>>|o\\{|\\|\\{|o\\||\\|\\||[>*#+^{]|[ox](?=\\s|\\[|\\(|\"|:|$))?)\\s*(?:\"([^\"]*)\"\\s*)?(${END})\\s*(?::\\s*(.*))?$`,\n 'u',\n)\n\ninterface ClassInfo {\n kind: string\n stereo?: string\n sections: string[][]\n}\n\nfunction description(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'rect')\n const info = new Map<string, ClassInfo>()\n const ns: string[] = []\n const stackKinds: string[] = []\n let body: { id: string; c: ClassInfo } | null = null\n let noteLines: string[] | null = null\n let noteTarget: string | undefined\n let noteId = ''\n let notes = 0\n let anon = 0\n const cur = () => ns[ns.length - 1]\n /** an element written in a link or a declaration: its id (created when new) */\n const element = (raw: string): string => {\n let t = raw.trim()\n let m: RegExpExecArray | null\n if (t === '(*)') return 'start'\n if ((m = /^\\[(.+)\\]$/.exec(t))) return ensure(m[1], 'component')\n if ((m = /^\\((.*)\\)$/.exec(t))) return ensure(m[1], 'ellipse')\n if ((m = /^:(.+):$/.exec(t))) return ensure(m[1], 'actor')\n if ((m = /^\\(\\)\\s*\"?([^\"]+)\"?$/.exec(t))) return ensure(m[1], 'circle')\n t = t.replace(/^\"(.*)\"$/, '$1')\n if (!b.has(t) && !b.isCluster(t)) b.node(t, { label: pText(t) }, cur())\n return t\n }\n const ensure = (name: string, shape: Shape) => {\n const id = name.trim()\n if (!b.has(id) && !b.isCluster(id)) b.node(id, { label: pText(id), shape }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n b.node(noteId, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteTarget) b.edge({ from: noteTarget, to: noteId, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (body) {\n if (l === '}') {\n body = null\n continue\n }\n if (/^(--|==|\\.\\.|__)(.*?)(--|==|\\.\\.|__)?$/.test(l)) body.c.sections.push([])\n else body.c.sections[body.c.sections.length - 1].push(pText(l.replace(/\\{(static|abstract|classifier|field|method)\\}\\s*/g, '')))\n continue\n }\n let m: RegExpExecArray | null\n if (l === '}' || /^end\\s*(package|namespace|rectangle|node|folder|frame|together)$/i.test(l)) {\n ns.pop()\n stackKinds.pop()\n continue\n }\n // note\n if ((m = /^note\\s+(left|right|top|bottom)(?:\\s+of)?\\s+(\\S+?)\\s*(?:#\\w+)?\\s*(?::\\s*(.*))?$/i.exec(l))) {\n const target = element(m[2])\n const nid = `__note${notes++}`\n if (m[3] !== undefined) {\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: target, to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteTarget = target\n noteId = nid\n }\n continue\n }\n if ((m = /^note\\s+\"([^\"]*)\"\\s+as\\s+(\\S+)$/i.exec(l))) {\n b.node(m[2], { label: pText(m[1]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n continue\n }\n if ((m = /^note\\s+as\\s+(\\S+)$/i.exec(l))) {\n noteLines = []\n noteTarget = undefined\n noteId = m[1]\n continue\n }\n // container: package \"Name\" { / rectangle System {\n if ((m = /^(package|namespace|rectangle|node|folder|frame|cloud|database|component|card|storage|artifact|file|stack|queue|agent|hexagon|together)\\s*(?:\"([^\"]*)\"|([^\\s{<#]+))?\\s*(?:as\\s+(\\S+))?\\s*(<<[^>]*>>)?\\s*(#\\S+)?\\s*\\{$/.exec(l))) {\n const kind = m[1].toLowerCase()\n const label = m[2] ?? m[3] ?? ''\n const cid = m[4] ?? (m[3] || m[2] || `__group${anon++}`)\n const c = b.cluster(cid, kind === 'together' ? '' : pText(label), cur())\n const fill = m[6] ? color(m[6].slice(1)) ?? color(m[6]) : undefined\n if (fill) c.style = { fill }\n if (kind === 'together') c.style = { fill: 'none', stroke: 'none' }\n ns.push(cid)\n stackKinds.push(kind)\n continue\n }\n // class-like declaration\n if ((m = /^(abstract\\s+class|abstract|class|interface|enum|annotation|struct|protocol|entity|exception|metaclass|stereotype|object|map|json)\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+)|(\\S+)\\s+as\\s+\"([^\"]+)\"|([^\\s{<#]+))(?:\\s*<([^>]+)>)?\\s*(<<.+?>>)?\\s*(#\\S+)?\\s*(\\{)?\\s*(\\})?$/.exec(l)) && CLASSES.has(m[1].toLowerCase().replace(/\\s+/, ' '))) {\n const kind = m[1].toLowerCase().replace(/\\s+/, ' ')\n const cid = m[3] ?? m[4] ?? m[6]\n const label = m[2] ?? m[5] ?? cid\n const generic = m[7] ? `<${m[7]}>` : ''\n b.node(cid, { label: pText(label) + generic, shape: 'rect' }, cur())\n const c: ClassInfo = info.get(cid) ?? { kind, sections: [[], []] }\n c.kind = kind\n if (m[8]) c.stereo = m[8].replace(/^<<|>>$/g, '').trim()\n const fill = m[9] ? color(m[9].slice(1)) ?? color(m[9]) : undefined\n if (fill) b.node(cid).style = { fill }\n info.set(cid, c)\n if (m[10] && !m[11]) {\n c.sections = [[]]\n body = { id: cid, c }\n }\n continue\n }\n // element declaration\n if ((m = /^(actor\\/?|usecase\\/?|component|node|database|cloud|folder|frame|package|artifact|file|storage|queue|stack|card|rectangle|agent|label|boundary|control|entity|collections|hexagon|interface|circle|person|port|portin|portout|action|process|diamond)\\s+(.+)$/.exec(l))) {\n const kind = m[1].toLowerCase().replace('/', '')\n let rest = m[2].trim()\n const col = /\\s+(#[\\w]+)\\s*$/.exec(rest)\n if (col) rest = rest.slice(0, col.index).trim()\n const stereo = /\\s*<<(.+?)>>\\s*$/.exec(rest)\n if (stereo) rest = rest.slice(0, stereo.index).trim()\n let id = rest\n let label = rest\n const a1 = /^(.+?)\\s+as\\s+(.+)$/.exec(rest)\n if (a1) {\n const [x, y] = [a1[1].trim(), a1[2].trim()]\n // the quoted / bracketed side is the label\n if (/^[\"([:]/.test(x)) [label, id] = [x, y]\n else [id, label] = [x, y]\n }\n label = label.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3')\n id = id.replace(/^\\((.*)\\)$|^\\[(.*)\\]$|^:(.*):$/, '$1$2$3').replace(/^\"(.*)\"$/, '$1')\n const shape = kind === 'usecase' ? 'ellipse' : kind === 'actor' ? 'actor' : (ELEMENT[kind] ?? 'rect')\n const n = b.node(id, { label: pText(label) + (stereo ? `\\n«${stereo[1]}»` : ''), shape }, cur())\n const fill = col ? color(col[1].slice(1)) ?? color(col[1]) : undefined\n if (fill) n.style = { ...n.style, fill }\n continue\n }\n // shorthand elements alone on a line\n if ((m = /^(\\[[^\\]]+\\]|\\([^)]+\\)|:[^:]+:)(?:\\s+as\\s+(\\S+))?$/.exec(l))) {\n const id = element(m[1])\n if (m[2]) {\n const n = b.get(id)!\n b.node(m[2], { label: n.label, shape: n.shape }, cur())\n b.g.nodes.splice(b.g.nodes.indexOf(n), 1)\n }\n continue\n }\n if ((m = LINK.exec(l))) {\n const [, ra, la, lm, l1, , dirWord, l2, , rm, lb, rz, label] = m\n let a = element(ra)\n let z = element(rz)\n const line = l1 + l2\n let tail = lm ? MARKS[lm] ?? 'none' : 'none'\n let head = rm ? MARKS[rm] ?? 'none' : 'none'\n let tl = la\n let hl = lb\n // \"up\" / \"left\": laid out the other way round\n if (/^(up|u|left|l|le)$/i.test(dirWord)) {\n ;[a, z] = [z, a]\n ;[tail, head] = [head, tail]\n ;[tl, hl] = [hl, tl]\n }\n const e: GEdge = { from: a, to: z, head, tail, line: line.includes('.') ? 'dashed' : line.includes('=') ? 'thick' : line.includes('~') ? 'dotted' : 'solid' }\n if (label) e.label = pText(label.replace(/\\s*[<>]\\s*$|^\\s*[<>]\\s*/g, ''))\n if (tl) e.tailLabel = tl\n if (hl) e.headLabel = hl\n b.edge(e)\n continue\n }\n // Class : member\n if ((m = /^([\\w.$]+)\\s*:\\s*(.+)$/.exec(l)) && (info.has(m[1]) || b.has(m[1]))) {\n const c = info.get(m[1]) ?? { kind: 'class', sections: [[], []] }\n info.set(m[1], c)\n const mem = pText(m[2])\n if (mem.includes('(') && c.sections.length > 1) c.sections[1].push(mem)\n else c.sections[0].push(mem)\n continue\n }\n }\n // start / end of old-style activity links\n const start = b.get('start')\n if (start && start.label === 'start' && b.g.edges.some((e) => e.from === 'start' || e.to === 'start')) {\n start.shape = 'start'\n start.label = ''\n const ins = b.g.edges.filter((e) => e.to === 'start')\n if (ins.length) {\n b.node('__end', { shape: 'end', label: '' })\n for (const e of ins) e.to = '__end'\n }\n }\n for (const n of b.g.nodes) {\n const c = info.get(n.id)\n if (!c) continue\n const header: string[][] = []\n const stereo = c.stereo ?? (c.kind === 'interface' ? 'interface' : c.kind === 'enum' ? 'enumeration' : c.kind === 'annotation' ? 'annotation' : c.kind === 'abstract' || c.kind === 'abstract class' ? 'abstract' : undefined)\n if (stereo) header.push([`«${stereo}»`])\n header.push([n.label])\n const sections: Section[] = [{ rows: header, bold: true, center: true, italic: c.kind.startsWith('abstract') }]\n for (const s of c.sections) sections.push({ rows: s.map((x) => [x]) })\n n.sections = sections\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- state\n\nfunction state(lines: string[], dir?: 'LR' | 'TB') {\n const b = new GraphBuilder(dir ?? 'TB', 'round')\n const scope: string[] = []\n const desc = new Map<string, string[]>()\n let notes = 0\n let noteLines: string[] | null = null\n let noteFor: string | undefined\n const cur = () => scope[scope.length - 1]\n const st = (raw: string, asTarget: boolean): string => {\n const id = raw.trim().replace(/^\"(.*)\"$/, '$1')\n if (id === '[*]') {\n const sid = `${cur() ?? ''}__${asTarget ? 'end' : 'start'}`\n b.node(sid, { label: '', shape: asTarget ? 'end' : 'start' }, cur())\n return sid\n }\n if (!b.isCluster(id) && !b.has(id)) b.node(id, { label: id }, cur())\n return id\n }\n for (const l of lines) {\n if (noteLines) {\n if (/^end\\s*note$/i.test(l)) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(noteLines.join('\\n')), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n if (noteFor) b.edge({ from: noteFor, to: nid, line: 'dashed', head: 'none' })\n noteLines = null\n } else noteLines.push(l)\n continue\n }\n if (l === '--' || l === '||') continue\n let m: RegExpExecArray | null\n if ((m = /^state\\s+(?:\"([^\"]+)\"\\s+as\\s+(\\S+?)|(\\S+?)\\s+as\\s+\"([^\"]+)\"|(\"[^\"]+\"|[^\\s{<#]+))\\s*(<<(\\w+)>>)?\\s*(#\\S+)?\\s*(\\{)?$/i.exec(l))) {\n const id = (m[2] ?? m[3] ?? m[5]).replace(/^\"(.*)\"$/, '$1')\n const label = m[1] ?? m[4] ?? id\n const kind = m[7]?.toLowerCase()\n if (m[9]) {\n b.cluster(id, pText(label), cur())\n scope.push(id)\n continue\n }\n const shape: Shape | undefined =\n kind === 'fork' || kind === 'join' ? 'bar' : kind === 'choice' ? 'diamond' : kind === 'start' || kind === 'entrypoint' ? 'start' : kind === 'end' || kind === 'exitpoint' ? 'end' : undefined\n b.node(id, { label: shape ? '' : pText(label), shape }, cur())\n const fill = m[8] ? color(m[8].slice(1)) ?? color(m[8]) : undefined\n if (fill) b.node(id).style = { fill }\n continue\n }\n if (l === '}') {\n scope.pop()\n continue\n }\n if ((m = /^note\\s+(left|right|top|bottom)\\s+of\\s+(\\S+)\\s*(?::\\s*(.*))?$/i.exec(l))) {\n if (m[3] !== undefined) {\n const nid = `__note${notes++}`\n b.node(nid, { label: pText(m[3]), shape: 'note', style: { fill: '#fff6c8', stroke: '#c9a227' } }, cur())\n b.edge({ from: st(m[2], false), to: nid, line: 'dashed', head: 'none' })\n } else {\n noteLines = []\n noteFor = st(m[2], false)\n }\n continue\n }\n if ((m = /^(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(-+|\\.+)(?:\\[[^\\]]*\\])?((?:up|down|left|right|u|d|l|r)?)(-*|\\.*)(?:\\[[^\\]]*\\])?>\\s*(\\[\\*\\]|\"[^\"]+\"|[\\w.$À-]+)\\s*(?::\\s*(.*))?$/u.exec(l))) {\n let a = st(m[1], false)\n let z = st(m[5], true)\n let rev = false\n if (/^(up|u|left|l)$/i.test(m[3])) {\n ;[a, z] = [z, a]\n rev = true\n }\n b.edge({ from: a, to: z, head: rev ? 'none' : 'arrow', tail: rev ? 'arrow' : 'none', line: m[2].includes('.') ? 'dashed' : 'solid', label: m[6] ? pText(m[6]) : undefined })\n continue\n }\n if ((m = /^([\\w.$À-]+)\\s*:\\s*(.+)$/u.exec(l))) {\n st(m[1], false)\n desc.set(m[1], [...(desc.get(m[1]) ?? []), pText(m[2])])\n }\n }\n for (const n of b.g.nodes) {\n const d = desc.get(n.id)\n if (d && n.shape === 'round') n.sections = [{ rows: [[n.label]], bold: true, center: true }, { rows: d.map((x) => [x]) }]\n }\n return b.g\n}\n\n// ---------------------------------------------------------------- activity (new syntax)\n\ninterface Exit {\n from: string\n label?: string\n}\n\nfunction activity(raw: string[]) {\n const b = new GraphBuilder('TB', 'round')\n // join multi-line actions \":…;\"\n const lines: string[] = []\n for (let k = 0; k < raw.length; k++) {\n let l = raw[k]\n if (/^:/.test(l) && !/[;|<>/\\]}]$/.test(l)) {\n while (k + 1 < raw.length && !/[;|<>/\\]}]$/.test(l)) l += '\\n' + raw[++k]\n }\n lines.push(l)\n }\n let i = 0\n let n = 0\n const scope: string[] = []\n const node = (shape: Shape, label = '') => {\n const id = `a${n++}`\n b.node(id, { shape, label }, scope[scope.length - 1])\n return id\n }\n let pendingLabel: string | undefined\n const link = (exits: Exit[], to: string) => {\n for (const e of exits) b.edge({ from: e.from, to, head: 'arrow', label: e.label })\n }\n const cond = (s: string) => pText(s.replace(/^\\((.*)\\)$/, '$1'))\n /** statements until a line matching `stop` (left unread); returns the open ends */\n const block = (start: Exit[], stop: RegExp): Exit[] => {\n let cur = start\n const put = (id: string) => {\n if (pendingLabel !== undefined) cur = cur.map((e) => ({ ...e, label: e.label ?? pendingLabel }))\n pendingLabel = undefined\n link(cur, id)\n }\n while (i < lines.length) {\n const l = lines[i]\n if (stop.test(l)) return cur\n i++\n let m: RegExpExecArray | null\n if (/^start$/i.test(l)) {\n const id = node('start')\n put(id)\n cur = [{ from: id }]\n } else if (/^(stop|end)$/i.test(l)) {\n const id = node('end')\n put(id)\n cur = []\n } else if (/^(kill|detach|break)$/i.test(l)) cur = []\n else if ((m = /^:([\\s\\S]*?)[;|<>/\\]}]$/.exec(l))) {\n const id = node('round', pText(m[1]))\n put(id)\n cur = [{ from: id }]\n } else if ((m = /^->\\s*(.*?);?$/.exec(l))) pendingLabel = pText(m[1]) || undefined\n else if ((m = /^if\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?\\s*$/i.exec(l)) || (m = /^if\\s*(\\(.*\\))\\s*(?:is\\s*\\((.*)\\))?\\s*then\\s*$/i.exec(l))) {\n let d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = block([{ from: d, label: m[2] ? pText(m[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i)\n let open = true\n while (i < lines.length) {\n const t = lines[i++]\n let e: RegExpExecArray | null\n if ((e = /^(?:elseif|else\\s*if)\\s*(\\(.*?\\))\\s*(?:then\\s*(?:\\((.*)\\))?)?$/i.exec(t))) {\n const d2 = node('diamond', cond(e[1]))\n b.edge({ from: d, to: d2, head: 'arrow' })\n d = d2\n out = out.concat(block([{ from: d2, label: e[2] ? pText(e[2]) : undefined }], /^(elseif|else\\s*if|else|endif|end\\s*if)\\b/i))\n } else if ((e = /^else\\s*(?:\\((.*)\\))?$/i.exec(t))) {\n out = out.concat(block([{ from: d, label: e[1] ? pText(e[1]) : undefined }], /^(endif|end\\s*if)\\b/i))\n open = false\n } else break\n }\n if (open) out.push({ from: d })\n cur = out\n } else if ((m = /^switch\\s*(\\(.*\\))$/i.exec(l))) {\n const d = node('diamond', cond(m[1]))\n put(d)\n let out: Exit[] = []\n while (i < lines.length) {\n const t = lines[i++]\n const e = /^case\\s*(\\(.*\\))$/i.exec(t)\n if (!e) break\n out = out.concat(block([{ from: d, label: cond(e[1]) }], /^(case\\s*\\(|endswitch)/i))\n }\n cur = out\n } else if ((m = /^while\\s*(\\(.*?\\))\\s*(?:is\\s*\\((.*)\\))?$/i.exec(l))) {\n const w = node('diamond', cond(m[1]))\n put(w)\n const body = block([{ from: w, label: m[2] ? pText(m[2]) : undefined }], /^(endwhile|end\\s*while)\\b/i)\n link(body, w)\n const e = /^(?:endwhile|end\\s*while)\\s*(?:\\((.*)\\))?$/i.exec(lines[i++] ?? '')\n cur = [{ from: w, label: e?.[1] ? pText(e[1]) : undefined }]\n } else if ((m = /^repeat\\s*(?::([\\s\\S]*?)[;|<>/\\]}])?$/i.exec(l)) && !/^repeat\\s*while/i.test(l)) {\n const r = m[1] !== undefined ? node('round', pText(m[1])) : node('diamond', '')\n put(r)\n const body = block([{ from: r }], /^(repeat\\s*while|backward)/i)\n let back: string | undefined\n let bm: RegExpExecArray | null\n if ((bm = /^backward\\s*:([\\s\\S]*?)[;|<>/\\]}]$/i.exec(lines[i] ?? ''))) {\n back = node('round', pText(bm[1]))\n i++\n }\n const e = /^repeat\\s*while\\s*(\\(.*?\\))?\\s*(?:is\\s*\\((.*?)\\))?\\s*(?:not\\s*\\((.*?)\\))?$/i.exec(lines[i++] ?? '')\n const d = node('diamond', e?.[1] ? cond(e[1]) : '')\n link(body, d)\n if (back) {\n b.edge({ from: d, to: back, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n b.edge({ from: back, to: r, head: 'arrow' })\n } else b.edge({ from: d, to: r, head: 'arrow', label: e?.[2] ? pText(e[2]) : undefined })\n cur = [{ from: d, label: e?.[3] ? pText(e[3]) : undefined }]\n } else if (/^(fork|split)$/i.test(l)) {\n const fork = /^fork$/i.test(l)\n let f: string | undefined\n let starts = cur\n if (fork) {\n f = node('bar')\n put(f)\n starts = [{ from: f }]\n } else if (pendingLabel !== undefined) pendingLabel = undefined\n let out: Exit[] = []\n for (;;) {\n out = out.concat(block(starts, /^(fork\\s+again|split\\s+again|end\\s*fork|end\\s*merge|end\\s*split)\\b/i))\n const t = lines[i++] ?? ''\n if (!/again/i.test(t)) break\n }\n if (fork) {\n const j = node('bar')\n link(out, j)\n cur = [{ from: j }]\n } else cur = out\n } else if ((m = /^(?:partition|group|package|rectangle|card)\\s+(?:\"([^\"]*)\"|(\\S[^{]*?))\\s*(?:#\\S+)?\\s*\\{?$/i.exec(l))) {\n const name = (m[1] ?? m[2]).trim()\n const cid = `__p${n++}`\n b.cluster(cid, pText(name), scope[scope.length - 1])\n scope.push(cid)\n } else if (l === '}' || /^end\\s*group$/i.test(l)) scope.pop()\n else if (/^[rh]?note\\b/i.test(l) || /^floating\\s+note\\b/i.test(l)) {\n if (!/:/.test(l)) while (i < lines.length && !/^end\\s*note$/i.test(lines[i++]));\n }\n // swimlanes, arrows styles, labels we do not draw\n }\n return cur\n }\n block([], /^\\u0000$/)\n return b.g\n}\n\n// ---------------------------------------------------------------- mind map / WBS\n\nfunction tree(lines: string[], wbs: boolean): TreeNode {\n const stack: { depth: number; n: TreeNode }[] = []\n let root: TreeNode | undefined\n for (let k = 0; k < lines.length; k++) {\n const l = lines[k]\n const m = /^([*+\\-#]+)(_)?\\s*(?:\\[#[\\w]+\\])?\\s*(.*)$/.exec(l)\n if (!m) continue\n let text = m[3]\n // \":multi\\nline;\" nodes\n if (text.startsWith(':')) {\n text = text.slice(1)\n while (!/;\\s*$/.test(text) && k + 1 < lines.length) text += '\\n' + lines[++k]\n text = text.replace(/;\\s*$/, '')\n }\n const depth = m[1].length\n const side = m[1][0] === '-' ? 'left' : 'right'\n const node: TreeNode = { label: pText(text), shape: m[2] ? 'none' : undefined, side: wbs ? undefined : side, children: [] }\n if (!root) {\n root = node\n stack.push({ depth, n: node })\n continue\n }\n while (stack.length > 1 && stack[stack.length - 1].depth >= depth) stack.pop()\n stack[stack.length - 1].n.children.push(node)\n stack.push({ depth, n: node })\n }\n if (!root) throw new DiagramError('The mind map is empty')\n // only the root's children choose a side\n const clear = (n: TreeNode, top: boolean) => n.children.forEach((c) => (top ? clear(c, false) : ((c.side = undefined), clear(c, false))))\n clear(root, true)\n return root\n}\n","/**\n * Diagrams as code, drawn without a browser, a server or a library: Mermaid, PlantUML and Graphviz DOT text in,\n * self-contained SVG pictures out. Runs in the worker (no DOM) and on the main thread.\n */\nimport { renderDotAll } from './dot'\nimport type { Rendered } from './graph'\nimport { renderMermaid } from './mermaid'\nimport { renderPlantUml } from './plantuml'\nimport { DiagramError } from './svg'\n\nexport type DiagramLang = 'mermaid' | 'plantuml' | 'graphviz'\nexport type { Rendered as DiagramImage } from './graph'\nexport { DiagramError } from './svg'\nimport { dict } from '../dict'\n\n/** file extensions of diagram sources */\nexport const DIAGRAM_EXT: Record<string, DiagramLang> = dict({\n mmd: 'mermaid',\n mermaid: 'mermaid',\n puml: 'plantuml',\n plantuml: 'plantuml',\n pu: 'plantuml',\n iuml: 'plantuml',\n wsd: 'plantuml',\n dot: 'graphviz',\n gv: 'graphviz',\n})\n\n/** Markdown code fence languages */\nexport const FENCE_LANG: Record<string, DiagramLang> = dict({\n mermaid: 'mermaid',\n mmd: 'mermaid',\n plantuml: 'plantuml',\n puml: 'plantuml',\n uml: 'plantuml',\n dot: 'graphviz',\n graphviz: 'graphviz',\n gv: 'graphviz',\n})\n\nexport const DIAGRAM_NAME: Record<DiagramLang, string> = { mermaid: 'Mermaid', plantuml: 'PlantUML', graphviz: 'Graphviz' }\n\n/** a Mermaid header line: the diagram keyword alone (prose that starts with \"pie\" or \"timeline\" is not one) */\nconst MERMAID_START =\n /^(?:(?:graph|flowchart)(?:\\s+(?:TB|TD|BT|RL|LR))?\\s*(?:;.*)?|(?:sequenceDiagram|classDiagram(?:-v2)?|stateDiagram(?:-v2)?|erDiagram|gantt|mindmap|journey|gitGraph|timeline|quadrantChart|requirementDiagram|C4Context|C4Container|C4Component|C4Dynamic|C4Deployment|sankey-beta|xychart-beta|block-beta|packet-beta|kanban|architecture-beta)\\s*|pie(?:\\s+showData)?(?:\\s+title\\s+.*)?\\s*)$/\nconst DOT_START = /^(strict\\s+)?(di)?graph(\\s+(\"[^\"]*\"|[\\w.]+))?\\s*\\{/i\n\n/** the diagram language of a text without a name: @startuml, digraph { }, a Mermaid header */\nexport function sniffDiagram(text: string): DiagramLang | null {\n if (/^\\s*@start(uml|mindmap|wbs|dot|salt|gantt|json|yaml)\\b/m.test(text.slice(0, 2000))) return 'plantuml'\n const lines = text\n .replace(/^/, '')\n .replace(/^\\s*---\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*\\r?\\n/, '')\n .replace(/%%\\{[\\s\\S]*?\\}%%/g, '')\n .split(/\\r?\\n/)\n const trimmed = lines.map((l) => l.trim())\n // DOT: comments (//, /* */, # lines) may come first\n const dot = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').split(/\\r?\\n/).map((l) => l.trim()).find((l) => l && !l.startsWith('//') && !l.startsWith('#'))\n if (dot && (DOT_START.test(dot) || (/^(strict\\s+)?(di)?graph(\\s+(\"[^\"]*\"|[\\w.]+))?\\s*$/i.test(dot) && /^\\s*\\{/m.test(text) && !MERMAID_START.test(dot)))) return 'graphviz'\n const first = trimmed.find((l) => l && !l.startsWith('%%'))\n return first && MERMAID_START.test(first) ? 'mermaid' : null\n}\n\nconst LIMIT = 2_000_000\n\n/** The pictures a diagram source draws (PlantUML and DOT files may hold several). Throws a DiagramError. */\nexport function renderDiagrams(lang: DiagramLang, text: string): Rendered[] {\n if (text.length > LIMIT) throw new DiagramError('The diagram is too large to draw')\n try {\n switch (lang) {\n case 'mermaid':\n return [renderMermaid(text)]\n case 'plantuml':\n return renderPlantUml(text)\n case 'graphviz':\n return renderDotAll(text)\n }\n } catch (e) {\n if (e instanceof DiagramError) throw e\n throw new DiagramError((e as Error)?.message || String(e))\n }\n}\n","/** Link schemes a document may open; any other (javascript:, data:, vbscript:, file:…) is shown as plain text. */\nconst SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel', 'sms', 'ftp', 'ftps'])\n\n/**\n * A document's link target, or undefined when following it could run code: web, mail, phone and FTP links, and\n * relative or in-document (`#bookmark`) targets are kept. The scheme is read the way a browser reads it.\n */\nexport function safeHref(href: string | null | undefined): string | undefined {\n if (!href) return undefined\n // browsers drop leading / trailing controls and spaces, and tabs / newlines anywhere: \"java\\tscript:\" is a script link\n const url = href.replace(/^[\\u0000- ]+|[\\u0000- ]+$/g, '').replace(/[\\t\\n\\r]/g, '')\n const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(url)?.[1].toLowerCase()\n return !scheme || SAFE_SCHEMES.has(scheme) ? href : undefined\n}\n","/**\n * Markdown → HTML for showing in a page: CommonMark blocks (headings, paragraphs, nested lists, quotes, code,\n * rules) and GitHub's tables, task lists, strikethrough and bare links. The HTML is safe to set as innerHTML:\n * text is escaped, raw HTML in the source is shown as text, and links / images keep only harmless URLs.\n * ```mermaid / ```plantuml / ```dot code blocks become SVG drawings.\n */\nimport { DIAGRAM_NAME, FENCE_LANG, renderDiagrams } from '../../../src/core/diagram'\nimport { safeHref } from '../../../src/core/url'\n\nexport interface MarkdownOptions {\n /** Draw ```mermaid, ```plantuml / ```puml and ```dot / ```graphviz code blocks as SVG. Default true. */\n diagrams?: boolean\n /** `id` attributes on headings (from their text) so `#links` reach them. Default true. */\n headingIds?: boolean\n}\n\ninterface Ctx {\n refs: Map<string, { href: string; title?: string }>\n diagrams: boolean\n ids: boolean\n slugs: Map<string, number>\n}\n\nconst esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n\nconst FENCE = /^( {0,3})(`{3,}|~{3,})[ \\t]*([^\\s`]*)[^`\\n]*$/\nconst ATX = /^ {0,3}(#{1,6})(?:[ \\t]+(.*?))?(?:[ \\t]+#+)?[ \\t]*$/\nconst SETEXT = /^ {0,3}(=+|-+)[ \\t]*$/\nconst HR = /^ {0,3}([-*_])(?:[ \\t]*\\1){2,}[ \\t]*$/\nconst QUOTE = /^ {0,3}> ?(.*)$/\nconst LIST = /^( {0,3})([-*+]|\\d{1,9}[.)])(?:([ \\t]{1,4})(.*)|[ \\t]*)$/\nconst DELIM = /^ {0,3}\\|?[ \\t]*:?-+:?[ \\t]*(?:\\|[ \\t]*:?-+:?[ \\t]*)*\\|?[ \\t]*$/\nconst REF = /^ {0,3}\\[([^\\]]+)\\]:[ \\t]*<?([^\\s>]+)>?(?:[ \\t]+(?:\"([^\"]*)\"|'([^']*)'|\\(([^)]*)\\)))?[ \\t]*$/\n\nconst label = (s: string) => s.trim().replace(/\\s+/g, ' ').toLowerCase()\n\n/** Markdown text → HTML. */\nexport function markdownToHtml(md: string, opts: MarkdownOptions = {}): string {\n const lines = md.replace(/^/, '').replace(/\\r\\n?/g, '\\n').replace(/\\t/g, ' ').split('\\n')\n const ctx: Ctx = { refs: new Map(), diagrams: opts.diagrams !== false, ids: opts.headingIds !== false, slugs: new Map() }\n // link reference definitions (outside code blocks) are read first and leave no text\n const kept: string[] = []\n let fence: string | null = null\n for (const l of lines) {\n const f = FENCE.exec(l)\n if (fence) {\n if (f && f[2][0] === fence[0] && f[2].length >= fence.length && !f[3]) fence = null\n kept.push(l)\n continue\n }\n if (f) fence = f[2]\n const r = !fence && REF.exec(l)\n if (r) {\n const key = label(r[1])\n if (!ctx.refs.has(key)) ctx.refs.set(key, { href: r[2], title: r[3] ?? r[4] ?? r[5] })\n continue\n }\n kept.push(l)\n }\n return blocks(kept, ctx, false)\n}\n\n/** a line that starts a block other than a paragraph (ends a lazy continuation) */\nconst startsBlock = (l: string) => FENCE.test(l) || ATX.test(l) || HR.test(l) || QUOTE.test(l) || LIST.test(l)\n\nfunction blocks(lines: string[], ctx: Ctx, tight: boolean): string {\n const out: string[] = []\n let para: string[] = []\n const flush = () => {\n if (!para.length) return\n const html = inline(para.map((l) => l.replace(/^ +/, '')).join('\\n').replace(/\\s+$/, ''), ctx)\n out.push(tight ? html : `<p>${html}</p>`)\n para = []\n }\n let i = 0\n while (i < lines.length) {\n const line = lines[i]\n if (!line.trim()) {\n flush()\n i++\n continue\n }\n let m: RegExpExecArray | null\n if ((m = FENCE.exec(line))) {\n flush()\n const indent = m[1].length\n const mark = m[2]\n const close = new RegExp(`^ {0,3}${mark[0] === '`' ? '`' : '~'}{${mark.length},}[ \\\\t]*$`)\n const body: string[] = []\n i++\n while (i < lines.length && !close.test(lines[i])) body.push(lines[i++].replace(new RegExp(`^ {0,${indent}}`), ''))\n i++\n out.push(code(body.join('\\n'), m[3], ctx))\n continue\n }\n if (!para.length && /^ {4}/.test(line)) {\n const body: string[] = []\n while (i < lines.length && (/^ {4}/.test(lines[i]) || !lines[i].trim())) body.push(lines[i++].slice(4))\n while (body.length && !body[body.length - 1].trim()) body.pop()\n out.push(`<pre><code>${esc(body.join('\\n'))}\\n</code></pre>`)\n continue\n }\n if ((m = ATX.exec(line))) {\n flush()\n out.push(heading(m[1].length, m[2] ?? '', ctx))\n i++\n continue\n }\n if (para.length && (m = SETEXT.exec(line))) {\n const text = para.join('\\n')\n para = []\n out.push(heading(m[1][0] === '=' ? 1 : 2, text, ctx))\n i++\n continue\n }\n if (HR.test(line)) {\n flush()\n out.push('<hr>')\n i++\n continue\n }\n if (QUOTE.test(line)) {\n flush()\n const inner: string[] = []\n while (i < lines.length) {\n const q = QUOTE.exec(lines[i])\n if (q) inner.push(q[1])\n // lazy continuation of a paragraph in the quote\n else if (lines[i].trim() && inner.length && inner[inner.length - 1].trim() && !startsBlock(lines[i])) inner.push(lines[i])\n else break\n i++\n }\n out.push(`<blockquote>\\n${blocks(inner, ctx, false)}\\n</blockquote>`)\n continue\n }\n if ((m = LIST.exec(line))) {\n // a list interrupts a paragraph only with content, and (numbered) from 1\n const empty = m[4] === undefined || !m[4].trim()\n if (!para.length || (!empty && (!/\\d/.test(m[2]) || parseInt(m[2], 10) === 1))) {\n flush()\n i = list(lines, i, out, ctx)\n continue\n }\n }\n if (line.includes('|') && i + 1 < lines.length && DELIM.test(lines[i + 1]) && (lines[i + 1].includes('|') || !line.trim().startsWith('|'))) {\n flush()\n i = table(lines, i, out, ctx)\n continue\n }\n para.push(line)\n i++\n }\n flush()\n return out.join('\\n')\n}\n\nfunction list(lines: string[], start: number, out: string[], ctx: Ctx): number {\n const first = LIST.exec(lines[start])!\n const ordered = /\\d/.test(first[2])\n const delim = first[2].slice(-1)\n const items: string[][] = []\n let loose = false\n let i = start\n while (i < lines.length) {\n const m = LIST.exec(lines[i])\n if (!m || /\\d/.test(m[2]) !== ordered || m[2].slice(-1) !== delim) break\n // content starts after the marker and 1–4 spaces (more: one space, the rest is indented code)\n const gap = m[3] === undefined ? 1 : m[3].length > 4 ? 1 : m[3].length\n const width = m[1].length + m[2].length + gap\n const item = [m[3] === undefined ? '' : m[3].length > 4 ? m[3].slice(1) + m[4] : m[4]]\n i++\n let blank = false\n while (i < lines.length) {\n const l = lines[i]\n if (!l.trim()) {\n item.push('')\n blank = true\n i++\n continue\n }\n const lead = l.length - l.trimStart().length\n if (lead >= width) {\n item.push(l.slice(width))\n blank = false\n i++\n continue\n }\n if (blank) break\n // lazy continuation of the item's paragraph\n if (!startsBlock(l) && item[item.length - 1].trim()) {\n item.push(l)\n i++\n continue\n }\n break\n }\n let trailing = false\n while (item.length > 1 && !item[item.length - 1].trim()) {\n item.pop()\n trailing = true\n }\n // a blank line between two blocks of the item: a loose list (paragraphs)\n for (let k = 1; k + 1 < item.length; k++) if (!item[k].trim() && item[k + 1].trim() && !/^\\s/.test(item[k + 1]) && !LIST.test(item[k + 1])) loose = true\n items.push(item)\n if (trailing) {\n const next = i < lines.length ? LIST.exec(lines[i]) : null\n if (next && /\\d/.test(next[2]) === ordered && next[2].slice(-1) === delim) loose = true\n }\n }\n const startNo = ordered ? parseInt(first[2], 10) : 1\n out.push(ordered ? `<ol${startNo !== 1 ? ` start=\"${startNo}\"` : ''}>` : '<ul>')\n for (const item of items) {\n const task = /^\\[([ xX])\\][ \\t]+/.exec(item[0])\n if (task) item[0] = item[0].slice(task[0].length)\n const body = blocks(item, ctx, !loose)\n const box = task ? `<input type=\"checkbox\" disabled${task[1] === ' ' ? '' : ' checked'}> ` : ''\n out.push(task ? `<li class=\"task-list-item\">${box}${body}</li>` : `<li>${body}</li>`)\n }\n out.push(ordered ? '</ol>' : '</ul>')\n return i\n}\n\nfunction table(lines: string[], i: number, out: string[], ctx: Ctx): number {\n const cells = (l: string) => {\n let s = l.trim()\n if (s.startsWith('|')) s = s.slice(1)\n if (s.endsWith('|') && !s.endsWith('\\\\|')) s = s.slice(0, -1)\n return s.split(/(?<!\\\\)\\|/).map((c) => c.trim().replace(/\\\\\\|/g, '|'))\n }\n const head = cells(lines[i])\n const align = cells(lines[i + 1]).map((c) => (c.startsWith(':') && c.endsWith(':') ? 'center' : c.endsWith(':') ? 'right' : c.startsWith(':') ? 'left' : ''))\n i += 2\n const rows: string[][] = []\n while (i < lines.length && lines[i].trim() && !startsBlock(lines[i])) rows.push(cells(lines[i++]))\n const cell = (tag: string, c: string | undefined, k: number) => `<${tag}${align[k] ? ` style=\"text-align:${align[k]}\"` : ''}>${inline(c ?? '', ctx)}</${tag}>`\n let html = `<table>\\n<thead>\\n<tr>${head.map((c, k) => cell('th', c, k)).join('')}</tr>\\n</thead>`\n if (rows.length) html += `\\n<tbody>\\n${rows.map((r) => `<tr>${head.map((_, k) => cell('td', r[k], k)).join('')}</tr>`).join('\\n')}\\n</tbody>`\n out.push(html + '\\n</table>')\n return i\n}\n\nfunction heading(level: number, text: string, ctx: Ctx): string {\n const html = inline(text.trim(), ctx)\n if (!ctx.ids) return `<h${level}>${html}</h${level}>`\n const base =\n html\n .replace(/<[^>]*>/g, '')\n .replace(/&\\w+;|&#\\d+;/g, '')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s_-]/gu, '')\n .trim()\n .replace(/\\s+/g, '-') || 'section'\n const n = ctx.slugs.get(base) ?? 0\n ctx.slugs.set(base, n + 1)\n return `<h${level} id=\"${esc(n ? `${base}-${n}` : base)}\">${html}</h${level}>`\n}\n\nfunction code(body: string, info: string, ctx: Ctx): string {\n const lang = info.toLowerCase().replace(/[^\\w+#.-]/g, '')\n const diagram = FENCE_LANG[lang]\n if (diagram && ctx.diagrams) {\n try {\n return renderDiagrams(diagram, body)\n .map((d) => `<figure class=\"md-diagram md-${diagram}\">${d.svg}</figure>`)\n .join('\\n')\n } catch (e) {\n return (\n `<div class=\"md-diagram-error\"><p>${esc(DIAGRAM_NAME[diagram])} diagram not drawn: ${esc((e as Error).message)}</p>` +\n `<pre><code class=\"language-${lang}\">${esc(body)}\\n</code></pre></div>`\n )\n }\n }\n return `<pre><code${lang ? ` class=\"language-${lang}\"` : ''}>${esc(body)}${body ? '\\n' : ''}</code></pre>`\n}\n\n/** URLs a picture may load: web, relative, and data: images */\nfunction safeSrc(src: string): string | undefined {\n const s = src.trim()\n if (/^data:image\\/(png|jpe?g|gif|webp|svg\\+xml|avif|bmp);/i.test(s)) return s\n const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(s.replace(/[\\u0000- ]/g, ''))?.[1].toLowerCase()\n return !scheme || scheme === 'http' || scheme === 'https' ? s : undefined\n}\n\nconst PUNCT = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst LINK_TAIL = String.raw`\\(\\s*(<[^>\\n]*>|[^\\s()]*(?:\\([^\\s()]*\\)[^\\s()]*)*)(?:\\s+(?:\"([^\"]*)\"|'([^']*)'|\\(([^)]*)\\)))?\\s*\\)`\nconst IMAGE = new RegExp(String.raw`!\\[((?:[^\\[\\]\\\\]|\\\\.|\\[[^\\]]*\\])*)\\]` + LINK_TAIL, 'g')\nconst LINK = new RegExp(String.raw`\\[((?:[^\\[\\]\\\\]|\\\\.|\\[[^\\]]*\\])*)\\]` + LINK_TAIL, 'g')\nconst REF_LINK = /(!?)\\[((?:[^[\\]\\\\]|\\\\.)*)\\](?:\\[((?:[^[\\]\\\\]|\\\\.)*)\\])?/g\n\nfunction inline(src: string, ctx: Ctx): string {\n const slots: string[] = []\n const hold = (html: string) => `\\u0000${slots.push(html) - 1}\\u0001`\n const unwrap = (u: string) => u.replace(/^<|>$/g, '')\n const link = (href: string, html: string, title?: string) => {\n const h = safeHref(href.replace(PUNCT, '$1'))\n // `html` is markup already: held whole so it is not escaped again\n return hold(h ? `<a href=\"${esc(h)}\"${title ? ` title=\"${esc(title)}\"` : ''}>${html}</a>` : html)\n }\n const image = (src: string, alt: string, title?: string) => {\n const s = safeSrc(src.replace(PUNCT, '$1'))\n const a = esc(alt.replace(PUNCT, '$1').replace(/[*_~`]/g, ''))\n return hold(s ? `<img src=\"${esc(s)}\" alt=\"${a}\"${title ? ` title=\"${esc(title)}\"` : ''}>` : a)\n }\n let s = src.replace(/[\\u0000\\u0001]/g, '�')\n // code spans first: nothing inside them is markup\n s = s.replace(/(`+)(?!`)([\\s\\S]*?[^`])\\1(?!`)/g, (_, _t: string, c: string) => {\n const t = c.replace(/\\n/g, ' ')\n return hold(`<code>${esc(/^ .* $/.test(t) && t.trim() ? t.slice(1, -1) : t)}</code>`)\n })\n s = s.replace(/\\\\\\n/g, () => hold('<br>\\n'))\n s = s.replace(PUNCT, (_, c: string) => hold(esc(c)))\n s = s.replace(/<((?:https?|ftp):\\/\\/[^\\s<>]+|mailto:[^\\s<>]+)>/gi, (_, u: string) => link(u, esc(u)))\n s = s.replace(/<([\\w.+-]+@[\\w-]+(?:\\.[\\w-]+)+)>/g, (_, e: string) => link('mailto:' + e, esc(e)))\n s = s.replace(IMAGE, (_, alt: string, u: string, t1?: string, t2?: string, t3?: string) => image(unwrap(u), alt, t1 ?? t2 ?? t3))\n s = s.replace(LINK, (_, text: string, u: string, t1?: string, t2?: string, t3?: string) => link(unwrap(u), emphasis(text), t1 ?? t2 ?? t3))\n s = s.replace(REF_LINK, (m, bang: string, text: string, ref?: string) => {\n const def = ctx.refs.get(label(ref || text))\n if (!def) return m\n return bang ? image(def.href, text, def.title) : link(def.href, emphasis(text), def.title)\n })\n // bare web addresses\n s = s.replace(/(^|[\\s(*_~])((?:https?:\\/\\/|www\\.)[^\\s<\\u0000]*[^\\s<\\u0000.,:;\"')\\]!?*_~])/g, (_, pre: string, u: string) => pre + link(u.startsWith('www.') ? 'http://' + u : u, esc(u)))\n s = emphasis(s)\n // put the held parts back (they may hold others)\n for (let k = 0; k < 4 && s.includes('\\u0000'); k++) s = s.replace(/\\u0000(\\d+)\\u0001/g, (_, n: string) => slots[Number(n)])\n return s\n}\n\n/** escapes text (held parts aside) and marks strong / emphasis / strikethrough and hard breaks */\nfunction emphasis(t: string): string {\n return esc(t)\n .replace(/\\*\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*\\*/g, '<strong><em>$1</em></strong>')\n .replace(/\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*/g, '<strong>$1</strong>')\n .replace(/(?<![\\p{L}\\p{N}_])__(?=\\S)([\\s\\S]*?\\S)__(?![\\p{L}\\p{N}_])/gu, '<strong>$1</strong>')\n .replace(/\\*(?=[^\\s*])([\\s\\S]*?[^\\s*])\\*/g, '<em>$1</em>')\n .replace(/(?<![\\p{L}\\p{N}_])_(?=[^\\s_])([\\s\\S]*?[^\\s_])_(?![\\p{L}\\p{N}_])/gu, '<em>$1</em>')\n .replace(/~~(?=\\S)([\\s\\S]*?\\S)~~/g, '<del>$1</del>')\n .replace(/ {2,}\\n/g, '<br>\\n')\n}\n","/**\n * @p10node/markdown: Markdown → safe HTML (CommonMark blocks, GitHub tables, task lists, strikethrough, bare links),\n * with ```mermaid / ```plantuml / ```dot code blocks drawn as SVG. No DOM needed, no dependency.\n */\nimport { markdownToHtml } from './markdown'\n\nexport interface MarkdownOptions {\n /** Draw ```mermaid, ```plantuml / ```puml and ```dot / ```graphviz code blocks as SVG. Default true. */\n diagrams?: boolean\n /** `id` attributes on headings (from their text) so `#links` reach them. Default true. */\n headingIds?: boolean\n}\n\n/**\n * HTML of a Markdown text, safe to set as `innerHTML`: text is escaped, HTML written in the Markdown is shown as\n * text, links keep web / mail / relative targets only and pictures web, relative or data: images.\n */\nexport function render(markdown: string, options: MarkdownOptions = {}): string {\n return markdownToHtml(markdown, options)\n}\n\n/** Renders Markdown into an element (its content is replaced). */\nexport function renderTo(target: Element, markdown: string, options: MarkdownOptions = {}): void {\n target.innerHTML = markdownToHtml(markdown, options)\n}\n"],"mappings":"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"}
|