schematex 0.3.4 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +5 -4
  2. package/dist/ai/ai-sdk.cjs +20 -19
  3. package/dist/ai/ai-sdk.cjs.map +1 -1
  4. package/dist/ai/ai-sdk.d.cts +2 -2
  5. package/dist/ai/ai-sdk.d.ts +2 -2
  6. package/dist/ai/ai-sdk.js +15 -14
  7. package/dist/ai/ai-sdk.js.map +1 -1
  8. package/dist/ai/index.cjs +23 -22
  9. package/dist/ai/index.d.cts +2 -2
  10. package/dist/ai/index.d.ts +2 -2
  11. package/dist/ai/index.js +15 -14
  12. package/dist/{api-BuFilDQB.d.cts → api-BIj9t4Oc.d.cts} +1 -1
  13. package/dist/{api-BuFilDQB.d.ts → api-BIj9t4Oc.d.ts} +1 -1
  14. package/dist/browser.cjs +17 -16
  15. package/dist/browser.cjs.map +1 -1
  16. package/dist/browser.d.cts +2 -2
  17. package/dist/browser.d.ts +2 -2
  18. package/dist/browser.js +15 -14
  19. package/dist/browser.js.map +1 -1
  20. package/dist/{chunk-4THC4VUA.cjs → chunk-2Z543TC3.cjs} +7 -6
  21. package/dist/chunk-2Z543TC3.cjs.map +1 -0
  22. package/dist/{chunk-DNZV4V4R.js → chunk-4SJSIJK2.js} +831 -10
  23. package/dist/chunk-4SJSIJK2.js.map +1 -0
  24. package/dist/{chunk-ZKDL6Y3O.js → chunk-5FF2IT3C.js} +5 -4
  25. package/dist/chunk-5FF2IT3C.js.map +1 -0
  26. package/dist/chunk-5IKOLUWK.js +89 -0
  27. package/dist/chunk-5IKOLUWK.js.map +1 -0
  28. package/dist/{chunk-3RAVPXLN.js → chunk-6URNSB6G.js} +5 -4
  29. package/dist/chunk-6URNSB6G.js.map +1 -0
  30. package/dist/{chunk-MIKCKV27.cjs → chunk-BW4KGTV7.cjs} +65 -31
  31. package/dist/chunk-BW4KGTV7.cjs.map +1 -0
  32. package/dist/{chunk-DBMZEZLF.cjs → chunk-DHHVYSQX.cjs} +6229 -51
  33. package/dist/chunk-DHHVYSQX.cjs.map +1 -0
  34. package/dist/{chunk-6ULC3UHJ.cjs → chunk-E2EJRVWS.cjs} +43 -12
  35. package/dist/chunk-E2EJRVWS.cjs.map +1 -0
  36. package/dist/{chunk-5CTERELC.js → chunk-EPKIJEH7.js} +5 -4
  37. package/dist/chunk-EPKIJEH7.js.map +1 -0
  38. package/dist/{chunk-IFR34VTL.cjs → chunk-GZY4CJ23.cjs} +5 -4
  39. package/dist/chunk-GZY4CJ23.cjs.map +1 -0
  40. package/dist/{chunk-TWAC2IIS.js → chunk-I55HO32M.js} +5 -4
  41. package/dist/chunk-I55HO32M.js.map +1 -0
  42. package/dist/{chunk-5SKT7RYR.js → chunk-J7JWMQD5.js} +7 -6
  43. package/dist/chunk-J7JWMQD5.js.map +1 -0
  44. package/dist/{chunk-PWI4NFYR.js → chunk-JDBG5DU2.js} +5 -4
  45. package/dist/chunk-JDBG5DU2.js.map +1 -0
  46. package/dist/{chunk-VRE5VWDQ.js → chunk-KVP7AORH.js} +43 -12
  47. package/dist/chunk-KVP7AORH.js.map +1 -0
  48. package/dist/{chunk-IURM4ZWE.js → chunk-L3CTXXVZ.js} +65 -31
  49. package/dist/chunk-L3CTXXVZ.js.map +1 -0
  50. package/dist/chunk-NAGUZFXX.cjs +94 -0
  51. package/dist/chunk-NAGUZFXX.cjs.map +1 -0
  52. package/dist/{chunk-H5JYZ5YS.cjs → chunk-OIZ4MYSF.cjs} +5 -4
  53. package/dist/chunk-OIZ4MYSF.cjs.map +1 -0
  54. package/dist/{chunk-T47A6XUK.cjs → chunk-QUKVGHN4.cjs} +5 -4
  55. package/dist/chunk-QUKVGHN4.cjs.map +1 -0
  56. package/dist/{chunk-V4OVUBLA.cjs → chunk-RYVV5UVI.cjs} +5 -4
  57. package/dist/chunk-RYVV5UVI.cjs.map +1 -0
  58. package/dist/{chunk-CQP5YHVK.cjs → chunk-S2KJRHDZ.cjs} +4 -5
  59. package/dist/chunk-S2KJRHDZ.cjs.map +1 -0
  60. package/dist/{chunk-5COUZTVA.cjs → chunk-ST5YRTTV.cjs} +5 -4
  61. package/dist/chunk-ST5YRTTV.cjs.map +1 -0
  62. package/dist/{chunk-CS67UBP3.cjs → chunk-SUIDD2C5.cjs} +5 -4
  63. package/dist/chunk-SUIDD2C5.cjs.map +1 -0
  64. package/dist/{chunk-DHKKDIVT.js → chunk-SZK376QB.js} +5 -4
  65. package/dist/chunk-SZK376QB.js.map +1 -0
  66. package/dist/{chunk-WIFGBWET.cjs → chunk-UUBNQV2T.cjs} +4 -5
  67. package/dist/chunk-UUBNQV2T.cjs.map +1 -0
  68. package/dist/{chunk-I6VEXSUK.js → chunk-VDSYMSUY.js} +4 -5
  69. package/dist/chunk-VDSYMSUY.js.map +1 -0
  70. package/dist/{chunk-J3Y2QDJR.cjs → chunk-WCAADEXJ.cjs} +833 -12
  71. package/dist/chunk-WCAADEXJ.cjs.map +1 -0
  72. package/dist/{chunk-XSNNGYXZ.cjs → chunk-YLEVMOK2.cjs} +22 -8
  73. package/dist/chunk-YLEVMOK2.cjs.map +1 -0
  74. package/dist/{chunk-HKJRHXGZ.js → chunk-Z5NGIM4Z.js} +6217 -39
  75. package/dist/chunk-Z5NGIM4Z.js.map +1 -0
  76. package/dist/{chunk-ZQZNWAHH.js → chunk-ZX74KJPM.js} +4 -5
  77. package/dist/chunk-ZX74KJPM.js.map +1 -0
  78. package/dist/{chunk-IZMAZOQI.js → chunk-ZYRCPSBU.js} +22 -8
  79. package/dist/chunk-ZYRCPSBU.js.map +1 -0
  80. package/dist/diagrams/blockdiagram/index.cjs +6 -5
  81. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  82. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  83. package/dist/diagrams/blockdiagram/index.js +2 -1
  84. package/dist/diagrams/circuit/index.cjs +8 -7
  85. package/dist/diagrams/circuit/index.d.cts +1 -1
  86. package/dist/diagrams/circuit/index.d.ts +1 -1
  87. package/dist/diagrams/circuit/index.js +2 -1
  88. package/dist/diagrams/ecomap/index.d.cts +1 -1
  89. package/dist/diagrams/ecomap/index.d.ts +1 -1
  90. package/dist/diagrams/entity/index.cjs +6 -5
  91. package/dist/diagrams/entity/index.d.cts +1 -1
  92. package/dist/diagrams/entity/index.d.ts +1 -1
  93. package/dist/diagrams/entity/index.js +2 -1
  94. package/dist/diagrams/fishbone/index.d.cts +1 -1
  95. package/dist/diagrams/fishbone/index.d.ts +1 -1
  96. package/dist/diagrams/flowchart/index.cjs +7 -7
  97. package/dist/diagrams/flowchart/index.d.cts +2 -2
  98. package/dist/diagrams/flowchart/index.d.ts +2 -2
  99. package/dist/diagrams/flowchart/index.js +1 -1
  100. package/dist/diagrams/genogram/index.d.cts +1 -1
  101. package/dist/diagrams/genogram/index.d.ts +1 -1
  102. package/dist/diagrams/ladder/index.cjs +6 -5
  103. package/dist/diagrams/ladder/index.d.cts +1 -1
  104. package/dist/diagrams/ladder/index.d.ts +1 -1
  105. package/dist/diagrams/ladder/index.js +2 -1
  106. package/dist/diagrams/logic/index.cjs +6 -5
  107. package/dist/diagrams/logic/index.d.cts +1 -1
  108. package/dist/diagrams/logic/index.d.ts +1 -1
  109. package/dist/diagrams/logic/index.js +2 -1
  110. package/dist/diagrams/orgchart/index.cjs +7 -6
  111. package/dist/diagrams/orgchart/index.d.cts +1 -1
  112. package/dist/diagrams/orgchart/index.d.ts +1 -1
  113. package/dist/diagrams/orgchart/index.js +2 -1
  114. package/dist/diagrams/pedigree/index.d.cts +1 -1
  115. package/dist/diagrams/pedigree/index.d.ts +1 -1
  116. package/dist/diagrams/phylo/index.cjs +7 -6
  117. package/dist/diagrams/phylo/index.d.cts +1 -1
  118. package/dist/diagrams/phylo/index.d.ts +1 -1
  119. package/dist/diagrams/phylo/index.js +2 -1
  120. package/dist/diagrams/sld/index.cjs +6 -5
  121. package/dist/diagrams/sld/index.d.cts +1 -1
  122. package/dist/diagrams/sld/index.d.ts +1 -1
  123. package/dist/diagrams/sld/index.js +2 -1
  124. package/dist/diagrams/sociogram/index.cjs +6 -5
  125. package/dist/diagrams/sociogram/index.d.cts +1 -1
  126. package/dist/diagrams/sociogram/index.d.ts +1 -1
  127. package/dist/diagrams/sociogram/index.js +2 -1
  128. package/dist/diagrams/timing/index.cjs +5 -4
  129. package/dist/diagrams/timing/index.d.cts +1 -1
  130. package/dist/diagrams/timing/index.d.ts +1 -1
  131. package/dist/diagrams/timing/index.js +2 -1
  132. package/dist/diagrams/venn/index.cjs +9 -8
  133. package/dist/diagrams/venn/index.d.cts +1 -1
  134. package/dist/diagrams/venn/index.d.ts +1 -1
  135. package/dist/diagrams/venn/index.js +2 -1
  136. package/dist/{index-D3u6vcA4.d.ts → index-CGK0xVls.d.ts} +3 -3
  137. package/dist/{index-bdfj6FpQ.d.cts → index-OW8eDrKj.d.cts} +3 -3
  138. package/dist/index.cjs +32 -31
  139. package/dist/index.d.cts +3 -3
  140. package/dist/index.d.ts +3 -3
  141. package/dist/index.js +14 -13
  142. package/dist/react.cjs +15 -14
  143. package/dist/react.cjs.map +1 -1
  144. package/dist/react.d.cts +1 -1
  145. package/dist/react.d.ts +1 -1
  146. package/dist/react.js +14 -13
  147. package/dist/react.js.map +1 -1
  148. package/dist/{types-DnU2UlWz.d.ts → types-Gkyab1sL.d.cts} +5 -1
  149. package/dist/{types-DnU2UlWz.d.cts → types-Gkyab1sL.d.ts} +5 -1
  150. package/package.json +2 -2
  151. package/dist/chunk-3RAVPXLN.js.map +0 -1
  152. package/dist/chunk-4THC4VUA.cjs.map +0 -1
  153. package/dist/chunk-5COUZTVA.cjs.map +0 -1
  154. package/dist/chunk-5CTERELC.js.map +0 -1
  155. package/dist/chunk-5SKT7RYR.js.map +0 -1
  156. package/dist/chunk-6ULC3UHJ.cjs.map +0 -1
  157. package/dist/chunk-CQP5YHVK.cjs.map +0 -1
  158. package/dist/chunk-CS67UBP3.cjs.map +0 -1
  159. package/dist/chunk-DBMZEZLF.cjs.map +0 -1
  160. package/dist/chunk-DHKKDIVT.js.map +0 -1
  161. package/dist/chunk-DNZV4V4R.js.map +0 -1
  162. package/dist/chunk-H5JYZ5YS.cjs.map +0 -1
  163. package/dist/chunk-HKJRHXGZ.js.map +0 -1
  164. package/dist/chunk-I6VEXSUK.js.map +0 -1
  165. package/dist/chunk-IFR34VTL.cjs.map +0 -1
  166. package/dist/chunk-IURM4ZWE.js.map +0 -1
  167. package/dist/chunk-IZMAZOQI.js.map +0 -1
  168. package/dist/chunk-J3Y2QDJR.cjs.map +0 -1
  169. package/dist/chunk-MIKCKV27.cjs.map +0 -1
  170. package/dist/chunk-PWI4NFYR.js.map +0 -1
  171. package/dist/chunk-T47A6XUK.cjs.map +0 -1
  172. package/dist/chunk-TWAC2IIS.js.map +0 -1
  173. package/dist/chunk-V4OVUBLA.cjs.map +0 -1
  174. package/dist/chunk-VRE5VWDQ.js.map +0 -1
  175. package/dist/chunk-WIFGBWET.cjs.map +0 -1
  176. package/dist/chunk-XSNNGYXZ.cjs.map +0 -1
  177. package/dist/chunk-ZKDL6Y3O.js.map +0 -1
  178. package/dist/chunk-ZQZNWAHH.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { resolveIndustrialTheme } from './chunk-2VNMKOUO.js';
