schematex 0.3.0 → 0.3.3

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 (186) hide show
  1. package/dist/ai/ai-sdk.cjs +25 -25
  2. package/dist/ai/ai-sdk.d.cts +1 -1
  3. package/dist/ai/ai-sdk.d.ts +1 -1
  4. package/dist/ai/ai-sdk.js +20 -20
  5. package/dist/ai/index.cjs +28 -28
  6. package/dist/ai/index.d.cts +1 -1
  7. package/dist/ai/index.d.ts +1 -1
  8. package/dist/ai/index.js +20 -20
  9. package/dist/browser.cjs +22 -22
  10. package/dist/browser.js +20 -20
  11. package/dist/{chunk-HDKDQAEQ.cjs → chunk-3WNW5Y7P.cjs} +54 -2
  12. package/dist/chunk-3WNW5Y7P.cjs.map +1 -0
  13. package/dist/{chunk-B6INLQBU.cjs → chunk-55UEHL57.cjs} +46 -46
  14. package/dist/{chunk-B6INLQBU.cjs.map → chunk-55UEHL57.cjs.map} +1 -1
  15. package/dist/{chunk-JDTB7IKL.js → chunk-5U2W3HQA.js} +3 -3
  16. package/dist/{chunk-JDTB7IKL.js.map → chunk-5U2W3HQA.js.map} +1 -1
  17. package/dist/{chunk-ULYRO2KY.cjs → chunk-5UCXMYE7.cjs} +44 -44
  18. package/dist/{chunk-ULYRO2KY.cjs.map → chunk-5UCXMYE7.cjs.map} +1 -1
  19. package/dist/{chunk-UGCUNADI.js → chunk-66XQBGX7.js} +35 -16
  20. package/dist/chunk-66XQBGX7.js.map +1 -0
  21. package/dist/{chunk-45KP67RR.js → chunk-6TIN33CA.js} +5 -5
  22. package/dist/chunk-6TIN33CA.js.map +1 -0
  23. package/dist/{chunk-NNU4RGT3.js → chunk-6YUP3QMA.js} +39 -27
  24. package/dist/chunk-6YUP3QMA.js.map +1 -0
  25. package/dist/{chunk-COLTVQWR.cjs → chunk-7EWFVNYD.cjs} +25 -25
  26. package/dist/{chunk-COLTVQWR.cjs.map → chunk-7EWFVNYD.cjs.map} +1 -1
  27. package/dist/{chunk-RP5UATRA.js → chunk-AC3XH3LB.js} +4 -4
  28. package/dist/{chunk-RP5UATRA.js.map → chunk-AC3XH3LB.js.map} +1 -1
  29. package/dist/{chunk-XTATRNUN.cjs → chunk-APV4AWQ5.cjs} +442 -430
  30. package/dist/chunk-APV4AWQ5.cjs.map +1 -0
  31. package/dist/{chunk-NZH4GWE6.cjs → chunk-AVIKQZSX.cjs} +37 -37
  32. package/dist/{chunk-NZH4GWE6.cjs.map → chunk-AVIKQZSX.cjs.map} +1 -1
  33. package/dist/{chunk-X7RPFTTR.cjs → chunk-CWZKP3CJ.cjs} +26 -26
  34. package/dist/{chunk-X7RPFTTR.cjs.map → chunk-CWZKP3CJ.cjs.map} +1 -1
  35. package/dist/{chunk-TYCHEOQX.js → chunk-FIVUMDLF.js} +49 -24
  36. package/dist/chunk-FIVUMDLF.js.map +1 -0
  37. package/dist/{chunk-DNZFOCV7.js → chunk-FO7BLCEW.js} +3 -3
  38. package/dist/{chunk-DNZFOCV7.js.map → chunk-FO7BLCEW.js.map} +1 -1
  39. package/dist/{chunk-OC22GGQN.js → chunk-GLFBHQSQ.js} +54 -4
  40. package/dist/chunk-GLFBHQSQ.js.map +1 -0
  41. package/dist/{chunk-XZNPAD6E.js → chunk-GVCPFBAV.js} +59 -8
  42. package/dist/chunk-GVCPFBAV.js.map +1 -0
  43. package/dist/{chunk-B37IKTI7.cjs → chunk-HOI6QKC6.cjs} +97 -47
  44. package/dist/chunk-HOI6QKC6.cjs.map +1 -0
  45. package/dist/{chunk-A5D2IMOX.cjs → chunk-IAEABLIV.cjs} +47 -47
  46. package/dist/{chunk-A5D2IMOX.cjs.map → chunk-IAEABLIV.cjs.map} +1 -1
  47. package/dist/{chunk-5YYAYW67.js → chunk-IQRRZPVZ.js} +3 -3
  48. package/dist/{chunk-5YYAYW67.js.map → chunk-IQRRZPVZ.js.map} +1 -1
  49. package/dist/{chunk-VLMK7MQK.js → chunk-MNOO7STY.js} +25 -6
  50. package/dist/chunk-MNOO7STY.js.map +1 -0
  51. package/dist/{chunk-ZNOD4VZT.cjs → chunk-N56YC75X.cjs} +46 -46
  52. package/dist/{chunk-ZNOD4VZT.cjs.map → chunk-N56YC75X.cjs.map} +1 -1
  53. package/dist/{chunk-YQANC7HQ.js → chunk-PAG3BNIV.js} +3 -3
  54. package/dist/{chunk-YQANC7HQ.js.map → chunk-PAG3BNIV.js.map} +1 -1
  55. package/dist/{chunk-QSQX77S2.cjs → chunk-PG6TDGKI.cjs} +21 -21
  56. package/dist/{chunk-QSQX77S2.cjs.map → chunk-PG6TDGKI.cjs.map} +1 -1
  57. package/dist/{chunk-WYFXOXVK.cjs → chunk-Q5OFA4I2.cjs} +35 -35
  58. package/dist/{chunk-WYFXOXVK.cjs.map → chunk-Q5OFA4I2.cjs.map} +1 -1
  59. package/dist/{chunk-MJGDP3CS.cjs → chunk-QOLBWCF5.cjs} +488 -109
  60. package/dist/chunk-QOLBWCF5.cjs.map +1 -0
  61. package/dist/{chunk-MCFQAUQV.cjs → chunk-QXL7AY2H.cjs} +58 -39
  62. package/dist/chunk-QXL7AY2H.cjs.map +1 -0
  63. package/dist/chunk-SYYBKDL7.js +122 -0
  64. package/dist/chunk-SYYBKDL7.js.map +1 -0
  65. package/dist/{chunk-H2OEUBPO.js → chunk-TQU44E46.js} +441 -62
  66. package/dist/chunk-TQU44E46.js.map +1 -0
  67. package/dist/{chunk-FCGHV6ZK.js → chunk-U3KRKXF7.js} +4 -4
  68. package/dist/{chunk-FCGHV6ZK.js.map → chunk-U3KRKXF7.js.map} +1 -1
  69. package/dist/{chunk-3YZ6FPQW.cjs → chunk-UDGU73RL.cjs} +131 -131
  70. package/dist/{chunk-3YZ6FPQW.cjs.map → chunk-UDGU73RL.cjs.map} +1 -1
  71. package/dist/{chunk-U6L3FAML.js → chunk-UDJ2KN2A.js} +3 -3
  72. package/dist/{chunk-U6L3FAML.js.map → chunk-UDJ2KN2A.js.map} +1 -1
  73. package/dist/{chunk-FE6GAUNW.js → chunk-UT4TIDAA.js} +5 -5
  74. package/dist/{chunk-FE6GAUNW.js.map → chunk-UT4TIDAA.js.map} +1 -1
  75. package/dist/{chunk-SQKLKBBK.cjs → chunk-UWRTV6IV.cjs} +27 -8
  76. package/dist/chunk-UWRTV6IV.cjs.map +1 -0
  77. package/dist/{chunk-NB56L5QK.js → chunk-WTF6JXHN.js} +4 -4
  78. package/dist/{chunk-NB56L5QK.js.map → chunk-WTF6JXHN.js.map} +1 -1
  79. package/dist/{chunk-ZNDIGQJD.js → chunk-X5QJO4ZD.js} +3 -3
  80. package/dist/{chunk-ZNDIGQJD.js.map → chunk-X5QJO4ZD.js.map} +1 -1
  81. package/dist/{chunk-M5B2UUNW.js → chunk-XV2DTN6G.js} +4 -4
  82. package/dist/{chunk-M5B2UUNW.js.map → chunk-XV2DTN6G.js.map} +1 -1
  83. package/dist/{chunk-K2SOC3XF.cjs → chunk-YUPG2M3I.cjs} +71 -20
  84. package/dist/chunk-YUPG2M3I.cjs.map +1 -0
  85. package/dist/{chunk-2JDVJRR3.cjs → chunk-ZCW7YH3C.cjs} +28 -28
  86. package/dist/chunk-ZCW7YH3C.cjs.map +1 -0
  87. package/dist/{chunk-3FKS4KQK.cjs → chunk-ZFNZ2FYI.cjs} +88 -63
  88. package/dist/chunk-ZFNZ2FYI.cjs.map +1 -0
  89. package/dist/{chunk-5AEN2PLB.cjs → chunk-ZZJDGGC3.cjs} +33 -33
  90. package/dist/{chunk-5AEN2PLB.cjs.map → chunk-ZZJDGGC3.cjs.map} +1 -1
  91. package/dist/diagrams/blockdiagram/index.cjs +6 -6
  92. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  93. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  94. package/dist/diagrams/blockdiagram/index.js +2 -2
  95. package/dist/diagrams/circuit/index.cjs +8 -8
  96. package/dist/diagrams/circuit/index.d.cts +1 -1
  97. package/dist/diagrams/circuit/index.d.ts +1 -1
  98. package/dist/diagrams/circuit/index.js +2 -2
  99. package/dist/diagrams/ecomap/index.cjs +8 -8
  100. package/dist/diagrams/ecomap/index.d.cts +1 -1
  101. package/dist/diagrams/ecomap/index.d.ts +1 -1
  102. package/dist/diagrams/ecomap/index.js +3 -3
  103. package/dist/diagrams/entity/index.cjs +6 -6
  104. package/dist/diagrams/entity/index.d.cts +1 -1
  105. package/dist/diagrams/entity/index.d.ts +1 -1
  106. package/dist/diagrams/entity/index.js +2 -2
  107. package/dist/diagrams/fishbone/index.cjs +8 -8
  108. package/dist/diagrams/fishbone/index.d.cts +1 -1
  109. package/dist/diagrams/fishbone/index.d.ts +1 -1
  110. package/dist/diagrams/fishbone/index.js +2 -2
  111. package/dist/diagrams/flowchart/index.cjs +8 -8
  112. package/dist/diagrams/flowchart/index.d.cts +2 -2
  113. package/dist/diagrams/flowchart/index.d.ts +2 -2
  114. package/dist/diagrams/flowchart/index.js +2 -2
  115. package/dist/diagrams/genogram/index.cjs +10 -10
  116. package/dist/diagrams/genogram/index.d.cts +1 -1
  117. package/dist/diagrams/genogram/index.d.ts +1 -1
  118. package/dist/diagrams/genogram/index.js +3 -3
  119. package/dist/diagrams/ladder/index.cjs +6 -6
  120. package/dist/diagrams/ladder/index.d.cts +1 -1
  121. package/dist/diagrams/ladder/index.d.ts +1 -1
  122. package/dist/diagrams/ladder/index.js +2 -2
  123. package/dist/diagrams/logic/index.cjs +6 -6
  124. package/dist/diagrams/logic/index.d.cts +1 -1
  125. package/dist/diagrams/logic/index.d.ts +1 -1
  126. package/dist/diagrams/logic/index.js +2 -2
  127. package/dist/diagrams/orgchart/index.cjs +7 -7
  128. package/dist/diagrams/orgchart/index.d.cts +1 -1
  129. package/dist/diagrams/orgchart/index.d.ts +1 -1
  130. package/dist/diagrams/orgchart/index.js +2 -2
  131. package/dist/diagrams/pedigree/index.cjs +8 -8
  132. package/dist/diagrams/pedigree/index.d.cts +1 -1
  133. package/dist/diagrams/pedigree/index.d.ts +1 -1
  134. package/dist/diagrams/pedigree/index.js +3 -3
  135. package/dist/diagrams/phylo/index.cjs +7 -7
  136. package/dist/diagrams/phylo/index.d.cts +1 -1
  137. package/dist/diagrams/phylo/index.d.ts +1 -1
  138. package/dist/diagrams/phylo/index.js +2 -2
  139. package/dist/diagrams/sld/index.cjs +6 -6
  140. package/dist/diagrams/sld/index.d.cts +1 -1
  141. package/dist/diagrams/sld/index.d.ts +1 -1
  142. package/dist/diagrams/sld/index.js +2 -2
  143. package/dist/diagrams/sociogram/index.cjs +7 -7
  144. package/dist/diagrams/sociogram/index.d.cts +1 -1
  145. package/dist/diagrams/sociogram/index.d.ts +1 -1
  146. package/dist/diagrams/sociogram/index.js +3 -3
  147. package/dist/diagrams/timing/index.cjs +5 -5
  148. package/dist/diagrams/timing/index.d.cts +1 -1
  149. package/dist/diagrams/timing/index.d.ts +1 -1
  150. package/dist/diagrams/timing/index.js +2 -2
  151. package/dist/diagrams/venn/index.cjs +9 -9
  152. package/dist/diagrams/venn/index.d.cts +1 -1
  153. package/dist/diagrams/venn/index.d.ts +1 -1
  154. package/dist/diagrams/venn/index.js +2 -2
  155. package/dist/{index-CUwp4GXI.d.ts → index-D3u6vcA4.d.ts} +1 -1
  156. package/dist/{index-ivhNGsyU.d.cts → index-bdfj6FpQ.d.cts} +1 -1
  157. package/dist/index.cjs +41 -41
  158. package/dist/index.d.cts +2 -2
  159. package/dist/index.d.ts +2 -2
  160. package/dist/index.js +19 -19
  161. package/dist/react.cjs +20 -20
  162. package/dist/react.cjs.map +1 -1
  163. package/dist/react.js +19 -19
  164. package/dist/react.js.map +1 -1
  165. package/dist/{types-Bl-Pn7Wj.d.cts → types-DnU2UlWz.d.cts} +26 -3
  166. package/dist/{types-Bl-Pn7Wj.d.ts → types-DnU2UlWz.d.ts} +26 -3
  167. package/package.json +1 -1
  168. package/dist/chunk-2JDVJRR3.cjs.map +0 -1
  169. package/dist/chunk-3FKS4KQK.cjs.map +0 -1
  170. package/dist/chunk-45KP67RR.js.map +0 -1
  171. package/dist/chunk-B37IKTI7.cjs.map +0 -1
  172. package/dist/chunk-H2OEUBPO.js.map +0 -1
  173. package/dist/chunk-HDKDQAEQ.cjs.map +0 -1
  174. package/dist/chunk-K2SOC3XF.cjs.map +0 -1
  175. package/dist/chunk-KLJEK547.js +0 -71
  176. package/dist/chunk-KLJEK547.js.map +0 -1
  177. package/dist/chunk-MCFQAUQV.cjs.map +0 -1
  178. package/dist/chunk-MJGDP3CS.cjs.map +0 -1
  179. package/dist/chunk-NNU4RGT3.js.map +0 -1
  180. package/dist/chunk-OC22GGQN.js.map +0 -1
  181. package/dist/chunk-SQKLKBBK.cjs.map +0 -1
  182. package/dist/chunk-TYCHEOQX.js.map +0 -1
  183. package/dist/chunk-UGCUNADI.js.map +0 -1
  184. package/dist/chunk-VLMK7MQK.js.map +0 -1
  185. package/dist/chunk-XTATRNUN.cjs.map +0 -1
  186. package/dist/chunk-XZNPAD6E.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkHDKDQAEQ_cjs = require('./chunk-HDKDQAEQ.cjs');
