schematex 0.5.2 → 0.6.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.
Files changed (174) hide show
  1. package/README.md +75 -1
  2. package/dist/ai/ai-sdk.cjs +22 -22
  3. package/dist/ai/ai-sdk.d.cts +3 -3
  4. package/dist/ai/ai-sdk.d.ts +3 -3
  5. package/dist/ai/ai-sdk.js +17 -17
  6. package/dist/ai/index.cjs +34 -26
  7. package/dist/ai/index.d.cts +4 -4
  8. package/dist/ai/index.d.ts +4 -4
  9. package/dist/ai/index.js +17 -17
  10. package/dist/{api-Cr_MxttI.d.ts → api-XWHHAhQI.d.ts} +3 -40
  11. package/dist/{api-C5SECOxZ.d.cts → api-qVDutqXH.d.cts} +3 -40
  12. package/dist/browser.cjs +23 -23
  13. package/dist/browser.d.cts +3 -3
  14. package/dist/browser.d.ts +3 -3
  15. package/dist/browser.js +17 -17
  16. package/dist/{chunk-4QPDZJAL.cjs → chunk-25ZON47K.cjs} +11484 -9030
  17. package/dist/chunk-25ZON47K.cjs.map +1 -0
  18. package/dist/{chunk-N7W5KZK7.cjs → chunk-2L4YXZAZ.cjs} +4 -4
  19. package/dist/{chunk-N7W5KZK7.cjs.map → chunk-2L4YXZAZ.cjs.map} +1 -1
  20. package/dist/{chunk-ZYRCPSBU.js → chunk-3IE7KZY4.js} +4 -4
  21. package/dist/{chunk-ZYRCPSBU.js.map → chunk-3IE7KZY4.js.map} +1 -1
  22. package/dist/{chunk-ZX74KJPM.js → chunk-3VB5AT4R.js} +3 -3
  23. package/dist/{chunk-ZX74KJPM.js.map → chunk-3VB5AT4R.js.map} +1 -1
  24. package/dist/{chunk-S2KJRHDZ.cjs → chunk-4UFR2LB6.cjs} +13 -13
  25. package/dist/{chunk-S2KJRHDZ.cjs.map → chunk-4UFR2LB6.cjs.map} +1 -1
  26. package/dist/{chunk-QTNPMIO2.cjs → chunk-6JI6FWLZ.cjs} +341 -35
  27. package/dist/chunk-6JI6FWLZ.cjs.map +1 -0
  28. package/dist/{chunk-OK5ZS3LU.js → chunk-7AFW2J6J.js} +11445 -8998
  29. package/dist/chunk-7AFW2J6J.js.map +1 -0
  30. package/dist/{chunk-UFTYX73U.js → chunk-7F76AWOI.js} +339 -35
  31. package/dist/chunk-7F76AWOI.js.map +1 -0
  32. package/dist/{chunk-BW4KGTV7.cjs → chunk-C5C5EF3W.cjs} +4 -4
  33. package/dist/{chunk-BW4KGTV7.cjs.map → chunk-C5C5EF3W.cjs.map} +1 -1
  34. package/dist/{chunk-VJGMEGMR.js → chunk-DOK7LKLO.js} +125 -13
  35. package/dist/chunk-DOK7LKLO.js.map +1 -0
  36. package/dist/{chunk-3M6WB62Y.cjs → chunk-ECD5XHBM.cjs} +139 -7
  37. package/dist/chunk-ECD5XHBM.cjs.map +1 -0
  38. package/dist/{chunk-L3CTXXVZ.js → chunk-FBS3PACU.js} +3 -3
  39. package/dist/{chunk-L3CTXXVZ.js.map → chunk-FBS3PACU.js.map} +1 -1
  40. package/dist/{chunk-QUKVGHN4.cjs → chunk-FKJBXGWP.cjs} +4 -4
  41. package/dist/{chunk-QUKVGHN4.cjs.map → chunk-FKJBXGWP.cjs.map} +1 -1
  42. package/dist/{chunk-SZK376QB.js → chunk-H4MT5TJP.js} +3 -3
  43. package/dist/{chunk-SZK376QB.js.map → chunk-H4MT5TJP.js.map} +1 -1
  44. package/dist/{chunk-3M6T7KB4.js → chunk-HAZALB7U.js} +3 -3
  45. package/dist/{chunk-3M6T7KB4.js.map → chunk-HAZALB7U.js.map} +1 -1
  46. package/dist/{chunk-VFZOPRQP.cjs → chunk-HWVBHU3O.cjs} +5 -5
  47. package/dist/{chunk-VFZOPRQP.cjs.map → chunk-HWVBHU3O.cjs.map} +1 -1
  48. package/dist/{chunk-D7EHZFK4.cjs → chunk-L7POWM5B.cjs} +138 -2
  49. package/dist/chunk-L7POWM5B.cjs.map +1 -0
  50. package/dist/{chunk-6OSUNBZY.js → chunk-LGABFD3L.js} +135 -7
  51. package/dist/chunk-LGABFD3L.js.map +1 -0
  52. package/dist/{chunk-2VNMKOUO.js → chunk-LRI4RH2N.js} +135 -3
  53. package/dist/chunk-LRI4RH2N.js.map +1 -0
  54. package/dist/{chunk-VDSYMSUY.js → chunk-MVIEIKOI.js} +3 -3
  55. package/dist/{chunk-VDSYMSUY.js.map → chunk-MVIEIKOI.js.map} +1 -1
  56. package/dist/{chunk-ZL5RB4UV.js → chunk-N5B242WY.js} +3 -3
  57. package/dist/{chunk-ZL5RB4UV.js.map → chunk-N5B242WY.js.map} +1 -1
  58. package/dist/{chunk-VKPCR7BG.js → chunk-P63S7P6N.js} +770 -12
  59. package/dist/chunk-P63S7P6N.js.map +1 -0
  60. package/dist/{chunk-YLEVMOK2.cjs → chunk-R66QG3XT.cjs} +5 -4
  61. package/dist/{chunk-YLEVMOK2.cjs.map → chunk-R66QG3XT.cjs.map} +1 -1
  62. package/dist/{chunk-I55HO32M.js → chunk-RJMCWT7Z.js} +3 -3
  63. package/dist/{chunk-I55HO32M.js.map → chunk-RJMCWT7Z.js.map} +1 -1
  64. package/dist/{chunk-TZTCIAYW.cjs → chunk-S3RMAXH5.cjs} +137 -25
  65. package/dist/chunk-S3RMAXH5.cjs.map +1 -0
  66. package/dist/{chunk-IBRW3UOA.js → chunk-TWLKXV2O.js} +3 -3
  67. package/dist/{chunk-IBRW3UOA.js.map → chunk-TWLKXV2O.js.map} +1 -1
  68. package/dist/{chunk-VCH7RI5H.js → chunk-UWA5MWCI.js} +4 -4
  69. package/dist/chunk-UWA5MWCI.js.map +1 -0
  70. package/dist/{chunk-RYVV5UVI.cjs → chunk-V4GILQR6.cjs} +4 -4
  71. package/dist/{chunk-RYVV5UVI.cjs.map → chunk-V4GILQR6.cjs.map} +1 -1
  72. package/dist/{chunk-QMTWG6JL.cjs → chunk-V4RO5KYY.cjs} +6 -4
  73. package/dist/chunk-V4RO5KYY.cjs.map +1 -0
  74. package/dist/{chunk-VZ5LDNHK.cjs → chunk-VTSH4YPT.cjs} +12 -12
  75. package/dist/{chunk-VZ5LDNHK.cjs.map → chunk-VTSH4YPT.cjs.map} +1 -1
  76. package/dist/{chunk-UUBNQV2T.cjs → chunk-WQDIZH2Z.cjs} +12 -12
  77. package/dist/{chunk-UUBNQV2T.cjs.map → chunk-WQDIZH2Z.cjs.map} +1 -1
  78. package/dist/{chunk-EGSUMHCS.cjs → chunk-YB4XJY5L.cjs} +12 -12
  79. package/dist/{chunk-EGSUMHCS.cjs.map → chunk-YB4XJY5L.cjs.map} +1 -1
  80. package/dist/{chunk-JHDR56XO.js → chunk-YS6CGUNH.js} +3 -3
  81. package/dist/{chunk-JHDR56XO.js.map → chunk-YS6CGUNH.js.map} +1 -1
  82. package/dist/{chunk-HK56GQQP.cjs → chunk-YVDUEUFV.cjs} +773 -13
  83. package/dist/chunk-YVDUEUFV.cjs.map +1 -0
  84. package/dist/{types-WTr9W5Ud.d.ts → diagnostics-DRxhodP6.d.cts} +74 -2
  85. package/dist/{types-WTr9W5Ud.d.cts → diagnostics-DRxhodP6.d.ts} +74 -2
  86. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  87. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  88. package/dist/diagrams/circuit/index.cjs +8 -8
  89. package/dist/diagrams/circuit/index.d.cts +1 -1
  90. package/dist/diagrams/circuit/index.d.ts +1 -1
  91. package/dist/diagrams/circuit/index.js +2 -2
  92. package/dist/diagrams/ecomap/index.cjs +7 -7
  93. package/dist/diagrams/ecomap/index.d.cts +1 -1
  94. package/dist/diagrams/ecomap/index.d.ts +1 -1
  95. package/dist/diagrams/ecomap/index.js +2 -2
  96. package/dist/diagrams/entity/index.cjs +6 -6
  97. package/dist/diagrams/entity/index.d.cts +1 -1
  98. package/dist/diagrams/entity/index.d.ts +1 -1
  99. package/dist/diagrams/entity/index.js +2 -2
  100. package/dist/diagrams/fishbone/index.cjs +8 -8
  101. package/dist/diagrams/fishbone/index.d.cts +1 -1
  102. package/dist/diagrams/fishbone/index.d.ts +1 -1
  103. package/dist/diagrams/fishbone/index.js +2 -2
  104. package/dist/diagrams/flowchart/index.cjs +8 -8
  105. package/dist/diagrams/flowchart/index.d.cts +2 -2
  106. package/dist/diagrams/flowchart/index.d.ts +2 -2
  107. package/dist/diagrams/flowchart/index.js +2 -2
  108. package/dist/diagrams/genogram/index.cjs +9 -9
  109. package/dist/diagrams/genogram/index.d.cts +1 -1
  110. package/dist/diagrams/genogram/index.d.ts +1 -1
  111. package/dist/diagrams/genogram/index.js +2 -2
  112. package/dist/diagrams/ladder/index.cjs +6 -6
  113. package/dist/diagrams/ladder/index.d.cts +1 -1
  114. package/dist/diagrams/ladder/index.d.ts +1 -1
  115. package/dist/diagrams/ladder/index.js +2 -2
  116. package/dist/diagrams/logic/index.cjs +6 -6
  117. package/dist/diagrams/logic/index.d.cts +1 -1
  118. package/dist/diagrams/logic/index.d.ts +1 -1
  119. package/dist/diagrams/logic/index.js +2 -2
  120. package/dist/diagrams/orgchart/index.cjs +7 -7
  121. package/dist/diagrams/orgchart/index.d.cts +1 -1
  122. package/dist/diagrams/orgchart/index.d.ts +1 -1
  123. package/dist/diagrams/orgchart/index.js +2 -2
  124. package/dist/diagrams/pedigree/index.cjs +7 -7
  125. package/dist/diagrams/pedigree/index.d.cts +1 -1
  126. package/dist/diagrams/pedigree/index.d.ts +1 -1
  127. package/dist/diagrams/pedigree/index.js +2 -2
  128. package/dist/diagrams/phylo/index.cjs +7 -7
  129. package/dist/diagrams/phylo/index.d.cts +1 -1
  130. package/dist/diagrams/phylo/index.d.ts +1 -1
  131. package/dist/diagrams/phylo/index.js +2 -2
  132. package/dist/diagrams/sld/index.cjs +14 -6
  133. package/dist/diagrams/sld/index.d.cts +14 -2
  134. package/dist/diagrams/sld/index.d.ts +14 -2
  135. package/dist/diagrams/sld/index.js +2 -2
  136. package/dist/diagrams/sociogram/index.cjs +6 -6
  137. package/dist/diagrams/sociogram/index.d.cts +1 -1
  138. package/dist/diagrams/sociogram/index.d.ts +1 -1
  139. package/dist/diagrams/sociogram/index.js +2 -2
  140. package/dist/diagrams/timing/index.d.cts +1 -1
  141. package/dist/diagrams/timing/index.d.ts +1 -1
  142. package/dist/diagrams/venn/index.cjs +9 -9
  143. package/dist/diagrams/venn/index.d.cts +1 -1
  144. package/dist/diagrams/venn/index.d.ts +1 -1
  145. package/dist/diagrams/venn/index.js +2 -2
  146. package/dist/{index-C30zQWZI.d.ts → index-BRIkOPnd.d.cts} +60 -2
  147. package/dist/{index-BD2yDfQM.d.cts → index-C7SN-FB3.d.ts} +60 -2
  148. package/dist/index.cjs +342 -54
  149. package/dist/index.cjs.map +1 -1
  150. package/dist/index.d.cts +38 -4
  151. package/dist/index.d.ts +38 -4
  152. package/dist/index.js +283 -16
  153. package/dist/index.js.map +1 -1
  154. package/dist/react.cjs +17 -17
  155. package/dist/react.d.cts +2 -2
  156. package/dist/react.d.ts +2 -2
  157. package/dist/react.js +16 -16
  158. package/dist/{tools-BHWaJPOl.d.ts → tools-BVeUNdsU.d.ts} +12 -4
  159. package/dist/{tools-DlpuE76u.d.cts → tools-DdhP1kWY.d.cts} +12 -4
  160. package/package.json +1 -1
  161. package/dist/chunk-2VNMKOUO.js.map +0 -1
  162. package/dist/chunk-3M6WB62Y.cjs.map +0 -1
  163. package/dist/chunk-4QPDZJAL.cjs.map +0 -1
  164. package/dist/chunk-6OSUNBZY.js.map +0 -1
  165. package/dist/chunk-D7EHZFK4.cjs.map +0 -1
  166. package/dist/chunk-HK56GQQP.cjs.map +0 -1
  167. package/dist/chunk-OK5ZS3LU.js.map +0 -1
  168. package/dist/chunk-QMTWG6JL.cjs.map +0 -1
  169. package/dist/chunk-QTNPMIO2.cjs.map +0 -1
  170. package/dist/chunk-TZTCIAYW.cjs.map +0 -1
  171. package/dist/chunk-UFTYX73U.js.map +0 -1
  172. package/dist/chunk-VCH7RI5H.js.map +0 -1
  173. package/dist/chunk-VJGMEGMR.js.map +0 -1
  174. package/dist/chunk-VKPCR7BG.js.map +0 -1