2
+ import { matchQuotedTitle } from './chunk-5IKOLUWK.js';
2
3
  import { title, desc, el, text, path, group, svgRoot } from './chunk-SYYBKDL7.js';
3
4
 
4
5
  // src/diagrams/ladder/parser.ts
@@ -157,8 +158,8 @@ function parseLadderDSL(text2) {
157
158
  }
158
159
  const line = stripped.trim();
159
160
  if (/^ladder\b/i.test(line)) {
160
- const m = line.match(/"([^"]*)"/);
161
- if (m) title2 = m[1];
161
+ const t = matchQuotedTitle(line);
162
+ if (t !== void 0) title2 = t;
162
163
  continue;
163
164
  }
164
165
  const rungMatch = line.match(/^rung\s+(\d+)(?:\s+"([^"]*)")?\s*:\s*$/i);
@@ -748,5 +749,5 @@ var ladder = {
748
749
  };
749
750
 
750
751
  export { ladder, layoutLadder, parseLadderDSL, renderLadder };
751
- //# sourceMappingURL=chunk-ZKDL6Y3O.js.map
752
- //# sourceMappingURL=chunk-ZKDL6Y3O.js.map
752
+ //# sourceMappingURL=chunk-5FF2IT3C.js.map
753
+ //# sourceMappingURL=chunk-5FF2IT3C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diagrams/ladder/parser.ts","../src/diagrams/ladder/layout.ts","../src/diagrams/ladder/renderer.ts","../src/diagrams/ladder/index.ts"],"names":["text","title","el","w","h","slot","nx","ny","id","LINE_H"],"mappings":"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","file":"chunk-5FF2IT3C.js","sourcesContent":["import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n LadderContactType,\n LadderCoilType,\n LadderFBType,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class LadderParseError 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 = \"LadderParseError\";\n }\n}\n\nconst CONTACT_TYPES = new Set<LadderContactType>([\"XIC\", \"XIO\", \"ONS\", \"OSF\"]);\nconst COIL_TYPES = new Set<LadderCoilType>([\"OTE\", \"OTL\", \"OTU\", \"OTN\"]);\nconst FB_TYPES = new Set<LadderFBType>([\n \"TON\", \"TOFF\", \"TP\",\n \"CTU\", \"CTD\", \"CTUD\",\n \"ADD\", \"SUB\", \"MUL\", \"DIV\",\n \"MOV\",\n \"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\",\n]);\n\n/** Split comma-separated args respecting quoted strings. */\nfunction splitArgs(s: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n out.push(cur.trim());\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) out.push(cur.trim());\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n/** Parse one element line, e.g. XIC(START), TON(T1, PT=5000), OTE(MOTOR). */\nfunction parseElement(line: string, lineNo: number): LadderElement {\n const m = line.match(/^([A-Z][A-Z0-9_]*)\\s*\\(\\s*([^)]*)\\s*\\)\\s*$/);\n if (!m) {\n throw new LadderParseError(`invalid element syntax: ${line}`, lineNo, undefined, line);\n }\n const op = m[1] as string;\n const args = splitArgs(m[2]);\n if (args.length === 0 || !args[0]) {\n throw new LadderParseError(`element missing tag: ${line}`, lineNo, undefined, line);\n }\n const tag = args[0];\n\n if (CONTACT_TYPES.has(op as LadderContactType)) {\n const contact: LadderContact = {\n elementType: \"contact\",\n contactType: op as LadderContactType,\n tag,\n };\n // optional address as second positional or address=...\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") contact.address = stripQuotes(kv[2]);\n else if (key === \"name\") contact.name = stripQuotes(kv[2]);\n } else {\n contact.address = stripQuotes(a);\n }\n }\n return contact;\n }\n\n if (COIL_TYPES.has(op as LadderCoilType)) {\n const coil: LadderCoil = {\n elementType: \"coil\",\n coilType: op as LadderCoilType,\n tag,\n };\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") coil.address = stripQuotes(kv[2]);\n else if (key === \"name\") coil.name = stripQuotes(kv[2]);\n } else {\n coil.address = stripQuotes(a);\n }\n }\n return coil;\n }\n\n if (FB_TYPES.has(op as LadderFBType)) {\n const params: Record<string, string | number> = {};\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const v = stripQuotes(kv[2]);\n const n = Number(v);\n params[kv[1]] = Number.isFinite(n) && v !== \"\" && /^-?\\d+(\\.\\d+)?$/.test(v) ? n : v;\n }\n }\n const fb: LadderFunctionBlock = {\n elementType: \"function_block\",\n fbType: op as LadderFBType,\n tag,\n params,\n };\n return fb;\n }\n\n throw new LadderParseError(`unknown element type \"${op}\"`, lineNo, undefined, line);\n}\n\nexport function parseLadderDSL(text: string): LadderAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const rungs: LadderRung[] = [];\n\n let currentRung: LadderRung | null = null;\n let currentParallel: LadderBranch[] | null = null;\n let currentBranch: LadderBranch | null = null;\n let parallelIndent = -1;\n let branchIndent = -1;\n\n function finishParallel() {\n if (currentRung && currentParallel) {\n currentRung.elements.push({ parallel: currentParallel });\n }\n currentParallel = null;\n currentBranch = null;\n parallelIndent = -1;\n branchIndent = -1;\n }\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i];\n const lineNo = i + 1;\n const stripped = raw.replace(/#.*$/, \"\");\n if (!stripped.trim()) continue;\n\n // indentation = count of leading spaces/tabs (tab = 2)\n let indent = 0;\n for (const ch of stripped) {\n if (ch === \" \") indent++;\n else if (ch === \"\\t\") indent += 2;\n else break;\n }\n const line = stripped.trim();\n\n // Header: ladder \"title\"\n if (/^ladder\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // Rung: rung N \"comment\":\n const rungMatch = line.match(/^rung\\s+(\\d+)(?:\\s+\"([^\"]*)\")?\\s*:\\s*$/i);\n if (rungMatch) {\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n currentRung = {\n number: Number(rungMatch[1]),\n comment: rungMatch[2],\n elements: [],\n };\n continue;\n }\n\n if (!currentRung) {\n throw new LadderParseError(`element outside of rung: ${line}`, lineNo, undefined, line);\n }\n\n // parallel:\n if (/^parallel\\s*:\\s*$/i.test(line)) {\n finishParallel();\n currentParallel = [];\n parallelIndent = indent;\n continue;\n }\n\n // branch:\n if (/^branch\\s*:\\s*$/i.test(line)) {\n if (!currentParallel) {\n throw new LadderParseError(`branch: without parallel:`, lineNo, undefined, line);\n }\n currentBranch = { elements: [] };\n currentParallel.push(currentBranch);\n branchIndent = indent;\n continue;\n }\n\n // If we're in a parallel block but indent fell back, close it.\n if (currentParallel && indent <= parallelIndent) {\n finishParallel();\n }\n\n const element = parseElement(line, lineNo);\n\n if (currentParallel && currentBranch && indent > branchIndent) {\n currentBranch.elements.push(element);\n } else {\n if (currentParallel) finishParallel();\n currentRung.elements.push(element);\n }\n }\n\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n\n if (rungs.length === 0) {\n throw new LadderParseError(\"Ladder diagram has no rungs\");\n }\n\n return { type: \"ladder\", title, rungs };\n}\n","import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n} from \"../../core/types\";\n\nexport const LEFT_RAIL_X = 60;\nexport const RIGHT_RAIL_MARGIN = 30;\nexport const BASE_RUNG_HEIGHT = 100;\nexport const ELEMENT_WIDTH = 32;\nexport const ELEMENT_HEIGHT = 24;\nexport const FB_WIDTH = 80;\nexport const FB_HEIGHT = 56;\nexport const CMP_WIDTH = 56;\nexport const CMP_HEIGHT = 34;\nexport const RUNG_Y_OFFSET = 70;\nexport const H_SPACING = 16;\nexport const PARALLEL_GAP = 14;\nexport const CANVAS_PADDING = 30;\n\n/** Rough chars → pixels for 9px font */\nconst CHAR_W = 6.1;\nconst LINE_H = 11;\n\nexport type LadderElementKind =\n | \"contact\"\n | \"coil\"\n | \"function_block\"\n | \"compare\";\n\nexport interface LadderLayoutNode {\n id: string;\n rungIndex: number;\n element: LadderElement;\n kind: LadderElementKind;\n /** x of the element body (left edge) */\n x: number;\n /** y of the element body (top edge) */\n y: number;\n width: number;\n height: number;\n /** rung centerline Y (where wires attach) */\n rungY: number;\n}\n\nexport interface LadderLayoutWire {\n path: string;\n}\n\nexport interface LadderLayoutRung {\n rung: LadderRung;\n index: number;\n y: number;\n /** Rightmost x reached by elements on this rung. */\n endX: number;\n /** Rung slot total height (used for spacing). */\n height: number;\n /** Total pixel height reserved above rungY for name/tag labels. */\n headerHeight: number;\n}\n\nexport interface LadderLayoutResult {\n width: number;\n height: number;\n leftRailX: number;\n rightRailX: number;\n rungs: LadderLayoutRung[];\n nodes: LadderLayoutNode[];\n wires: LadderLayoutWire[];\n}\n\nconst COMPARE_TYPES = new Set([\"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\"]);\n\nfunction bodyWidth(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_WIDTH;\n return FB_WIDTH;\n }\n return ELEMENT_WIDTH;\n}\n\nfunction bodyHeight(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_HEIGHT;\n return FB_HEIGHT;\n }\n return ELEMENT_HEIGHT;\n}\n\nfunction elementKind(el: LadderElement): LadderElementKind {\n if (el.elementType === \"contact\") return \"contact\";\n if (el.elementType === \"coil\") return \"coil\";\n if (COMPARE_TYPES.has(el.fbType)) return \"compare\";\n return \"function_block\";\n}\n\n/** Wrap a long description into lines of ~13 chars without splitting words. */\nexport function wrapName(name: string, maxChars = 14): string[] {\n const words = name.split(/\\s+/);\n const lines: string[] = [];\n let cur = \"\";\n for (const w of words) {\n const trial = cur ? `${cur} ${w}` : w;\n if (trial.length > maxChars && cur) {\n lines.push(cur);\n cur = w;\n } else {\n cur = trial;\n }\n }\n if (cur) lines.push(cur);\n return lines.slice(0, 3);\n}\n\nfunction labelLinesForContactOrCoil(el: LadderElement): string[] {\n if (el.elementType === \"function_block\") return [el.tag];\n const lines: string[] = [];\n if (el.name) lines.push(...wrapName(el.name));\n lines.push(el.tag);\n if (el.address) lines.push(el.address);\n return lines;\n}\n\n/** Max label width in px across all label lines of the element. */\nfunction labelWidth(el: LadderElement): number {\n const lines = labelLinesForContactOrCoil(el);\n let maxChars = 0;\n for (const l of lines) if (l.length > maxChars) maxChars = l.length;\n return maxChars * CHAR_W;\n}\n\n/** Slot width = max(bodyWidth, labelWidth) + padding on both sides. */\nfunction slotWidth(el: LadderElement): number {\n return Math.max(bodyWidth(el), labelWidth(el)) + 6;\n}\n\n/** Total label rows above the element body (name lines + tag). */\nfunction labelRowsAbove(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 1;\n const name = el.name ? wrapName(el.name).length : 0;\n return name + 1; // + tag line\n}\n\nfunction labelRowsBelow(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 0;\n if ((el as { address?: string }).address) return 1;\n return 0;\n}\n\n/** Required vertical pixels above rung centerline for tallest element label stack. */\nfunction rungLabelHeaderHeight(rung: LadderRung): number {\n let maxAbovePx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n // Only the top-branch elements extend above the centerline.\n const topBranch = item.parallel[0];\n if (!topBranch) continue;\n const aboveRows = Math.max(\n 1,\n ...topBranch.elements.map((e) => labelRowsAbove(e))\n );\n const px = ph / 2 + aboveRows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n } else {\n const rows = labelRowsAbove(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n }\n }\n return maxAbovePx;\n}\n\nfunction rungLabelFooterHeight(rung: LadderRung): number {\n let maxBelowPx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n const bottomBranch = item.parallel[item.parallel.length - 1];\n if (!bottomBranch) continue;\n const belowRows = Math.max(\n 0,\n ...bottomBranch.elements.map((e) => labelRowsBelow(e))\n );\n const px = ph / 2 + belowRows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n } else {\n const rows = labelRowsBelow(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n }\n }\n return maxBelowPx;\n}\n\nfunction branchInlineWidth(branch: LadderBranch): number {\n if (branch.elements.length === 0) return ELEMENT_WIDTH;\n let w = 0;\n branch.elements.forEach((el, i) => {\n w += slotWidth(el);\n if (i < branch.elements.length - 1) w += H_SPACING;\n });\n return w;\n}\n\nfunction parallelWidth(branches: LadderBranch[]): number {\n const maxBranch = Math.max(\n ELEMENT_WIDTH,\n ...branches.map(branchInlineWidth)\n );\n return maxBranch + 2 * H_SPACING;\n}\n\n/** Per-branch row height including label stack above + below. */\nfunction branchRowHeight(branch: LadderBranch): number {\n const bodyH = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(1, ...branch.elements.map((e) => labelRowsAbove(e)));\n const below = Math.max(0, ...branch.elements.map((e) => labelRowsBelow(e)));\n return bodyH + above * LINE_H + below * LINE_H + 6;\n}\n\nfunction parallelHeight(branches: LadderBranch[]): number {\n // Account for label space between branches so name/address rows don't collide.\n let total = 0;\n branches.forEach((br, i) => {\n total += branchRowHeight(br);\n if (i < branches.length - 1) total += PARALLEL_GAP;\n });\n return Math.max(total, ELEMENT_HEIGHT);\n}\n\nexport function layoutLadder(ast: LadderAST): LadderLayoutResult {\n const nodes: LadderLayoutNode[] = [];\n const wires: LadderLayoutWire[] = [];\n const rungs: LadderLayoutRung[] = [];\n\n let maxEndX = LEFT_RAIL_X + 200;\n let cursorY = RUNG_Y_OFFSET;\n\n ast.rungs.forEach((rung, rungIndex) => {\n const headerH = rungLabelHeaderHeight(rung);\n const footerH = rungLabelFooterHeight(rung);\n // Per-rung height is comment (16) + header + footer + a little breathing room.\n const rungHeight = Math.max(BASE_RUNG_HEIGHT, 16 + headerH + footerH + 16);\n const rungY = cursorY + 16 + headerH;\n\n let x = LEFT_RAIL_X + H_SPACING;\n let prevRightX = LEFT_RAIL_X;\n let prevRightY = rungY;\n\n const addWire = (x1: number, y1: number, x2: number, y2: number) => {\n wires.push({ path: `M ${x1} ${y1} L ${x2} ${y2}` });\n };\n\n rung.elements.forEach((item, elIdx) => {\n if (\"parallel\" in item) {\n const branches = item.parallel;\n const pw = parallelWidth(branches);\n const ph = parallelHeight(branches);\n const bx = x;\n const ex = x + pw;\n\n addWire(prevRightX, prevRightY, bx, rungY);\n\n const busTop = rungY - ph / 2;\n const busBot = rungY + ph / 2;\n wires.push({ path: `M ${bx} ${busTop} L ${bx} ${busBot}` });\n wires.push({ path: `M ${ex} ${busTop} L ${ex} ${busBot}` });\n\n // Pre-compute row Y for each branch using actual row heights.\n let rowY = busTop;\n branches.forEach((branch, bIdx) => {\n const rowH = branchRowHeight(branch);\n const bodyMax = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(\n 1,\n ...branch.elements.map((e) => labelRowsAbove(e))\n );\n // Position centerline so labels above fit within rowH.\n const branchY = rowY + above * LINE_H + bodyMax / 2;\n const bInline = branchInlineWidth(branch);\n const startX = bx + H_SPACING + ((ex - bx - 2 * H_SPACING) - bInline) / 2;\n let bx0 = startX;\n let prevBX = bx;\n branch.elements.forEach((bel, beIdx) => {\n const w = bodyWidth(bel);\n const h = bodyHeight(bel);\n const slot = slotWidth(bel);\n const nx = bx0 + (slot - w) / 2;\n const ny = branchY - h / 2;\n const id = `R${rung.number}_P${elIdx}_B${bIdx}_E${beIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: bel,\n kind: elementKind(bel),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY: branchY,\n });\n addWire(prevBX, branchY, nx, branchY);\n prevBX = nx + w;\n bx0 += slot + H_SPACING;\n });\n addWire(prevBX, branchY, ex, branchY);\n rowY += rowH + PARALLEL_GAP;\n });\n\n prevRightX = ex;\n prevRightY = rungY;\n x = ex + H_SPACING;\n return;\n }\n\n const el = item;\n const w = bodyWidth(el);\n const h = bodyHeight(el);\n const slot = slotWidth(el);\n const nx = x + (slot - w) / 2;\n const ny = rungY - h / 2;\n const id = `R${rung.number}_E${elIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: el,\n kind: elementKind(el),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY,\n });\n addWire(prevRightX, prevRightY, nx, rungY);\n prevRightX = nx + w;\n prevRightY = rungY;\n x += slot + H_SPACING;\n });\n\n rungs.push({\n rung,\n index: rungIndex,\n y: rungY,\n endX: prevRightX,\n height: rungHeight,\n headerHeight: headerH,\n });\n if (prevRightX > maxEndX) maxEndX = prevRightX;\n cursorY += rungHeight;\n });\n\n const rightRailX = maxEndX + H_SPACING * 2;\n const width = rightRailX + RIGHT_RAIL_MARGIN;\n const height = cursorY + CANVAS_PADDING;\n\n for (const r of rungs) {\n wires.push({ path: `M ${r.endX} ${r.y} L ${rightRailX} ${r.y}` });\n }\n\n return {\n width,\n height,\n leftRailX: LEFT_RAIL_X,\n rightRailX,\n rungs,\n nodes,\n wires,\n };\n}\n\nexport { labelRowsAbove, labelRowsBelow };\n","import type {\n LadderAST,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n RenderConfig,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\nimport { resolveIndustrialTheme, type IndustrialTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { layoutLadder, type LadderLayoutNode, wrapName } from \"./layout\";\n\ntype IT = ResolvedTheme<IndustrialTokens>;\n\nfunction buildCss(t: IT): string {\n return `\n.lt-ladder { font-family: system-ui, -apple-system, sans-serif; }\n.lt-ladder-rail { stroke: ${t.strokeHeavy}; stroke-width: 4; stroke-linecap: square; }\n.lt-ladder-wire { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.lt-ladder-element { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-coil { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-fb { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 2; }\n.lt-ladder-fb-name { font: bold 11px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-pin { font: 8px sans-serif; fill: ${t.stroke}; }\n.lt-ladder-name { font: 9px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-tag { font: 600 9px ui-monospace, SFMono-Regular, Menlo, monospace; fill: ${t.accent}; text-anchor: middle; }\n.lt-ladder-addr { font: 600 8.5px ui-monospace, monospace; fill: ${t.error}; text-anchor: middle; }\n.lt-ladder-rung-num { font: 10px sans-serif; fill: ${t.textMuted}; text-anchor: end; }\n.lt-ladder-comment { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.lt-ladder-title { font: bold 15px sans-serif; fill: ${t.text}; }\n.lt-ladder-symbol-label { font: bold 10px sans-serif; fill: ${t.stroke}; text-anchor: middle; }\n`.trim();\n}\n\nconst LINE_H = 11;\n\nfunction labelsAbove(\n name: string | undefined,\n tag: string,\n cx: number,\n bodyTopY: number\n): string[] {\n const pieces: string[] = [];\n const nameLines = name ? wrapName(name) : [];\n const totalLines = nameLines.length + 1; // +1 for tag\n const firstY = bodyTopY - 4 - (totalLines - 1) * LINE_H;\n nameLines.forEach((line, i) => {\n pieces.push(\n text({ x: cx, y: firstY + i * LINE_H, class: \"lt-ladder-name\" }, line)\n );\n });\n pieces.push(\n text(\n { x: cx, y: firstY + nameLines.length * LINE_H, class: \"lt-ladder-tag\" },\n tag\n )\n );\n return pieces;\n}\n\nfunction renderContact(node: LadderLayoutNode): string {\n const c = node.element as LadderContact;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const leftBarX = x + 4;\n const rightBarX = x + w - 4;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: leftBarX, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: leftBarX, y1: y, x2: leftBarX, y2: y + h, class: \"lt-ladder-element\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: y, x2: rightBarX, y2: y + h, class: \"lt-ladder-element\" }));\n\n if (c.contactType === \"XIO\") {\n pieces.push(\n el(\"line\", {\n x1: leftBarX + 2,\n y1: y + h - 2,\n x2: rightBarX - 2,\n y2: y + 2,\n class: \"lt-ladder-element\",\n })\n );\n } else if (c.contactType === \"ONS\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↑\"));\n } else if (c.contactType === \"OSF\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↓\"));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"contact\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCoil(node: LadderLayoutNode): string {\n const c = node.element as LadderCoil;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n const leftArc = `M ${x + 6} ${y} A 10 ${h / 2} 0 0 0 ${x + 6} ${y + h}`;\n const rightArc = `M ${x + w - 6} ${y} A 10 ${h / 2} 0 0 1 ${x + w - 6} ${y + h}`;\n pieces.push(pathEl({ d: leftArc, class: \"lt-ladder-coil\" }));\n pieces.push(pathEl({ d: rightArc, class: \"lt-ladder-coil\" }));\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: x + 6, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w - 6, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n\n let inner = \"\";\n if (c.coilType === \"OTL\") inner = \"S\";\n else if (c.coilType === \"OTU\") inner = \"R\";\n else if (c.coilType === \"OTN\") inner = \"/\";\n if (inner) {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, inner));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"coil\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCompare(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 12, class: \"lt-ladder-fb-name\" }, fb.fbType));\n const entries = Object.entries(fb.params);\n entries.slice(0, 2).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 22 + i * 9, class: \"lt-ladder-pin\" }, `${k}:${v}`)\n );\n });\n pieces.push(el(\"line\", { x1: x - 2, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w, y1: cy, x2: x + w + 2, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"compare\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderFunctionBlock(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 14, class: \"lt-ladder-fb-name\" }, fb.fbType));\n\n pieces.push(\n el(\"line\", { x1: x - 6, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" })\n );\n pieces.push(\n el(\"line\", { x1: x + w, y1: cy, x2: x + w + 6, y2: cy, class: \"lt-ladder-wire\" })\n );\n\n const entries = Object.entries(fb.params);\n entries.slice(0, 3).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 28 + i * 9, class: \"lt-ladder-pin\" }, `${k}=${v}`)\n );\n });\n\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"function_block\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderNode(node: LadderLayoutNode): string {\n switch (node.kind) {\n case \"contact\":\n return renderContact(node);\n case \"coil\":\n return renderCoil(node);\n case \"compare\":\n return renderCompare(node);\n case \"function_block\":\n return renderFunctionBlock(node);\n }\n}\n\nexport function renderLadder(ast: LadderAST, config?: RenderConfig): string {\n const layout = layoutLadder(ast);\n const t = resolveIndustrialTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 30 : 0;\n const width = layout.width;\n const height = layout.height + titleOffset;\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Ladder Logic\"));\n children.push(\n desc(`PLC ladder logic diagram with ${ast.rungs.length} rung${ast.rungs.length === 1 ? \"\" : \"s\"}`)\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n if (ast.title) {\n children.push(\n text({ x: layout.leftRailX, y: 20, class: \"lt-ladder-title\" }, ast.title)\n );\n }\n\n const inner: string[] = [];\n\n inner.push(\n el(\"line\", {\n x1: layout.leftRailX,\n y1: 0,\n x2: layout.leftRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n inner.push(\n el(\"line\", {\n x1: layout.rightRailX,\n y1: 0,\n x2: layout.rightRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n\n for (const r of layout.rungs) {\n inner.push(\n text(\n { x: layout.leftRailX - 6, y: r.y + 3, class: \"lt-ladder-rung-num\" },\n `Rung ${String(r.rung.number).padStart(3, \"0\")}`\n )\n );\n if (r.rung.comment) {\n // Place comment above the tallest element label on this rung (and above the parallel bus if any).\n const commentY = Math.max(14, r.y - (r.headerHeight + 6));\n inner.push(\n text(\n {\n x: layout.leftRailX + 10,\n y: commentY,\n class: \"lt-ladder-comment\",\n },\n `— ${r.rung.comment} —`\n )\n );\n }\n }\n\n for (const w of layout.wires) {\n inner.push(pathEl({ d: w.path, class: \"lt-ladder-wire\" }));\n }\n\n for (const n of layout.nodes) {\n inner.push(renderNode(n));\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-ladder\",\n role: \"img\",\n \"aria-labelledby\": \"lt-ladder-title lt-ladder-desc\",\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseLadderDSL } from \"./parser\";\nimport { renderLadder } from \"./renderer\";\n\nexport const ladder: DiagramPlugin = {\n type: \"ladder\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"ladder\");\n },\n parse: parseLadderDSL,\n\n render(text: string, config): string {\n const ast = parseLadderDSL(text);\n return renderLadder(ast, config);\n },\n};\n\nexport { parseLadderDSL } from \"./parser\";\nexport { renderLadder } from \"./renderer\";\nexport { layoutLadder } from \"./layout\";\n"]}
@@ -0,0 +1,89 @@
1
+ // src/core/quotes.ts
2
+ var QUOTE_PAIRS = {
3
+ '"': '"',
4
+ "'": "'",
5
+ "\u201C": "\u201D",
6
+ // " "
7
+ "\u2018": "\u2019",
8
+ // ' '
9
+ "\xAB": "\xBB",
10
+ // « »
11
+ "\u300C": "\u300D",
12
+ // 「 」
13
+ "\u300E": "\u300F"
14
+ // 『 』
15
+ };
16
+ var OPEN_QUOTES = new Set(Object.keys(QUOTE_PAIRS));
17
+ function isOpenQuote(ch) {
18
+ return OPEN_QUOTES.has(ch);
19
+ }
20
+ function findClosingQuote(s, openIdx) {
21
+ const open = s[openIdx];
22
+ if (open === void 0 || !OPEN_QUOTES.has(open)) return -1;
23
+ const close = QUOTE_PAIRS[open];
24
+ const escapable = open === '"' || open === "'";
25
+ for (let i = openIdx + 1; i < s.length; i++) {
26
+ const ch = s[i];
27
+ if (escapable && ch === "\\" && i + 1 < s.length) {
28
+ i++;
29
+ continue;
30
+ }
31
+ if (ch === close) return i;
32
+ }
33
+ return -1;
34
+ }
35
+ function extractQuotedString(s, start) {
36
+ const open = s[start];
37
+ if (open === void 0 || !OPEN_QUOTES.has(open)) return null;
38
+ const closeIdx = findClosingQuote(s, start);
39
+ if (closeIdx < 0) {
40
+ throw new Error(`unterminated quoted string starting at index ${start}`);
41
+ }
42
+ const raw = s.slice(start + 1, closeIdx);
43
+ const value = open === '"' || open === "'" ? unescapeAscii(raw, open) : raw;
44
+ return { value, end: closeIdx + 1 };
45
+ }
46
+ function unescapeAscii(s, quote) {
47
+ let out = "";
48
+ for (let i = 0; i < s.length; i++) {
49
+ const ch = s[i];
50
+ if (ch === "\\" && i + 1 < s.length) {
51
+ const next = s[i + 1];
52
+ if (next === quote || next === "\\") {
53
+ out += next;
54
+ i++;
55
+ continue;
56
+ }
57
+ }
58
+ out += ch;
59
+ }
60
+ return out;
61
+ }
62
+ function matchQuotedTitle(line) {
63
+ for (let i = 0; i < line.length; i++) {
64
+ const ch = line[i];
65
+ if (OPEN_QUOTES.has(ch)) {
66
+ try {
67
+ const r = extractQuotedString(line, i);
68
+ if (r) return r.value;
69
+ } catch {
70
+ return void 0;
71
+ }
72
+ }
73
+ }
74
+ return void 0;
75
+ }
76
+ function stripQuotes(s) {
77
+ const t = s.trim();
78
+ if (t.length < 2) return t;
79
+ const open = t[0];
80
+ if (!OPEN_QUOTES.has(open)) return t;
81
+ const expected = QUOTE_PAIRS[open];
82
+ if (t[t.length - 1] !== expected) return t;
83
+ const inner = t.slice(1, -1);
84
+ return open === '"' || open === "'" ? unescapeAscii(inner, open) : inner;
85
+ }
86
+
87
+ export { extractQuotedString, isOpenQuote, matchQuotedTitle, stripQuotes };
88
+ //# sourceMappingURL=chunk-5IKOLUWK.js.map
89
+ //# sourceMappingURL=chunk-5IKOLUWK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/quotes.ts"],"names":[],"mappings":"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","file":"chunk-5IKOLUWK.js","sourcesContent":["/**\n * Smart-quote-aware string helpers shared across parsers.\n *\n * Many human writers (and most LLM outputs in non-English locales) use\n * Unicode quote pairs rather than ASCII `\"`. We accept all common pairs:\n *\n * \"...\" ASCII straight double\n * '...' ASCII straight single\n * \"...\" Unicode curly double (U+201C/U+201D)\n * '...' Unicode curly single (U+2018/U+2019)\n * «...» French/Spanish guillemets (U+00AB/U+00BB)\n * 「...」 CJK corner brackets (U+300C/U+300D)\n * 『...』 CJK white corner brackets (U+300E/U+300F)\n *\n * Inside ASCII-quoted strings, `\\\"` and `\\'` are recognised as escapes so\n * authors can include literal quotes without breaking the parser.\n */\n\nexport const QUOTE_PAIRS: Record<string, string> = {\n '\"': '\"',\n \"'\": \"'\",\n \"“\": \"”\", // \" \"\n \"‘\": \"’\", // ' '\n \"«\": \"»\", // « »\n \"「\": \"」\", // 「 」\n \"『\": \"』\", // 『 』\n};\n\nconst OPEN_QUOTES = new Set(Object.keys(QUOTE_PAIRS));\n\nexport function isOpenQuote(ch: string): boolean {\n return OPEN_QUOTES.has(ch);\n}\n\nexport function isAnyQuote(ch: string): boolean {\n if (OPEN_QUOTES.has(ch)) return true;\n for (const close of Object.values(QUOTE_PAIRS)) if (ch === close) return true;\n return false;\n}\n\n/**\n * Find the index of the closing quote that matches the opener at `openIdx`.\n * For ASCII openers (\" '), supports `\\\"`/`\\'` escapes inside the string.\n * Returns -1 if no closer is found.\n */\nexport function findClosingQuote(s: string, openIdx: number): number {\n const open = s[openIdx];\n if (open === undefined || !OPEN_QUOTES.has(open)) return -1;\n const close = QUOTE_PAIRS[open]!;\n const escapable = open === '\"' || open === \"'\";\n for (let i = openIdx + 1; i < s.length; i++) {\n const ch = s[i];\n if (escapable && ch === \"\\\\\" && i + 1 < s.length) {\n i++;\n continue;\n }\n if (ch === close) return i;\n }\n return -1;\n}\n\n/**\n * Extract a quoted string starting at `start` (must point at an opener).\n * Returns the unescaped inner value plus the index *after* the closer.\n * Returns null if `start` is not on an opener.\n * Throws if the opener is found but no closer is.\n */\nexport function extractQuotedString(\n s: string,\n start: number\n): { value: string; end: number } | null {\n const open = s[start];\n if (open === undefined || !OPEN_QUOTES.has(open)) return null;\n const closeIdx = findClosingQuote(s, start);\n if (closeIdx < 0) {\n throw new Error(`unterminated quoted string starting at index ${start}`);\n }\n const raw = s.slice(start + 1, closeIdx);\n const value = open === '\"' || open === \"'\" ? unescapeAscii(raw, open) : raw;\n return { value, end: closeIdx + 1 };\n}\n\nfunction unescapeAscii(s: string, quote: string): string {\n let out = \"\";\n for (let i = 0; i < s.length; i++) {\n const ch = s[i];\n if (ch === \"\\\\\" && i + 1 < s.length) {\n const next = s[i + 1]!;\n if (next === quote || next === \"\\\\\") {\n out += next;\n i++;\n continue;\n }\n }\n out += ch;\n }\n return out;\n}\n\n/**\n * Find the first quoted substring anywhere on `line` and return its inner\n * value. Replaces the common idiom `line.match(/\"([^\"]*)\"/)` so that smart\n * quotes are also accepted.\n */\nexport function matchQuotedTitle(line: string): string | undefined {\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (OPEN_QUOTES.has(ch)) {\n try {\n const r = extractQuotedString(line, i);\n if (r) return r.value;\n } catch {\n return undefined;\n }\n }\n }\n return undefined;\n}\n\n/**\n * If `s` is wrapped in any recognised quote pair, return the inner value;\n * otherwise return `s` (trimmed). Whitespace outside the quotes is ignored.\n */\nexport function stripQuotes(s: string): string {\n const t = s.trim();\n if (t.length < 2) return t;\n const open = t[0]!;\n if (!OPEN_QUOTES.has(open)) return t;\n const expected = QUOTE_PAIRS[open]!;\n if (t[t.length - 1] !== expected) return t;\n const inner = t.slice(1, -1);\n return open === '\"' || open === \"'\" ? unescapeAscii(inner, open) : inner;\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { matchQuotedTitle } from './chunk-5IKOLUWK.js';
1
2
  import { el, text, group, svgRoot, title, desc, defs } from './chunk-SYYBKDL7.js';