3
+ var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
4
4
 
5
5
  // src/diagrams/blockdiagram/parser.ts
6
6
  var BlockDiagramParseError = class extends Error {
@@ -124,22 +124,30 @@ function parseBlockDiagram(text2) {
124
124
  let tailAttrs = {};
125
125
  if (body.endsWith("]")) {
126
126
  let bracketStart = -1;
127
+ let depth = 0;
127
128
  let inQuote = false;
128
- for (let i2 = 0; i2 < body.length - 1; i2++) {
129
+ for (let i2 = body.length - 1; i2 >= 1; i2--) {
129
130
  const ch = body[i2];
130
131
  if (ch === '"') inQuote = !inQuote;
131
- else if (ch === "[" && !inQuote) {
132
- bracketStart = i2;
133
- break;
132
+ else if (!inQuote && ch === "]") depth++;
133
+ else if (!inQuote && ch === "[") {
134
+ depth--;
135
+ if (depth === 0) {
136
+ if (/\s/.test(body[i2 - 1] ?? "")) bracketStart = i2;
137
+ break;
138
+ }
134
139
  }
135
140
  }
136
141
  if (bracketStart >= 0) {
137
142
  const inner = body.slice(bracketStart + 1, -1).trim();
138
- body = body.slice(0, bracketStart).trim();
139
- if (inner.startsWith('"') && inner.endsWith('"') && !inner.slice(1, -1).includes(",")) {
140
- tailAttrs.label = inner.slice(1, -1);
141
- } else {
142
- tailAttrs = parseAttrs(inner);
143
+ const isBareId = /^[A-Za-z_]\w*$/.test(inner);
144
+ if (!isBareId) {
145
+ body = body.slice(0, bracketStart).trim();
146
+ if (inner.startsWith('"') && inner.endsWith('"') && !inner.slice(1, -1).includes(",")) {
147
+ tailAttrs.label = inner.slice(1, -1);
148
+ } else {
149
+ tailAttrs = parseAttrs(inner);
150
+ }
143
151
  }
144
152
  }
145
153
  }
@@ -147,10 +155,21 @@ function parseBlockDiagram(text2) {
147
155
  if (parts.length < 2) {
148
156
  throw new BlockDiagramParseError(`Invalid connection: ${line}`, lineNo, void 0, line);
149
157
  }
150
- for (let i2 = 0; i2 < parts.length - 1; i2++) {
151
- const from = parts[i2];
152
- const to = parts[i2 + 1];
153
- const isLast = i2 === parts.length - 2;
158
+ const endpoints = parts.map((p) => {
159
+ const m = /^\[([A-Za-z_]\w*)\]$/.exec(p);
160
+ return m ? m[1] : p;
161
+ });
162
+ for (const ep of endpoints) {
163
+ if (!/^[A-Za-z_]\w*$/.test(ep)) continue;
164
+ const exists = blocks.some((b) => b.id === ep) || sums.some((s) => s.id === ep) || signals.has(ep);
165
+ if (!exists) {
166
+ blocks.push({ id: ep, label: ep, role: "generic" });
167
+ }
168
+ }
169
+ for (let i2 = 0; i2 < endpoints.length - 1; i2++) {
170
+ const from = endpoints[i2];
171
+ const to = endpoints[i2 + 1];
172
+ const isLast = i2 === endpoints.length - 2;
154
173
  const edge = { from, to };
155
174
  if (isLast && tailAttrs.label) edge.label = tailAttrs.label;
156
175
  if (isLast && tailAttrs.discrete) edge.discrete = true;
@@ -606,7 +625,7 @@ function renderBlockDiagram(ast) {
606
625
  .schematex-bd-title { font: bold 15px sans-serif; fill: #111; }
607
626
  .schematex-bd-branch { fill: #333; stroke: none; }
608
627
  `.trim();
609
- const arrowDef = chunkHDKDQAEQ_cjs.el(
628
+ const arrowDef = chunk3WNW5Y7P_cjs.el(
610
629
  "marker",
611
630
  {
612
631
  id: "lt-bd-arrow",
@@ -616,7 +635,7 @@ function renderBlockDiagram(ast) {
616
635
  refY: 4,
617
636
  orient: "auto"
618
637
  },
619
- [chunkHDKDQAEQ_cjs.el("polygon", { points: "0 0, 10 4, 0 8", fill: "#333" })]
638
+ [chunk3WNW5Y7P_cjs.el("polygon", { points: "0 0, 10 4, 0 8", fill: "#333" })]
620
639
  );
621
640
  const nodeSvgs = [];
622
641
  const edgeSvgs = [];
@@ -625,21 +644,21 @@ function renderBlockDiagram(ast) {
625
644
  if (n.kind === "block") {
626
645
  const fill = ROLE_FILL[n.role] ?? "#fff";
627
646
  nodeSvgs.push(
628
- chunkHDKDQAEQ_cjs.group(
647
+ chunk3WNW5Y7P_cjs.group(
629
648
  {
630
649
  transform: `translate(${n.x}, ${n.y})`,
631
650
  "data-block-id": n.id,
632
651
  "data-block-role": n.role
633
652
  },
634
653
  [
635
- chunkHDKDQAEQ_cjs.el("rect", {
654
+ chunk3WNW5Y7P_cjs.el("rect", {
636
655
  width: n.width,
637
656
  height: n.height,
638
657
  fill,
639
658
  class: "schematex-bd-block",
640
659
  rx: 2
641
660
  }),
642
- chunkHDKDQAEQ_cjs.text(
661
+ chunk3WNW5Y7P_cjs.text(
643
662
  {
644
663
  x: n.width / 2,
645
664
  y: n.height / 2 + 5,
@@ -653,7 +672,7 @@ function renderBlockDiagram(ast) {
653
672
  );
654
673
  if (n.hasBranch) {
655
674
  branchSvgs.push(
656
- chunkHDKDQAEQ_cjs.circle({
675
+ chunk3WNW5Y7P_cjs.circle({
657
676
  cx: n.x + n.width,
658
677
  cy: n.y + n.height / 2,
659
678
  r: 3.5,
@@ -663,8 +682,8 @@ function renderBlockDiagram(ast) {
663
682
  }
664
683
  } else if (n.kind === "sum") {
665
684
  nodeSvgs.push(
666
- chunkHDKDQAEQ_cjs.group({ "data-sum-id": n.id }, [
667
- chunkHDKDQAEQ_cjs.circle({
685
+ chunk3WNW5Y7P_cjs.group({ "data-sum-id": n.id }, [
686
+ chunk3WNW5Y7P_cjs.circle({
668
687
  cx: n.cx,
669
688
  cy: n.cy,
670
689
  r: n.r,
@@ -674,7 +693,7 @@ function renderBlockDiagram(ast) {
674
693
  );
675
694
  if (n.hasBranch) {
676
695
  branchSvgs.push(
677
- chunkHDKDQAEQ_cjs.circle({
696
+ chunk3WNW5Y7P_cjs.circle({
678
697
  cx: n.cx + n.r,
679
698
  cy: n.cy,
680
699
  r: 3.5,
@@ -684,8 +703,8 @@ function renderBlockDiagram(ast) {
684
703
  }
685
704
  } else if (n.kind === "port") {
686
705
  nodeSvgs.push(
687
- chunkHDKDQAEQ_cjs.group({ "data-port-id": n.id }, [
688
- chunkHDKDQAEQ_cjs.text(
706
+ chunk3WNW5Y7P_cjs.group({ "data-port-id": n.id }, [
707
+ chunk3WNW5Y7P_cjs.text(
689
708
  {
690
709
  x: n.isInput ? n.x - 4 : n.x + 4,
691
710
  y: n.y + 4,
@@ -701,7 +720,7 @@ function renderBlockDiagram(ast) {
701
720
  for (const e of layout.edges) {
702
721
  const cls = e.discrete ? "schematex-bd-signal-discrete" : "schematex-bd-signal";
703
722
  edgeSvgs.push(
704
- chunkHDKDQAEQ_cjs.path({
723
+ chunk3WNW5Y7P_cjs.path({
705
724
  d: e.path,
706
725
  class: cls,
707
726
  "marker-end": "url(#lt-bd-arrow)",
@@ -711,7 +730,7 @@ function renderBlockDiagram(ast) {
711
730
  );
712
731
  if (e.label) {
713
732
  edgeSvgs.push(
714
- chunkHDKDQAEQ_cjs.text(
733
+ chunk3WNW5Y7P_cjs.text(
715
734
  {
716
735
  x: e.midX,
717
736
  y: e.midY,
@@ -724,7 +743,7 @@ function renderBlockDiagram(ast) {
724
743
  }
725
744
  if (e.polarity) {
726
745
  edgeSvgs.push(
727
- chunkHDKDQAEQ_cjs.text(
746
+ chunk3WNW5Y7P_cjs.text(
728
747
  {
729
748
  x: e.polarity.x,
730
749
  y: e.polarity.y,
@@ -736,7 +755,7 @@ function renderBlockDiagram(ast) {
736
755
  );
737
756
  }
738
757
  }
739
- const titleSvg = ast.title ? chunkHDKDQAEQ_cjs.text(
758
+ const titleSvg = ast.title ? chunk3WNW5Y7P_cjs.text(
740
759
  {
741
760
  x: width / 2,
742
761
  y: 18,
@@ -745,7 +764,7 @@ function renderBlockDiagram(ast) {
745
764
  },
746
765
  ast.title
747
766
  ) : "";
748
- return chunkHDKDQAEQ_cjs.svgRoot(
767
+ return chunk3WNW5Y7P_cjs.svgRoot(
749
768
  {
750
769
  class: "schematex-bd",
751
770
  viewBox: `0 0 ${width} ${height}`,
@@ -755,16 +774,16 @@ function renderBlockDiagram(ast) {
755
774
  "data-diagram-type": "blockdiagram"
756
775
  },
757
776
  [
758
- chunkHDKDQAEQ_cjs.title(ast.title ?? "Block Diagram"),
759
- chunkHDKDQAEQ_cjs.desc(
777
+ chunk3WNW5Y7P_cjs.title(ast.title ?? "Block Diagram"),
778
+ chunk3WNW5Y7P_cjs.desc(
760
779
  `Block diagram with ${ast.blocks.length} blocks, ${ast.sums.length} summing junctions, ${ast.connections.length} signals`
761
780
  ),
762
- chunkHDKDQAEQ_cjs.defs([chunkHDKDQAEQ_cjs.el("style", {}, css), arrowDef]),
781
+ chunk3WNW5Y7P_cjs.defs([chunk3WNW5Y7P_cjs.el("style", {}, css), arrowDef]),
763
782
  titleSvg,
764
- chunkHDKDQAEQ_cjs.group({ transform: `translate(0, ${titleOffset})` }, [
765
- chunkHDKDQAEQ_cjs.group({ class: "schematex-bd-signals" }, edgeSvgs),
766
- chunkHDKDQAEQ_cjs.group({ class: "schematex-bd-nodes" }, nodeSvgs),
767
- chunkHDKDQAEQ_cjs.group({ class: "schematex-bd-branches" }, branchSvgs)
783
+ chunk3WNW5Y7P_cjs.group({ transform: `translate(0, ${titleOffset})` }, [
784
+ chunk3WNW5Y7P_cjs.group({ class: "schematex-bd-signals" }, edgeSvgs),
785
+ chunk3WNW5Y7P_cjs.group({ class: "schematex-bd-nodes" }, nodeSvgs),
786
+ chunk3WNW5Y7P_cjs.group({ class: "schematex-bd-branches" }, branchSvgs)
768
787
  ])
769
788
  ]
770
789
  );
@@ -788,5 +807,5 @@ exports.blockdiagram = blockdiagram;
788
807
  exports.layoutBlockDiagram = layoutBlockDiagram;
789
808
  exports.parseBlockDiagram = parseBlockDiagram;
790
809
  exports.renderBlockDiagram = renderBlockDiagram;
791
- //# sourceMappingURL=chunk-MCFQAUQV.cjs.map
792
- //# sourceMappingURL=chunk-MCFQAUQV.cjs.map
810
+ //# sourceMappingURL=chunk-QXL7AY2H.cjs.map
811
+ //# sourceMappingURL=chunk-QXL7AY2H.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diagrams/blockdiagram/parser.ts","../src/diagrams/blockdiagram/layout.ts","../src/diagrams/blockdiagram/renderer.ts","../src/diagrams/blockdiagram/index.ts"],"names":["text","title","i","path","el","group","circle","svgRoot","desc","defs"],"mappings":"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","file":"chunk-QXL7AY2H.cjs","sourcesContent":["import type {\n BlockAST,\n BlockNode,\n BlockEdge,\n SummingJunction,\n BlockRole,\n} from \"../../core/types\";\n\nexport class BlockDiagramParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"BlockDiagramParseError\";\n }\n}\n\nconst ROLE_VALUES = new Set<BlockRole>([\n \"plant\",\n \"controller\",\n \"sensor\",\n \"actuator\",\n \"reference\",\n \"disturbance\",\n \"generic\",\n]);\n\ninterface SignalDecl {\n id: string;\n label: string;\n discrete: boolean;\n}\n\ninterface ParsedAttrs {\n name?: string;\n role?: BlockRole;\n discrete?: boolean;\n label?: string;\n route?: \"above\" | \"below\";\n}\n\nfunction parseAttrs(s: string): ParsedAttrs {\n // Inside [ ... ] — comma-separated key:value or bare flags like \"discrete\"\n const result: ParsedAttrs = {};\n // Split at commas not inside quotes\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n\n for (const raw of parts) {\n const p = raw.trim();\n if (!p) continue;\n if (p === \"discrete\") {\n result.discrete = true;\n continue;\n }\n if (p.startsWith('\"') && p.endsWith('\"')) {\n result.label = p.slice(1, -1);\n continue;\n }\n const m = p.match(/^(\\w+)\\s*:\\s*(.+)$/);\n if (!m) continue;\n const key = m[1].toLowerCase();\n let val = m[2].trim();\n if (val.startsWith('\"') && val.endsWith('\"')) val = val.slice(1, -1);\n if (key === \"name\") result.name = val;\n else if (key === \"role\") {\n if (ROLE_VALUES.has(val as BlockRole)) result.role = val as BlockRole;\n } else if (key === \"label\") result.label = val;\n else if (key === \"route\") {\n if (val === \"above\" || val === \"below\") result.route = val;\n }\n }\n return result;\n}\n\nexport function parseBlockDiagram(text: string): BlockAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const blocks: BlockNode[] = [];\n const sums: SummingJunction[] = [];\n const connections: BlockEdge[] = [];\n const signals = new Map<string, SignalDecl>();\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i] ?? \"\";\n const lineNo = i + 1;\n const line = rawLine.replace(/#.*$/, \"\").trim();\n if (!line) continue;\n\n // Header: blockdiagram \"Title\"\n if (/^blockdiagram\\b/i.test(line)) {\n const t = line.match(/\"([^\"]*)\"/);\n if (t) title = t[1];\n continue;\n }\n\n // block: ID = block(\"label\") [role: X, name: \"Y\"]\n const blockMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*block\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (blockMatch) {\n const id = blockMatch[1];\n const label = blockMatch[2];\n const attrs = blockMatch[3] ? parseAttrs(blockMatch[3]) : {};\n const node: BlockNode = { id, label, role: attrs.role ?? \"generic\" };\n if (attrs.route) node.route = attrs.route;\n blocks.push(node);\n continue;\n }\n\n // sum: ID = sum(+a, -b, ...)\n const sumMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*sum\\s*\\(([^)]*)\\)\\s*$/\n );\n if (sumMatch) {\n const id = sumMatch[1];\n const rawInputs = sumMatch[2]\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean);\n const inputs: string[] = [];\n for (const tok of rawInputs) {\n if (tok.startsWith(\"+\") || tok.startsWith(\"-\")) inputs.push(tok);\n else inputs.push(\"+\" + tok);\n }\n sums.push({ id, inputs });\n continue;\n }\n\n // signal: ID = signal(\"label\") [discrete]\n const sigMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*signal\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (sigMatch) {\n const id = sigMatch[1];\n const label = sigMatch[2];\n const attrs = sigMatch[3] ? parseAttrs(sigMatch[3]) : {};\n signals.set(id, { id, label, discrete: !!attrs.discrete });\n continue;\n }\n\n // Connection chain: `A -> B -> C [label_or_attrs]`. Inline `[id] -> [id]` (D2/Mermaid) auto-declares.\n const arrowIdx = line.indexOf(\"->\");\n if (arrowIdx >= 0) {\n let body = line;\n let tailAttrs: ParsedAttrs = {};\n // Trailing `[...]` must be preceded by whitespace, else it's an inline endpoint.\n if (body.endsWith(\"]\")) {\n let bracketStart = -1;\n let depth = 0;\n let inQuote = false;\n for (let i = body.length - 1; i >= 1; i--) {\n const ch = body[i];\n if (ch === '\"') inQuote = !inQuote;\n else if (!inQuote && ch === \"]\") depth++;\n else if (!inQuote && ch === \"[\") {\n depth--;\n if (depth === 0) {\n if (/\\s/.test(body[i - 1] ?? \"\")) bracketStart = i;\n break;\n }\n }\n }\n if (bracketStart >= 0) {\n const inner = body.slice(bracketStart + 1, -1).trim();\n const isBareId = /^[A-Za-z_]\\w*$/.test(inner);\n if (!isBareId) {\n body = body.slice(0, bracketStart).trim();\n if (inner.startsWith('\"') && inner.endsWith('\"') && !inner.slice(1, -1).includes(',')) {\n tailAttrs.label = inner.slice(1, -1);\n } else {\n tailAttrs = parseAttrs(inner);\n }\n }\n }\n }\n const parts = body.split(\"->\").map((x) => x.trim()).filter(Boolean);\n if (parts.length < 2) {\n throw new BlockDiagramParseError(`Invalid connection: ${line}`, lineNo, undefined, line);\n }\n const endpoints = parts.map((p) => {\n const m = /^\\[([A-Za-z_]\\w*)\\]$/.exec(p);\n return m ? m[1] : p;\n });\n for (const ep of endpoints) {\n if (!/^[A-Za-z_]\\w*$/.test(ep)) continue;\n const exists =\n blocks.some((b) => b.id === ep) ||\n sums.some((s) => s.id === ep) ||\n signals.has(ep);\n if (!exists) {\n blocks.push({ id: ep, label: ep, role: \"generic\" });\n }\n }\n for (let i = 0; i < endpoints.length - 1; i++) {\n const from = endpoints[i];\n const to = endpoints[i + 1];\n const isLast = i === endpoints.length - 2;\n const edge: BlockEdge = { from, to };\n if (isLast && tailAttrs.label) edge.label = tailAttrs.label;\n if (isLast && tailAttrs.discrete) edge.discrete = true;\n connections.push(edge);\n }\n continue;\n }\n }\n\n // Post-process: if edge endpoints reference a signal id, inline the signal.\n // A signal is a pass-through label. Merge edges X->sig and sig->Y into X->Y,\n // using signal's label (unless edge already has one) and discrete flag.\n if (signals.size > 0) {\n const merged: BlockEdge[] = [];\n const bySource = new Map<string, BlockEdge[]>();\n const byTarget = new Map<string, BlockEdge[]>();\n for (const e of connections) {\n if (!bySource.has(e.from)) bySource.set(e.from, []);\n bySource.get(e.from)!.push(e);\n if (!byTarget.has(e.to)) byTarget.set(e.to, []);\n byTarget.get(e.to)!.push(e);\n }\n\n const consumed = new Set<BlockEdge>();\n for (const sigId of signals.keys()) {\n const sig = signals.get(sigId)!;\n const incoming = byTarget.get(sigId) ?? [];\n const outgoing = bySource.get(sigId) ?? [];\n // For each incoming/outgoing pair, make a merged edge\n for (const ine of incoming) {\n for (const oute of outgoing) {\n consumed.add(ine);\n consumed.add(oute);\n merged.push({\n from: ine.from,\n to: oute.to,\n label: ine.label ?? oute.label ?? sig.label,\n discrete: sig.discrete || ine.discrete || oute.discrete,\n });\n }\n }\n }\n // Keep edges not consumed\n for (const e of connections) {\n if (!consumed.has(e)) merged.push(e);\n }\n connections.length = 0;\n connections.push(...merged);\n }\n\n return {\n type: \"blockdiagram\",\n title,\n blocks,\n sums,\n connections,\n };\n}\n","import type { BlockAST, BlockEdge, BlockNode, SummingJunction } from \"../../core/types\";\n\nexport interface LaidBlock {\n kind: \"block\";\n id: string;\n label: string;\n role: string;\n x: number;\n y: number;\n width: number;\n height: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidSum {\n kind: \"sum\";\n id: string;\n cx: number;\n cy: number;\n r: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidPort {\n kind: \"port\";\n id: string;\n label: string;\n x: number;\n y: number;\n isInput: boolean;\n hasBranch?: boolean;\n}\n\nexport type LaidNode = LaidBlock | LaidSum | LaidPort;\n\nexport interface LaidEdgePolarity {\n sign: \"+\" | \"-\";\n pin: \"left\" | \"top\" | \"right\" | \"bottom\";\n x: number;\n y: number;\n}\n\nexport interface LaidEdge {\n from: string;\n to: string;\n label?: string;\n discrete: boolean;\n path: string;\n midX: number;\n midY: number;\n isFeedback: boolean;\n /** Polarity sign to draw near the target if target is a sum */\n polarity?: LaidEdgePolarity;\n}\n\nexport interface BlockDiagramLayout {\n width: number;\n height: number;\n nodes: LaidNode[];\n edges: LaidEdge[];\n title?: string;\n /** Offset applied to all y coords (>0 when feedforward rows exist above FWD_Y) */\n topOffset: number;\n}\n\nconst BLOCK_W = 100;\nconst BLOCK_H = 54;\nconst SUM_R = 12;\nconst FWD_Y = 110;\nconst ROW_GAP = 80;\nconst FIRST_ROW_OFFSET = 110;\nconst COL_GAP = 60;\nconst LEFT_PAD = 30;\nconst RIGHT_PAD = 30;\n\ninterface Track {\n /** row index (1, 2, ...); 0 means forward path */\n row: number;\n /** above = y < FWD_Y; below = y > FWD_Y */\n side: \"above\" | \"below\";\n /** Occupied col ranges [minCol, maxCol] for collision detection */\n ranges: Array<[number, number]>;\n}\n\nexport function layoutBlockDiagram(ast: BlockAST): BlockDiagramLayout {\n const nodeIds = new Set<string>();\n for (const b of ast.blocks) nodeIds.add(b.id);\n for (const s of ast.sums) nodeIds.add(s.id);\n for (const e of ast.connections) {\n nodeIds.add(e.from);\n nodeIds.add(e.to);\n }\n\n const outgoing = new Map<string, BlockEdge[]>();\n const incoming = new Map<string, BlockEdge[]>();\n for (const id of nodeIds) {\n outgoing.set(id, []);\n incoming.set(id, []);\n }\n for (const e of ast.connections) {\n outgoing.get(e.from)!.push(e);\n incoming.get(e.to)!.push(e);\n }\n\n // Entry points\n const hasIn = nodeIds.has(\"in\");\n const entries: string[] = [];\n if (hasIn) entries.push(\"in\");\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n if ((incoming.get(id) ?? []).length === 0 && !entries.includes(id)) {\n entries.push(id);\n }\n }\n\n // BFS forward (first-visit col assignment — back-edges become feedback)\n const col = new Map<string, number>();\n const queue: string[] = [];\n for (const e of entries) {\n col.set(e, 0);\n queue.push(e);\n }\n while (queue.length > 0) {\n const cur = queue.shift()!;\n const c = col.get(cur)!;\n for (const edge of outgoing.get(cur) ?? []) {\n if (!col.has(edge.to)) {\n col.set(edge.to, c + 1);\n queue.push(edge.to);\n }\n }\n }\n // Any unreached node\n for (const id of nodeIds) {\n if (!col.has(id)) col.set(id, 1);\n }\n\n // Feedback detection: outgoing edges are ALL going backward\n const isFeedback = new Set<string>();\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n const myCol = col.get(id)!;\n const outs = outgoing.get(id) ?? [];\n if (outs.length === 0) continue;\n const allBack = outs.every((e) => (col.get(e.to) ?? myCol) < myCol);\n if (allBack) isFeedback.add(id);\n }\n\n // For each feedback node, compute loop range [minCol, maxCol]\n const blockById = new Map<string, BlockNode>();\n for (const b of ast.blocks) blockById.set(b.id, b);\n\n interface FbInfo {\n id: string;\n range: [number, number];\n side: \"above\" | \"below\";\n row: number; // depth\n }\n const fbInfos: FbInfo[] = [];\n for (const id of isFeedback) {\n const outs = outgoing.get(id) ?? [];\n const ins = incoming.get(id) ?? [];\n // targets (forward nodes it feeds back into)\n const targetCols = outs.map((e) => col.get(e.to) ?? 0);\n const sourceCols = ins.map((e) => col.get(e.from) ?? 0);\n const minC = Math.min(...targetCols, ...sourceCols);\n const maxC = Math.max(...targetCols, ...sourceCols);\n const bn = blockById.get(id);\n const side: \"above\" | \"below\" = bn?.route === \"above\" ? \"above\" : \"below\";\n fbInfos.push({ id, range: [minC, maxC], side, row: 0 });\n }\n\n // Sort by range width desc (outermost first), break ties by min col\n fbInfos.sort((a, b) => {\n const wa = a.range[1] - a.range[0];\n const wb = b.range[1] - b.range[0];\n if (wa !== wb) return wb - wa;\n return a.range[0] - b.range[0];\n });\n\n // Assign tracks per side, greedy interval-overlap depth\n const tracks: Record<\"above\" | \"below\", Track[]> = { above: [], below: [] };\n for (const fb of fbInfos) {\n let row = 1;\n while (true) {\n // check if any existing block on this (side, row) has overlapping range\n const occupied = tracks[fb.side].find((t) => t.row === row);\n const conflict =\n occupied?.ranges.some(\n ([a, b]) => !(fb.range[1] < a || fb.range[0] > b)\n ) ?? false;\n if (!conflict) {\n if (occupied) occupied.ranges.push(fb.range);\n else\n tracks[fb.side].push({ row, side: fb.side, ranges: [fb.range] });\n fb.row = row;\n break;\n }\n row++;\n }\n }\n\n const maxBelowRow = tracks.below.reduce((m, t) => Math.max(m, t.row), 0);\n const maxAboveRow = tracks.above.reduce((m, t) => Math.max(m, t.row), 0);\n\n // Compute y per (side, row)\n const yFor = (side: \"above\" | \"below\", row: number): number => {\n const step = FIRST_ROW_OFFSET + (row - 1) * ROW_GAP;\n return side === \"above\" ? FWD_Y - step : FWD_Y + step;\n };\n\n // For the feedforward row(s) to have room, shift all y by topOffset\n const topOffset = maxAboveRow > 0 ? (FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP) + 30 : 30;\n const forwardY = FWD_Y + (topOffset - 30);\n\n // Remap y helper\n const rowY = (side: \"above\" | \"below\", row: number): number =>\n yFor(side, row) + (topOffset - 30);\n\n // Normalize columns\n let maxFwdCol = 0;\n for (const id of nodeIds) {\n if (!isFeedback.has(id)) maxFwdCol = Math.max(maxFwdCol, col.get(id) ?? 0);\n }\n const colCount = maxFwdCol + 1;\n const colContent = new Array(colCount).fill(BLOCK_W);\n\n const colX: number[] = [];\n {\n let x = LEFT_PAD;\n for (let i = 0; i < colCount; i++) {\n const w = i === 0 && hasIn ? 30 : colContent[i];\n colX.push(x + w / 2);\n x += w + COL_GAP;\n }\n }\n const totalWidth = colX.length\n ? colX[colX.length - 1] + BLOCK_W / 2 + RIGHT_PAD\n : 400;\n\n // Lookup for feedback row info\n const fbById = new Map<string, FbInfo>();\n for (const f of fbInfos) fbById.set(f.id, f);\n\n const nodes: LaidNode[] = [];\n const branchCount = new Map<string, number>();\n for (const e of ast.connections) {\n branchCount.set(e.from, (branchCount.get(e.from) ?? 0) + 1);\n }\n const hasBranchOf = (id: string) => (branchCount.get(id) ?? 0) > 1;\n\n for (const b of ast.blocks) {\n const c = col.get(b.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(b.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"block\",\n id: b.id,\n label: b.label,\n role: b.role ?? \"generic\",\n x: cx - BLOCK_W / 2,\n y: cy - BLOCK_H / 2,\n width: BLOCK_W,\n height: BLOCK_H,\n hasBranch: hasBranchOf(b.id),\n });\n }\n\n for (const s of ast.sums) {\n const c = col.get(s.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(s.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"sum\",\n id: s.id,\n cx,\n cy,\n r: SUM_R,\n hasBranch: hasBranchOf(s.id),\n });\n }\n\n if (hasIn) {\n nodes.push({\n kind: \"port\",\n id: \"in\",\n label: \"in\",\n x: LEFT_PAD,\n y: forwardY,\n isInput: true,\n hasBranch: hasBranchOf(\"in\"),\n });\n }\n if (nodeIds.has(\"out\")) {\n const outCol = col.get(\"out\") ?? maxFwdCol;\n const cx = colX[Math.min(outCol, colX.length - 1)];\n nodes.push({\n kind: \"port\",\n id: \"out\",\n label: \"out\",\n x: cx,\n y: forwardY,\n isInput: false,\n });\n }\n\n // Anchor lookup\n interface Anchor {\n left: { x: number; y: number };\n right: { x: number; y: number };\n top: { x: number; y: number };\n bottom: { x: number; y: number };\n cx: number;\n cy: number;\n }\n const anchors = new Map<string, Anchor>();\n for (const n of nodes) {\n if (n.kind === \"block\") {\n anchors.set(n.id, {\n left: { x: n.x, y: n.y + n.height / 2 },\n right: { x: n.x + n.width, y: n.y + n.height / 2 },\n top: { x: n.x + n.width / 2, y: n.y },\n bottom: { x: n.x + n.width / 2, y: n.y + n.height },\n cx: n.x + n.width / 2,\n cy: n.y + n.height / 2,\n });\n } else if (n.kind === \"sum\") {\n anchors.set(n.id, {\n left: { x: n.cx - n.r, y: n.cy },\n right: { x: n.cx + n.r, y: n.cy },\n top: { x: n.cx, y: n.cy - n.r },\n bottom: { x: n.cx, y: n.cy + n.r },\n cx: n.cx,\n cy: n.cy,\n });\n } else {\n anchors.set(n.id, {\n left: { x: n.x - 10, y: n.y },\n right: { x: n.x + (n.isInput ? 20 : 0), y: n.y },\n top: { x: n.x, y: n.y - 10 },\n bottom: { x: n.x, y: n.y + 10 },\n cx: n.x,\n cy: n.y,\n });\n }\n }\n\n // Build sum-input-polarity lookup\n const sumPolarity = new Map<string, Map<string, \"+\" | \"-\">>();\n for (const s of ast.sums) {\n const m = new Map<string, \"+\" | \"-\">();\n for (const tok of s.inputs) {\n const sign = tok.startsWith(\"-\") ? \"-\" : \"+\";\n const srcId = tok.replace(/^[+-]/, \"\");\n m.set(srcId, sign);\n }\n sumPolarity.set(s.id, m);\n }\n\n // Build edges\n const edges: LaidEdge[] = [];\n // Track horizontal-track offsets for feedback paths to avoid overlap\n const sumById = new Map<string, SummingJunction>();\n for (const s of ast.sums) sumById.set(s.id, s);\n\n for (const e of ast.connections) {\n const fromA = anchors.get(e.from);\n const toA = anchors.get(e.to);\n if (!fromA || !toA) continue;\n\n const fromFb = fbById.get(e.from);\n const toFb = fbById.get(e.to);\n const fromCol = col.get(e.from) ?? 0;\n const toCol = col.get(e.to) ?? 0;\n\n // Determine pin on target when target is a sum: left (from forward earlier),\n // bottom (from below feedback), top (from above feedforward), or right (rare, output)\n let polarity: LaidEdgePolarity | undefined;\n if (sumById.has(e.to)) {\n const pm = sumPolarity.get(e.to);\n const sign = pm?.get(e.from) ?? \"+\";\n let pin: \"left\" | \"top\" | \"bottom\" | \"right\" = \"left\";\n if (fromFb?.side === \"below\") pin = \"bottom\";\n else if (fromFb?.side === \"above\") pin = \"top\";\n else if (fromCol < toCol) pin = \"left\";\n else pin = \"bottom\";\n const sumNode = nodes.find(\n (n) => n.kind === \"sum\" && n.id === e.to\n ) as LaidSum | undefined;\n if (sumNode) {\n let px = sumNode.cx, py = sumNode.cy;\n if (pin === \"left\") {\n px = sumNode.cx - sumNode.r - 8;\n py = sumNode.cy + 6;\n } else if (pin === \"bottom\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy + sumNode.r + 10;\n } else if (pin === \"top\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy - sumNode.r - 2;\n }\n polarity = { sign, pin, x: px, y: py };\n }\n }\n\n // Route\n let path: string;\n let midX: number, midY: number;\n let isFb = false;\n\n const fromIsFbSide = fromFb?.side;\n const toIsFbSide = toFb?.side;\n\n if (fromIsFbSide && toIsFbSide === fromIsFbSide) {\n // within same feedback row\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"below\") {\n // forward → below feedback: branch down from source.bottom\n const sx = fromA.bottom.x;\n const sy = fromA.bottom.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"above\") {\n // forward → above feedforward: branch up from source.top\n const sx = fromA.top.x;\n const sy = fromA.top.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (fromIsFbSide === \"below\" && !toIsFbSide) {\n // below feedback → forward target (bottom pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (fromIsFbSide === \"above\" && !toIsFbSide) {\n // above feedforward → forward target (top pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.top.x;\n const ty = toA.top.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (toCol < fromCol) {\n // generic back-edge fallback (below)\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n const dipY = Math.max(sy, ty) + 60;\n path = `M ${sx} ${sy} L ${sx} ${dipY} L ${tx} ${dipY} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = dipY + 10;\n isFb = true;\n } else {\n // forward edge\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.left.x;\n const ty = toA.left.y;\n if (Math.abs(sy - ty) < 0.5) {\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n } else {\n const midXH = (sx + tx) / 2;\n path = `M ${sx} ${sy} L ${midXH} ${sy} L ${midXH} ${ty} L ${tx} ${ty}`;\n }\n midX = (sx + tx) / 2;\n midY = sy - 8;\n }\n\n edges.push({\n from: e.from,\n to: e.to,\n label: e.label,\n discrete: !!e.discrete,\n path,\n midX,\n midY,\n isFeedback: isFb,\n polarity,\n });\n }\n\n // Total canvas height: enough for top rows + forward + bottom rows\n const totalTopSpace =\n maxAboveRow > 0\n ? FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP + 60\n : 30;\n const totalBottomSpace =\n maxBelowRow > 0\n ? FIRST_ROW_OFFSET + (maxBelowRow - 1) * ROW_GAP + 60\n : 100;\n const height = Math.max(\n forwardY + totalBottomSpace,\n FWD_Y + 170,\n totalTopSpace + totalBottomSpace\n );\n\n return {\n width: totalWidth,\n height,\n nodes,\n edges,\n title: ast.title,\n topOffset,\n };\n}\n","import type { BlockAST } from \"../../core/types\";\nimport { layoutBlockDiagram } from \"./layout\";\nimport {\n svgRoot,\n defs,\n group,\n el,\n circle,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\n\nconst ROLE_FILL: Record<string, string> = {\n plant: \"#ffffff\",\n controller: \"#E3F2FD\",\n sensor: \"#F3E5F5\",\n actuator: \"#E8F5E9\",\n filter: \"#FFF8E1\",\n reference: \"#ffffff\",\n disturbance: \"#FFF3E0\",\n generic: \"#ffffff\",\n};\n\nexport function renderBlockDiagram(ast: BlockAST): string {\n const layout = layoutBlockDiagram(ast);\n const titleOffset = ast.title ? 26 : 0;\n const { width } = layout;\n const height = layout.height + titleOffset;\n\n const css = `\n.schematex-bd { background: #fff; font-family: system-ui, -apple-system, sans-serif; }\n.schematex-bd-block { stroke: #333; stroke-width: 2; }\n.schematex-bd-tf { font: italic 14px serif; fill: #111; }\n.schematex-bd-block-name { font: 10px sans-serif; fill: #666; }\n.schematex-bd-sum { fill: #fff; stroke: #333; stroke-width: 2; }\n.schematex-bd-sum-sign { font: bold 11px sans-serif; fill: #333; }\n.schematex-bd-signal { stroke: #333; stroke-width: 2; fill: none; }\n.schematex-bd-signal-discrete { stroke: #333; stroke-width: 2; fill: none; stroke-dasharray: 6 4; }\n.schematex-bd-signal-label { font: italic 12px serif; fill: #333; }\n.schematex-bd-port-label { font: italic 13px serif; fill: #111; }\n.schematex-bd-title { font: bold 15px sans-serif; fill: #111; }\n.schematex-bd-branch { fill: #333; stroke: none; }\n`.trim();\n\n const arrowDef = el(\n \"marker\",\n {\n id: \"lt-bd-arrow\",\n markerWidth: 10,\n markerHeight: 8,\n refX: 9,\n refY: 4,\n orient: \"auto\",\n },\n [el(\"polygon\", { points: \"0 0, 10 4, 0 8\", fill: \"#333\" })]\n );\n\n const nodeSvgs: string[] = [];\n const edgeSvgs: string[] = [];\n const branchSvgs: string[] = [];\n\n for (const n of layout.nodes) {\n if (n.kind === \"block\") {\n const fill = ROLE_FILL[n.role] ?? \"#fff\";\n nodeSvgs.push(\n group(\n {\n transform: `translate(${n.x}, ${n.y})`,\n \"data-block-id\": n.id,\n \"data-block-role\": n.role,\n },\n [\n el(\"rect\", {\n width: n.width,\n height: n.height,\n fill,\n class: \"schematex-bd-block\",\n rx: 2,\n }),\n text(\n {\n x: n.width / 2,\n y: n.height / 2 + 5,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-tf\",\n },\n n.label\n ),\n ]\n )\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.x + n.width,\n cy: n.y + n.height / 2,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"sum\") {\n nodeSvgs.push(\n group({ \"data-sum-id\": n.id }, [\n circle({\n cx: n.cx,\n cy: n.cy,\n r: n.r,\n class: \"schematex-bd-sum\",\n }),\n ])\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.cx + n.r,\n cy: n.cy,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"port\") {\n nodeSvgs.push(\n group({ \"data-port-id\": n.id }, [\n text(\n {\n x: n.isInput ? n.x - 4 : n.x + 4,\n y: n.y + 4,\n \"text-anchor\": n.isInput ? \"end\" : \"start\",\n class: \"schematex-bd-port-label\",\n },\n n.label\n ),\n ])\n );\n }\n }\n\n for (const e of layout.edges) {\n const cls = e.discrete\n ? \"schematex-bd-signal-discrete\"\n : \"schematex-bd-signal\";\n edgeSvgs.push(\n pathEl({\n d: e.path,\n class: cls,\n \"marker-end\": \"url(#lt-bd-arrow)\",\n \"data-from\": e.from,\n \"data-to\": e.to,\n })\n );\n if (e.label) {\n edgeSvgs.push(\n text(\n {\n x: e.midX,\n y: e.midY,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-signal-label\",\n },\n e.label\n )\n );\n }\n if (e.polarity) {\n edgeSvgs.push(\n text(\n {\n x: e.polarity.x,\n y: e.polarity.y,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-sum-sign\",\n },\n e.polarity.sign === \"-\" ? \"−\" : \"+\"\n )\n );\n }\n }\n\n const titleSvg = ast.title\n ? text(\n {\n x: width / 2,\n y: 18,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-title\",\n },\n ast.title\n )\n : \"\";\n\n return svgRoot(\n {\n class: \"schematex-bd\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"blockdiagram\",\n },\n [\n titleEl(ast.title ?? \"Block Diagram\"),\n desc(\n `Block diagram with ${ast.blocks.length} blocks, ${ast.sums.length} summing junctions, ${ast.connections.length} signals`\n ),\n defs([el(\"style\", {}, css), arrowDef]),\n titleSvg,\n group({ transform: `translate(0, ${titleOffset})` }, [\n group({ class: \"schematex-bd-signals\" }, edgeSvgs),\n group({ class: \"schematex-bd-nodes\" }, nodeSvgs),\n group({ class: \"schematex-bd-branches\" }, branchSvgs),\n ]),\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseBlockDiagram } from \"./parser\";\nimport { renderBlockDiagram } from \"./renderer\";\n\nexport const blockdiagram: DiagramPlugin = {\n type: \"blockdiagram\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"blockdiagram\");\n },\n parse: parseBlockDiagram,\n\n render(text: string): string {\n const ast = parseBlockDiagram(text);\n return renderBlockDiagram(ast);\n },\n};\n\nexport { parseBlockDiagram } from \"./parser\";\nexport { renderBlockDiagram } from \"./renderer\";\nexport { layoutBlockDiagram } from \"./layout\";\n"]}
@@ -0,0 +1,122 @@
1
+ // src/core/svg.ts
2
+ var ESCAPE_MAP = {
3
+ "&": "&amp;",
4
+ "<": "&lt;",
5
+ ">": "&gt;",
6
+ '"': "&quot;",
7
+ "'": "&apos;"
8
+ };
9
+ function escapeXml(str) {
10
+ return str.replace(/[&<>"']/g, (ch) => ESCAPE_MAP[ch] ?? ch);
11
+ }
12
+ function formatAttrs(attrs) {
13
+ return Object.entries(attrs).filter(([, v]) => v !== void 0).map(([k, v]) => `${k}="${escapeXml(String(v))}"`).join(" ");
14
+ }
15
+ function el(tag, attrs, children) {
16
+ const attrStr = formatAttrs(attrs);
17
+ const open = attrStr ? `<${tag} ${attrStr}` : `<${tag}`;
18
+ if (children === void 0) {
19
+ return `${open}/>`;
20
+ }
21
+ const content = Array.isArray(children) ? children.join("\n") : children;
22
+ return `${open}>${content}</${tag}>`;
23
+ }
24
+ function svgRoot(attrs, children) {
25
+ return el(
26
+ "svg",
27
+ {
28
+ xmlns: "http://www.w3.org/2000/svg",
29
+ "xmlns:xlink": "http://www.w3.org/1999/xlink",
30
+ ...attrs
31
+ },
32
+ children
33
+ );
34
+ }
35
+ function defs(children) {
36
+ return el("defs", {}, children);
37
+ }
38
+ function group(attrs, children) {
39
+ return el("g", attrs, children);
40
+ }
41
+ function rect(attrs) {
42
+ return el("rect", attrs);
43
+ }
44
+ function circle(attrs) {
45
+ return el("circle", attrs);
46
+ }
47
+ function line(attrs) {
48
+ return el("line", attrs);
49
+ }
50
+ function path(attrs) {
51
+ return el("path", attrs);
52
+ }
53
+ function text(attrs, content) {
54
+ return el("text", attrs, escapeXml(content));
55
+ }
56
+ function parseInlineSegments(line2) {
57
+ const out = [];
58
+ let bold = false;
59
+ let italic = false;
60
+ let buf = "";
61
+ let i = 0;
62
+ while (i < line2.length) {
63
+ const rest = line2.slice(i);
64
+ const m = /^<(\/?)([bi])>/i.exec(rest);
65
+ if (m) {
66
+ if (buf) {
67
+ out.push({ text: buf, bold, italic });
68
+ buf = "";
69
+ }
70
+ const isClose = m[1] === "/";
71
+ const tag = m[2].toLowerCase();
72
+ if (tag === "b") bold = !isClose;
73
+ else italic = !isClose;
74
+ i += m[0].length;
75
+ } else {
76
+ buf += line2[i];
77
+ i++;
78
+ }
79
+ }
80
+ if (buf) out.push({ text: buf, bold, italic });
81
+ return out;
82
+ }
83
+ function segmentTspan(seg, extra) {
84
+ const a = { ...extra };
85
+ if (seg.bold) a["font-weight"] = "bold";
86
+ if (seg.italic) a["font-style"] = "italic";
87
+ return el("tspan", a, escapeXml(seg.text));
88
+ }
89
+ function multilineText(attrs, content, lineHeight = 14) {
90
+ const lines = String(content).split(/<br\s*\/?>|\n/i);
91
+ const total = (lines.length - 1) * lineHeight;
92
+ const tspans = [];
93
+ lines.forEach((ln, lineIdx) => {
94
+ const segs = parseInlineSegments(ln);
95
+ const rendered = segs.length === 0 ? [{ text: "", bold: false, italic: false }] : segs;
96
+ rendered.forEach((seg, segIdx) => {
97
+ const extra = {};
98
+ if (segIdx === 0) {
99
+ extra.x = attrs.x;
100
+ extra.dy = lineIdx === 0 ? -total / 2 : lineHeight;
101
+ }
102
+ tspans.push(segmentTspan(seg, extra));
103
+ });
104
+ });
105
+ return el("text", attrs, tspans.join(""));
106
+ }
107
+ function title(content) {
108
+ return el("title", {}, escapeXml(content));
109
+ }
110
+ function desc(content) {
111
+ return el("desc", {}, escapeXml(content));
112
+ }
113
+ function pattern(attrs, children) {
114
+ return el("pattern", attrs, children);
115
+ }
116
+ function polygon(attrs) {
117
+ return el("polygon", attrs);
118
+ }
119
+
120
+ export { circle, defs, desc, el, escapeXml, group, line, multilineText, path, pattern, polygon, rect, svgRoot, text, title };
121
+ //# sourceMappingURL=chunk-SYYBKDL7.js.map
122
+ //# sourceMappingURL=chunk-SYYBKDL7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/svg.ts"],"names":["line"],"mappings":"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","file":"chunk-SYYBKDL7.js","sourcesContent":["/**\n * Tiny SVG builder utility.\n *\n * Handles XML escaping, attribute formatting, and nesting.\n * Avoids raw string concatenation fragility.\n *\n * @example\n * ```ts\n * const svg = svgRoot({ width: 800, height: 600, viewBox: '0 0 800 600' }, [\n * defs([\n * pattern({ id: 'half-fill', ... }, [...]),\n * ]),\n * group({ class: 'schematex-generation-0', transform: 'translate(0, 0)' }, [\n * rect({ x: 100, y: 50, width: 40, height: 40, class: 'schematex-node' }),\n * text({ x: 120, y: 110, class: 'schematex-label' }, 'John'),\n * ]),\n * ]);\n * ```\n */\n\n// ─── XML Escaping ────────────────────────────────────────────\n\nconst ESCAPE_MAP: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&apos;\",\n};\n\nexport function escapeXml(str: string): string {\n return str.replace(/[&<>\"']/g, (ch) => ESCAPE_MAP[ch] ?? ch);\n}\n\n// ─── Attribute Formatting ────────────────────────────────────\n\ntype Attrs = Record<string, string | number | undefined>;\n\nfunction formatAttrs(attrs: Attrs): string {\n return Object.entries(attrs)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${k}=\"${escapeXml(String(v))}\"`)\n .join(\" \");\n}\n\n// ─── Element Builders ────────────────────────────────────────\n\nexport function el(\n tag: string,\n attrs: Attrs,\n children?: string | string[]\n): string {\n const attrStr = formatAttrs(attrs);\n const open = attrStr ? `<${tag} ${attrStr}` : `<${tag}`;\n\n if (children === undefined) {\n return `${open}/>`;\n }\n\n const content = Array.isArray(children) ? children.join(\"\\n\") : children;\n return `${open}>${content}</${tag}>`;\n}\n\n// Convenience wrappers for common SVG elements\n\nexport function svgRoot(attrs: Attrs, children: string[]): string {\n return el(\n \"svg\",\n {\n xmlns: \"http://www.w3.org/2000/svg\",\n \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n ...attrs,\n },\n children\n );\n}\n\nexport function defs(children: string[]): string {\n return el(\"defs\", {}, children);\n}\n\nexport function group(attrs: Attrs, children: string[]): string {\n return el(\"g\", attrs, children);\n}\n\nexport function rect(attrs: Attrs): string {\n return el(\"rect\", attrs);\n}\n\nexport function circle(attrs: Attrs): string {\n return el(\"circle\", attrs);\n}\n\nexport function line(attrs: Attrs): string {\n return el(\"line\", attrs);\n}\n\nexport function path(attrs: Attrs): string {\n return el(\"path\", attrs);\n}\n\nexport function text(attrs: Attrs, content: string): string {\n return el(\"text\", attrs, escapeXml(content));\n}\n\ninterface Segment { text: string; bold: boolean; italic: boolean }\n\nfunction parseInlineSegments(line: string): Segment[] {\n const out: Segment[] = [];\n let bold = false;\n let italic = false;\n let buf = \"\";\n let i = 0;\n while (i < line.length) {\n const rest = line.slice(i);\n const m = /^<(\\/?)([bi])>/i.exec(rest);\n if (m) {\n if (buf) { out.push({ text: buf, bold, italic }); buf = \"\"; }\n const isClose = m[1] === \"/\";\n const tag = m[2]!.toLowerCase();\n if (tag === \"b\") bold = !isClose;\n else italic = !isClose;\n i += m[0].length;\n } else {\n buf += line[i];\n i++;\n }\n }\n if (buf) out.push({ text: buf, bold, italic });\n return out;\n}\n\nfunction segmentTspan(\n seg: Segment,\n extra: Attrs\n): string {\n const a: Attrs = { ...extra };\n if (seg.bold) a[\"font-weight\"] = \"bold\";\n if (seg.italic) a[\"font-style\"] = \"italic\";\n return el(\"tspan\", a, escapeXml(seg.text));\n}\n\n/** Splits on `<br/>`/`<br>`/`\\n` into vertically centered `<tspan>` rows. Honors inline `<b>`/`<i>` per segment. */\nexport function multilineText(\n attrs: Attrs & { x: number | string },\n content: string,\n lineHeight = 14\n): string {\n const lines = String(content).split(/<br\\s*\\/?>|\\n/i);\n const total = (lines.length - 1) * lineHeight;\n const tspans: string[] = [];\n lines.forEach((ln, lineIdx) => {\n const segs = parseInlineSegments(ln);\n const rendered = segs.length === 0 ? [{ text: \"\", bold: false, italic: false }] : segs;\n rendered.forEach((seg, segIdx) => {\n // Only the first segment of each line carries x + dy (line break);\n // subsequent segments inherit position and continue inline.\n const extra: Attrs = {};\n if (segIdx === 0) {\n extra.x = attrs.x;\n extra.dy = lineIdx === 0 ? -total / 2 : lineHeight;\n }\n tspans.push(segmentTspan(seg, extra));\n });\n });\n return el(\"text\", attrs, tspans.join(\"\"));\n}\n\nexport function title(content: string): string {\n return el(\"title\", {}, escapeXml(content));\n}\n\nexport function desc(content: string): string {\n return el(\"desc\", {}, escapeXml(content));\n}\n\nexport function pattern(attrs: Attrs, children: string[]): string {\n return el(\"pattern\", attrs, children);\n}\n\nexport function polygon(attrs: Attrs): string {\n return el(\"polygon\", attrs);\n}\n"]}