@@ -1 +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-IBRW3UOA.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\";\nimport { didYouMean } from \"../../core/dsl-suggest\";\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\"]);\n// IEC 61131-3 §6.7 coil types + Rockwell/Allen-Bradley extensions.\n// OTE/OTL/OTU/OTN — output energize / latch / unlatch / not (IEC + AB)\n// RES — counter / timer reset (AB convention; IEC writes `R` on\n// a reset rung). Visually a coil with `R` inscribed.\nconst COIL_TYPES = new Set<LadderCoilType>([\"OTE\", \"OTL\", \"OTU\", \"OTN\", \"RES\"]);\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\nconst ALL_ELEMENT_TYPES: string[] = [\n ...CONTACT_TYPES,\n ...COIL_TYPES,\n ...FB_TYPES,\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/**\n * Split an element line into op + inner-arg-string, walking paren depth and\n * respecting double-quoted regions. Replaces the old `^OP\\s*\\(([^)]*)\\)\\s*$`\n * regex which broke on quoted names that themselves contained parens — e.g.\n * `XIC(SENSOR, name=\"الحساس (صغير)\")` would terminate at the inner `)`.\n */\nfunction splitOpAndArgs(line: string): { op: string; inside: string } | null {\n const opMatch = line.match(/^([A-Z][A-Z0-9_]*)\\s*\\(/);\n if (!opMatch) return null;\n const op = opMatch[1]!;\n const start = opMatch[0]!.length;\n let depth = 1;\n let inQuote = false;\n let end = -1;\n for (let i = start; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === '\"' && line[i - 1] !== \"\\\\\") {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) continue;\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end < 0) return null;\n // Trailing chars after the closing `)` are only allowed if blank.\n if (line.slice(end + 1).trim() !== \"\") return null;\n return { op, inside: line.slice(start, end) };\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 = splitOpAndArgs(line);\n if (!m) {\n throw new LadderParseError(`invalid element syntax: ${line}`, lineNo, undefined, line);\n }\n const op = m.op;\n const args = splitArgs(m.inside);\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(\n `unknown element type \"${op}\"${didYouMean(op, ALL_ELEMENT_TYPES)}`,\n lineNo,\n undefined,\n line\n );\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 // Strip `#`, `//`, or Mermaid `%%` line comments. Quote-awareness is\n // overkill here: ladder lines don't carry URL-shaped attributes, and\n // a literal `#` inside a quoted PLC tag is exceedingly rare.\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\":` — the trailing colon is optional, since LLMs\n // routinely emit `rung 1` without it (Mermaid never uses a colon here, so\n // it's not in the training data). The optional quoted comment is unchanged.\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 else if (c.coilType === \"RES\") inner = \"R\";\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 { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseLadderDSL } from \"./parser\";\nimport { renderLadder } from \"./renderer\";\n\nexport const ladder: DiagramPlugin = {\n type: \"ladder\",\n detect(text: string): boolean {\n const first = firstContentLine(text)?.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"]}
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-TWLKXV2O.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\";\nimport { didYouMean } from \"../../core/dsl-suggest\";\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\"]);\n// IEC 61131-3 §6.7 coil types + Rockwell/Allen-Bradley extensions.\n// OTE/OTL/OTU/OTN — output energize / latch / unlatch / not (IEC + AB)\n// RES — counter / timer reset (AB convention; IEC writes `R` on\n// a reset rung). Visually a coil with `R` inscribed.\nconst COIL_TYPES = new Set<LadderCoilType>([\"OTE\", \"OTL\", \"OTU\", \"OTN\", \"RES\"]);\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\nconst ALL_ELEMENT_TYPES: string[] = [\n ...CONTACT_TYPES,\n ...COIL_TYPES,\n ...FB_TYPES,\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/**\n * Split an element line into op + inner-arg-string, walking paren depth and\n * respecting double-quoted regions. Replaces the old `^OP\\s*\\(([^)]*)\\)\\s*$`\n * regex which broke on quoted names that themselves contained parens — e.g.\n * `XIC(SENSOR, name=\"الحساس (صغير)\")` would terminate at the inner `)`.\n */\nfunction splitOpAndArgs(line: string): { op: string; inside: string } | null {\n const opMatch = line.match(/^([A-Z][A-Z0-9_]*)\\s*\\(/);\n if (!opMatch) return null;\n const op = opMatch[1]!;\n const start = opMatch[0]!.length;\n let depth = 1;\n let inQuote = false;\n let end = -1;\n for (let i = start; i < line.length; i++) {\n const ch = line[i]!;\n if (ch === '\"' && line[i - 1] !== \"\\\\\") {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) continue;\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end < 0) return null;\n // Trailing chars after the closing `)` are only allowed if blank.\n if (line.slice(end + 1).trim() !== \"\") return null;\n return { op, inside: line.slice(start, end) };\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 = splitOpAndArgs(line);\n if (!m) {\n throw new LadderParseError(`invalid element syntax: ${line}`, lineNo, undefined, line);\n }\n const op = m.op;\n const args = splitArgs(m.inside);\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(\n `unknown element type \"${op}\"${didYouMean(op, ALL_ELEMENT_TYPES)}`,\n lineNo,\n undefined,\n line\n );\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 // Strip `#`, `//`, or Mermaid `%%` line comments. Quote-awareness is\n // overkill here: ladder lines don't carry URL-shaped attributes, and\n // a literal `#` inside a quoted PLC tag is exceedingly rare.\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\":` — the trailing colon is optional, since LLMs\n // routinely emit `rung 1` without it (Mermaid never uses a colon here, so\n // it's not in the training data). The optional quoted comment is unchanged.\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 else if (c.coilType === \"RES\") inner = \"R\";\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 { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseLadderDSL } from \"./parser\";\nimport { renderLadder } from \"./renderer\";\n\nexport const ladder: DiagramPlugin = {\n type: \"ladder\",\n detect(text: string): boolean {\n const first = firstContentLine(text)?.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"]}
@@ -1,4 +1,4 @@
1
- import { resolveIndustrialTheme } from './chunk-2VNMKOUO.js';
1
+ import { resolveIndustrialTheme } from './chunk-LRI4RH2N.js';
2
2
  import { matchQuotedTitle } from './chunk-5IKOLUWK.js';
3
3
  import { text, svgRoot, title, desc, defs, el, group, circle, escapeXml } from './chunk-SYYBKDL7.js';
4
4
 
@@ -2040,6 +2040,6 @@ var circuit = {
2040
2040
  }
2041
2041
  };
2042
2042
 
2043
- export { circuit, layoutCircuit, layoutCircuitNetlist, parseCircuit, parseNetlist, renderCircuit };
2044
- //# sourceMappingURL=chunk-VCH7RI5H.js.map
2045
- //# sourceMappingURL=chunk-VCH7RI5H.js.map
2043
+ export { EXTRA_SYMBOLS, SYMBOLS, circuit, layoutCircuit, layoutCircuitNetlist, parseCircuit, parseNetlist, renderCircuit };
2044
+ //# sourceMappingURL=chunk-UWA5MWCI.js.map
2045
+ //# sourceMappingURL=chunk-UWA5MWCI.js.map