schematex 0.6.10 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/ai-sdk.cjs +19 -19
- package/dist/ai/ai-sdk.d.cts +4 -4
- package/dist/ai/ai-sdk.d.ts +4 -4
- package/dist/ai/ai-sdk.js +14 -14
- package/dist/ai/index.cjs +25 -25
- package/dist/ai/index.d.cts +3 -3
- package/dist/ai/index.d.ts +3 -3
- package/dist/ai/index.js +14 -14
- package/dist/{api-JaBtsUT8.d.cts → api-BnJAPCwC.d.cts} +1 -1
- package/dist/{api-DIJM_mqp.d.ts → api-DAZJGq9r.d.ts} +1 -1
- package/dist/browser.cjs +20 -20
- package/dist/browser.d.cts +3 -3
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +14 -14
- package/dist/{chunk-34O3C6OC.cjs → chunk-2YBBDPOW.cjs} +4 -4
- package/dist/chunk-2YBBDPOW.cjs.map +1 -0
- package/dist/{chunk-3YRYBTLG.cjs → chunk-3CSST5GZ.cjs} +9082 -591
- package/dist/chunk-3CSST5GZ.cjs.map +1 -0
- package/dist/{chunk-JTGTWBAD.js → chunk-6DVK5M2J.js} +3 -3
- package/dist/chunk-6DVK5M2J.js.map +1 -0
- package/dist/{chunk-SHMG7BVF.cjs → chunk-6L46VIXI.cjs} +4 -4
- package/dist/{chunk-SHMG7BVF.cjs.map → chunk-6L46VIXI.cjs.map} +1 -1
- package/dist/{chunk-OFKRELZK.js → chunk-ABCMTAOZ.js} +3 -3
- package/dist/{chunk-OFKRELZK.js.map → chunk-ABCMTAOZ.js.map} +1 -1
- package/dist/{chunk-5FYPSIGD.cjs → chunk-B5AQ3CG3.cjs} +4 -4
- package/dist/{chunk-5FYPSIGD.cjs.map → chunk-B5AQ3CG3.cjs.map} +1 -1
- package/dist/{chunk-3GAPHXCE.js → chunk-CDK7KDIW.js} +3 -3
- package/dist/{chunk-3GAPHXCE.js.map → chunk-CDK7KDIW.js.map} +1 -1
- package/dist/{chunk-Z3A2UNK2.cjs → chunk-D34VGLSE.cjs} +4 -4
- package/dist/{chunk-Z3A2UNK2.cjs.map → chunk-D34VGLSE.cjs.map} +1 -1
- package/dist/{chunk-BL57NQKN.cjs → chunk-DHI7YAQJ.cjs} +326 -29
- package/dist/chunk-DHI7YAQJ.cjs.map +1 -0
- package/dist/{chunk-C7V57V6O.js → chunk-DX44TBFZ.js} +3 -3
- package/dist/{chunk-C7V57V6O.js.map → chunk-DX44TBFZ.js.map} +1 -1
- package/dist/{chunk-MPCSWRZC.js → chunk-E3CAJGJM.js} +3 -3
- package/dist/{chunk-MPCSWRZC.js.map → chunk-E3CAJGJM.js.map} +1 -1
- package/dist/{chunk-HL5PS6MG.js → chunk-E7LXMEKX.js} +325 -28
- package/dist/chunk-E7LXMEKX.js.map +1 -0
- package/dist/{chunk-P26FCZP3.js → chunk-IXRPRMHI.js} +3 -3
- package/dist/{chunk-P26FCZP3.js.map → chunk-IXRPRMHI.js.map} +1 -1
- package/dist/{chunk-WU2N6ZVM.js → chunk-JGCKW5RS.js} +3 -3
- package/dist/{chunk-WU2N6ZVM.js.map → chunk-JGCKW5RS.js.map} +1 -1
- package/dist/{chunk-J3EPFZPX.cjs → chunk-JIJWGHRN.cjs} +5 -5
- package/dist/{chunk-J3EPFZPX.cjs.map → chunk-JIJWGHRN.cjs.map} +1 -1
- package/dist/{chunk-TACTEF2N.cjs → chunk-JIUC4DRS.cjs} +4 -4
- package/dist/{chunk-TACTEF2N.cjs.map → chunk-JIUC4DRS.cjs.map} +1 -1
- package/dist/{chunk-77GPD4YQ.cjs → chunk-KUITLG4N.cjs} +4 -4
- package/dist/{chunk-77GPD4YQ.cjs.map → chunk-KUITLG4N.cjs.map} +1 -1
- package/dist/{chunk-2F45Y2ON.cjs → chunk-NXU4XKLY.cjs} +4 -4
- package/dist/{chunk-2F45Y2ON.cjs.map → chunk-NXU4XKLY.cjs.map} +1 -1
- package/dist/{chunk-UHPGWO77.cjs → chunk-Q2YRJHFB.cjs} +4 -4
- package/dist/{chunk-UHPGWO77.cjs.map → chunk-Q2YRJHFB.cjs.map} +1 -1
- package/dist/{chunk-DZGA25O5.cjs → chunk-RKN6QJ7K.cjs} +733 -10
- package/dist/chunk-RKN6QJ7K.cjs.map +1 -0
- package/dist/{chunk-2TUZ3QJA.js → chunk-T3GV7OVF.js} +3 -3
- package/dist/{chunk-2TUZ3QJA.js.map → chunk-T3GV7OVF.js.map} +1 -1
- package/dist/{chunk-5IKOLUWK.js → chunk-TO6PNBT3.js} +3 -3
- package/dist/chunk-TO6PNBT3.js.map +1 -0
- package/dist/{chunk-X4P4HKHP.js → chunk-TXMT4XLE.js} +731 -8
- package/dist/chunk-TXMT4XLE.js.map +1 -0
- package/dist/{chunk-T3FV73LM.js → chunk-UOM3EDE6.js} +3 -3
- package/dist/{chunk-T3FV73LM.js.map → chunk-UOM3EDE6.js.map} +1 -1
- package/dist/{chunk-NAGUZFXX.cjs → chunk-VHDSPI6A.cjs} +3 -2
- package/dist/chunk-VHDSPI6A.cjs.map +1 -0
- package/dist/{chunk-YMZTXOUG.js → chunk-WNGOG4CI.js} +3 -3
- package/dist/{chunk-YMZTXOUG.js.map → chunk-WNGOG4CI.js.map} +1 -1
- package/dist/{chunk-6AWASOFO.js → chunk-XI5QP7LM.js} +9054 -571
- package/dist/chunk-XI5QP7LM.js.map +1 -0
- package/dist/{chunk-LPAWZYDU.cjs → chunk-YMFYPB5Y.cjs} +14 -14
- package/dist/{chunk-LPAWZYDU.cjs.map → chunk-YMFYPB5Y.cjs.map} +1 -1
- package/dist/{diagnostics-BKRow1ur.d.cts → diagnostics-B-jOt6Ua.d.cts} +1 -1
- package/dist/{diagnostics-BKRow1ur.d.ts → diagnostics-B-jOt6Ua.d.ts} +1 -1
- package/dist/diagrams/blockdiagram/index.cjs +6 -6
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +2 -2
- package/dist/diagrams/circuit/index.cjs +9 -9
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +8 -8
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +8 -8
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +22 -1
- package/dist/diagrams/phylo/index.d.ts +22 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +8 -8
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.cjs +5 -5
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +2 -2
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/{index-Dq3Mfxay.d.ts → index-8MaUFTMN.d.ts} +1 -1
- package/dist/{index-DU2h1Y-a.d.cts → index-D-MAB6CH.d.cts} +1 -1
- package/dist/index.cjs +83 -51
- package/dist/index.d.cts +33 -5
- package/dist/index.d.ts +33 -5
- package/dist/index.js +17 -17
- package/dist/react.cjs +14 -14
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +13 -13
- package/dist/{tools-OzOQnlnV.d.cts → tools-CV1JZ75-.d.cts} +2 -2
- package/dist/{tools-A0HRZ8jj.d.ts → tools-CcPysgAD.d.ts} +2 -2
- package/package.json +1 -1
- package/dist/chunk-34O3C6OC.cjs.map +0 -1
- package/dist/chunk-3YRYBTLG.cjs.map +0 -1
- package/dist/chunk-5IKOLUWK.js.map +0 -1
- package/dist/chunk-6AWASOFO.js.map +0 -1
- package/dist/chunk-BL57NQKN.cjs.map +0 -1
- package/dist/chunk-DZGA25O5.cjs.map +0 -1
- package/dist/chunk-HL5PS6MG.js.map +0 -1
- package/dist/chunk-JTGTWBAD.js.map +0 -1
- package/dist/chunk-NAGUZFXX.cjs.map +0 -1
- package/dist/chunk-X4P4HKHP.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/dendrogram.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title","matchQuotedTitle","collectLeaves","estimateLabelWidth","TIP_SPACING","PADDING_LEFT","PADDING_RIGHT","PADDING_TOP","PADDING_BOTTOM","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","group","rect","resolveBiologyTheme","path","circle","desc","el","svgRoot"],"mappings":"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","file":"chunk-DHI7YAQJ.cjs","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n /**\n * Dendrogram (hierarchical-clustering) mode flag. Dendrogram is a phylo-local\n * mode layered on top of the cladogram base `mode`; it is carried in AST\n * metadata (not the shared `PhyloMode` union) so the dendrogram feature stays\n * isolated inside the phylo folder.\n */\n dendrogram?: boolean;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n } else if (val === \"dendrogram\") {\n // Dendrogram is a phylo-local mode (not in the shared PhyloMode\n // union). It reuses the cladogram base for any code that only knows\n // the standard modes, and is flagged separately for the dendrogram\n // layout/renderer.\n result.mode = \"cladogram\";\n result.dendrogram = true;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n const title: string | undefined = matchQuotedTitle(headerLine);\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n let cut: number | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Cut line (dendrogram threshold): \"cut 1.5\" or \"cut: 1.5\"\n if (/^cut\\b/i.test(trimmed)) {\n const cutStr = trimmed.replace(/^cut\\s*:?\\s*/i, \"\").trim();\n const cutVal = Number(cutStr);\n if (!Number.isNaN(cutVal)) cut = cutVal;\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n // Dendrogram mode + cut threshold are phylo-local concerns carried in\n // metadata so the dendrogram feature stays inside the phylo folder without\n // extending the shared PhyloMode union or PhyloTreeAST interface.\n const metadata: Record<string, string> = {};\n if (headerProps.dendrogram) metadata.dendrogram = \"true\";\n if (cut !== undefined) metadata.cut = String(cut);\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata,\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\nimport type { PhyloLayoutResult, PhyloBranch } from \"./layout\";\n\n// ─── Dendrogram (hierarchical-clustering tree) ───────────────\n//\n// A dendrogram differs from a cladogram in that internal nodes are positioned\n// at their *merge height* (the cluster distance at which two sub-clusters\n// join). Leaves all align at the baseline (height 0). Connectors are\n// rectangular \"elbow\" U-shapes. An optional `cut` threshold slices the tree\n// into flat clusters, each drawn in a distinct colour.\n//\n// Convention (matching the rest of the phylo engine — root on the left,\n// tips on the right):\n// - height 0 → rightmost (leaves)\n// - maxHeight → leftmost (root)\n// - x = PADDING_LEFT + (maxHeight - height) * scale\n//\n// This module is phylo-local: dendrogram mode is flagged via\n// `ast.metadata.dendrogram === \"true\"` rather than the shared PhyloMode union.\n\nconst TIP_SPACING = 24;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 24;\nconst PADDING_BOTTOM = 52;\n\n/** Is this AST a dendrogram (phylo-local mode carried in metadata)? */\nexport function isDendrogram(ast: PhyloTreeAST): boolean {\n return ast.metadata?.dendrogram === \"true\";\n}\n\n/** Parsed cut threshold, or undefined when no `cut` directive was given. */\nexport function getCut(ast: PhyloTreeAST): number | undefined {\n const raw = ast.metadata?.cut;\n if (raw === undefined) return undefined;\n const val = Number(raw);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n/**\n * Merge height of a node = the cophenetic height at which its sub-clusters\n * join, computed as the maximum branch-length distance from this node down to\n * any descendant tip. Leaves have height 0. This is the standard\n * hierarchical-clustering interpretation and is stable for arbitrary\n * branch-length inputs.\n */\nfunction computeHeights(node: PhyloNode, out: Map<string, number>): number {\n if (node.isLeaf) {\n out.set(node.id, 0);\n return 0;\n }\n let max = 0;\n for (const child of node.children) {\n const childHeight = computeHeights(child, out);\n const branch = child.branchLength ?? 0;\n const reach = childHeight + branch;\n if (reach > max) max = reach;\n }\n out.set(node.id, max);\n return max;\n}\n\n/**\n * Compute flat clusters produced by a horizontal/vertical cut at `cutValue`.\n * A cluster is the maximal subtree rooted at a node whose merge height is\n * <= cutValue but whose parent's merge height is > cutValue (i.e. the cut line\n * severs the edge above it). Returns one entry per cluster: the cluster's root\n * node and the set of leaf ids it contains.\n */\nexport interface DendrogramCluster {\n rootId: string;\n leafIds: string[];\n}\n\nexport function computeClusters(\n ast: PhyloTreeAST,\n heights: Map<string, number>,\n cutValue: number\n): DendrogramCluster[] {\n const clusters: DendrogramCluster[] = [];\n\n function visit(node: PhyloNode, parentHeight: number): void {\n const h = heights.get(node.id) ?? 0;\n // The edge entering `node` crosses the cut line when the parent merges\n // above the cut but this node merges at/below it. The root is treated as\n // having an infinite parent height.\n if (h <= cutValue && parentHeight > cutValue) {\n clusters.push({ rootId: node.id, leafIds: collectLeaves(node).map((l) => l.id) });\n return;\n }\n // Node merges above the cut — descend; its children may form clusters.\n if (h > cutValue) {\n for (const child of node.children) visit(child, h);\n } else {\n // h <= cut and parent <= cut: already inside a containing cluster — this\n // branch is unreachable for the root call but kept for completeness.\n clusters.push({ rootId: node.id, leafIds: collectLeaves(node).map((l) => l.id) });\n }\n }\n\n visit(ast.root, Number.POSITIVE_INFINITY);\n return clusters;\n}\n\nexport function layoutDendrogram(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n\n const heights = new Map<string, number>();\n const maxHeight = computeHeights(ast.root, heights);\n\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const availableWidth = Math.max(320, numLeaves * 36 + maxLabelWidth + 120);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n // Pixels per unit of merge height.\n const scale = maxHeight > 0 ? plotWidth / maxHeight : plotWidth;\n\n // Baseline (height 0) sits at the right edge of the plot; root at the left.\n const baselineX = PADDING_LEFT + plotWidth;\n const heightToX = (h: number): number => baselineX - h * scale;\n\n const nodeMap = new Map<string, PhyloLayoutNode>();\n\n // Step 1: leaf Y in-order, leaf X pinned to baseline.\n let leafIdx = 0;\n function assignLeaf(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * TIP_SPACING;\n nodeMap.set(node.id, { node, x: baselineX, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) assignLeaf(child);\n }\n assignLeaf(ast.root);\n\n // Step 2: internal Y = midpoint of children; X from merge height.\n function assignInternal(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternal);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n const x = heightToX(heights.get(node.id) ?? 0);\n if (existing) {\n existing.y = y;\n existing.x = x;\n } else {\n nodeMap.set(node.id, { node, x, y });\n }\n return y;\n }\n assignInternal(ast.root);\n\n // Optional cut → assign each leaf a cluster index for colouring.\n const cut = getCut(ast);\n const leafCluster = new Map<string, number>();\n let clusterCount = 0;\n if (cut !== undefined) {\n const clusters = computeClusters(ast, heights, cut);\n clusterCount = clusters.length;\n clusters.forEach((cluster, idx) => {\n for (const leafId of cluster.leafIds) leafCluster.set(leafId, idx);\n });\n }\n\n /** Cluster index for an internal node's outgoing edge, when its whole\n * subtree lies in a single cut cluster; otherwise undefined (above the cut). */\n function subtreeCluster(node: PhyloNode): number | undefined {\n const ids = collectLeaves(node).map((l) => l.id);\n const first = leafCluster.get(ids[0]);\n if (first === undefined) return undefined;\n for (const id of ids) {\n if (leafCluster.get(id) !== first) return undefined;\n }\n return first;\n }\n\n // Step 3: rectangular elbow connectors.\n const branches: PhyloBranch[] = [];\n\n function generate(node: PhyloNode): void {\n if (node.children.length === 0) return;\n const parent = nodeMap.get(node.id);\n if (!parent) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n if (childLayouts.length === 0) return;\n\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n // Vertical bar of the U at the node's merge-height X, spanning children.\n branches.push({\n path: `M ${parent.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n // Horizontal arm of the U out to each child's X.\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const cluster = subtreeCluster(child);\n branches.push({\n path: `M ${parent.x},${childLayout.y} H ${childLayout.x}`,\n fromId: node.id,\n toId: child.id,\n cladeId: cluster !== undefined ? `cut${cluster}` : undefined,\n isConnector: false,\n });\n }\n\n for (const child of node.children) generate(child);\n }\n generate(ast.root);\n\n const allNodes = Array.from(nodeMap.values());\n const maxX = Math.max(\n ...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0))\n );\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n // Dendrogram-specific extras stashed for the renderer (see types below).\n dendrogram: {\n maxHeight,\n baselineX,\n plotLeftX: PADDING_LEFT,\n scale,\n cut,\n clusterCount,\n leafCluster,\n heights,\n },\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\nimport { isDendrogram, layoutDendrogram } from \"./dendrogram\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n /** Present only for dendrogram mode — drives the height axis + cut line. */\n dendrogram?: DendrogramExtras;\n}\n\n/** Dendrogram-only layout metadata (phylo-local; see ./dendrogram.ts). */\nexport interface DendrogramExtras {\n /** Largest merge height in the tree (root's height). */\n maxHeight: number;\n /** X pixel of the height-0 baseline (where leaves align). */\n baselineX: number;\n /** X pixel of the plot's left edge (root / max height). */\n plotLeftX: number;\n /** Pixels per unit of merge height. */\n scale: number;\n /** Cut threshold value, when a `cut` directive was given. */\n cut?: number;\n /** Number of flat clusters produced by the cut (0 when no cut). */\n clusterCount: number;\n /** Leaf id → cluster index (empty when no cut). */\n leafCluster: Map<string, number>;\n /** Node id → merge height. */\n heights: Map<string, number>;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n if (isDendrogram(ast)) {\n return layoutDendrogram(ast);\n }\n\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n // Dendrogram cut-cluster colours. The cluster count is layout-dependent, so\n // emit one class per palette entry keyed off the biology clade palette; the\n // layout assigns each cluster an index `cut{i}` that maps to these.\n const cutColors: string[] = [];\n if (ast.metadata?.dendrogram === \"true\" && ast.metadata?.cut !== undefined) {\n for (let i = 0; i < t.cladeColors.length; i++) {\n cutColors.push(\n `.schematex-phylo-clade-cut${i} { stroke: ${t.cladeColors[i % t.cladeColors.length]}; }`\n );\n }\n }\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-dendro-axis line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-dendro-axis text { font-size: 10px; fill: ${t.textMuted}; text-anchor: middle; }\n.schematex-phylo-dendro-cut { stroke: ${t.supportBad}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 5 4; fill: none; }\n.schematex-phylo-dendro-cut-label { font-size: 10px; fill: ${t.supportBad}; text-anchor: start; }\n${cutColors.join(\"\\n\")}\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Dendrogram Height Axis + Cut Line ──────────────────────\n\n/** \"Nice\" step for the height axis so ticks land on round numbers. */\nfunction niceStep(maxHeight: number, targetTicks: number): number {\n if (maxHeight <= 0) return 1;\n const rough = maxHeight / targetTicks;\n const mag = Math.pow(10, Math.floor(Math.log10(rough)));\n const norm = rough / mag;\n let step: number;\n if (norm < 1.5) step = 1;\n else if (norm < 3) step = 2;\n else if (norm < 7) step = 5;\n else step = 10;\n return step * mag;\n}\n\nfunction formatTick(value: number): string {\n if (value === 0) return \"0\";\n if (Math.abs(value) < 0.01) return value.toExponential(0);\n return String(Math.round(value * 1000) / 1000);\n}\n\nfunction renderDendrogramAxis(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>\n): string {\n const d = layout.dendrogram;\n if (!d) return \"\";\n\n const axisY = layout.height - 28;\n const elements: string[] = [];\n\n // Axis baseline from root (left, max height) to tips (right, height 0).\n elements.push(\n line({ x1: d.plotLeftX, y1: axisY, x2: d.baselineX, y2: axisY })\n );\n\n const step = niceStep(d.maxHeight, 5);\n for (let h = 0; h <= d.maxHeight + step * 0.001; h += step) {\n const x = d.baselineX - h * d.scale;\n elements.push(line({ x1: x, y1: axisY, x2: x, y2: axisY + 4 }));\n elements.push(\n text({ x, y: axisY + 16, \"text-anchor\": \"middle\" }, formatTick(h))\n );\n }\n\n if (layout.ast.scaleLabel) {\n elements.push(\n text(\n {\n x: (d.plotLeftX + d.baselineX) / 2,\n y: axisY + 28,\n \"text-anchor\": \"middle\",\n \"font-size\": \"9\",\n fill: t.textMuted,\n },\n layout.ast.scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-dendro-axis\" }, elements);\n}\n\nfunction renderCutLine(layout: PhyloLayoutResult): string {\n const d = layout.dendrogram;\n if (!d || d.cut === undefined) return \"\";\n\n const x = d.baselineX - d.cut * d.scale;\n const topY = 8;\n const bottomY = layout.height - 32;\n\n return group({}, [\n line({\n x1: x,\n y1: topY,\n x2: x,\n y2: bottomY,\n class: \"schematex-phylo-dendro-cut\",\n }),\n text(\n { x: x + 4, y: topY + 4, class: \"schematex-phylo-dendro-cut-label\" },\n `cut = ${formatTick(d.cut)}`\n ),\n ]);\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar (phylogram/chronogram) OR dendrogram height axis + cut line.\n const isDendro = layout.dendrogram !== undefined;\n const scaleBarEl = isDendro ? \"\" : renderScaleBar(layout, t, ast.scaleLabel);\n const dendroAxisEl = isDendro ? renderDendrogramAxis(layout, t) : \"\";\n const cutLineEl = isDendro ? renderCutLine(layout) : \"\";\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const isDendrogramMode = layout.dendrogram !== undefined;\n const descMode = isDendrogramMode ? \"dendrogram\" : ast.mode;\n const descTitle = isDendrogramMode ? \"Dendrogram\" : \"Phylogenetic Tree\";\n const cutSuffix =\n isDendrogramMode && layout.dendrogram?.cut !== undefined\n ? `, cut at ${layout.dendrogram.cut} into ${layout.dendrogram.clusterCount} clusters`\n : \"\";\n const svgContent = [\n title(`${descTitle}${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(\n `${isDendrogramMode ? \"Dendrogram\" : \"Phylogenetic tree\"} with ${leafCount} taxa, ${descMode} mode, ${ast.layout} layout${cutSuffix}`\n ),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n if (dendroAxisEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [dendroAxisEl]\n )\n );\n }\n\n if (cutLineEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [cutLineEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n parse: parsePhylo,\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { matchQuotedTitle } from './chunk-
|
|
1
|
+
import { matchQuotedTitle } from './chunk-TO6PNBT3.js';
|
|
2
2
|
import { el, group, text, circle, path, svgRoot, title, desc, defs } from './chunk-SYYBKDL7.js';
|
|
3
3
|
|
|
4
4
|
// src/diagrams/blockdiagram/parser.ts
|
|
@@ -849,5 +849,5 @@ var blockdiagram = {
|
|
|
849
849
|
};
|
|
850
850
|
|
|
851
851
|
export { blockdiagram, layoutBlockDiagram, parseBlockDiagram, renderBlockDiagram };
|
|
852
|
-
//# sourceMappingURL=chunk-
|
|
853
|
-
//# sourceMappingURL=chunk-
|
|
852
|
+
//# sourceMappingURL=chunk-DX44TBFZ.js.map
|
|
853
|
+
//# sourceMappingURL=chunk-DX44TBFZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/blockdiagram/parser.ts","../src/diagrams/blockdiagram/layout.ts","../src/diagrams/blockdiagram/renderer.ts","../src/diagrams/blockdiagram/index.ts"],"names":["text","title","i","path"],"mappings":"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","file":"chunk-C7V57V6O.js","sourcesContent":["import type {\n BlockAST,\n BlockNode,\n BlockEdge,\n SummingJunction,\n BlockRole,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class BlockDiagramParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"BlockDiagramParseError\";\n }\n}\n\nconst ROLE_VALUES = new Set<BlockRole>([\n \"plant\",\n \"controller\",\n \"sensor\",\n \"actuator\",\n \"reference\",\n \"disturbance\",\n \"generic\",\n]);\n\ninterface SignalDecl {\n id: string;\n label: string;\n discrete: boolean;\n}\n\ninterface ParsedAttrs {\n name?: string;\n role?: BlockRole;\n discrete?: boolean;\n label?: string;\n route?: \"above\" | \"below\";\n}\n\nfunction parseAttrs(s: string): ParsedAttrs {\n // Inside [ ... ] — comma-separated key:value or bare flags like \"discrete\"\n const result: ParsedAttrs = {};\n // Split at commas not inside quotes\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n\n for (const raw of parts) {\n const p = raw.trim();\n if (!p) continue;\n if (p === \"discrete\") {\n result.discrete = true;\n continue;\n }\n if (p.startsWith('\"') && p.endsWith('\"')) {\n result.label = p.slice(1, -1);\n continue;\n }\n const m = p.match(/^(\\w+)\\s*:\\s*(.+)$/);\n if (!m) continue;\n const key = m[1].toLowerCase();\n let val = m[2].trim();\n if (val.startsWith('\"') && val.endsWith('\"')) val = val.slice(1, -1);\n if (key === \"name\") result.name = val;\n else if (key === \"role\") {\n if (ROLE_VALUES.has(val as BlockRole)) result.role = val as BlockRole;\n } else if (key === \"label\") result.label = val;\n else if (key === \"route\") {\n if (val === \"above\" || val === \"below\") result.route = val;\n }\n }\n return result;\n}\n\nexport function parseBlockDiagram(text: string): BlockAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const blocks: BlockNode[] = [];\n const sums: SummingJunction[] = [];\n const connections: BlockEdge[] = [];\n const signals = new Map<string, SignalDecl>();\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i] ?? \"\";\n const lineNo = i + 1;\n const line = rawLine.replace(/#.*$/, \"\").trim();\n if (!line) continue;\n\n // Header: blockdiagram \"Title\"\n if (/^blockdiagram\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // block: ID = block(\"label\") [role: X, name: \"Y\"]\n const blockMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*block\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (blockMatch) {\n const id = blockMatch[1];\n const label = blockMatch[2];\n const attrs = blockMatch[3] ? parseAttrs(blockMatch[3]) : {};\n const node: BlockNode = { id, label, role: attrs.role ?? \"generic\" };\n if (attrs.route) node.route = attrs.route;\n blocks.push(node);\n continue;\n }\n\n // sum: ID = sum(+a, -b, ...)\n const sumMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*sum\\s*\\(([^)]*)\\)\\s*$/\n );\n if (sumMatch) {\n const id = sumMatch[1];\n const rawInputs = sumMatch[2]\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean);\n const inputs: string[] = [];\n for (const tok of rawInputs) {\n if (tok.startsWith(\"+\") || tok.startsWith(\"-\")) inputs.push(tok);\n else inputs.push(\"+\" + tok);\n }\n sums.push({ id, inputs });\n continue;\n }\n\n // signal: ID = signal(\"label\") [discrete]\n const sigMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*signal\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (sigMatch) {\n const id = sigMatch[1];\n const label = sigMatch[2];\n const attrs = sigMatch[3] ? parseAttrs(sigMatch[3]) : {};\n signals.set(id, { id, label, discrete: !!attrs.discrete });\n continue;\n }\n\n // Connection chain: `A -> B -> C [label_or_attrs]`. Inline `[id] -> [id]` (D2/Mermaid) auto-declares.\n const arrowIdx = line.indexOf(\"->\");\n if (arrowIdx >= 0) {\n let body = line;\n let tailAttrs: ParsedAttrs = {};\n // Trailing `[...]` must be preceded by whitespace, else it's an inline endpoint.\n if (body.endsWith(\"]\")) {\n let bracketStart = -1;\n let depth = 0;\n let inQuote = false;\n for (let i = body.length - 1; i >= 1; i--) {\n const ch = body[i];\n if (ch === '\"') inQuote = !inQuote;\n else if (!inQuote && ch === \"]\") depth++;\n else if (!inQuote && ch === \"[\") {\n depth--;\n if (depth === 0) {\n if (/\\s/.test(body[i - 1] ?? \"\")) bracketStart = i;\n break;\n }\n }\n }\n if (bracketStart >= 0) {\n const inner = body.slice(bracketStart + 1, -1).trim();\n const isBareId = /^[A-Za-z_]\\w*$/.test(inner);\n if (!isBareId) {\n body = body.slice(0, bracketStart).trim();\n if (inner.startsWith('\"') && inner.endsWith('\"') && !inner.slice(1, -1).includes(',')) {\n tailAttrs.label = inner.slice(1, -1);\n } else {\n tailAttrs = parseAttrs(inner);\n }\n }\n }\n }\n const parts = body.split(\"->\").map((x) => x.trim()).filter(Boolean);\n if (parts.length < 2) {\n throw new BlockDiagramParseError(`Invalid connection: ${line}`, lineNo, undefined, line);\n }\n const endpoints = parts.map((p) => {\n const m = /^\\[([A-Za-z_]\\w*)\\]$/.exec(p);\n return m ? m[1] : p;\n });\n for (const ep of endpoints) {\n if (!/^[A-Za-z_]\\w*$/.test(ep)) continue;\n const exists =\n blocks.some((b) => b.id === ep) ||\n sums.some((s) => s.id === ep) ||\n signals.has(ep);\n if (!exists) {\n blocks.push({ id: ep, label: ep, role: \"generic\" });\n }\n }\n for (let i = 0; i < endpoints.length - 1; i++) {\n const from = endpoints[i];\n const to = endpoints[i + 1];\n const isLast = i === endpoints.length - 2;\n const edge: BlockEdge = { from, to };\n if (isLast && tailAttrs.label) edge.label = tailAttrs.label;\n if (isLast && tailAttrs.discrete) edge.discrete = true;\n connections.push(edge);\n }\n continue;\n }\n }\n\n // Post-process: if edge endpoints reference a signal id, inline the signal.\n // A signal is a pass-through label. Merge edges X->sig and sig->Y into X->Y,\n // using signal's label (unless edge already has one) and discrete flag.\n if (signals.size > 0) {\n const merged: BlockEdge[] = [];\n const bySource = new Map<string, BlockEdge[]>();\n const byTarget = new Map<string, BlockEdge[]>();\n for (const e of connections) {\n if (!bySource.has(e.from)) bySource.set(e.from, []);\n bySource.get(e.from)!.push(e);\n if (!byTarget.has(e.to)) byTarget.set(e.to, []);\n byTarget.get(e.to)!.push(e);\n }\n\n const consumed = new Set<BlockEdge>();\n for (const sigId of signals.keys()) {\n const sig = signals.get(sigId)!;\n const incoming = byTarget.get(sigId) ?? [];\n const outgoing = bySource.get(sigId) ?? [];\n\n if (incoming.length > 0 && outgoing.length > 0) {\n // Full pass-through: merge X→sig + sig→Y into X→Y\n for (const ine of incoming) {\n for (const oute of outgoing) {\n consumed.add(ine);\n consumed.add(oute);\n merged.push({\n from: ine.from,\n to: oute.to,\n label: ine.label ?? oute.label ?? sig.label,\n discrete: sig.discrete || ine.discrete || oute.discrete,\n });\n }\n }\n } else if (incoming.length > 0) {\n // Dangling output signal (no consumer): keep the incoming edge but\n // apply the signal's label so the arrowhead is annotated.\n for (const ine of incoming) {\n consumed.add(ine);\n merged.push({\n from: ine.from,\n to: sigId,\n label: ine.label ?? sig.label,\n discrete: sig.discrete || ine.discrete,\n });\n }\n } else if (outgoing.length > 0) {\n // Dangling input signal (no producer): keep the outgoing edge with label.\n for (const oute of outgoing) {\n consumed.add(oute);\n merged.push({\n from: sigId,\n to: oute.to,\n label: oute.label ?? sig.label,\n discrete: sig.discrete || oute.discrete,\n });\n }\n }\n }\n // Keep edges not consumed by any signal merge\n for (const e of connections) {\n if (!consumed.has(e)) merged.push(e);\n }\n connections.length = 0;\n connections.push(...merged);\n }\n\n return {\n type: \"blockdiagram\",\n title,\n blocks,\n sums,\n connections,\n };\n}\n","import type { BlockAST, BlockEdge, BlockNode, SummingJunction } from \"../../core/types\";\n\nexport interface LaidBlock {\n kind: \"block\";\n id: string;\n label: string;\n role: string;\n x: number;\n y: number;\n width: number;\n height: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidSum {\n kind: \"sum\";\n id: string;\n cx: number;\n cy: number;\n r: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidPort {\n kind: \"port\";\n id: string;\n label: string;\n x: number;\n y: number;\n isInput: boolean;\n hasBranch?: boolean;\n}\n\nexport type LaidNode = LaidBlock | LaidSum | LaidPort;\n\nexport interface LaidEdgePolarity {\n sign: \"+\" | \"-\";\n pin: \"left\" | \"top\" | \"right\" | \"bottom\";\n x: number;\n y: number;\n}\n\nexport interface LaidEdge {\n from: string;\n to: string;\n label?: string;\n discrete: boolean;\n path: string;\n midX: number;\n midY: number;\n isFeedback: boolean;\n /** Polarity sign to draw near the target if target is a sum */\n polarity?: LaidEdgePolarity;\n}\n\nexport interface BlockDiagramLayout {\n width: number;\n height: number;\n nodes: LaidNode[];\n edges: LaidEdge[];\n title?: string;\n /** Offset applied to all y coords (>0 when feedforward rows exist above FWD_Y) */\n topOffset: number;\n}\n\nconst BLOCK_W = 100;\nconst BLOCK_H = 54;\nconst SUM_R = 12;\nconst FWD_Y = 110;\nconst ROW_GAP = 80;\nconst FIRST_ROW_OFFSET = 110;\nconst COL_GAP = 60;\nconst LEFT_PAD = 30;\nconst RIGHT_PAD = 30;\n\ninterface Track {\n /** row index (1, 2, ...); 0 means forward path */\n row: number;\n /** above = y < FWD_Y; below = y > FWD_Y */\n side: \"above\" | \"below\";\n /** Occupied col ranges [minCol, maxCol] for collision detection */\n ranges: Array<[number, number]>;\n}\n\nexport function layoutBlockDiagram(ast: BlockAST): BlockDiagramLayout {\n const nodeIds = new Set<string>();\n for (const b of ast.blocks) nodeIds.add(b.id);\n for (const s of ast.sums) nodeIds.add(s.id);\n for (const e of ast.connections) {\n nodeIds.add(e.from);\n nodeIds.add(e.to);\n }\n\n const outgoing = new Map<string, BlockEdge[]>();\n const incoming = new Map<string, BlockEdge[]>();\n for (const id of nodeIds) {\n outgoing.set(id, []);\n incoming.set(id, []);\n }\n for (const e of ast.connections) {\n outgoing.get(e.from)!.push(e);\n incoming.get(e.to)!.push(e);\n }\n\n // Entry points\n const hasIn = nodeIds.has(\"in\");\n const entries: string[] = [];\n if (hasIn) entries.push(\"in\");\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n if ((incoming.get(id) ?? []).length === 0 && !entries.includes(id)) {\n entries.push(id);\n }\n }\n\n // BFS forward (first-visit col assignment — back-edges become feedback)\n const col = new Map<string, number>();\n const queue: string[] = [];\n for (const e of entries) {\n col.set(e, 0);\n queue.push(e);\n }\n while (queue.length > 0) {\n const cur = queue.shift()!;\n const c = col.get(cur)!;\n for (const edge of outgoing.get(cur) ?? []) {\n if (!col.has(edge.to)) {\n col.set(edge.to, c + 1);\n queue.push(edge.to);\n }\n }\n }\n // Any unreached node\n for (const id of nodeIds) {\n if (!col.has(id)) col.set(id, 1);\n }\n\n // Feedback detection: outgoing edges are ALL going backward\n const isFeedback = new Set<string>();\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n const myCol = col.get(id)!;\n const outs = outgoing.get(id) ?? [];\n if (outs.length === 0) continue;\n const allBack = outs.every((e) => (col.get(e.to) ?? myCol) < myCol);\n if (allBack) isFeedback.add(id);\n }\n\n // For each feedback node, compute loop range [minCol, maxCol]\n const blockById = new Map<string, BlockNode>();\n for (const b of ast.blocks) blockById.set(b.id, b);\n\n interface FbInfo {\n id: string;\n range: [number, number];\n side: \"above\" | \"below\";\n row: number; // depth\n }\n const fbInfos: FbInfo[] = [];\n for (const id of isFeedback) {\n const outs = outgoing.get(id) ?? [];\n const ins = incoming.get(id) ?? [];\n // targets (forward nodes it feeds back into)\n const targetCols = outs.map((e) => col.get(e.to) ?? 0);\n const sourceCols = ins.map((e) => col.get(e.from) ?? 0);\n const minC = Math.min(...targetCols, ...sourceCols);\n const maxC = Math.max(...targetCols, ...sourceCols);\n const bn = blockById.get(id);\n const side: \"above\" | \"below\" = bn?.route === \"above\" ? \"above\" : \"below\";\n fbInfos.push({ id, range: [minC, maxC], side, row: 0 });\n }\n\n // Sort by range width desc (outermost first), break ties by min col\n fbInfos.sort((a, b) => {\n const wa = a.range[1] - a.range[0];\n const wb = b.range[1] - b.range[0];\n if (wa !== wb) return wb - wa;\n return a.range[0] - b.range[0];\n });\n\n // Assign tracks per side, greedy interval-overlap depth\n const tracks: Record<\"above\" | \"below\", Track[]> = { above: [], below: [] };\n for (const fb of fbInfos) {\n let row = 1;\n while (true) {\n // check if any existing block on this (side, row) has overlapping range\n const occupied = tracks[fb.side].find((t) => t.row === row);\n const conflict =\n occupied?.ranges.some(\n ([a, b]) => !(fb.range[1] < a || fb.range[0] > b)\n ) ?? false;\n if (!conflict) {\n if (occupied) occupied.ranges.push(fb.range);\n else\n tracks[fb.side].push({ row, side: fb.side, ranges: [fb.range] });\n fb.row = row;\n break;\n }\n row++;\n }\n }\n\n const maxBelowRow = tracks.below.reduce((m, t) => Math.max(m, t.row), 0);\n const maxAboveRow = tracks.above.reduce((m, t) => Math.max(m, t.row), 0);\n\n // Compute y per (side, row)\n const yFor = (side: \"above\" | \"below\", row: number): number => {\n const step = FIRST_ROW_OFFSET + (row - 1) * ROW_GAP;\n return side === \"above\" ? FWD_Y - step : FWD_Y + step;\n };\n\n // For the feedforward row(s) to have room, shift all y by topOffset\n const topOffset = maxAboveRow > 0 ? (FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP) + 30 : 30;\n const forwardY = FWD_Y + (topOffset - 30);\n\n // Remap y helper\n const rowY = (side: \"above\" | \"below\", row: number): number =>\n yFor(side, row) + (topOffset - 30);\n\n // Normalize columns\n let maxFwdCol = 0;\n for (const id of nodeIds) {\n if (!isFeedback.has(id)) maxFwdCol = Math.max(maxFwdCol, col.get(id) ?? 0);\n }\n const colCount = maxFwdCol + 1;\n const colContent = new Array(colCount).fill(BLOCK_W);\n\n const colX: number[] = [];\n {\n let x = LEFT_PAD;\n for (let i = 0; i < colCount; i++) {\n const w = i === 0 && hasIn ? 30 : colContent[i];\n colX.push(x + w / 2);\n x += w + COL_GAP;\n }\n }\n const totalWidth = colX.length\n ? colX[colX.length - 1] + BLOCK_W / 2 + RIGHT_PAD\n : 400;\n\n // Lookup for feedback row info\n const fbById = new Map<string, FbInfo>();\n for (const f of fbInfos) fbById.set(f.id, f);\n\n const nodes: LaidNode[] = [];\n const branchCount = new Map<string, number>();\n for (const e of ast.connections) {\n branchCount.set(e.from, (branchCount.get(e.from) ?? 0) + 1);\n }\n const hasBranchOf = (id: string) => (branchCount.get(id) ?? 0) > 1;\n\n for (const b of ast.blocks) {\n const c = col.get(b.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(b.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"block\",\n id: b.id,\n label: b.label,\n role: b.role ?? \"generic\",\n x: cx - BLOCK_W / 2,\n y: cy - BLOCK_H / 2,\n width: BLOCK_W,\n height: BLOCK_H,\n hasBranch: hasBranchOf(b.id),\n });\n }\n\n for (const s of ast.sums) {\n const c = col.get(s.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(s.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"sum\",\n id: s.id,\n cx,\n cy,\n r: SUM_R,\n hasBranch: hasBranchOf(s.id),\n });\n }\n\n if (hasIn) {\n nodes.push({\n kind: \"port\",\n id: \"in\",\n label: \"in\",\n x: LEFT_PAD,\n y: forwardY,\n isInput: true,\n hasBranch: hasBranchOf(\"in\"),\n });\n }\n if (nodeIds.has(\"out\")) {\n const outCol = col.get(\"out\") ?? maxFwdCol;\n const cx = colX[Math.min(outCol, colX.length - 1)];\n nodes.push({\n kind: \"port\",\n id: \"out\",\n label: \"out\",\n x: cx,\n y: forwardY,\n isInput: false,\n });\n }\n\n // Dangling signal targets: node IDs that appear as edge targets but have no\n // block / sum / port entry (i.e. they are the `to` of a signal declaration\n // with no consumer). Create a minimal output-port anchor so the edge is\n // routed and its label rendered rather than silently dropped.\n {\n const knownIds = new Set<string>([\n ...ast.blocks.map((b) => b.id),\n ...ast.sums.map((s) => s.id),\n \"in\",\n \"out\",\n ]);\n for (const id of nodeIds) {\n if (knownIds.has(id)) continue;\n if ((incoming.get(id)?.length ?? 0) === 0) continue;\n const sigCol = Math.min(col.get(id) ?? maxFwdCol + 1, colX.length - 1);\n const x = colX[sigCol] ?? (colX[colX.length - 1] ?? 0) + COL_GAP;\n nodes.push({\n kind: \"port\",\n id,\n label: \"\", // edge label carries the signal label; blank avoids double-text\n x,\n y: forwardY,\n isInput: false,\n });\n }\n }\n\n // Anchor lookup\n interface Anchor {\n left: { x: number; y: number };\n right: { x: number; y: number };\n top: { x: number; y: number };\n bottom: { x: number; y: number };\n cx: number;\n cy: number;\n }\n const anchors = new Map<string, Anchor>();\n for (const n of nodes) {\n if (n.kind === \"block\") {\n anchors.set(n.id, {\n left: { x: n.x, y: n.y + n.height / 2 },\n right: { x: n.x + n.width, y: n.y + n.height / 2 },\n top: { x: n.x + n.width / 2, y: n.y },\n bottom: { x: n.x + n.width / 2, y: n.y + n.height },\n cx: n.x + n.width / 2,\n cy: n.y + n.height / 2,\n });\n } else if (n.kind === \"sum\") {\n anchors.set(n.id, {\n left: { x: n.cx - n.r, y: n.cy },\n right: { x: n.cx + n.r, y: n.cy },\n top: { x: n.cx, y: n.cy - n.r },\n bottom: { x: n.cx, y: n.cy + n.r },\n cx: n.cx,\n cy: n.cy,\n });\n } else {\n anchors.set(n.id, {\n left: { x: n.x - 10, y: n.y },\n right: { x: n.x + (n.isInput ? 20 : 0), y: n.y },\n top: { x: n.x, y: n.y - 10 },\n bottom: { x: n.x, y: n.y + 10 },\n cx: n.x,\n cy: n.y,\n });\n }\n }\n\n // Build sum-input-polarity lookup\n const sumPolarity = new Map<string, Map<string, \"+\" | \"-\">>();\n for (const s of ast.sums) {\n const m = new Map<string, \"+\" | \"-\">();\n for (const tok of s.inputs) {\n const sign = tok.startsWith(\"-\") ? \"-\" : \"+\";\n const srcId = tok.replace(/^[+-]/, \"\");\n m.set(srcId, sign);\n }\n sumPolarity.set(s.id, m);\n }\n\n // Build edges\n const edges: LaidEdge[] = [];\n // Track horizontal-track offsets for feedback paths to avoid overlap\n const sumById = new Map<string, SummingJunction>();\n for (const s of ast.sums) sumById.set(s.id, s);\n\n for (const e of ast.connections) {\n const fromA = anchors.get(e.from);\n const toA = anchors.get(e.to);\n if (!fromA || !toA) continue;\n\n const fromFb = fbById.get(e.from);\n const toFb = fbById.get(e.to);\n const fromCol = col.get(e.from) ?? 0;\n const toCol = col.get(e.to) ?? 0;\n\n // Determine pin on target when target is a sum: left (from forward earlier),\n // bottom (from below feedback), top (from above feedforward), or right (rare, output)\n let polarity: LaidEdgePolarity | undefined;\n if (sumById.has(e.to)) {\n const pm = sumPolarity.get(e.to);\n const sign = pm?.get(e.from) ?? \"+\";\n let pin: \"left\" | \"top\" | \"bottom\" | \"right\" = \"left\";\n if (fromFb?.side === \"below\") pin = \"bottom\";\n else if (fromFb?.side === \"above\") pin = \"top\";\n else if (fromCol < toCol) pin = \"left\";\n else pin = \"bottom\";\n const sumNode = nodes.find(\n (n) => n.kind === \"sum\" && n.id === e.to\n ) as LaidSum | undefined;\n if (sumNode) {\n let px = sumNode.cx, py = sumNode.cy;\n if (pin === \"left\") {\n px = sumNode.cx - sumNode.r - 8;\n py = sumNode.cy + 6;\n } else if (pin === \"bottom\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy + sumNode.r + 10;\n } else if (pin === \"top\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy - sumNode.r - 2;\n }\n polarity = { sign, pin, x: px, y: py };\n }\n }\n\n // Route\n let path: string;\n let midX: number, midY: number;\n let isFb = false;\n\n const fromIsFbSide = fromFb?.side;\n const toIsFbSide = toFb?.side;\n\n if (fromIsFbSide && toIsFbSide === fromIsFbSide) {\n // within same feedback row\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"below\") {\n // forward → below feedback: branch down from source.bottom\n const sx = fromA.bottom.x;\n const sy = fromA.bottom.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"above\") {\n // forward → above feedforward: branch up from source.top\n const sx = fromA.top.x;\n const sy = fromA.top.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (fromIsFbSide === \"below\" && !toIsFbSide) {\n // below feedback → forward target (bottom pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (fromIsFbSide === \"above\" && !toIsFbSide) {\n // above feedforward → forward target (top pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.top.x;\n const ty = toA.top.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (toCol < fromCol) {\n // generic back-edge fallback (below)\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n const dipY = Math.max(sy, ty) + 60;\n path = `M ${sx} ${sy} L ${sx} ${dipY} L ${tx} ${dipY} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = dipY + 10;\n isFb = true;\n } else {\n // forward edge\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.left.x;\n const ty = toA.left.y;\n if (Math.abs(sy - ty) < 0.5) {\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n } else {\n const midXH = (sx + tx) / 2;\n path = `M ${sx} ${sy} L ${midXH} ${sy} L ${midXH} ${ty} L ${tx} ${ty}`;\n }\n midX = (sx + tx) / 2;\n midY = sy - 8;\n }\n\n edges.push({\n from: e.from,\n to: e.to,\n label: e.label,\n discrete: !!e.discrete,\n path,\n midX,\n midY,\n isFeedback: isFb,\n polarity,\n });\n }\n\n // Total canvas height: enough for top rows + forward + bottom rows\n const totalTopSpace =\n maxAboveRow > 0\n ? FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP + 60\n : 30;\n const totalBottomSpace =\n maxBelowRow > 0\n ? FIRST_ROW_OFFSET + (maxBelowRow - 1) * ROW_GAP + 60\n : 100;\n // `FWD_Y + 170` is a conservative floor that reserves space for feedback\n // rows. Apply it only when at least one feedback row exists; pure forward\n // diagrams (no loops) are allowed to be more compact.\n const hasFeedbackRows = maxBelowRow > 0 || maxAboveRow > 0;\n const height = Math.max(\n forwardY + totalBottomSpace,\n hasFeedbackRows ? FWD_Y + 170 : 0,\n totalTopSpace + totalBottomSpace\n );\n\n return {\n width: totalWidth,\n height,\n nodes,\n edges,\n title: ast.title,\n topOffset,\n };\n}\n","import type { BlockAST } from \"../../core/types\";\nimport { layoutBlockDiagram } from \"./layout\";\nimport {\n svgRoot,\n defs,\n group,\n el,\n circle,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\n\nconst ROLE_FILL: Record<string, string> = {\n plant: \"#ffffff\",\n controller: \"#E3F2FD\",\n sensor: \"#F3E5F5\",\n actuator: \"#E8F5E9\",\n filter: \"#FFF8E1\",\n reference: \"#ffffff\",\n disturbance: \"#FFF3E0\",\n generic: \"#ffffff\",\n};\n\nexport function renderBlockDiagram(ast: BlockAST): string {\n const layout = layoutBlockDiagram(ast);\n const titleOffset = ast.title ? 26 : 0;\n const { width } = layout;\n const height = layout.height + titleOffset;\n\n const css = `\n.schematex-bd { font-family: system-ui, -apple-system, sans-serif; }\n.schematex-bd-block { stroke: #333; stroke-width: 2; }\n.schematex-bd-tf { font: italic 14px serif; fill: #111; }\n.schematex-bd-block-name { font: 10px sans-serif; fill: #666; }\n.schematex-bd-sum { fill: #fff; stroke: #333; stroke-width: 2; }\n.schematex-bd-sum-sign { font: bold 11px sans-serif; fill: #333; }\n.schematex-bd-signal { stroke: #333; stroke-width: 2; fill: none; }\n.schematex-bd-signal-discrete { stroke: #333; stroke-width: 2; fill: none; stroke-dasharray: 6 4; }\n.schematex-bd-signal-label { font: italic 12px serif; fill: #333; }\n.schematex-bd-port-label { font: italic 13px serif; fill: #111; }\n.schematex-bd-title { font: bold 15px sans-serif; fill: #111; }\n.schematex-bd-branch { fill: #333; stroke: none; }\n`.trim();\n\n const arrowDef = el(\n \"marker\",\n {\n id: \"lt-bd-arrow\",\n markerWidth: 10,\n markerHeight: 8,\n refX: 9,\n refY: 4,\n orient: \"auto\",\n },\n [el(\"polygon\", { points: \"0 0, 10 4, 0 8\", fill: \"#333\" })]\n );\n\n const nodeSvgs: string[] = [];\n const edgeSvgs: string[] = [];\n const branchSvgs: string[] = [];\n\n for (const n of layout.nodes) {\n if (n.kind === \"block\") {\n const fill = ROLE_FILL[n.role] ?? \"#fff\";\n nodeSvgs.push(\n group(\n {\n transform: `translate(${n.x}, ${n.y})`,\n \"data-block-id\": n.id,\n \"data-block-role\": n.role,\n },\n [\n el(\"rect\", {\n width: n.width,\n height: n.height,\n fill,\n class: \"schematex-bd-block\",\n rx: 2,\n }),\n text(\n {\n x: n.width / 2,\n y: n.height / 2 + 5,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-tf\",\n },\n n.label\n ),\n ]\n )\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.x + n.width,\n cy: n.y + n.height / 2,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"sum\") {\n nodeSvgs.push(\n group({ \"data-sum-id\": n.id }, [\n circle({\n cx: n.cx,\n cy: n.cy,\n r: n.r,\n class: \"schematex-bd-sum\",\n }),\n ])\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.cx + n.r,\n cy: n.cy,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"port\") {\n nodeSvgs.push(\n group({ \"data-port-id\": n.id }, [\n text(\n {\n x: n.isInput ? n.x - 4 : n.x + 4,\n y: n.y + 4,\n \"text-anchor\": n.isInput ? \"end\" : \"start\",\n class: \"schematex-bd-port-label\",\n },\n n.label\n ),\n ])\n );\n }\n }\n\n for (const e of layout.edges) {\n const cls = e.discrete\n ? \"schematex-bd-signal-discrete\"\n : \"schematex-bd-signal\";\n edgeSvgs.push(\n pathEl({\n d: e.path,\n class: cls,\n \"marker-end\": \"url(#lt-bd-arrow)\",\n \"data-from\": e.from,\n \"data-to\": e.to,\n })\n );\n if (e.label) {\n edgeSvgs.push(\n text(\n {\n x: e.midX,\n y: e.midY,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-signal-label\",\n },\n e.label\n )\n );\n }\n if (e.polarity) {\n edgeSvgs.push(\n text(\n {\n x: e.polarity.x,\n y: e.polarity.y,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-sum-sign\",\n },\n e.polarity.sign === \"-\" ? \"−\" : \"+\"\n )\n );\n }\n }\n\n const titleSvg = ast.title\n ? text(\n {\n x: width / 2,\n y: 18,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-title\",\n },\n ast.title\n )\n : \"\";\n\n return svgRoot(\n {\n class: \"schematex-bd\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"blockdiagram\",\n },\n [\n titleEl(ast.title ?? \"Block Diagram\"),\n desc(\n `Block diagram with ${ast.blocks.length} blocks, ${ast.sums.length} summing junctions, ${ast.connections.length} signals`\n ),\n defs([el(\"style\", {}, css), arrowDef]),\n titleSvg,\n group({ transform: `translate(0, ${titleOffset})` }, [\n group({ class: \"schematex-bd-signals\" }, edgeSvgs),\n group({ class: \"schematex-bd-nodes\" }, nodeSvgs),\n group({ class: \"schematex-bd-branches\" }, branchSvgs),\n ]),\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseBlockDiagram } from \"./parser\";\nimport { renderBlockDiagram } from \"./renderer\";\n\nexport const blockdiagram: DiagramPlugin = {\n type: \"blockdiagram\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"blockdiagram\");\n },\n parse: parseBlockDiagram,\n\n render(text: string): string {\n const ast = parseBlockDiagram(text);\n return renderBlockDiagram(ast);\n },\n};\n\nexport { parseBlockDiagram } from \"./parser\";\nexport { renderBlockDiagram } from \"./renderer\";\nexport { layoutBlockDiagram } from \"./layout\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/blockdiagram/parser.ts","../src/diagrams/blockdiagram/layout.ts","../src/diagrams/blockdiagram/renderer.ts","../src/diagrams/blockdiagram/index.ts"],"names":["text","title","i","path"],"mappings":"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","file":"chunk-DX44TBFZ.js","sourcesContent":["import type {\n BlockAST,\n BlockNode,\n BlockEdge,\n SummingJunction,\n BlockRole,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class BlockDiagramParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"BlockDiagramParseError\";\n }\n}\n\nconst ROLE_VALUES = new Set<BlockRole>([\n \"plant\",\n \"controller\",\n \"sensor\",\n \"actuator\",\n \"reference\",\n \"disturbance\",\n \"generic\",\n]);\n\ninterface SignalDecl {\n id: string;\n label: string;\n discrete: boolean;\n}\n\ninterface ParsedAttrs {\n name?: string;\n role?: BlockRole;\n discrete?: boolean;\n label?: string;\n route?: \"above\" | \"below\";\n}\n\nfunction parseAttrs(s: string): ParsedAttrs {\n // Inside [ ... ] — comma-separated key:value or bare flags like \"discrete\"\n const result: ParsedAttrs = {};\n // Split at commas not inside quotes\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n\n for (const raw of parts) {\n const p = raw.trim();\n if (!p) continue;\n if (p === \"discrete\") {\n result.discrete = true;\n continue;\n }\n if (p.startsWith('\"') && p.endsWith('\"')) {\n result.label = p.slice(1, -1);\n continue;\n }\n const m = p.match(/^(\\w+)\\s*:\\s*(.+)$/);\n if (!m) continue;\n const key = m[1].toLowerCase();\n let val = m[2].trim();\n if (val.startsWith('\"') && val.endsWith('\"')) val = val.slice(1, -1);\n if (key === \"name\") result.name = val;\n else if (key === \"role\") {\n if (ROLE_VALUES.has(val as BlockRole)) result.role = val as BlockRole;\n } else if (key === \"label\") result.label = val;\n else if (key === \"route\") {\n if (val === \"above\" || val === \"below\") result.route = val;\n }\n }\n return result;\n}\n\nexport function parseBlockDiagram(text: string): BlockAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const blocks: BlockNode[] = [];\n const sums: SummingJunction[] = [];\n const connections: BlockEdge[] = [];\n const signals = new Map<string, SignalDecl>();\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i] ?? \"\";\n const lineNo = i + 1;\n const line = rawLine.replace(/#.*$/, \"\").trim();\n if (!line) continue;\n\n // Header: blockdiagram \"Title\"\n if (/^blockdiagram\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // block: ID = block(\"label\") [role: X, name: \"Y\"]\n const blockMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*block\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (blockMatch) {\n const id = blockMatch[1];\n const label = blockMatch[2];\n const attrs = blockMatch[3] ? parseAttrs(blockMatch[3]) : {};\n const node: BlockNode = { id, label, role: attrs.role ?? \"generic\" };\n if (attrs.route) node.route = attrs.route;\n blocks.push(node);\n continue;\n }\n\n // sum: ID = sum(+a, -b, ...)\n const sumMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*sum\\s*\\(([^)]*)\\)\\s*$/\n );\n if (sumMatch) {\n const id = sumMatch[1];\n const rawInputs = sumMatch[2]\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean);\n const inputs: string[] = [];\n for (const tok of rawInputs) {\n if (tok.startsWith(\"+\") || tok.startsWith(\"-\")) inputs.push(tok);\n else inputs.push(\"+\" + tok);\n }\n sums.push({ id, inputs });\n continue;\n }\n\n // signal: ID = signal(\"label\") [discrete]\n const sigMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*signal\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (sigMatch) {\n const id = sigMatch[1];\n const label = sigMatch[2];\n const attrs = sigMatch[3] ? parseAttrs(sigMatch[3]) : {};\n signals.set(id, { id, label, discrete: !!attrs.discrete });\n continue;\n }\n\n // Connection chain: `A -> B -> C [label_or_attrs]`. Inline `[id] -> [id]` (D2/Mermaid) auto-declares.\n const arrowIdx = line.indexOf(\"->\");\n if (arrowIdx >= 0) {\n let body = line;\n let tailAttrs: ParsedAttrs = {};\n // Trailing `[...]` must be preceded by whitespace, else it's an inline endpoint.\n if (body.endsWith(\"]\")) {\n let bracketStart = -1;\n let depth = 0;\n let inQuote = false;\n for (let i = body.length - 1; i >= 1; i--) {\n const ch = body[i];\n if (ch === '\"') inQuote = !inQuote;\n else if (!inQuote && ch === \"]\") depth++;\n else if (!inQuote && ch === \"[\") {\n depth--;\n if (depth === 0) {\n if (/\\s/.test(body[i - 1] ?? \"\")) bracketStart = i;\n break;\n }\n }\n }\n if (bracketStart >= 0) {\n const inner = body.slice(bracketStart + 1, -1).trim();\n const isBareId = /^[A-Za-z_]\\w*$/.test(inner);\n if (!isBareId) {\n body = body.slice(0, bracketStart).trim();\n if (inner.startsWith('\"') && inner.endsWith('\"') && !inner.slice(1, -1).includes(',')) {\n tailAttrs.label = inner.slice(1, -1);\n } else {\n tailAttrs = parseAttrs(inner);\n }\n }\n }\n }\n const parts = body.split(\"->\").map((x) => x.trim()).filter(Boolean);\n if (parts.length < 2) {\n throw new BlockDiagramParseError(`Invalid connection: ${line}`, lineNo, undefined, line);\n }\n const endpoints = parts.map((p) => {\n const m = /^\\[([A-Za-z_]\\w*)\\]$/.exec(p);\n return m ? m[1] : p;\n });\n for (const ep of endpoints) {\n if (!/^[A-Za-z_]\\w*$/.test(ep)) continue;\n const exists =\n blocks.some((b) => b.id === ep) ||\n sums.some((s) => s.id === ep) ||\n signals.has(ep);\n if (!exists) {\n blocks.push({ id: ep, label: ep, role: \"generic\" });\n }\n }\n for (let i = 0; i < endpoints.length - 1; i++) {\n const from = endpoints[i];\n const to = endpoints[i + 1];\n const isLast = i === endpoints.length - 2;\n const edge: BlockEdge = { from, to };\n if (isLast && tailAttrs.label) edge.label = tailAttrs.label;\n if (isLast && tailAttrs.discrete) edge.discrete = true;\n connections.push(edge);\n }\n continue;\n }\n }\n\n // Post-process: if edge endpoints reference a signal id, inline the signal.\n // A signal is a pass-through label. Merge edges X->sig and sig->Y into X->Y,\n // using signal's label (unless edge already has one) and discrete flag.\n if (signals.size > 0) {\n const merged: BlockEdge[] = [];\n const bySource = new Map<string, BlockEdge[]>();\n const byTarget = new Map<string, BlockEdge[]>();\n for (const e of connections) {\n if (!bySource.has(e.from)) bySource.set(e.from, []);\n bySource.get(e.from)!.push(e);\n if (!byTarget.has(e.to)) byTarget.set(e.to, []);\n byTarget.get(e.to)!.push(e);\n }\n\n const consumed = new Set<BlockEdge>();\n for (const sigId of signals.keys()) {\n const sig = signals.get(sigId)!;\n const incoming = byTarget.get(sigId) ?? [];\n const outgoing = bySource.get(sigId) ?? [];\n\n if (incoming.length > 0 && outgoing.length > 0) {\n // Full pass-through: merge X→sig + sig→Y into X→Y\n for (const ine of incoming) {\n for (const oute of outgoing) {\n consumed.add(ine);\n consumed.add(oute);\n merged.push({\n from: ine.from,\n to: oute.to,\n label: ine.label ?? oute.label ?? sig.label,\n discrete: sig.discrete || ine.discrete || oute.discrete,\n });\n }\n }\n } else if (incoming.length > 0) {\n // Dangling output signal (no consumer): keep the incoming edge but\n // apply the signal's label so the arrowhead is annotated.\n for (const ine of incoming) {\n consumed.add(ine);\n merged.push({\n from: ine.from,\n to: sigId,\n label: ine.label ?? sig.label,\n discrete: sig.discrete || ine.discrete,\n });\n }\n } else if (outgoing.length > 0) {\n // Dangling input signal (no producer): keep the outgoing edge with label.\n for (const oute of outgoing) {\n consumed.add(oute);\n merged.push({\n from: sigId,\n to: oute.to,\n label: oute.label ?? sig.label,\n discrete: sig.discrete || oute.discrete,\n });\n }\n }\n }\n // Keep edges not consumed by any signal merge\n for (const e of connections) {\n if (!consumed.has(e)) merged.push(e);\n }\n connections.length = 0;\n connections.push(...merged);\n }\n\n return {\n type: \"blockdiagram\",\n title,\n blocks,\n sums,\n connections,\n };\n}\n","import type { BlockAST, BlockEdge, BlockNode, SummingJunction } from \"../../core/types\";\n\nexport interface LaidBlock {\n kind: \"block\";\n id: string;\n label: string;\n role: string;\n x: number;\n y: number;\n width: number;\n height: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidSum {\n kind: \"sum\";\n id: string;\n cx: number;\n cy: number;\n r: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidPort {\n kind: \"port\";\n id: string;\n label: string;\n x: number;\n y: number;\n isInput: boolean;\n hasBranch?: boolean;\n}\n\nexport type LaidNode = LaidBlock | LaidSum | LaidPort;\n\nexport interface LaidEdgePolarity {\n sign: \"+\" | \"-\";\n pin: \"left\" | \"top\" | \"right\" | \"bottom\";\n x: number;\n y: number;\n}\n\nexport interface LaidEdge {\n from: string;\n to: string;\n label?: string;\n discrete: boolean;\n path: string;\n midX: number;\n midY: number;\n isFeedback: boolean;\n /** Polarity sign to draw near the target if target is a sum */\n polarity?: LaidEdgePolarity;\n}\n\nexport interface BlockDiagramLayout {\n width: number;\n height: number;\n nodes: LaidNode[];\n edges: LaidEdge[];\n title?: string;\n /** Offset applied to all y coords (>0 when feedforward rows exist above FWD_Y) */\n topOffset: number;\n}\n\nconst BLOCK_W = 100;\nconst BLOCK_H = 54;\nconst SUM_R = 12;\nconst FWD_Y = 110;\nconst ROW_GAP = 80;\nconst FIRST_ROW_OFFSET = 110;\nconst COL_GAP = 60;\nconst LEFT_PAD = 30;\nconst RIGHT_PAD = 30;\n\ninterface Track {\n /** row index (1, 2, ...); 0 means forward path */\n row: number;\n /** above = y < FWD_Y; below = y > FWD_Y */\n side: \"above\" | \"below\";\n /** Occupied col ranges [minCol, maxCol] for collision detection */\n ranges: Array<[number, number]>;\n}\n\nexport function layoutBlockDiagram(ast: BlockAST): BlockDiagramLayout {\n const nodeIds = new Set<string>();\n for (const b of ast.blocks) nodeIds.add(b.id);\n for (const s of ast.sums) nodeIds.add(s.id);\n for (const e of ast.connections) {\n nodeIds.add(e.from);\n nodeIds.add(e.to);\n }\n\n const outgoing = new Map<string, BlockEdge[]>();\n const incoming = new Map<string, BlockEdge[]>();\n for (const id of nodeIds) {\n outgoing.set(id, []);\n incoming.set(id, []);\n }\n for (const e of ast.connections) {\n outgoing.get(e.from)!.push(e);\n incoming.get(e.to)!.push(e);\n }\n\n // Entry points\n const hasIn = nodeIds.has(\"in\");\n const entries: string[] = [];\n if (hasIn) entries.push(\"in\");\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n if ((incoming.get(id) ?? []).length === 0 && !entries.includes(id)) {\n entries.push(id);\n }\n }\n\n // BFS forward (first-visit col assignment — back-edges become feedback)\n const col = new Map<string, number>();\n const queue: string[] = [];\n for (const e of entries) {\n col.set(e, 0);\n queue.push(e);\n }\n while (queue.length > 0) {\n const cur = queue.shift()!;\n const c = col.get(cur)!;\n for (const edge of outgoing.get(cur) ?? []) {\n if (!col.has(edge.to)) {\n col.set(edge.to, c + 1);\n queue.push(edge.to);\n }\n }\n }\n // Any unreached node\n for (const id of nodeIds) {\n if (!col.has(id)) col.set(id, 1);\n }\n\n // Feedback detection: outgoing edges are ALL going backward\n const isFeedback = new Set<string>();\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n const myCol = col.get(id)!;\n const outs = outgoing.get(id) ?? [];\n if (outs.length === 0) continue;\n const allBack = outs.every((e) => (col.get(e.to) ?? myCol) < myCol);\n if (allBack) isFeedback.add(id);\n }\n\n // For each feedback node, compute loop range [minCol, maxCol]\n const blockById = new Map<string, BlockNode>();\n for (const b of ast.blocks) blockById.set(b.id, b);\n\n interface FbInfo {\n id: string;\n range: [number, number];\n side: \"above\" | \"below\";\n row: number; // depth\n }\n const fbInfos: FbInfo[] = [];\n for (const id of isFeedback) {\n const outs = outgoing.get(id) ?? [];\n const ins = incoming.get(id) ?? [];\n // targets (forward nodes it feeds back into)\n const targetCols = outs.map((e) => col.get(e.to) ?? 0);\n const sourceCols = ins.map((e) => col.get(e.from) ?? 0);\n const minC = Math.min(...targetCols, ...sourceCols);\n const maxC = Math.max(...targetCols, ...sourceCols);\n const bn = blockById.get(id);\n const side: \"above\" | \"below\" = bn?.route === \"above\" ? \"above\" : \"below\";\n fbInfos.push({ id, range: [minC, maxC], side, row: 0 });\n }\n\n // Sort by range width desc (outermost first), break ties by min col\n fbInfos.sort((a, b) => {\n const wa = a.range[1] - a.range[0];\n const wb = b.range[1] - b.range[0];\n if (wa !== wb) return wb - wa;\n return a.range[0] - b.range[0];\n });\n\n // Assign tracks per side, greedy interval-overlap depth\n const tracks: Record<\"above\" | \"below\", Track[]> = { above: [], below: [] };\n for (const fb of fbInfos) {\n let row = 1;\n while (true) {\n // check if any existing block on this (side, row) has overlapping range\n const occupied = tracks[fb.side].find((t) => t.row === row);\n const conflict =\n occupied?.ranges.some(\n ([a, b]) => !(fb.range[1] < a || fb.range[0] > b)\n ) ?? false;\n if (!conflict) {\n if (occupied) occupied.ranges.push(fb.range);\n else\n tracks[fb.side].push({ row, side: fb.side, ranges: [fb.range] });\n fb.row = row;\n break;\n }\n row++;\n }\n }\n\n const maxBelowRow = tracks.below.reduce((m, t) => Math.max(m, t.row), 0);\n const maxAboveRow = tracks.above.reduce((m, t) => Math.max(m, t.row), 0);\n\n // Compute y per (side, row)\n const yFor = (side: \"above\" | \"below\", row: number): number => {\n const step = FIRST_ROW_OFFSET + (row - 1) * ROW_GAP;\n return side === \"above\" ? FWD_Y - step : FWD_Y + step;\n };\n\n // For the feedforward row(s) to have room, shift all y by topOffset\n const topOffset = maxAboveRow > 0 ? (FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP) + 30 : 30;\n const forwardY = FWD_Y + (topOffset - 30);\n\n // Remap y helper\n const rowY = (side: \"above\" | \"below\", row: number): number =>\n yFor(side, row) + (topOffset - 30);\n\n // Normalize columns\n let maxFwdCol = 0;\n for (const id of nodeIds) {\n if (!isFeedback.has(id)) maxFwdCol = Math.max(maxFwdCol, col.get(id) ?? 0);\n }\n const colCount = maxFwdCol + 1;\n const colContent = new Array(colCount).fill(BLOCK_W);\n\n const colX: number[] = [];\n {\n let x = LEFT_PAD;\n for (let i = 0; i < colCount; i++) {\n const w = i === 0 && hasIn ? 30 : colContent[i];\n colX.push(x + w / 2);\n x += w + COL_GAP;\n }\n }\n const totalWidth = colX.length\n ? colX[colX.length - 1] + BLOCK_W / 2 + RIGHT_PAD\n : 400;\n\n // Lookup for feedback row info\n const fbById = new Map<string, FbInfo>();\n for (const f of fbInfos) fbById.set(f.id, f);\n\n const nodes: LaidNode[] = [];\n const branchCount = new Map<string, number>();\n for (const e of ast.connections) {\n branchCount.set(e.from, (branchCount.get(e.from) ?? 0) + 1);\n }\n const hasBranchOf = (id: string) => (branchCount.get(id) ?? 0) > 1;\n\n for (const b of ast.blocks) {\n const c = col.get(b.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(b.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"block\",\n id: b.id,\n label: b.label,\n role: b.role ?? \"generic\",\n x: cx - BLOCK_W / 2,\n y: cy - BLOCK_H / 2,\n width: BLOCK_W,\n height: BLOCK_H,\n hasBranch: hasBranchOf(b.id),\n });\n }\n\n for (const s of ast.sums) {\n const c = col.get(s.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(s.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"sum\",\n id: s.id,\n cx,\n cy,\n r: SUM_R,\n hasBranch: hasBranchOf(s.id),\n });\n }\n\n if (hasIn) {\n nodes.push({\n kind: \"port\",\n id: \"in\",\n label: \"in\",\n x: LEFT_PAD,\n y: forwardY,\n isInput: true,\n hasBranch: hasBranchOf(\"in\"),\n });\n }\n if (nodeIds.has(\"out\")) {\n const outCol = col.get(\"out\") ?? maxFwdCol;\n const cx = colX[Math.min(outCol, colX.length - 1)];\n nodes.push({\n kind: \"port\",\n id: \"out\",\n label: \"out\",\n x: cx,\n y: forwardY,\n isInput: false,\n });\n }\n\n // Dangling signal targets: node IDs that appear as edge targets but have no\n // block / sum / port entry (i.e. they are the `to` of a signal declaration\n // with no consumer). Create a minimal output-port anchor so the edge is\n // routed and its label rendered rather than silently dropped.\n {\n const knownIds = new Set<string>([\n ...ast.blocks.map((b) => b.id),\n ...ast.sums.map((s) => s.id),\n \"in\",\n \"out\",\n ]);\n for (const id of nodeIds) {\n if (knownIds.has(id)) continue;\n if ((incoming.get(id)?.length ?? 0) === 0) continue;\n const sigCol = Math.min(col.get(id) ?? maxFwdCol + 1, colX.length - 1);\n const x = colX[sigCol] ?? (colX[colX.length - 1] ?? 0) + COL_GAP;\n nodes.push({\n kind: \"port\",\n id,\n label: \"\", // edge label carries the signal label; blank avoids double-text\n x,\n y: forwardY,\n isInput: false,\n });\n }\n }\n\n // Anchor lookup\n interface Anchor {\n left: { x: number; y: number };\n right: { x: number; y: number };\n top: { x: number; y: number };\n bottom: { x: number; y: number };\n cx: number;\n cy: number;\n }\n const anchors = new Map<string, Anchor>();\n for (const n of nodes) {\n if (n.kind === \"block\") {\n anchors.set(n.id, {\n left: { x: n.x, y: n.y + n.height / 2 },\n right: { x: n.x + n.width, y: n.y + n.height / 2 },\n top: { x: n.x + n.width / 2, y: n.y },\n bottom: { x: n.x + n.width / 2, y: n.y + n.height },\n cx: n.x + n.width / 2,\n cy: n.y + n.height / 2,\n });\n } else if (n.kind === \"sum\") {\n anchors.set(n.id, {\n left: { x: n.cx - n.r, y: n.cy },\n right: { x: n.cx + n.r, y: n.cy },\n top: { x: n.cx, y: n.cy - n.r },\n bottom: { x: n.cx, y: n.cy + n.r },\n cx: n.cx,\n cy: n.cy,\n });\n } else {\n anchors.set(n.id, {\n left: { x: n.x - 10, y: n.y },\n right: { x: n.x + (n.isInput ? 20 : 0), y: n.y },\n top: { x: n.x, y: n.y - 10 },\n bottom: { x: n.x, y: n.y + 10 },\n cx: n.x,\n cy: n.y,\n });\n }\n }\n\n // Build sum-input-polarity lookup\n const sumPolarity = new Map<string, Map<string, \"+\" | \"-\">>();\n for (const s of ast.sums) {\n const m = new Map<string, \"+\" | \"-\">();\n for (const tok of s.inputs) {\n const sign = tok.startsWith(\"-\") ? \"-\" : \"+\";\n const srcId = tok.replace(/^[+-]/, \"\");\n m.set(srcId, sign);\n }\n sumPolarity.set(s.id, m);\n }\n\n // Build edges\n const edges: LaidEdge[] = [];\n // Track horizontal-track offsets for feedback paths to avoid overlap\n const sumById = new Map<string, SummingJunction>();\n for (const s of ast.sums) sumById.set(s.id, s);\n\n for (const e of ast.connections) {\n const fromA = anchors.get(e.from);\n const toA = anchors.get(e.to);\n if (!fromA || !toA) continue;\n\n const fromFb = fbById.get(e.from);\n const toFb = fbById.get(e.to);\n const fromCol = col.get(e.from) ?? 0;\n const toCol = col.get(e.to) ?? 0;\n\n // Determine pin on target when target is a sum: left (from forward earlier),\n // bottom (from below feedback), top (from above feedforward), or right (rare, output)\n let polarity: LaidEdgePolarity | undefined;\n if (sumById.has(e.to)) {\n const pm = sumPolarity.get(e.to);\n const sign = pm?.get(e.from) ?? \"+\";\n let pin: \"left\" | \"top\" | \"bottom\" | \"right\" = \"left\";\n if (fromFb?.side === \"below\") pin = \"bottom\";\n else if (fromFb?.side === \"above\") pin = \"top\";\n else if (fromCol < toCol) pin = \"left\";\n else pin = \"bottom\";\n const sumNode = nodes.find(\n (n) => n.kind === \"sum\" && n.id === e.to\n ) as LaidSum | undefined;\n if (sumNode) {\n let px = sumNode.cx, py = sumNode.cy;\n if (pin === \"left\") {\n px = sumNode.cx - sumNode.r - 8;\n py = sumNode.cy + 6;\n } else if (pin === \"bottom\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy + sumNode.r + 10;\n } else if (pin === \"top\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy - sumNode.r - 2;\n }\n polarity = { sign, pin, x: px, y: py };\n }\n }\n\n // Route\n let path: string;\n let midX: number, midY: number;\n let isFb = false;\n\n const fromIsFbSide = fromFb?.side;\n const toIsFbSide = toFb?.side;\n\n if (fromIsFbSide && toIsFbSide === fromIsFbSide) {\n // within same feedback row\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"below\") {\n // forward → below feedback: branch down from source.bottom\n const sx = fromA.bottom.x;\n const sy = fromA.bottom.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"above\") {\n // forward → above feedforward: branch up from source.top\n const sx = fromA.top.x;\n const sy = fromA.top.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (fromIsFbSide === \"below\" && !toIsFbSide) {\n // below feedback → forward target (bottom pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (fromIsFbSide === \"above\" && !toIsFbSide) {\n // above feedforward → forward target (top pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.top.x;\n const ty = toA.top.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (toCol < fromCol) {\n // generic back-edge fallback (below)\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n const dipY = Math.max(sy, ty) + 60;\n path = `M ${sx} ${sy} L ${sx} ${dipY} L ${tx} ${dipY} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = dipY + 10;\n isFb = true;\n } else {\n // forward edge\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.left.x;\n const ty = toA.left.y;\n if (Math.abs(sy - ty) < 0.5) {\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n } else {\n const midXH = (sx + tx) / 2;\n path = `M ${sx} ${sy} L ${midXH} ${sy} L ${midXH} ${ty} L ${tx} ${ty}`;\n }\n midX = (sx + tx) / 2;\n midY = sy - 8;\n }\n\n edges.push({\n from: e.from,\n to: e.to,\n label: e.label,\n discrete: !!e.discrete,\n path,\n midX,\n midY,\n isFeedback: isFb,\n polarity,\n });\n }\n\n // Total canvas height: enough for top rows + forward + bottom rows\n const totalTopSpace =\n maxAboveRow > 0\n ? FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP + 60\n : 30;\n const totalBottomSpace =\n maxBelowRow > 0\n ? FIRST_ROW_OFFSET + (maxBelowRow - 1) * ROW_GAP + 60\n : 100;\n // `FWD_Y + 170` is a conservative floor that reserves space for feedback\n // rows. Apply it only when at least one feedback row exists; pure forward\n // diagrams (no loops) are allowed to be more compact.\n const hasFeedbackRows = maxBelowRow > 0 || maxAboveRow > 0;\n const height = Math.max(\n forwardY + totalBottomSpace,\n hasFeedbackRows ? FWD_Y + 170 : 0,\n totalTopSpace + totalBottomSpace\n );\n\n return {\n width: totalWidth,\n height,\n nodes,\n edges,\n title: ast.title,\n topOffset,\n };\n}\n","import type { BlockAST } from \"../../core/types\";\nimport { layoutBlockDiagram } from \"./layout\";\nimport {\n svgRoot,\n defs,\n group,\n el,\n circle,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\n\nconst ROLE_FILL: Record<string, string> = {\n plant: \"#ffffff\",\n controller: \"#E3F2FD\",\n sensor: \"#F3E5F5\",\n actuator: \"#E8F5E9\",\n filter: \"#FFF8E1\",\n reference: \"#ffffff\",\n disturbance: \"#FFF3E0\",\n generic: \"#ffffff\",\n};\n\nexport function renderBlockDiagram(ast: BlockAST): string {\n const layout = layoutBlockDiagram(ast);\n const titleOffset = ast.title ? 26 : 0;\n const { width } = layout;\n const height = layout.height + titleOffset;\n\n const css = `\n.schematex-bd { font-family: system-ui, -apple-system, sans-serif; }\n.schematex-bd-block { stroke: #333; stroke-width: 2; }\n.schematex-bd-tf { font: italic 14px serif; fill: #111; }\n.schematex-bd-block-name { font: 10px sans-serif; fill: #666; }\n.schematex-bd-sum { fill: #fff; stroke: #333; stroke-width: 2; }\n.schematex-bd-sum-sign { font: bold 11px sans-serif; fill: #333; }\n.schematex-bd-signal { stroke: #333; stroke-width: 2; fill: none; }\n.schematex-bd-signal-discrete { stroke: #333; stroke-width: 2; fill: none; stroke-dasharray: 6 4; }\n.schematex-bd-signal-label { font: italic 12px serif; fill: #333; }\n.schematex-bd-port-label { font: italic 13px serif; fill: #111; }\n.schematex-bd-title { font: bold 15px sans-serif; fill: #111; }\n.schematex-bd-branch { fill: #333; stroke: none; }\n`.trim();\n\n const arrowDef = el(\n \"marker\",\n {\n id: \"lt-bd-arrow\",\n markerWidth: 10,\n markerHeight: 8,\n refX: 9,\n refY: 4,\n orient: \"auto\",\n },\n [el(\"polygon\", { points: \"0 0, 10 4, 0 8\", fill: \"#333\" })]\n );\n\n const nodeSvgs: string[] = [];\n const edgeSvgs: string[] = [];\n const branchSvgs: string[] = [];\n\n for (const n of layout.nodes) {\n if (n.kind === \"block\") {\n const fill = ROLE_FILL[n.role] ?? \"#fff\";\n nodeSvgs.push(\n group(\n {\n transform: `translate(${n.x}, ${n.y})`,\n \"data-block-id\": n.id,\n \"data-block-role\": n.role,\n },\n [\n el(\"rect\", {\n width: n.width,\n height: n.height,\n fill,\n class: \"schematex-bd-block\",\n rx: 2,\n }),\n text(\n {\n x: n.width / 2,\n y: n.height / 2 + 5,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-tf\",\n },\n n.label\n ),\n ]\n )\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.x + n.width,\n cy: n.y + n.height / 2,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"sum\") {\n nodeSvgs.push(\n group({ \"data-sum-id\": n.id }, [\n circle({\n cx: n.cx,\n cy: n.cy,\n r: n.r,\n class: \"schematex-bd-sum\",\n }),\n ])\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.cx + n.r,\n cy: n.cy,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"port\") {\n nodeSvgs.push(\n group({ \"data-port-id\": n.id }, [\n text(\n {\n x: n.isInput ? n.x - 4 : n.x + 4,\n y: n.y + 4,\n \"text-anchor\": n.isInput ? \"end\" : \"start\",\n class: \"schematex-bd-port-label\",\n },\n n.label\n ),\n ])\n );\n }\n }\n\n for (const e of layout.edges) {\n const cls = e.discrete\n ? \"schematex-bd-signal-discrete\"\n : \"schematex-bd-signal\";\n edgeSvgs.push(\n pathEl({\n d: e.path,\n class: cls,\n \"marker-end\": \"url(#lt-bd-arrow)\",\n \"data-from\": e.from,\n \"data-to\": e.to,\n })\n );\n if (e.label) {\n edgeSvgs.push(\n text(\n {\n x: e.midX,\n y: e.midY,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-signal-label\",\n },\n e.label\n )\n );\n }\n if (e.polarity) {\n edgeSvgs.push(\n text(\n {\n x: e.polarity.x,\n y: e.polarity.y,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-sum-sign\",\n },\n e.polarity.sign === \"-\" ? \"−\" : \"+\"\n )\n );\n }\n }\n\n const titleSvg = ast.title\n ? text(\n {\n x: width / 2,\n y: 18,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-title\",\n },\n ast.title\n )\n : \"\";\n\n return svgRoot(\n {\n class: \"schematex-bd\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"blockdiagram\",\n },\n [\n titleEl(ast.title ?? \"Block Diagram\"),\n desc(\n `Block diagram with ${ast.blocks.length} blocks, ${ast.sums.length} summing junctions, ${ast.connections.length} signals`\n ),\n defs([el(\"style\", {}, css), arrowDef]),\n titleSvg,\n group({ transform: `translate(0, ${titleOffset})` }, [\n group({ class: \"schematex-bd-signals\" }, edgeSvgs),\n group({ class: \"schematex-bd-nodes\" }, nodeSvgs),\n group({ class: \"schematex-bd-branches\" }, branchSvgs),\n ]),\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseBlockDiagram } from \"./parser\";\nimport { renderBlockDiagram } from \"./renderer\";\n\nexport const blockdiagram: DiagramPlugin = {\n type: \"blockdiagram\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"blockdiagram\");\n },\n parse: parseBlockDiagram,\n\n render(text: string): string {\n const ast = parseBlockDiagram(text);\n return renderBlockDiagram(ast);\n },\n};\n\nexport { parseBlockDiagram } from \"./parser\";\nexport { renderBlockDiagram } from \"./renderer\";\nexport { layoutBlockDiagram } from \"./layout\";\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveBaseTheme } from './chunk-UK6HF6PE.js';
|
|
2
|
-
import { matchQuotedTitle } from './chunk-
|
|
2
|
+
import { matchQuotedTitle } from './chunk-TO6PNBT3.js';
|
|
3
3
|
import { title, desc, el, text, path, rect, group, svgRoot, escapeXml, circle } from './chunk-SYYBKDL7.js';
|
|
4
4
|
|
|
5
5
|
// src/diagrams/orgchart/parser.ts
|
|
@@ -1077,5 +1077,5 @@ var orgchart = {
|
|
|
1077
1077
|
};
|
|
1078
1078
|
|
|
1079
1079
|
export { OrgchartParseError, layoutOrgchart, lintOrgchart, orgchart, parseOrgchart, renderOrgchart };
|
|
1080
|
-
//# sourceMappingURL=chunk-
|
|
1081
|
-
//# sourceMappingURL=chunk-
|
|
1080
|
+
//# sourceMappingURL=chunk-E3CAJGJM.js.map
|
|
1081
|
+
//# sourceMappingURL=chunk-E3CAJGJM.js.map
|