@diagrammo/dgmo 0.45.0 → 0.47.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 (250) hide show
  1. package/dist/advanced.cjs +31 -25
  2. package/dist/advanced.d.cts +3 -855
  3. package/dist/advanced.d.ts +3 -855
  4. package/dist/advanced.js +541 -70101
  5. package/dist/analyzer-UYKBXAKR.js +15 -0
  6. package/dist/auto.cjs +500 -341
  7. package/dist/auto.css +342 -159
  8. package/dist/auto.d.cts +10 -8
  9. package/dist/auto.d.ts +10 -8
  10. package/dist/auto.js +373 -265
  11. package/dist/auto.mjs +500 -341
  12. package/dist/block.cjs +31 -25
  13. package/dist/block.js +83 -69411
  14. package/dist/calculator-LDYQCDDY.js +11 -0
  15. package/dist/charts-d3-QOZHKTCT.js +25 -0
  16. package/dist/chunk-2DXMZRWJ.js +800 -0
  17. package/dist/chunk-2LACINWN.js +786 -0
  18. package/dist/chunk-33LCUH4H.js +893 -0
  19. package/dist/chunk-3CIOJ5YJ.js +35 -0
  20. package/dist/chunk-3HDBAXF5.js +86 -0
  21. package/dist/chunk-3JLKYGBQ.js +290 -0
  22. package/dist/chunk-3MQQNXPD.js +415 -0
  23. package/dist/chunk-3R5POCTZ.js +967 -0
  24. package/dist/chunk-3SMGIJDD.js +112 -0
  25. package/dist/chunk-44CM72SQ.js +409 -0
  26. package/dist/chunk-4GRI7MEB.js +1604 -0
  27. package/dist/chunk-4OHACBGX.js +606 -0
  28. package/dist/chunk-5DH3KYFH.js +21 -0
  29. package/dist/chunk-5MLYVTYM.js +76 -0
  30. package/dist/chunk-5QXL4NYS.js +553 -0
  31. package/dist/chunk-5WRI5ZAA.js +31 -0
  32. package/dist/chunk-6EK55ART.js +117 -0
  33. package/dist/chunk-6FZYCKXB.js +2065 -0
  34. package/dist/chunk-6HO5ZTXK.js +277 -0
  35. package/dist/chunk-6KFWC4CO.js +7 -0
  36. package/dist/chunk-6MTWIQVO.js +121 -0
  37. package/dist/chunk-6NYWYNBI.js +329 -0
  38. package/dist/chunk-6SM5NJQH.js +620 -0
  39. package/dist/chunk-725LDASD.js +422 -0
  40. package/dist/chunk-76OWZ3BA.js +130 -0
  41. package/dist/chunk-7JEGTRLD.js +338 -0
  42. package/dist/chunk-A44USUV7.js +923 -0
  43. package/dist/chunk-A4GOY3PE.js +25 -0
  44. package/dist/chunk-A4VFQH5G.js +251 -0
  45. package/dist/chunk-AELOBFW5.js +375 -0
  46. package/dist/chunk-AN2MOO5T.js +522 -0
  47. package/dist/chunk-BMR4CIEO.js +41 -0
  48. package/dist/chunk-BS7SV7C3.js +51 -0
  49. package/dist/chunk-BUPDIHML.js +613 -0
  50. package/dist/chunk-BUVJFRPY.js +887 -0
  51. package/dist/chunk-C3Z4DX3V.js +112 -0
  52. package/dist/chunk-CI2G3OEB.js +1818 -0
  53. package/dist/chunk-CKNVO24D.js +54 -0
  54. package/dist/chunk-CUVHQHZ7.js +391 -0
  55. package/dist/chunk-CXK4DZH3.js +114 -0
  56. package/dist/chunk-DKEPS5LH.js +315 -0
  57. package/dist/chunk-DU7W62N5.js +487 -0
  58. package/dist/chunk-DZAQBW35.js +751 -0
  59. package/dist/chunk-EB6FPQUP.js +316 -0
  60. package/dist/chunk-EMS2SK26.js +376 -0
  61. package/dist/chunk-ERLBPDGU.js +510 -0
  62. package/dist/chunk-EVCVDTXE.js +732 -0
  63. package/dist/chunk-FCIIHT24.js +384 -0
  64. package/dist/chunk-FFUN5D66.js +97 -0
  65. package/dist/chunk-FITOLXSX.js +714 -0
  66. package/dist/chunk-FMDSF3OV.js +68 -0
  67. package/dist/chunk-FNB3PNGF.js +410 -0
  68. package/dist/chunk-G2H74XJZ.js +2104 -0
  69. package/dist/chunk-GMR5MFHJ.js +339 -0
  70. package/dist/chunk-H6PI3KJT.js +305 -0
  71. package/dist/chunk-I46X5VUA.js +59 -0
  72. package/dist/chunk-I5IGB56C.js +255 -0
  73. package/dist/chunk-IH6ZMVQ5.js +3950 -0
  74. package/dist/chunk-IJZFN3HM.js +463 -0
  75. package/dist/chunk-IPWPWM6R.js +3079 -0
  76. package/dist/chunk-IYULMRBE.js +23 -0
  77. package/dist/chunk-IZMRON6C.js +167 -0
  78. package/dist/chunk-J5FIXQRT.js +813 -0
  79. package/dist/chunk-JED6ZDEE.js +73 -0
  80. package/dist/chunk-JEUJOX5X.js +136 -0
  81. package/dist/chunk-JM4LEPY3.js +436 -0
  82. package/dist/chunk-L3UHP6TD.js +101 -0
  83. package/dist/chunk-L66GEFB6.js +524 -0
  84. package/dist/chunk-LIOHW36Z.js +469 -0
  85. package/dist/chunk-LP7EC4MI.js +16 -0
  86. package/dist/chunk-MITI6NOL.js +548 -0
  87. package/dist/chunk-MO5YHHMQ.js +168 -0
  88. package/dist/chunk-MZSBFAPJ.js +885 -0
  89. package/dist/chunk-NNAAJVBU.js +9 -0
  90. package/dist/chunk-NOTA6TEI.js +47 -0
  91. package/dist/chunk-NURGB5Z4.js +335 -0
  92. package/dist/chunk-NX4EQS3U.js +1062 -0
  93. package/dist/chunk-NXMESY4J.js +1 -0
  94. package/dist/chunk-OJR3MQYV.js +1458 -0
  95. package/dist/chunk-OURHMODR.js +454 -0
  96. package/dist/chunk-P235SVAH.js +1057 -0
  97. package/dist/chunk-P4RH4OSP.js +1038 -0
  98. package/dist/chunk-P6T66CCZ.js +226 -0
  99. package/dist/chunk-PBAHEPLQ.js +223 -0
  100. package/dist/chunk-PBHE5UG6.js +1530 -0
  101. package/dist/chunk-PDKUANDZ.js +35 -0
  102. package/dist/chunk-PWIHZ6NJ.js +296 -0
  103. package/dist/chunk-QEBUY5NY.js +1685 -0
  104. package/dist/chunk-QLCCJEJI.js +253 -0
  105. package/dist/chunk-QOOUC2J5.js +52 -0
  106. package/dist/chunk-QYTPPDAO.js +402 -0
  107. package/dist/chunk-R3XI2VC7.js +801 -0
  108. package/dist/chunk-RCERWOJR.js +154 -0
  109. package/dist/chunk-RJE5JTVK.js +362 -0
  110. package/dist/chunk-RTLBSQ3G.js +1155 -0
  111. package/dist/chunk-RUNNI6VE.js +448 -0
  112. package/dist/chunk-RVMRZAPB.js +354 -0
  113. package/dist/chunk-RYEGFMUO.js +955 -0
  114. package/dist/chunk-RZCF2VVM.js +528 -0
  115. package/dist/chunk-SML67VPV.js +1025 -0
  116. package/dist/chunk-SQ7IY53Q.js +44 -0
  117. package/dist/chunk-SQAG3UXH.js +161 -0
  118. package/dist/chunk-SRTU6HMQ.js +1851 -0
  119. package/dist/chunk-T2OE3YQB.js +550 -0
  120. package/dist/chunk-T3UBLACL.js +299 -0
  121. package/dist/chunk-TLVIHFRO.js +296 -0
  122. package/dist/chunk-TYS6CSS5.js +52 -0
  123. package/dist/chunk-U6EQI3U6.js +130 -0
  124. package/dist/chunk-UJ4FJLBF.js +86 -0
  125. package/dist/chunk-ULOEATBZ.js +347 -0
  126. package/dist/chunk-UNCCZ3NU.js +127 -0
  127. package/dist/chunk-USZW2HHU.js +197 -0
  128. package/dist/chunk-UWN33VNX.js +1610 -0
  129. package/dist/chunk-UZ7EZW3B.js +40 -0
  130. package/dist/chunk-VOKGH627.js +37 -0
  131. package/dist/chunk-WBRZJOEC.js +204 -0
  132. package/dist/chunk-WCSOJFU3.js +380 -0
  133. package/dist/chunk-WCT3NYCV.js +160 -0
  134. package/dist/chunk-WVAJFAIA.js +529 -0
  135. package/dist/chunk-X5LCYCL5.js +394 -0
  136. package/dist/chunk-XAKEUMEJ.js +1256 -0
  137. package/dist/chunk-Y2ZE3MSG.js +590 -0
  138. package/dist/chunk-Y3J7VR52.js +646 -0
  139. package/dist/chunk-Y5QGVTVC.js +33 -0
  140. package/dist/chunk-YAA6IID3.js +548 -0
  141. package/dist/chunk-YGJTDXVR.js +692 -0
  142. package/dist/chunk-YRYKTYMQ.js +186 -0
  143. package/dist/chunk-YYVTBZZC.js +61 -0
  144. package/dist/chunk-Z5CGSFJB.js +647 -0
  145. package/dist/chunk-Z72XRXD4.js +787 -0
  146. package/dist/chunk-ZGR7ULFJ.js +978 -0
  147. package/dist/chunk-ZJEL4H2R.js +851 -0
  148. package/dist/chunk-ZO27FGJS.js +554 -0
  149. package/dist/cli.cjs +112 -112
  150. package/dist/collapse-CLPJD2RL.js +11 -0
  151. package/dist/collapse-SLINJQW6.js +9 -0
  152. package/dist/collapse-ZWUFFCK2.js +9 -0
  153. package/dist/compute-G55RG53N.js +8 -0
  154. package/dist/dgmo-router-DZCIDUO5.js +73 -0
  155. package/dist/dimensions-J3FHIMJ6.js +22 -0
  156. package/dist/element.cjs +492 -325
  157. package/dist/element.js +367 -259
  158. package/dist/element.mjs +492 -325
  159. package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
  160. package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
  161. package/dist/index.cjs +34 -28
  162. package/dist/index.d.cts +3 -469
  163. package/dist/index.d.ts +3 -469
  164. package/dist/index.js +137 -69679
  165. package/dist/layout-46N4JJYK.js +17 -0
  166. package/dist/layout-5RA6QWR6.js +26 -0
  167. package/dist/layout-5T6RH5M6.js +14 -0
  168. package/dist/layout-7QXCNOVS.js +13 -0
  169. package/dist/layout-EE6GE46Y.js +17 -0
  170. package/dist/layout-G23F7LDH.js +9 -0
  171. package/dist/layout-HRBZPFCN.js +23 -0
  172. package/dist/layout-HWDSRX5E.js +20 -0
  173. package/dist/layout-HYZPWAK5.js +18 -0
  174. package/dist/layout-N76NR4ZO.js +19 -0
  175. package/dist/layout-OB3RI63S.js +14 -0
  176. package/dist/layout-S2QBYSK2.js +15 -0
  177. package/dist/layout-UM5F4DJB.js +15 -0
  178. package/dist/layout-search-OYV77HHS.js +1655 -0
  179. package/dist/load-data-EHDDZ5ZS.js +8 -0
  180. package/dist/palettes-PRJ2RI6D.js +56 -0
  181. package/dist/parser-2MFP2H2E.js +11 -0
  182. package/dist/parser-3STE62GB.js +21 -0
  183. package/dist/parser-4FL2CMDG.js +18 -0
  184. package/dist/parser-4OGOBJJ4.js +13 -0
  185. package/dist/parser-6BTRLKRZ.js +15 -0
  186. package/dist/parser-AQETEVRW.js +21 -0
  187. package/dist/parser-CFZD5IBL.js +12 -0
  188. package/dist/parser-FUSKFGZN.js +16 -0
  189. package/dist/parser-I6KXEYFK.js +13 -0
  190. package/dist/parser-IXSZZQHY.js +18 -0
  191. package/dist/parser-JAL2HD4I.js +13 -0
  192. package/dist/parser-KNSQSKQO.js +20 -0
  193. package/dist/parser-N5O4IHUN.js +13 -0
  194. package/dist/parser-NGU3ETO6.js +16 -0
  195. package/dist/parser-NRAI6O25.js +19 -0
  196. package/dist/parser-O5J4VBII.js +11 -0
  197. package/dist/parser-OV7NOBW6.js +21 -0
  198. package/dist/parser-PQ3POX45.js +23 -0
  199. package/dist/parser-TFZFBVWN.js +11 -0
  200. package/dist/parser-TRTHDFPP.js +18 -0
  201. package/dist/parser-VQP2UJ6W.js +11 -0
  202. package/dist/parser-XDVELHRK.js +13 -0
  203. package/dist/parser-XKRP7QKP.js +11 -0
  204. package/dist/parser-Y6WTBU76.js +14 -0
  205. package/dist/parser-ZSDPZYQP.js +12 -0
  206. package/dist/renderer-2XQQQ6QR.js +28 -0
  207. package/dist/renderer-5NDVNDAZ.js +26 -0
  208. package/dist/renderer-6EEZHMH4.js +26 -0
  209. package/dist/renderer-6W5462RB.js +43 -0
  210. package/dist/renderer-7MVLWWQD.js +22 -0
  211. package/dist/renderer-AWWAF6XD.js +33 -0
  212. package/dist/renderer-BYCNMBF7.js +34 -0
  213. package/dist/renderer-CLJHQPBJ.js +29 -0
  214. package/dist/renderer-GHPZMFU2.js +15 -0
  215. package/dist/renderer-JGBKUCZD.js +16 -0
  216. package/dist/renderer-KQB7UGDS.js +19 -0
  217. package/dist/renderer-PGX2TKVS.js +24 -0
  218. package/dist/renderer-QIWVHWZO.js +15 -0
  219. package/dist/renderer-RPOA5YPZ.js +35 -0
  220. package/dist/renderer-SMIBCRVB.js +24 -0
  221. package/dist/renderer-T7YKC5VP.js +28 -0
  222. package/dist/renderer-TOCOVLHS.js +37 -0
  223. package/dist/renderer-UWA5XS74.js +39 -0
  224. package/dist/renderer-VACVQYML.js +25 -0
  225. package/dist/renderer-W4M6QLIJ.js +37 -0
  226. package/dist/renderer-WZRREQ2P.js +23 -0
  227. package/dist/renderer-YY2OSF6E.js +27 -0
  228. package/dist/renderer-Z7I3W2PP.js +24 -0
  229. package/dist/renderer-ZGNTUWC4.js +22 -0
  230. package/dist/renderer-ZTR3DER3.js +19 -0
  231. package/dist/renderer-radial-C32GPJQ7.js +21 -0
  232. package/dist/resolver-NOAA7ID7.js +13 -0
  233. package/dist/state-collapse-HCGD6IVJ.js +8 -0
  234. package/dist/state-parser-Z2V23ATR.js +18 -0
  235. package/dist/state-renderer-RFYHSP4K.js +34 -0
  236. package/dist/themes-1-CuKpeH.d.cts +908 -0
  237. package/dist/themes-1-CuKpeH.d.ts +908 -0
  238. package/package.json +1 -1
  239. package/src/auto/index.ts +55 -57
  240. package/src/auto/shared.ts +142 -142
  241. package/src/auto/styles.ts +44 -199
  242. package/src/c4/renderer.ts +2 -2
  243. package/src/element/index.ts +29 -21
  244. package/src/infra/renderer.ts +1 -1
  245. package/src/render.ts +34 -14
  246. package/src/sitemap/renderer.ts +1 -1
  247. package/src/timeline/renderer.ts +1 -1
  248. package/src/utils/hover-styles.ts +6 -1
  249. package/src/utils/legend-d3.ts +1 -4
  250. package/src/utils/legend-svg.ts +1 -1