2
3
 
3
4
  // src/diagrams/timing/parser.ts
@@ -41,8 +42,8 @@ function parseTiming(text2) {
41
42
  const line = raw.trim();
42
43
  if (!line || line.startsWith("#")) continue;
43
44
  if (/^timing\b/i.test(line)) {
44
- const titleMatch = line.match(/"([^"]*)"/);
45
- if (titleMatch) title2 = titleMatch[1];
45
+ const t = matchQuotedTitle(line);
46
+ if (t !== void 0) title2 = t;
46
47
  const hs = line.match(/hscale\s*:\s*(\d+(?:\.\d+)?)/);
47
48
  if (hs) hscale = parseFloat(hs[1]);
48
49
  continue;
@@ -454,5 +455,5 @@ var timing = {
454
455
  };
455
456
 
456
457
  export { parseTiming, renderTiming, timing };
457
- //# sourceMappingURL=chunk-3RAVPXLN.js.map
458
- //# sourceMappingURL=chunk-3RAVPXLN.js.map
458
+ //# sourceMappingURL=chunk-6URNSB6G.js.map
459
+ //# sourceMappingURL=chunk-6URNSB6G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diagrams/timing/parser.ts","../src/diagrams/timing/renderer.ts","../src/diagrams/timing/index.ts"],"names":["text","title"],"mappings":"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","file":"chunk-6URNSB6G.js","sourcesContent":["import type { TimingAST, TimingSignal, TimingGroup } from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class TimingParseError 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 = \"TimingParseError\";\n }\n}\n\nconst VALID_STATES = /^[01xzpPnNhHlLudD=.23456789]+$/;\n\nfunction splitDataList(rest: string): { wave: string; data: string[] } {\n // Wave string is first token; remaining tokens are quoted strings or a `data: [...]` form\n const trimmed = rest.trim();\n // Accept: `wave data: [\"a\",\"b\"]` or `wave \"a\" \"b\" \"c\"`\n const m = trimmed.match(/^(\\S+)\\s*(.*)$/);\n if (!m) return { wave: trimmed, data: [] };\n const wave = m[1];\n const remainder = m[2].trim();\n if (!remainder) return { wave, data: [] };\n\n const data: string[] = [];\n // Strip `data:` prefix + optional brackets\n let r = remainder.replace(/^data\\s*:\\s*/, \"\").trim();\n if (r.startsWith(\"[\") && r.endsWith(\"]\")) r = r.slice(1, -1);\n const re = /\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(r)) !== null) data.push(match[1]);\n return { wave, data };\n}\n\nexport function parseTiming(text: string): TimingAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n const signals: Array<TimingSignal | TimingGroup> = [];\n let title: string | undefined;\n let hscale: number | undefined;\n let currentGroup: TimingGroup | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i] ?? \"\";\n const lineNo = i + 1;\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n\n // Header: `timing \"title\" [hscale: 2]`\n if (/^timing\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n const hs = line.match(/hscale\\s*:\\s*(\\d+(?:\\.\\d+)?)/);\n if (hs) hscale = parseFloat(hs[1]);\n continue;\n }\n\n // Group start: `[GroupName]` or `group \"name\" {`\n const groupOpen = line.match(/^\\[([^\\]]+)\\]$/) || line.match(/^group\\s+\"([^\"]+)\"\\s*\\{?$/);\n if (groupOpen) {\n currentGroup = { label: groupOpen[1], signals: [] };\n signals.push(currentGroup);\n continue;\n }\n if (line === \"}\") {\n currentGroup = null;\n continue;\n }\n if (line === \"---\") {\n currentGroup = null;\n continue;\n }\n\n // Signal: `NAME: wave ...`\n const sigMatch = line.match(/^([^:]+):\\s*(.+)$/);\n if (sigMatch) {\n const name = sigMatch[1].trim();\n const { wave, data } = splitDataList(sigMatch[2]);\n if (!VALID_STATES.test(wave)) {\n throw new TimingParseError(`Invalid wave string \"${wave}\" for signal ${name}`, lineNo, undefined, line);\n }\n const signal: TimingSignal = { name, wave, data: data.length ? data : undefined };\n if (currentGroup) currentGroup.signals.push(signal);\n else signals.push(signal);\n continue;\n }\n }\n\n return { type: \"timing\", title, hscale, signals };\n}\n","import type { TimingAST, TimingSignal, TimingGroup } from \"../../core/types\";\nimport { svgRoot, defs, group, el, text, title as titleEl, desc } from \"../../core/svg\";\n\nconst NAME_W = 120;\nconst SIG_H = 36;\nconst PAD_TOP = 12;\nconst PAD_BOT = 12;\nconst PAD_V = 6; // vertical padding inside band for rail spacing\nconst DEFAULT_PW = 40;\nconst GROUP_LABEL_H = 22;\n\ntype FlatRow =\n | { kind: \"signal\"; signal: TimingSignal; indent: number }\n | { kind: \"group\"; label: string; indent: number };\n\nfunction flatten(items: Array<TimingSignal | TimingGroup>, indent = 0): FlatRow[] {\n const out: FlatRow[] = [];\n for (const item of items) {\n if (\"wave\" in item) {\n out.push({ kind: \"signal\", signal: item, indent });\n } else {\n out.push({ kind: \"group\", label: item.label, indent });\n out.push(...flatten(item.signals, indent + 1));\n }\n }\n return out;\n}\n\ninterface WaveCtx {\n pw: number;\n yHi: number;\n yLo: number;\n yMid: number;\n h: number;\n}\n\ntype PrevState = \"hi\" | \"lo\" | \"bus\" | \"z\" | \"x\" | \"none\";\n\nfunction renderWave(signal: TimingSignal, ctx: WaveCtx): { svg: string; labels: string } {\n const { pw, yHi, yLo, yMid } = ctx;\n const wave = signal.wave;\n const paths: string[] = [];\n const busRects: string[] = [];\n const busTexts: string[] = [];\n const xPatchRects: string[] = [];\n const zLines: string[] = [];\n\n let prev: PrevState = \"none\";\n let prevChar = \"\";\n let busStartX = 0;\n let busIndex = 0;\n let dataIdx = 0;\n let linePath = \"\";\n\n const startLine = (x: number, y: number) => {\n if (linePath) paths.push(linePath);\n linePath = `M ${x},${y}`;\n };\n const extendLineTo = (x: number, y: number) => {\n linePath += ` L ${x},${y}`;\n };\n const flushLine = () => {\n if (linePath) {\n paths.push(linePath);\n linePath = \"\";\n }\n };\n\n const closeBus = (x: number) => {\n const start = busStartX;\n const end = x;\n const inset = Math.min(5, (end - start) / 2);\n // Trapezoid outline\n const d = `M ${start + inset},${yHi} L ${end - inset},${yHi} L ${end},${yMid} L ${end - inset},${yLo} L ${start + inset},${yLo} L ${start},${yMid} Z`;\n busRects.push(\n el(\"path\", { class: \"schematex-timing-bus\", d, \"data-bus-index\": String(busIndex) })\n );\n // Data label\n const label = signal.data?.[dataIdx] ?? \"\";\n if (label) {\n busTexts.push(\n text(\n {\n x: (start + end) / 2,\n y: yMid + 4,\n class: \"schematex-timing-bus-label\",\n \"text-anchor\": \"middle\",\n },\n label\n )\n );\n }\n dataIdx++;\n busIndex++;\n };\n\n for (let i = 0; i < wave.length; i++) {\n const ch = wave[i];\n const x = i * pw;\n const xNext = x + pw;\n\n // Handle continuation '.'\n const effective = ch === \".\" ? prevChar : ch;\n\n switch (effective) {\n case \"0\":\n case \"l\":\n case \"L\": {\n if (prev === \"bus\") closeBus(x);\n if (prev === \"x\" || prev === \"z\" || prev === \"none\" || prev === \"bus\") {\n flushLine();\n startLine(x, yLo);\n } else if (prev === \"hi\") {\n extendLineTo(x, yLo);\n }\n extendLineTo(xNext, yLo);\n prev = \"lo\";\n break;\n }\n case \"1\":\n case \"h\":\n case \"H\": {\n if (prev === \"bus\") closeBus(x);\n if (prev === \"x\" || prev === \"z\" || prev === \"none\" || prev === \"bus\") {\n flushLine();\n startLine(x, yHi);\n } else if (prev === \"lo\") {\n extendLineTo(x, yHi);\n }\n extendLineTo(xNext, yHi);\n prev = \"hi\";\n break;\n }\n case \"p\":\n case \"P\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n // One-period positive clock: lo→hi at x, hi until midpoint, lo at mid, lo until xNext\n startLine(x, yLo);\n extendLineTo(x, yHi);\n extendLineTo(x + pw / 2, yHi);\n extendLineTo(x + pw / 2, yLo);\n extendLineTo(xNext, yLo);\n flushLine();\n prev = \"lo\";\n break;\n }\n case \"n\":\n case \"N\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yHi);\n extendLineTo(x, yLo);\n extendLineTo(x + pw / 2, yLo);\n extendLineTo(x + pw / 2, yHi);\n extendLineTo(xNext, yHi);\n flushLine();\n prev = \"hi\";\n break;\n }\n case \"u\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yLo);\n extendLineTo(xNext, yHi);\n prev = \"hi\";\n break;\n }\n case \"d\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yHi);\n extendLineTo(xNext, yLo);\n prev = \"lo\";\n break;\n }\n case \"z\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n zLines.push(\n el(\"line\", {\n x1: x,\n y1: yMid,\n x2: xNext,\n y2: yMid,\n class: \"schematex-timing-hiz\",\n })\n );\n prev = \"z\";\n break;\n }\n case \"x\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n xPatchRects.push(\n el(\"rect\", {\n x,\n y: yHi,\n width: pw,\n height: yLo - yHi,\n class: \"schematex-timing-unknown\",\n fill: \"url(#schematex-timing-xhatch)\",\n })\n );\n prev = \"x\";\n break;\n }\n case \"=\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n // Each fresh bus char (not '.') begins a new segment.\n const isContinuation = ch === \".\";\n if (!isContinuation && prev === \"bus\") closeBus(x);\n if (prev !== \"bus\" || !isContinuation) {\n flushLine();\n busStartX = x;\n }\n prev = \"bus\";\n break;\n }\n default: {\n // unknown char -> treat as x\n flushLine();\n xPatchRects.push(\n el(\"rect\", {\n x,\n y: yHi,\n width: pw,\n height: yLo - yHi,\n class: \"schematex-timing-unknown\",\n fill: \"url(#schematex-timing-xhatch)\",\n })\n );\n prev = \"x\";\n }\n }\n\n prevChar = effective;\n }\n\n // Close trailing bus\n if (prev === \"bus\") closeBus(wave.length * pw);\n flushLine();\n\n const waveSvg = paths\n .map((d) => el(\"path\", { class: \"schematex-timing-wave\", d }))\n .concat(xPatchRects, zLines, busRects)\n .join(\"\");\n\n return { svg: waveSvg, labels: busTexts.join(\"\") };\n}\n\nexport function renderTiming(ast: TimingAST): string {\n const pw = DEFAULT_PW * (ast.hscale ?? 1);\n const rows = flatten(ast.signals);\n const maxWaveLen = Math.max(\n 1,\n ...rows.flatMap((r) => (r.kind === \"signal\" ? [r.signal.wave.length] : []))\n );\n const waveAreaW = maxWaveLen * pw;\n const width = NAME_W + waveAreaW + 20;\n\n let y = PAD_TOP;\n const rowYs: number[] = [];\n for (const r of rows) {\n rowYs.push(y);\n y += r.kind === \"group\" ? GROUP_LABEL_H : SIG_H;\n }\n const height = y + PAD_BOT + 10;\n\n // Render rows\n const waveSvgs: string[] = [];\n const labelSvgs: string[] = [];\n const nameSvgs: string[] = [];\n const gridLines: string[] = [];\n\n // Grid: vertical period ticks across signal area\n for (let i = 0; i <= maxWaveLen; i++) {\n const xg = NAME_W + i * pw;\n gridLines.push(\n el(\"line\", {\n x1: xg,\n y1: PAD_TOP,\n x2: xg,\n y2: height - PAD_BOT,\n class: \"schematex-timing-grid\",\n })\n );\n }\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n const ry = rowYs[i];\n\n if (row.kind === \"group\") {\n nameSvgs.push(\n text(\n {\n x: 6 + row.indent * 10,\n y: ry + GROUP_LABEL_H - 6,\n class: \"schematex-timing-group-label\",\n },\n row.label\n )\n );\n continue;\n }\n\n const signal = row.signal;\n const yHi = ry + PAD_V;\n const yLo = ry + SIG_H - PAD_V;\n const yMid = ry + SIG_H / 2;\n\n // Signal name (right-aligned in name column). `~NAME` or `/NAME` → overlined active-low.\n const activeLow = signal.name.startsWith(\"~\") || signal.name.startsWith(\"/\");\n const displayName = activeLow ? signal.name.slice(1) : signal.name;\n nameSvgs.push(\n text(\n {\n x: NAME_W - 8,\n y: yMid + 4,\n class: activeLow\n ? \"schematex-timing-name schematex-timing-name-activelow\"\n : \"schematex-timing-name\",\n \"text-anchor\": \"end\",\n },\n displayName\n )\n );\n\n const { svg, labels } = renderWave(signal, {\n pw,\n yHi,\n yLo,\n yMid,\n h: SIG_H - 2 * PAD_V,\n });\n\n waveSvgs.push(\n group(\n {\n transform: `translate(${NAME_W}, 0)`,\n \"data-signal\": signal.name,\n },\n [svg]\n )\n );\n labelSvgs.push(\n group({ transform: `translate(${NAME_W}, 0)` }, [labels])\n );\n }\n\n const xhatch = el(\n \"pattern\",\n {\n id: \"schematex-timing-xhatch\",\n patternUnits: \"userSpaceOnUse\",\n width: 6,\n height: 6,\n },\n [\n el(\"rect\", { x: 0, y: 0, width: 6, height: 6, fill: \"#f5f5f5\" }),\n el(\"path\", {\n d: \"M 0,6 L 6,0 M -1,1 L 1,-1 M 5,7 L 7,5\",\n stroke: \"#999\",\n \"stroke-width\": 0.8,\n }),\n ]\n );\n\n const css = `\n.schematex-timing { font-family: system-ui, -apple-system, sans-serif; }\n.schematex-timing-name { font: 12px monospace; fill: #111; }\n.schematex-timing-name-activelow { text-decoration: overline; }\n.schematex-timing-group-label { font: bold 12px sans-serif; fill: #111; }\n.schematex-timing-wave { stroke: #111; stroke-width: 1.75; fill: none; stroke-linejoin: miter; stroke-linecap: square; }\n.schematex-timing-bus { fill: none; stroke: #111; stroke-width: 1.5; }\n.schematex-timing-bus-label { font: 11px monospace; fill: #111; }\n.schematex-timing-unknown { stroke: #555; stroke-width: 0.5; }\n.schematex-timing-hiz { stroke: #555; stroke-width: 1.5; stroke-dasharray: 4 3; }\n.schematex-timing-grid { stroke: #eee; stroke-width: 0.5; }\n`.trim();\n\n return svgRoot(\n {\n class: \"schematex-timing\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"timing\",\n },\n [\n titleEl(ast.title ?? \"Timing Diagram\"),\n desc(`Digital timing diagram with ${rows.filter((r) => r.kind === \"signal\").length} signals`),\n defs([xhatch, el(\"style\", {}, css)]),\n group({ class: \"schematex-timing-grid-g\" }, gridLines),\n group({ class: \"schematex-timing-waves\" }, waveSvgs),\n group({ class: \"schematex-timing-labels\" }, labelSvgs),\n group({ class: \"schematex-timing-names\" }, nameSvgs),\n ast.title\n ? text(\n {\n x: width / 2,\n y: 14,\n \"text-anchor\": \"middle\",\n class: \"schematex-timing-title\",\n style: \"font: bold 13px sans-serif; fill: #333;\",\n },\n ast.title\n )\n : \"\",\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseTiming } from \"./parser\";\nimport { renderTiming } from \"./renderer\";\n\nexport const timing: DiagramPlugin = {\n type: \"timing\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"timing\");\n },\n parse: parseTiming,\n\n render(text: string): string {\n const ast = parseTiming(text);\n return renderTiming(ast);\n },\n};\n\nexport { parseTiming } from \"./parser\";\nexport { renderTiming } from \"./renderer\";\n"]}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
4
+ var chunkNAGUZFXX_cjs = require('./chunk-NAGUZFXX.cjs');
4
5
  var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
5
6
 
6
7
  // src/diagrams/venn/parser.ts
@@ -21,30 +22,47 @@ var DEFAULT_CONFIG = {
21
22
  showPercent: false
22
23
  };
23
24
  function stripComment(line) {
24
- let inQuote = false;
25
25
  for (let i = 0; i < line.length; i++) {
26
26
  const ch = line[i];
27
- if (ch === '"') inQuote = !inQuote;
28
- else if (ch === "#" && !inQuote) return line.slice(0, i);
27
+ if (chunkNAGUZFXX_cjs.isOpenQuote(ch)) {
28
+ try {
29
+ const r = chunkNAGUZFXX_cjs.extractQuotedString(line, i);
30
+ if (r) {
31
+ i = r.end - 1;
32
+ continue;
33
+ }
34
+ } catch {
35
+ return line;
36
+ }
37
+ }
38
+ if (ch === "#") return line.slice(0, i);
29
39
  }
30
40
  return line;
31
41
  }
32
- function stripQuotes(s) {
33
- const t = s.trim();
34
- if (t.length >= 2 && t.startsWith('"') && t.endsWith('"')) return t.slice(1, -1);
35
- return t;
42
+ function stripQuotes2(s) {
43
+ return chunkNAGUZFXX_cjs.stripQuotes(s);
36
44
  }
37
45
  function parseConfigProps(text2) {
38
46
  const out = {};
39
47
  let depth = 0;
40
- let inQuote = false;
41
48
  let buf = "";
42
49
  const parts = [];
43
- for (const ch of text2) {
44
- if (ch === '"') inQuote = !inQuote;
45
- else if (!inQuote && (ch === "[" || ch === "(" || ch === "{")) depth++;
46
- else if (!inQuote && (ch === "]" || ch === ")" || ch === "}")) depth--;
47
- if (ch === "," && depth === 0 && !inQuote) {
50
+ for (let i = 0; i < text2.length; i++) {
51
+ const ch = text2[i];
52
+ if (chunkNAGUZFXX_cjs.isOpenQuote(ch)) {
53
+ try {
54
+ const r = chunkNAGUZFXX_cjs.extractQuotedString(text2, i);
55
+ if (r) {
56
+ buf += text2.slice(i, r.end);
57
+ i = r.end - 1;
58
+ continue;
59
+ }
60
+ } catch {
61
+ }
62
+ }
63
+ if (ch === "[" || ch === "(" || ch === "{") depth++;
64
+ else if (ch === "]" || ch === ")" || ch === "}") depth--;
65
+ if (ch === "," && depth === 0) {
48
66
  parts.push(buf);
49
67
  buf = "";
50
68
  } else {
@@ -57,7 +75,7 @@ function parseConfigProps(text2) {
57
75
  if (idx < 0) continue;
58
76
  const k = p.slice(0, idx).trim();
59
77
  const v = p.slice(idx + 1).trim();
60
- out[k] = stripQuotes(v);
78
+ out[k] = stripQuotes2(v);
61
79
  }
62
80
  return out;
63
81
  }
@@ -65,11 +83,16 @@ function parseTitleAndProps(rest) {
65
83
  const trimmed = rest.trim();
66
84
  let i = 0;
67
85
  let title2;
68
- if (trimmed.startsWith('"')) {
69
- const end = trimmed.indexOf('"', 1);
70
- if (end < 0) throw new VennParseError("unterminated quoted title");
71
- title2 = trimmed.slice(1, end);
72
- i = end + 1;
86
+ if (trimmed.length > 0 && chunkNAGUZFXX_cjs.isOpenQuote(trimmed[0])) {
87
+ try {
88
+ const r = chunkNAGUZFXX_cjs.extractQuotedString(trimmed, 0);
89
+ if (r) {
90
+ title2 = r.value;
91
+ i = r.end;
92
+ }
93
+ } catch {
94
+ throw new VennParseError("unterminated quoted title");
95
+ }
73
96
  }
74
97
  const tail = trimmed.slice(i).trim();
75
98
  let props = {};
@@ -84,7 +107,7 @@ function parseValue(raw) {
84
107
  if (t.startsWith("[") && t.endsWith("]")) {
85
108
  const inner = t.slice(1, -1).trim();
86
109
  if (!inner) return { kind: "list", value: [] };
87
- const items = splitTopLevelCommas(inner).map((x) => stripQuotes(x.trim()));
110
+ const items = splitTopLevelCommas(inner).map((x) => stripQuotes2(x.trim()));
88
111
  return { kind: "list", value: items };
89
112
  }
90
113
  if (/^-?\d+(\.\d+)?%$/.test(t)) {
@@ -93,8 +116,9 @@ function parseValue(raw) {
93
116
  if (/^-?\d+$/.test(t)) {
94
117
  return { kind: "integer", value: parseInt(t, 10) };
95
118
  }
96
- if (t.startsWith('"') && t.endsWith('"')) {
97
- return { kind: "text", value: t.slice(1, -1) };
119
+ if (t.length >= 2 && chunkNAGUZFXX_cjs.isOpenQuote(t[0])) {
120
+ const stripped = chunkNAGUZFXX_cjs.stripQuotes(t);
121
+ if (stripped !== t) return { kind: "text", value: stripped };
98
122
  }
99
123
  return { kind: "text", value: t };
100
124
  }
@@ -102,12 +126,22 @@ function splitTopLevelCommas(s) {
102
126
  const out = [];
103
127
  let buf = "";
104
128
  let depth = 0;
105
- let inQuote = false;
106
- for (const ch of s) {
107
- if (ch === '"') inQuote = !inQuote;
108
- else if (!inQuote && (ch === "{" || ch === "[" || ch === "(")) depth++;
109
- else if (!inQuote && (ch === "}" || ch === "]" || ch === ")")) depth--;
110
- if (ch === "," && depth === 0 && !inQuote) {
129
+ for (let i = 0; i < s.length; i++) {
130
+ const ch = s[i];
131
+ if (chunkNAGUZFXX_cjs.isOpenQuote(ch)) {
132
+ try {
133
+ const r = chunkNAGUZFXX_cjs.extractQuotedString(s, i);
134
+ if (r) {
135
+ buf += s.slice(i, r.end);
136
+ i = r.end - 1;
137
+ continue;
138
+ }
139
+ } catch {
140
+ }
141
+ }
142
+ if (ch === "{" || ch === "[" || ch === "(") depth++;
143
+ else if (ch === "}" || ch === "]" || ch === ")") depth--;
144
+ if (ch === "," && depth === 0) {
111
145
  out.push(buf);
112
146
  buf = "";
113
147
  } else {
@@ -202,7 +236,7 @@ function parseVennDSL(input) {
202
236
  const enumMatch = /^([A-Za-z][\w-]*)\s*=\s*\{([^}]*)\}\s*$/.exec(raw);
203
237
  if (enumMatch && enumMatch[1] !== void 0 && enumMatch[2] !== void 0) {
204
238
  const id = enumMatch[1];
205
- const items = splitTopLevelCommas(enumMatch[2]).map((x) => stripQuotes(x.trim())).filter((x) => x.length > 0);
239
+ const items = splitTopLevelCommas(enumMatch[2]).map((x) => stripQuotes2(x.trim())).filter((x) => x.length > 0);
206
240
  let setObj = setsById.get(id);
207
241
  if (!setObj) {
208
242
  setObj = { id, label: id, elements: items };
@@ -1217,5 +1251,5 @@ exports.renderVenn = renderVenn;
1217
1251
  exports.renderVennAST = renderVennAST;
1218
1252
  exports.renderVennLayout = renderVennLayout;
1219
1253
  exports.venn = venn;
1220
- //# sourceMappingURL=chunk-MIKCKV27.cjs.map
1221
- //# sourceMappingURL=chunk-MIKCKV27.cjs.map
1254
+ //# sourceMappingURL=chunk-BW4KGTV7.cjs.map
1255
+ //# sourceMappingURL=chunk-BW4KGTV7.cjs.map