schematex 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -3
- package/dist/ai/ai-sdk.cjs +17 -15
- package/dist/ai/ai-sdk.cjs.map +1 -1
- package/dist/ai/ai-sdk.d.cts +2 -2
- package/dist/ai/ai-sdk.d.ts +2 -2
- package/dist/ai/ai-sdk.js +12 -10
- package/dist/ai/ai-sdk.js.map +1 -1
- package/dist/ai/index.cjs +20 -18
- package/dist/ai/index.d.cts +3 -3
- package/dist/ai/index.d.ts +3 -3
- package/dist/ai/index.js +12 -10
- package/dist/{api-BIj9t4Oc.d.cts → api-C5UcmT7n.d.cts} +1 -1
- package/dist/{api-BIj9t4Oc.d.ts → api-C5UcmT7n.d.ts} +1 -1
- package/dist/browser.cjs +14 -12
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +2 -2
- package/dist/browser.d.ts +2 -2
- package/dist/browser.js +12 -10
- package/dist/browser.js.map +1 -1
- package/dist/chunk-2KTQ75LN.js +67 -0
- package/dist/chunk-2KTQ75LN.js.map +1 -0
- package/dist/chunk-3KRL2EGN.cjs +70 -0
- package/dist/chunk-3KRL2EGN.cjs.map +1 -0
- package/dist/{chunk-YWDODCW2.js → chunk-3M6T7KB4.js} +60 -14
- package/dist/chunk-3M6T7KB4.js.map +1 -0
- package/dist/{chunk-OIZ4MYSF.cjs → chunk-3M6WB62Y.cjs} +43 -9
- package/dist/chunk-3M6WB62Y.cjs.map +1 -0
- package/dist/{chunk-DHHVYSQX.cjs → chunk-3YUUC6RN.cjs} +5145 -295
- package/dist/chunk-3YUUC6RN.cjs.map +1 -0
- package/dist/{chunk-JDBG5DU2.js → chunk-6OSUNBZY.js} +43 -9
- package/dist/chunk-6OSUNBZY.js.map +1 -0
- package/dist/{chunk-O5POCPXZ.cjs → chunk-EGSUMHCS.cjs} +21 -10
- package/dist/chunk-EGSUMHCS.cjs.map +1 -0
- package/dist/{chunk-Z5NGIM4Z.js → chunk-GTDQAN2Z.js} +5134 -287
- package/dist/chunk-GTDQAN2Z.js.map +1 -0
- package/dist/{chunk-J7JWMQD5.js → chunk-HUPDIRBX.js} +119 -4
- package/dist/chunk-HUPDIRBX.js.map +1 -0
- package/dist/{chunk-5FF2IT3C.js → chunk-IBRW3UOA.js} +51 -10
- package/dist/chunk-IBRW3UOA.js.map +1 -0
- package/dist/{chunk-YTLGK5BZ.js → chunk-IM4RCUHA.js} +238 -1788
- package/dist/chunk-IM4RCUHA.js.map +1 -0
- package/dist/{chunk-LPKVIRYT.js → chunk-JHDR56XO.js} +18 -9
- package/dist/chunk-JHDR56XO.js.map +1 -0
- package/dist/{chunk-GZY4CJ23.cjs → chunk-N7W5KZK7.cjs} +51 -10
- package/dist/chunk-N7W5KZK7.cjs.map +1 -0
- package/dist/{chunk-Z5UECSNM.cjs → chunk-NWPCY65Z.cjs} +240 -1790
- package/dist/chunk-NWPCY65Z.cjs.map +1 -0
- package/dist/chunk-PIV2A3HG.js +55 -0
- package/dist/chunk-PIV2A3HG.js.map +1 -0
- package/dist/{chunk-E2EJRVWS.cjs → chunk-QTNPMIO2.cjs} +158 -15
- package/dist/chunk-QTNPMIO2.cjs.map +1 -0
- package/dist/chunk-SBB6C4OP.cjs +57 -0
- package/dist/chunk-SBB6C4OP.cjs.map +1 -0
- package/dist/{chunk-K6RAUXRQ.cjs → chunk-TZTCIAYW.cjs} +7 -6
- package/dist/chunk-TZTCIAYW.cjs.map +1 -0
- package/dist/{chunk-KVP7AORH.js → chunk-UFTYX73U.js} +158 -15
- package/dist/chunk-UFTYX73U.js.map +1 -0
- package/dist/{chunk-6WORZSL3.cjs → chunk-VFZOPRQP.cjs} +60 -14
- package/dist/chunk-VFZOPRQP.cjs.map +1 -0
- package/dist/{chunk-WHNIK4LK.js → chunk-VJGMEGMR.js} +7 -6
- package/dist/chunk-VJGMEGMR.js.map +1 -0
- package/dist/{chunk-3MJKJX27.cjs → chunk-VZ5LDNHK.cjs} +18 -9
- package/dist/chunk-VZ5LDNHK.cjs.map +1 -0
- package/dist/{chunk-2Z543TC3.cjs → chunk-XRCY75UV.cjs} +119 -4
- package/dist/chunk-XRCY75UV.cjs.map +1 -0
- package/dist/{chunk-6XGSEG3K.js → chunk-ZL5RB4UV.js} +21 -10
- package/dist/chunk-ZL5RB4UV.js.map +1 -0
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.cjs +7 -7
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +1 -1
- package/dist/diagrams/ecomap/index.cjs +7 -6
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -1
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.cjs +8 -7
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -1
- package/dist/diagrams/flowchart/index.cjs +8 -7
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -1
- package/dist/diagrams/genogram/index.cjs +9 -8
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -1
- package/dist/diagrams/ladder/index.cjs +7 -5
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +3 -1
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.cjs +7 -6
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -1
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/sld/index.cjs +7 -5
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +3 -1
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/{index-CGK0xVls.d.ts → index-C9A0h-CB.d.cts} +1 -2
- package/dist/{index-OW8eDrKj.d.cts → index-CJai_TEZ.d.ts} +1 -2
- package/dist/index.cjs +37 -23
- package/dist/index.d.cts +10 -4
- package/dist/index.d.ts +10 -4
- package/dist/index.js +11 -9
- package/dist/react.cjs +12 -10
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +11 -9
- package/dist/react.js.map +1 -1
- package/dist/{types-Gkyab1sL.d.ts → types-BOAsqHoU.d.cts} +3 -3
- package/dist/{types-Gkyab1sL.d.cts → types-BOAsqHoU.d.ts} +3 -3
- package/package.json +2 -2
- package/dist/chunk-2Z543TC3.cjs.map +0 -1
- package/dist/chunk-3MJKJX27.cjs.map +0 -1
- package/dist/chunk-5FF2IT3C.js.map +0 -1
- package/dist/chunk-6WORZSL3.cjs.map +0 -1
- package/dist/chunk-6XGSEG3K.js.map +0 -1
- package/dist/chunk-DHHVYSQX.cjs.map +0 -1
- package/dist/chunk-E2EJRVWS.cjs.map +0 -1
- package/dist/chunk-GZY4CJ23.cjs.map +0 -1
- package/dist/chunk-J7JWMQD5.js.map +0 -1
- package/dist/chunk-JDBG5DU2.js.map +0 -1
- package/dist/chunk-K6RAUXRQ.cjs.map +0 -1
- package/dist/chunk-KVP7AORH.js.map +0 -1
- package/dist/chunk-LPKVIRYT.js.map +0 -1
- package/dist/chunk-O5POCPXZ.cjs.map +0 -1
- package/dist/chunk-OIZ4MYSF.cjs.map +0 -1
- package/dist/chunk-WHNIK4LK.js.map +0 -1
- package/dist/chunk-YTLGK5BZ.js.map +0 -1
- package/dist/chunk-YWDODCW2.js.map +0 -1
- package/dist/chunk-Z5NGIM4Z.js.map +0 -1
- package/dist/chunk-Z5UECSNM.cjs.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// src/core/dsl-suggest.ts
|
|
2
|
+
function distance(a, b, cap) {
|
|
3
|
+
if (a === b) return 0;
|
|
4
|
+
if (Math.abs(a.length - b.length) > cap) return cap + 1;
|
|
5
|
+
const al = a.length;
|
|
6
|
+
const bl = b.length;
|
|
7
|
+
const prev = new Array(bl + 1);
|
|
8
|
+
const curr = new Array(bl + 1);
|
|
9
|
+
for (let j = 0; j <= bl; j++) prev[j] = j;
|
|
10
|
+
for (let i = 1; i <= al; i++) {
|
|
11
|
+
curr[0] = i;
|
|
12
|
+
let rowMin = i;
|
|
13
|
+
for (let j = 1; j <= bl; j++) {
|
|
14
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
15
|
+
curr[j] = Math.min(
|
|
16
|
+
prev[j] + 1,
|
|
17
|
+
// deletion
|
|
18
|
+
curr[j - 1] + 1,
|
|
19
|
+
// insertion
|
|
20
|
+
prev[j - 1] + cost
|
|
21
|
+
// substitution
|
|
22
|
+
);
|
|
23
|
+
if (curr[j] < rowMin) rowMin = curr[j];
|
|
24
|
+
}
|
|
25
|
+
if (rowMin > cap) return cap + 1;
|
|
26
|
+
for (let j = 0; j <= bl; j++) prev[j] = curr[j];
|
|
27
|
+
}
|
|
28
|
+
return prev[bl];
|
|
29
|
+
}
|
|
30
|
+
function suggestKeyword(input, candidates) {
|
|
31
|
+
const needle = input.toLowerCase();
|
|
32
|
+
let best = null;
|
|
33
|
+
let secondBest = Infinity;
|
|
34
|
+
for (const c of candidates) {
|
|
35
|
+
const d = distance(needle, c.toLowerCase(), 2);
|
|
36
|
+
if (d > 2) continue;
|
|
37
|
+
if (best === null || d < best.dist) {
|
|
38
|
+
secondBest = best?.dist ?? Infinity;
|
|
39
|
+
best = { word: c, dist: d };
|
|
40
|
+
} else if (d < secondBest) {
|
|
41
|
+
secondBest = d;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (best === null) return null;
|
|
45
|
+
if (secondBest <= best.dist) return null;
|
|
46
|
+
return best.word;
|
|
47
|
+
}
|
|
48
|
+
function didYouMean(input, candidates) {
|
|
49
|
+
const s = suggestKeyword(input, candidates);
|
|
50
|
+
return s ? ` (did you mean '${s}'?)` : "";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { didYouMean };
|
|
54
|
+
//# sourceMappingURL=chunk-PIV2A3HG.js.map
|
|
55
|
+
//# sourceMappingURL=chunk-PIV2A3HG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/dsl-suggest.ts"],"names":[],"mappings":"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","file":"chunk-PIV2A3HG.js","sourcesContent":["/**\n * \"Did you mean…?\" helper for parser error messages.\n *\n * Every diagram parser eventually rejects an unknown keyword (an unknown\n * node type, an unknown directive, a misspelled mode). The bare error\n * \"unknown element type 'RES'\" tells the LLM nothing — but\n * \"unknown element type 'RES' (did you mean 'OTE'?)\" gives it the bump\n * it needs to self-correct on the next attempt.\n *\n * Implementation is a textbook Levenshtein distance with an early-exit\n * cap of 3. We only suggest if the closest valid keyword is within 2\n * edits AND meaningfully closer than the second-best — that avoids the\n * \"did you mean 'a'?\" noise when input was nonsense.\n */\n\n/** Edit distance with an upper-bound short-circuit. */\nfunction distance(a: string, b: string, cap: number): number {\n if (a === b) return 0;\n if (Math.abs(a.length - b.length) > cap) return cap + 1;\n const al = a.length;\n const bl = b.length;\n // Pre-pad shorter to longer.\n const prev = new Array<number>(bl + 1);\n const curr = new Array<number>(bl + 1);\n for (let j = 0; j <= bl; j++) prev[j] = j;\n for (let i = 1; i <= al; i++) {\n curr[0] = i;\n let rowMin = i;\n for (let j = 1; j <= bl; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(\n prev[j]! + 1, // deletion\n curr[j - 1]! + 1, // insertion\n prev[j - 1]! + cost // substitution\n );\n if (curr[j]! < rowMin) rowMin = curr[j]!;\n }\n if (rowMin > cap) return cap + 1;\n for (let j = 0; j <= bl; j++) prev[j] = curr[j]!;\n }\n return prev[bl]!;\n}\n\n/**\n * Suggest the closest valid keyword to `input` from `candidates`.\n *\n * Returns the keyword if it's within edit distance 2 AND strictly closer\n * than every other candidate (i.e. unambiguous). Returns null otherwise.\n *\n * Comparison is case-insensitive. The returned suggestion preserves the\n * casing of the candidate, not the input.\n */\nexport function suggestKeyword(\n input: string,\n candidates: Iterable<string>\n): string | null {\n const needle = input.toLowerCase();\n let best: { word: string; dist: number } | null = null;\n let secondBest = Infinity;\n for (const c of candidates) {\n const d = distance(needle, c.toLowerCase(), 2);\n if (d > 2) continue;\n if (best === null || d < best.dist) {\n secondBest = best?.dist ?? Infinity;\n best = { word: c, dist: d };\n } else if (d < secondBest) {\n secondBest = d;\n }\n }\n if (best === null) return null;\n // Require strict separation so we don't pick arbitrarily between two\n // equally-close candidates (\"OTE\" vs \"OTL\" for \"OTX\" — useless).\n if (secondBest <= best.dist) return null;\n return best.word;\n}\n\n/**\n * Build a \"(did you mean 'X'?)\" suffix, or empty string if no good match.\n * Convenience wrapper so call sites read as one expression.\n */\nexport function didYouMean(input: string, candidates: Iterable<string>): string {\n const s = suggestKeyword(input, candidates);\n return s ? ` (did you mean '${s}'?)` : \"\";\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunk3KRL2EGN_cjs = require('./chunk-3KRL2EGN.cjs');
|
|
3
4
|
var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
|
|
4
5
|
var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
|
|
5
6
|
|
|
@@ -291,6 +292,47 @@ function parseCssProps(s) {
|
|
|
291
292
|
}
|
|
292
293
|
return props;
|
|
293
294
|
}
|
|
295
|
+
function extractInlineClasses(line2) {
|
|
296
|
+
const pairs = [];
|
|
297
|
+
let out = line2;
|
|
298
|
+
const re = /:::([A-Za-z_][\w-]*)/g;
|
|
299
|
+
let m;
|
|
300
|
+
const hits = [];
|
|
301
|
+
while ((m = re.exec(out)) !== null) {
|
|
302
|
+
hits.push({ start: m.index, end: m.index + m[0].length, name: m[1] });
|
|
303
|
+
}
|
|
304
|
+
if (hits.length === 0) return { stripped: line2, pairs };
|
|
305
|
+
for (let h = hits.length - 1; h >= 0; h--) {
|
|
306
|
+
const hit = hits[h];
|
|
307
|
+
const before = out.slice(0, hit.start);
|
|
308
|
+
let cursor = before.length;
|
|
309
|
+
const lastCh = before[cursor - 1];
|
|
310
|
+
if (lastCh === "]" || lastCh === ")" || lastCh === "}") {
|
|
311
|
+
const closer = lastCh;
|
|
312
|
+
const opener = closer === "]" ? "[" : closer === ")" ? "(" : "{";
|
|
313
|
+
let depth = 0;
|
|
314
|
+
let i = cursor - 1;
|
|
315
|
+
for (; i >= 0; i--) {
|
|
316
|
+
if (before[i] === closer) depth++;
|
|
317
|
+
else if (before[i] === opener) {
|
|
318
|
+
depth--;
|
|
319
|
+
if (depth === 0) break;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (i >= 0) cursor = i;
|
|
323
|
+
}
|
|
324
|
+
const idEnd = cursor;
|
|
325
|
+
let idStart = idEnd;
|
|
326
|
+
while (idStart > 0 && /[A-Za-z0-9_-]/.test(before[idStart - 1])) idStart--;
|
|
327
|
+
if (idStart === idEnd) {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
const id = before.slice(idStart, idEnd);
|
|
331
|
+
pairs.push({ id, className: hit.name });
|
|
332
|
+
out = out.slice(0, hit.start) + out.slice(hit.end);
|
|
333
|
+
}
|
|
334
|
+
return { stripped: out, pairs };
|
|
335
|
+
}
|
|
294
336
|
function parseFlowchart(source) {
|
|
295
337
|
const lines = source.replace(/\r\n/g, "\n").split("\n");
|
|
296
338
|
const ast = {
|
|
@@ -333,10 +375,18 @@ function parseFlowchart(source) {
|
|
|
333
375
|
ast.title = mQuoted ? mQuoted[1] : extra;
|
|
334
376
|
}
|
|
335
377
|
const subgraphStack = [];
|
|
378
|
+
const pendingInlineClasses = [];
|
|
336
379
|
for (let i = headerIdx + 1; i < lines.length; i++) {
|
|
337
|
-
const
|
|
380
|
+
const rawOriginal = lines[i];
|
|
381
|
+
const originalTrimmed = rawOriginal.trim();
|
|
382
|
+
if (originalTrimmed.length === 0 || originalTrimmed.startsWith("%%")) {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
const { stripped, pairs } = extractInlineClasses(rawOriginal);
|
|
386
|
+
for (const p of pairs) pendingInlineClasses.push(p);
|
|
387
|
+
const raw = stripped;
|
|
338
388
|
const trimmed = raw.trim();
|
|
339
|
-
if (trimmed.length === 0
|
|
389
|
+
if (trimmed.length === 0) continue;
|
|
340
390
|
const sgMatch = /^subgraph(?:\s+(.*))?$/.exec(trimmed);
|
|
341
391
|
if (sgMatch) {
|
|
342
392
|
const sg = parseSubgraphHeader(sgMatch[1] ?? "", ast.subgraphs.length);
|
|
@@ -459,6 +509,11 @@ function parseFlowchart(source) {
|
|
|
459
509
|
ast.edges.push(edge);
|
|
460
510
|
}
|
|
461
511
|
}
|
|
512
|
+
for (const { id, className } of pendingInlineClasses) {
|
|
513
|
+
const existing = nodeMap.get(id);
|
|
514
|
+
if (!existing) continue;
|
|
515
|
+
existing.classes = [...existing.classes ?? [], className];
|
|
516
|
+
}
|
|
462
517
|
return ast;
|
|
463
518
|
}
|
|
464
519
|
|
|
@@ -769,15 +824,27 @@ function isFullWidth(code) {
|
|
|
769
824
|
if (code >= 131072 && code <= 196607) return true;
|
|
770
825
|
return false;
|
|
771
826
|
}
|
|
772
|
-
function
|
|
827
|
+
function labelLines(label) {
|
|
828
|
+
return String(label).split(/<br\s*\/?>|\n/i).map((line2) => line2.replace(/<\/?[bi]>/gi, ""));
|
|
829
|
+
}
|
|
830
|
+
function measureLineWidth(line2) {
|
|
773
831
|
let w = 0;
|
|
774
|
-
for (const ch of
|
|
832
|
+
for (const ch of line2) {
|
|
775
833
|
const code = ch.codePointAt(0) ?? 0;
|
|
776
834
|
if (isFullWidth(code)) w += FC_CONST.cjkCharWidth;
|
|
777
835
|
else w += FC_CONST.charWidth;
|
|
778
836
|
}
|
|
779
837
|
return w;
|
|
780
838
|
}
|
|
839
|
+
function measureLabelWidth(label) {
|
|
840
|
+
const lines = labelLines(label);
|
|
841
|
+
let max = 0;
|
|
842
|
+
for (const line2 of lines) {
|
|
843
|
+
const w = measureLineWidth(line2);
|
|
844
|
+
if (w > max) max = w;
|
|
845
|
+
}
|
|
846
|
+
return max;
|
|
847
|
+
}
|
|
781
848
|
function greedyFAS(nodeIds, edges) {
|
|
782
849
|
const outAdj = /* @__PURE__ */ new Map();
|
|
783
850
|
const inAdj = /* @__PURE__ */ new Map();
|
|
@@ -1210,6 +1277,85 @@ function laneBasedXCoords(layerNodes, pathOf, nodeSpacingX, segments) {
|
|
|
1210
1277
|
}
|
|
1211
1278
|
return result;
|
|
1212
1279
|
}
|
|
1280
|
+
function enforceSequentialClusterLayers(ast, layerMap, edges) {
|
|
1281
|
+
const sgParent = /* @__PURE__ */ new Map();
|
|
1282
|
+
for (const sg of ast.subgraphs) {
|
|
1283
|
+
for (const childSg of sg.subgraphs) sgParent.set(childSg, sg.id);
|
|
1284
|
+
if (!sgParent.has(sg.id)) sgParent.set(sg.id, void 0);
|
|
1285
|
+
}
|
|
1286
|
+
const topLevel = ast.subgraphs.filter((sg) => !sgParent.get(sg.id));
|
|
1287
|
+
if (topLevel.length < 2) return;
|
|
1288
|
+
const collect = (sgId) => {
|
|
1289
|
+
const sg = ast.subgraphs.find((s) => s.id === sgId);
|
|
1290
|
+
if (!sg) return [];
|
|
1291
|
+
const ids = [...sg.children];
|
|
1292
|
+
for (const childSgId of sg.subgraphs) ids.push(...collect(childSgId));
|
|
1293
|
+
return ids;
|
|
1294
|
+
};
|
|
1295
|
+
const adjOut = /* @__PURE__ */ new Map();
|
|
1296
|
+
for (const e of edges) {
|
|
1297
|
+
if (!adjOut.has(e.from)) adjOut.set(e.from, []);
|
|
1298
|
+
adjOut.get(e.from).push(e.to);
|
|
1299
|
+
}
|
|
1300
|
+
const hasForwardEdge = (srcSgId, dstSgId) => {
|
|
1301
|
+
const srcIds = new Set(collect(srcSgId));
|
|
1302
|
+
const dstIds = new Set(collect(dstSgId));
|
|
1303
|
+
for (const id of srcIds) {
|
|
1304
|
+
for (const t of adjOut.get(id) ?? []) {
|
|
1305
|
+
if (dstIds.has(t)) return true;
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
return false;
|
|
1309
|
+
};
|
|
1310
|
+
const chains = [];
|
|
1311
|
+
let cur = [];
|
|
1312
|
+
for (let i = 0; i < topLevel.length; i++) {
|
|
1313
|
+
const sg = topLevel[i];
|
|
1314
|
+
if (i === 0 || !hasForwardEdge(topLevel[i - 1].id, sg.id)) {
|
|
1315
|
+
if (cur.length > 1) chains.push(cur);
|
|
1316
|
+
cur = [sg.id];
|
|
1317
|
+
} else {
|
|
1318
|
+
cur.push(sg.id);
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
if (cur.length > 1) chains.push(cur);
|
|
1322
|
+
if (chains.length === 0) return;
|
|
1323
|
+
for (const chain of chains) {
|
|
1324
|
+
let prevMax = -Infinity;
|
|
1325
|
+
for (const clusterId of chain) {
|
|
1326
|
+
const ids = collect(clusterId);
|
|
1327
|
+
if (ids.length === 0) continue;
|
|
1328
|
+
let curMin = Infinity;
|
|
1329
|
+
let curMax = -Infinity;
|
|
1330
|
+
for (const id of ids) {
|
|
1331
|
+
const l = layerMap.get(id) ?? 0;
|
|
1332
|
+
if (l < curMin) curMin = l;
|
|
1333
|
+
if (l > curMax) curMax = l;
|
|
1334
|
+
}
|
|
1335
|
+
const requiredMin = prevMax === -Infinity ? curMin : prevMax + 1;
|
|
1336
|
+
if (curMin < requiredMin) {
|
|
1337
|
+
const shift = requiredMin - curMin;
|
|
1338
|
+
const toShift = new Set(ids);
|
|
1339
|
+
const queue = [...ids];
|
|
1340
|
+
while (queue.length > 0) {
|
|
1341
|
+
const u = queue.shift();
|
|
1342
|
+
for (const t of adjOut.get(u) ?? []) {
|
|
1343
|
+
if (!toShift.has(t)) {
|
|
1344
|
+
toShift.add(t);
|
|
1345
|
+
queue.push(t);
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
for (const id of toShift) {
|
|
1350
|
+
layerMap.set(id, (layerMap.get(id) ?? 0) + shift);
|
|
1351
|
+
}
|
|
1352
|
+
prevMax = curMax + shift;
|
|
1353
|
+
} else {
|
|
1354
|
+
prevMax = curMax;
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1213
1359
|
function hasOverlappingTopLevelClusters(ast, layerMap, sgParent) {
|
|
1214
1360
|
const topLevel = ast.subgraphs.filter((sg) => !sgParent.get(sg.id));
|
|
1215
1361
|
if (topLevel.length < 2) return false;
|
|
@@ -1246,7 +1392,9 @@ function layoutFlowchart(ast) {
|
|
|
1246
1392
|
Math.ceil(rawTextW) + FC_CONST.labelHPad * 2
|
|
1247
1393
|
);
|
|
1248
1394
|
let shapeW = Math.max(FC_CONST.minNodeWidth, labelW);
|
|
1249
|
-
|
|
1395
|
+
const nLines = labelLines(n.label).length;
|
|
1396
|
+
const multilineH = nLines > 1 ? FC_CONST.nodeHeight + (nLines - 1) * 14 : FC_CONST.nodeHeight;
|
|
1397
|
+
let shapeH = multilineH;
|
|
1250
1398
|
if (n.shape === "diamond") {
|
|
1251
1399
|
shapeW = Math.max(shapeW, labelW * 1.4);
|
|
1252
1400
|
shapeH = Math.max(shapeH, 52);
|
|
@@ -1303,6 +1451,7 @@ function layoutFlowchart(ast) {
|
|
|
1303
1451
|
};
|
|
1304
1452
|
});
|
|
1305
1453
|
const layerMap = longestPathLayers(allIds, ledges);
|
|
1454
|
+
enforceSequentialClusterLayers(ast, layerMap, ledges);
|
|
1306
1455
|
let dummyCounter = 0;
|
|
1307
1456
|
const dummies = [];
|
|
1308
1457
|
const { updatedEdges } = insertDummies(ledges, layerMap, () => {
|
|
@@ -2079,14 +2228,8 @@ function renderFlowchart(text2, themeName = "default") {
|
|
|
2079
2228
|
var flowchart = {
|
|
2080
2229
|
type: "flowchart",
|
|
2081
2230
|
detect(text2) {
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
if (t.length === 0) continue;
|
|
2085
|
-
if (t.startsWith("%%")) continue;
|
|
2086
|
-
const first = t.split(/\s+/)[0]?.toLowerCase() ?? "";
|
|
2087
|
-
return first === "flowchart" || first === "graph";
|
|
2088
|
-
}
|
|
2089
|
-
return false;
|
|
2231
|
+
const first = chunk3KRL2EGN_cjs.firstContentLine(text2)?.split(/\s+/)[0]?.toLowerCase() ?? "";
|
|
2232
|
+
return first === "flowchart" || first === "graph";
|
|
2090
2233
|
},
|
|
2091
2234
|
parse: parseFlowchart,
|
|
2092
2235
|
render(text2, config) {
|
|
@@ -2101,5 +2244,5 @@ exports.layoutFlowchart = layoutFlowchart;
|
|
|
2101
2244
|
exports.parseFlowchart = parseFlowchart;
|
|
2102
2245
|
exports.renderFlowchart = renderFlowchart;
|
|
2103
2246
|
exports.renderFlowchartAST = renderFlowchartAST;
|
|
2104
|
-
//# sourceMappingURL=chunk-
|
|
2105
|
-
//# sourceMappingURL=chunk-
|
|
2247
|
+
//# sourceMappingURL=chunk-QTNPMIO2.cjs.map
|
|
2248
|
+
//# sourceMappingURL=chunk-QTNPMIO2.cjs.map
|