@@ -0,0 +1,338 @@
1
+ import {
2
+ isBlockNode
3
+ } from "./chunk-NNAAJVBU.js";
4
+ import {
5
+ AUTO_TAG_COLOR_SENTINEL,
6
+ finalizeAutoTagColors,
7
+ matchTagBlockHeading,
8
+ stripDefaultModifier,
9
+ tagAttrKey,
10
+ validateTagGroupNames,
11
+ validateTagValues
12
+ } from "./chunk-QLCCJEJI.js";
13
+ import {
14
+ extractColor,
15
+ measureIndent,
16
+ parseFirstLine
17
+ } from "./chunk-Y3J7VR52.js";
18
+ import {
19
+ formatDgmoError,
20
+ makeDgmoError,
21
+ makeFail,
22
+ suggest
23
+ } from "./chunk-CXK4DZH3.js";
24
+
25
+ // src/block/parser.ts
26
+ function parseBlock(content, palette) {
27
+ const options = { noLegend: false, solidFill: false };
28
+ const result = {
29
+ type: "block",
30
+ title: null,
31
+ titleLineNumber: null,
32
+ top: { cols: null, rows: [] },
33
+ tagGroups: [],
34
+ options,
35
+ diagnostics: [],
36
+ error: null
37
+ };
38
+ const fail = makeFail(result);
39
+ const pushError = (line, message, code) => {
40
+ const diag = makeDgmoError(line, message, "error", code);
41
+ result.diagnostics.push(diag);
42
+ if (!result.error) result.error = formatDgmoError(diag);
43
+ };
44
+ const pushWarning = (line, message, code) => {
45
+ result.diagnostics.push(makeDgmoError(line, message, "warning", code));
46
+ };
47
+ if (!content?.trim()) {
48
+ return fail(0, "No content provided");
49
+ }
50
+ const lines = content.split("\n");
51
+ let contentStarted = false;
52
+ let topCols = null;
53
+ let currentTagGroup = null;
54
+ const aliasMap = /* @__PURE__ */ new Map();
55
+ const contentLines = [];
56
+ for (let i = 0; i < lines.length; i++) {
57
+ const line = lines[i];
58
+ const lineNumber = i + 1;
59
+ const trimmed = line.trim();
60
+ if (!trimmed) {
61
+ currentTagGroup = null;
62
+ continue;
63
+ }
64
+ if (trimmed.startsWith("//")) continue;
65
+ if (!contentStarted) {
66
+ if (result.titleLineNumber === null && i === 0) {
67
+ const firstLine = parseFirstLine(trimmed);
68
+ if (firstLine) {
69
+ if (firstLine.chartType !== "block") {
70
+ let msg = `Expected chart type "block", got "${firstLine.chartType}"`;
71
+ const hint = suggest(firstLine.chartType, ["block"]);
72
+ if (hint) msg += `. ${hint}`;
73
+ return fail(lineNumber, msg);
74
+ }
75
+ result.title = firstLine.title ?? null;
76
+ result.titleLineNumber = lineNumber;
77
+ continue;
78
+ }
79
+ }
80
+ const tagBlockMatch = matchTagBlockHeading(trimmed);
81
+ if (tagBlockMatch) {
82
+ currentTagGroup = {
83
+ name: tagBlockMatch.name,
84
+ ...tagBlockMatch.alias !== void 0 && {
85
+ alias: tagBlockMatch.alias
86
+ },
87
+ entries: [],
88
+ lineNumber
89
+ };
90
+ if (tagBlockMatch.alias) {
91
+ aliasMap.set(
92
+ tagBlockMatch.alias.toLowerCase(),
93
+ tagAttrKey(tagBlockMatch.name)
94
+ );
95
+ }
96
+ aliasMap.set(
97
+ tagAttrKey(tagBlockMatch.name),
98
+ tagAttrKey(tagBlockMatch.name)
99
+ );
100
+ result.tagGroups.push(currentTagGroup);
101
+ continue;
102
+ }
103
+ if (currentTagGroup) {
104
+ const indent = measureIndent(line);
105
+ if (indent > 0) {
106
+ const { text: cleanEntry, isDefault } = stripDefaultModifier(trimmed);
107
+ const { label, color } = extractColor(
108
+ cleanEntry,
109
+ palette,
110
+ result.diagnostics,
111
+ lineNumber
112
+ );
113
+ if (isDefault || currentTagGroup.entries.length === 0) {
114
+ currentTagGroup.defaultValue = label;
115
+ }
116
+ currentTagGroup.entries.push({
117
+ value: label,
118
+ color: color ?? AUTO_TAG_COLOR_SENTINEL,
119
+ lineNumber
120
+ });
121
+ continue;
122
+ }
123
+ currentTagGroup = null;
124
+ }
125
+ if (measureIndent(line) === 0) {
126
+ const headerCols = trimmed.match(/^columns\s+(\d+)\s*$/i);
127
+ if (headerCols) {
128
+ topCols = parseInt(headerCols[1], 10);
129
+ continue;
130
+ }
131
+ if (/^no-legend\s*$/i.test(trimmed)) {
132
+ options.noLegend = true;
133
+ continue;
134
+ }
135
+ if (/^solid-fill\s*$/i.test(trimmed)) {
136
+ options.solidFill = true;
137
+ continue;
138
+ }
139
+ }
140
+ }
141
+ if (contentStarted && matchTagBlockHeading(trimmed)) {
142
+ pushError(
143
+ lineNumber,
144
+ "Tag groups must appear before block content",
145
+ "E_TAG_DECLARED_AFTER_CONTENT"
146
+ );
147
+ continue;
148
+ }
149
+ contentStarted = true;
150
+ currentTagGroup = null;
151
+ contentLines.push({ indent: measureIndent(line), trimmed, lineNumber });
152
+ }
153
+ finalizeAutoTagColors(result.tagGroups, palette);
154
+ let idx = 0;
155
+ let nodeCounter = 0;
156
+ const baseIndent = contentLines.length > 0 ? contentLines[0].indent : 0;
157
+ const parseGrid = (base) => {
158
+ const grid = { cols: null, rows: [] };
159
+ while (idx < contentLines.length) {
160
+ const ln = contentLines[idx];
161
+ if (ln.indent < base) break;
162
+ if (ln.indent > base) {
163
+ pushWarning(
164
+ ln.lineNumber,
165
+ `Over-indented line "${ln.trimmed}" has no parent block \u2014 ignored`
166
+ );
167
+ idx++;
168
+ continue;
169
+ }
170
+ const colsMatch = ln.trimmed.match(/^columns\s+(\d+)\s*$/i);
171
+ if (colsMatch) {
172
+ grid.cols = parseInt(colsMatch[1], 10);
173
+ idx++;
174
+ continue;
175
+ }
176
+ if (/^\[|^_(?=\s|$)|^space(?=\s|$)/.test(ln.trimmed)) {
177
+ const cells = parseRow(
178
+ ln.trimmed,
179
+ ln.lineNumber,
180
+ aliasMap,
181
+ () => ++nodeCounter,
182
+ pushWarning
183
+ );
184
+ idx++;
185
+ const only = cells.length === 1 ? cells[0] : null;
186
+ if (only && isBlockNode(only) && idx < contentLines.length && contentLines[idx].indent > base) {
187
+ only.grid = parseGrid(contentLines[idx].indent);
188
+ }
189
+ if (cells.length > 0) grid.rows.push(cells);
190
+ continue;
191
+ }
192
+ pushWarning(
193
+ ln.lineNumber,
194
+ `Unrecognized line "${ln.trimmed}" \u2014 block rows are bracketed (e.g. [A] [B]) or a "columns N" directive`
195
+ );
196
+ idx++;
197
+ }
198
+ return grid;
199
+ };
200
+ result.top = parseGrid(baseIndent);
201
+ if (topCols !== null && result.top.cols === null) result.top.cols = topCols;
202
+ const inferGrid = (grid) => {
203
+ const cols = grid.cols ?? Math.max(
204
+ 1,
205
+ ...grid.rows.map((r) => r.reduce((s, c) => s + (c.span || 1), 0))
206
+ );
207
+ grid.cols = cols;
208
+ for (const row of grid.rows) {
209
+ for (const c of row) if (c.span > cols) c.span = cols;
210
+ const cnt = row.length;
211
+ const allOne = row.every((c) => (c.span || 1) === 1);
212
+ if (allOne && cnt > 0 && cnt < cols && cols % cnt === 0) {
213
+ const sp = cols / cnt;
214
+ for (const c of row) c.span = sp;
215
+ }
216
+ for (const c of row) if (isBlockNode(c) && c.grid) inferGrid(c.grid);
217
+ }
218
+ };
219
+ inferGrid(result.top);
220
+ const allNodes = [];
221
+ const collect = (grid) => {
222
+ for (const row of grid.rows)
223
+ for (const c of row)
224
+ if (isBlockNode(c)) {
225
+ allNodes.push(c);
226
+ if (c.grid) collect(c.grid);
227
+ }
228
+ };
229
+ collect(result.top);
230
+ if (result.tagGroups.length > 0) {
231
+ const tagKeys = result.tagGroups.map((g) => tagAttrKey(g.name));
232
+ const cascade = (grid, inherited) => {
233
+ for (const row of grid.rows)
234
+ for (const c of row) {
235
+ if (!isBlockNode(c)) continue;
236
+ for (const k of tagKeys) {
237
+ if (!(k in c.metadata) && inherited[k] !== void 0) {
238
+ c.metadata[k] = inherited[k];
239
+ }
240
+ }
241
+ if (c.grid) cascade(c.grid, c.metadata);
242
+ }
243
+ };
244
+ cascade(result.top, {});
245
+ validateTagValues(allNodes, result.tagGroups, pushWarning, suggest);
246
+ validateTagGroupNames(result.tagGroups, pushWarning);
247
+ }
248
+ if (allNodes.length === 0 && !result.error) {
249
+ const diag = makeDgmoError(1, "No blocks found in block diagram");
250
+ result.diagnostics.push(diag);
251
+ result.error = formatDgmoError(diag);
252
+ }
253
+ return result;
254
+ }
255
+ function parseRow(line, lineNumber, aliasMap, nextId, pushWarning) {
256
+ const cells = [];
257
+ let i = 0;
258
+ const n = line.length;
259
+ while (i < n) {
260
+ while (i < n && line[i] === " ") i++;
261
+ if (i >= n) break;
262
+ const gap = line.slice(i).match(/^(_|space)(?=\s|$)/);
263
+ if (gap) {
264
+ cells.push({ empty: true, span: 1 });
265
+ i += gap[1].length;
266
+ continue;
267
+ }
268
+ if (line[i] === "[") {
269
+ const end = line.indexOf("]", i);
270
+ if (end < 0) {
271
+ pushWarning(lineNumber, `Unclosed "[" in block row "${line.trim()}"`);
272
+ break;
273
+ }
274
+ const label = line.slice(i + 1, end).trim();
275
+ i = end + 1;
276
+ let tail = "";
277
+ while (i < n) {
278
+ let k = i;
279
+ while (k < n && line[k] === " ") k++;
280
+ if (k >= n || line[k] === "[") {
281
+ i = k;
282
+ break;
283
+ }
284
+ let e = k;
285
+ while (e < n && line[e] !== " " && line[e] !== "[") e++;
286
+ const tok = line.slice(k, e);
287
+ if (tok === "_" || tok === "space") {
288
+ i = k;
289
+ break;
290
+ }
291
+ tail += (tail ? " " : "") + tok;
292
+ i = e;
293
+ }
294
+ const { meta, span, collapsed } = parseBlockTail(tail, aliasMap);
295
+ const node = {
296
+ id: `block-node-${nextId()}`,
297
+ label,
298
+ span: span ?? 1,
299
+ collapsed,
300
+ metadata: meta,
301
+ lineNumber
302
+ };
303
+ cells.push(node);
304
+ continue;
305
+ }
306
+ i++;
307
+ }
308
+ return cells;
309
+ }
310
+ function parseBlockTail(tail, aliasMap) {
311
+ let collapsed = false;
312
+ const stripped = tail.replace(/(^|\s)collapsed(?=\s|$)/i, (_m, a) => {
313
+ collapsed = true;
314
+ return a;
315
+ });
316
+ const meta = {};
317
+ let span;
318
+ for (const seg of stripped.split(",")) {
319
+ const t = seg.trim();
320
+ if (!t) continue;
321
+ const colonIdx = t.indexOf(":");
322
+ if (colonIdx < 0) continue;
323
+ const rawKey = t.slice(0, colonIdx).trim().toLowerCase();
324
+ const value = t.slice(colonIdx + 1).trim();
325
+ if (rawKey === "span") {
326
+ const num = parseInt(value, 10);
327
+ if (Number.isFinite(num) && num >= 1) span = num;
328
+ } else if (value) {
329
+ meta[aliasMap.get(rawKey) ?? rawKey] = value;
330
+ }
331
+ }
332
+ return { meta, ...span !== void 0 && { span }, collapsed };
333
+ }
334
+
335
+ export {
336
+ parseBlock
337
+ };
338
+ //# sourceMappingURL=chunk-7JEGTRLD.js.map