@p10node/diagram 0.0.0-stage → 0.9.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/LICENSE +21 -0
- package/README.md +77 -2
- package/dist/index.d.ts +28 -0
- package/dist/index.js +4262 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -4
package/dist/index.js
ADDED
|
@@ -0,0 +1,4262 @@
|
|
|
1
|
+
function e(e, t, n, r) {
|
|
2
|
+
let i = e.length, a = n.length, o = Array.from({ length: i }, () => []), s = Array(i).fill(!0);
|
|
3
|
+
t.forEach((e, t) => {
|
|
4
|
+
e.v !== e.w && (o[e.v].push(t), s[e.w] = !1);
|
|
5
|
+
});
|
|
6
|
+
let c = Array(t.length).fill(!1), l = new Uint8Array(i), u = [...Array.from({ length: i }, (e, t) => t).filter((e) => s[e]), ...Array.from({ length: i }, (e, t) => t)];
|
|
7
|
+
for (let e of u) {
|
|
8
|
+
if (l[e]) continue;
|
|
9
|
+
l[e] = 1;
|
|
10
|
+
let n = [[e, 0]];
|
|
11
|
+
for (; n.length;) {
|
|
12
|
+
let e = n[n.length - 1], r = e[0];
|
|
13
|
+
if (e[1] < o[r].length) {
|
|
14
|
+
let i = o[r][e[1]++], a = t[i].w;
|
|
15
|
+
l[a] === 1 ? c[i] = !0 : l[a] || (l[a] = 1, n.push([a, 0]));
|
|
16
|
+
} else l[r] = 2, n.pop();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
let d = /* @__PURE__ */ new Map();
|
|
20
|
+
r.sameRank?.forEach((e, t) => e.forEach((e) => d.set(e, t)));
|
|
21
|
+
let f = t.map((e, t) => {
|
|
22
|
+
let n = d.has(e.v) && d.get(e.v) === d.get(e.w);
|
|
23
|
+
return c[t] ? {
|
|
24
|
+
v: e.w,
|
|
25
|
+
w: e.v,
|
|
26
|
+
minlen: n ? 0 : e.minlen,
|
|
27
|
+
weight: e.weight
|
|
28
|
+
} : {
|
|
29
|
+
v: e.v,
|
|
30
|
+
w: e.w,
|
|
31
|
+
minlen: n ? 0 : e.minlen,
|
|
32
|
+
weight: e.weight
|
|
33
|
+
};
|
|
34
|
+
}), p = Array.from({ length: i }, () => []), m = Array.from({ length: i }, () => []);
|
|
35
|
+
f.forEach((e, t) => {
|
|
36
|
+
e.v !== e.w && (m[e.v].push(t), p[e.w].push(t));
|
|
37
|
+
});
|
|
38
|
+
let h = [];
|
|
39
|
+
{
|
|
40
|
+
let e = p.map((e) => e.length), t = Array.from({ length: i }, (e, t) => t).filter((t) => !e[t]);
|
|
41
|
+
for (; t.length;) {
|
|
42
|
+
let n = t.shift();
|
|
43
|
+
h.push(n);
|
|
44
|
+
for (let r of m[n]) --e[f[r].w] || t.push(f[r].w);
|
|
45
|
+
}
|
|
46
|
+
if (h.length < i) for (let e = 0; e < i; e++) h.includes(e) || h.push(e);
|
|
47
|
+
}
|
|
48
|
+
let g = Array(i).fill(0), _ = () => {
|
|
49
|
+
for (let e of h) for (let t of m[e]) g[f[t].w] = Math.max(g[f[t].w], g[e] + f[t].minlen);
|
|
50
|
+
};
|
|
51
|
+
_();
|
|
52
|
+
for (let e = 0; e < 60; e++) {
|
|
53
|
+
let t = !1, n = e % 2 ? [...h].reverse() : h;
|
|
54
|
+
for (let e of n) {
|
|
55
|
+
if (d.has(e)) continue;
|
|
56
|
+
let n = -Infinity, r = Infinity, i = 0, a = 0;
|
|
57
|
+
for (let t of p[e]) n = Math.max(n, g[f[t].v] + f[t].minlen), i += f[t].weight;
|
|
58
|
+
for (let t of m[e]) r = Math.min(r, g[f[t].w] - f[t].minlen), a += f[t].weight;
|
|
59
|
+
let o = g[e];
|
|
60
|
+
i > a && n > -Infinity ? o = n : a > i && r < Infinity && (o = r), o !== g[e] && (g[e] = o, t = !0);
|
|
61
|
+
}
|
|
62
|
+
if (!t) break;
|
|
63
|
+
}
|
|
64
|
+
if (r.sameRank?.length) for (let e = 0; e < 12; e++) {
|
|
65
|
+
let e = !1;
|
|
66
|
+
for (let t of r.sameRank) {
|
|
67
|
+
let n = Math.max(...t.map((e) => g[e]));
|
|
68
|
+
for (let r of t) g[r] !== n && (g[r] = n, e = !0);
|
|
69
|
+
}
|
|
70
|
+
if (_(), !e) break;
|
|
71
|
+
}
|
|
72
|
+
let v = g.reduce((e, t) => Math.min(e, t), 0);
|
|
73
|
+
for (let e = 0; e < i; e++) g[e] -= v;
|
|
74
|
+
let y = g.reduce((e, t) => Math.max(e, t), 0), b = (e) => {
|
|
75
|
+
let t = [];
|
|
76
|
+
for (let r = e; r >= 0; r = n[r].parent) t.unshift(r);
|
|
77
|
+
return t;
|
|
78
|
+
}, x = (e, t) => {
|
|
79
|
+
let n = b(e), r = b(t), i = 0;
|
|
80
|
+
for (; i < n.length && i < r.length && n[i] === r[i];) i++;
|
|
81
|
+
return i ? n[i - 1] : -1;
|
|
82
|
+
}, S = e.map((e) => e.w), C = e.map((e) => e.h), w = e.map(() => 0), T = e.map((e) => e.cluster), E = [...g], D = e.map((e) => e.loop ?? 0), O = e.map(() => -1), k = (e, t, n, r, i) => (S.push(e), C.push(t), w.push(n), T.push(r), E.push(i), D.push(0), O.push(n === 2 || n === 3 ? r : -1), S.length - 1), A = [], j = [], ee = (e, t, n) => {
|
|
83
|
+
for (; A.length < S.length;) A.push([]), j.push([]);
|
|
84
|
+
j[e].push([t, n]), A[t].push([e, n]);
|
|
85
|
+
}, te = 6e4;
|
|
86
|
+
for (let e of f) te -= Math.max(0, Math.abs(g[e.w] - g[e.v]) - 1);
|
|
87
|
+
if (te < 0) throw Error("The diagram is too large to draw");
|
|
88
|
+
let M = [], ne = [];
|
|
89
|
+
f.forEach((e, n) => {
|
|
90
|
+
if (e.v === e.w) {
|
|
91
|
+
M.push(null), ne.push(-1);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
let r = [e.v], i = g[e.w] - g[e.v], a = t[n].label, o = a && i >= 2 ? g[e.v] + Math.floor(i / 2) : -1, s = x(T[e.v], T[e.w]), c = -1;
|
|
95
|
+
for (let t = g[e.v] + 1; t < g[e.w]; t++) {
|
|
96
|
+
let e = t === o ? k(a.w, a.h, 1, s, t) : k(0, 0, 1, s, t);
|
|
97
|
+
t === o && (c = e), r.push(e);
|
|
98
|
+
}
|
|
99
|
+
r.push(e.w), M.push(i > 0 ? r : null), ne.push(c);
|
|
100
|
+
for (let t = 0; t + 1 < r.length && !(i <= 0); t++) {
|
|
101
|
+
let n = r[t], i = r[t + 1], a = +(w[n] === 1) + +(w[i] === 1);
|
|
102
|
+
ee(n, i, e.weight * (a === 2 ? 8 : a === 1 ? 2 : 1));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
let re = f.map((e, t) => e.v !== e.w && g[e.v] === g[e.w] && !M[t]), N = Array(a).fill(Infinity), P = Array(a).fill(-Infinity);
|
|
106
|
+
for (let e = 0; e < S.length; e++) for (let t of b(T[e])) N[t] = Math.min(N[t], E[e]), P[t] = Math.max(P[t], E[e]);
|
|
107
|
+
let F = Array.from({ length: a }, () => []), ie = Array.from({ length: a }, () => []), ae = [];
|
|
108
|
+
for (let e = 0; e < a; e++) if (!(N[e] > P[e])) for (let t = N[e]; t <= P[e]; t++) F[e][t] = k(0, 0, 2, e, t), ie[e][t] = k(0, 0, 3, e, t);
|
|
109
|
+
for (; A.length < S.length;) A.push([]), j.push([]);
|
|
110
|
+
for (let e = 0; e < S.length; e++) ae.push([]);
|
|
111
|
+
for (let e = 0; e < a; e++) for (let t = N[e]; t < P[e]; t++) ae[F[e][t]].push([F[e][t + 1], 1]), ae[F[e][t + 1]].push([F[e][t], 1]), ae[ie[e][t]].push([ie[e][t + 1], 1]), ae[ie[e][t + 1]].push([ie[e][t], 1]);
|
|
112
|
+
let I = S.length;
|
|
113
|
+
y = E.reduce((e, t) => Math.max(e, t), y);
|
|
114
|
+
let L = Array.from({ length: y + 1 }, () => []);
|
|
115
|
+
{
|
|
116
|
+
let e = new Uint8Array(I), t = Array.from({ length: I }, (e, t) => t).filter((e) => w[e] !== 2 && w[e] !== 3).sort((e, t) => E[e] - E[t] || e - t);
|
|
117
|
+
for (let n of t) {
|
|
118
|
+
if (e[n]) continue;
|
|
119
|
+
let t = [n];
|
|
120
|
+
for (; t.length;) {
|
|
121
|
+
let n = t.pop();
|
|
122
|
+
if (!e[n]) {
|
|
123
|
+
e[n] = 1, L[E[n]].push(n);
|
|
124
|
+
for (let r = j[n].length - 1; r >= 0; r--) e[j[n][r][0]] || t.push(j[n][r][0]);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (let e = 0; e < I; e++) (w[e] === 2 || w[e] === 3) && L[E[e]].push(e);
|
|
129
|
+
}
|
|
130
|
+
let R = new Float64Array(I), oe = () => L.forEach((e) => e.forEach((e, t) => R[e] = t));
|
|
131
|
+
oe();
|
|
132
|
+
let z = new Float64Array(I), B = new Float64Array(a), V = () => {
|
|
133
|
+
for (let e = 0; e < a; e++) {
|
|
134
|
+
if (N[e] > P[e]) continue;
|
|
135
|
+
let t = 0;
|
|
136
|
+
for (let n = N[e]; n <= P[e]; n++) t += R[F[e][n]] / Math.max(1, L[n].length);
|
|
137
|
+
B[e] = t / (P[e] - N[e] + 1);
|
|
138
|
+
}
|
|
139
|
+
}, se = (e, t) => {
|
|
140
|
+
if (!a) return [...e].sort((e, t) => z[e] - z[t] || R[e] - R[t]);
|
|
141
|
+
let r = {
|
|
142
|
+
node: -1,
|
|
143
|
+
cluster: -1,
|
|
144
|
+
key: 0,
|
|
145
|
+
idx: 0,
|
|
146
|
+
items: []
|
|
147
|
+
}, i = /* @__PURE__ */ new Map(), o = (e) => {
|
|
148
|
+
if (e < 0) return r;
|
|
149
|
+
let a = i.get(e);
|
|
150
|
+
return a || (a = {
|
|
151
|
+
node: -1,
|
|
152
|
+
cluster: e,
|
|
153
|
+
key: 0,
|
|
154
|
+
idx: R[F[e][t]] ?? 0,
|
|
155
|
+
items: []
|
|
156
|
+
}, i.set(e, a), o(n[e].parent).items.push(a)), a;
|
|
157
|
+
};
|
|
158
|
+
for (let t of e) w[t] === 2 ? o(O[t]) : w[t] !== 3 && o(T[t]).items.push({
|
|
159
|
+
node: t,
|
|
160
|
+
cluster: -1,
|
|
161
|
+
key: z[t],
|
|
162
|
+
idx: R[t],
|
|
163
|
+
items: []
|
|
164
|
+
});
|
|
165
|
+
let s = (e) => {
|
|
166
|
+
let n = 0, r = 0;
|
|
167
|
+
for (let t of e.items) if (t.node >= 0) n += t.key, r++;
|
|
168
|
+
else {
|
|
169
|
+
let [e, i] = s(t);
|
|
170
|
+
n += e, r += i;
|
|
171
|
+
}
|
|
172
|
+
e.cluster >= 0 && (e.key = r ? n / r : z[F[e.cluster][t]]), e.items.sort((e, t) => e.key - t.key || e.idx - t.idx);
|
|
173
|
+
let i = e.items.map((e, t) => e.cluster >= 0 ? t : -1).filter((e) => e >= 0), a = i.map((t) => e.items[t]).sort((e, t) => B[e.cluster] - B[t.cluster]);
|
|
174
|
+
return i.forEach((t, n) => e.items[t] = a[n]), [n, r];
|
|
175
|
+
};
|
|
176
|
+
s(r);
|
|
177
|
+
let c = [], l = (e) => {
|
|
178
|
+
for (let n of e.items) n.node >= 0 ? c.push(n.node) : (c.push(F[n.cluster][t]), l(n), c.push(ie[n.cluster][t]));
|
|
179
|
+
};
|
|
180
|
+
return l(r), c;
|
|
181
|
+
}, H = (e) => {
|
|
182
|
+
let t = 0;
|
|
183
|
+
for (let n = 0; n + 1 < e.length; n++) {
|
|
184
|
+
let r = [];
|
|
185
|
+
for (let t of e[n]) for (let [e] of j[t]) r.push([R[t], R[e]]);
|
|
186
|
+
r.sort((e, t) => e[0] - t[0] || e[1] - t[1]);
|
|
187
|
+
let i = e[n + 1].length + 1, a = new Float64Array(i + 1);
|
|
188
|
+
for (let e = 0; e < r.length; e++) {
|
|
189
|
+
let n = 0;
|
|
190
|
+
for (let t = r[e][1] + 1; t > 0; t -= t & -t) n += a[t];
|
|
191
|
+
t += e - n;
|
|
192
|
+
for (let t = r[e][1] + 1; t <= i; t += t & -t) a[t]++;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return t;
|
|
196
|
+
}, ce = (e, t) => {
|
|
197
|
+
let n = 0, r = 0;
|
|
198
|
+
for (let [i, a] of t[e]) n += R[i] * a, r += a;
|
|
199
|
+
return r ? n / r : R[e];
|
|
200
|
+
};
|
|
201
|
+
for (let e of L) for (let t of e) z[t] = R[t];
|
|
202
|
+
V(), L = L.map((e, t) => se(e, t)), oe();
|
|
203
|
+
let le = L.map((e) => [...e]), ue = H(L);
|
|
204
|
+
for (let e = 0; e < 24 && ue > 0; e++) {
|
|
205
|
+
V();
|
|
206
|
+
let t = e % 2 == 0;
|
|
207
|
+
for (let e = 1; e <= y; e++) {
|
|
208
|
+
let n = t ? e : y - e, r = t ? A : j;
|
|
209
|
+
for (let e of L[n]) z[e] = ce(e, r);
|
|
210
|
+
L[n] = se(L[n], n), L[n].forEach((e, t) => R[e] = t);
|
|
211
|
+
}
|
|
212
|
+
let n = H(L);
|
|
213
|
+
n < ue && (ue = n, le = L.map((e) => [...e]));
|
|
214
|
+
}
|
|
215
|
+
L = le, oe();
|
|
216
|
+
let de = L.map((e) => e.reduce((e, t) => Math.max(e, C[t]), 0)), fe = Array.from({ length: a }, () => []);
|
|
217
|
+
n.forEach((e, t) => e.parent >= 0 && fe[e.parent].push(t));
|
|
218
|
+
let U = (e) => n[e].pad[2] + Math.max(0, ...fe[e].filter((t) => N[t] === N[e]).map(U)), W = (e) => n[e].pad[3] + Math.max(0, ...fe[e].filter((t) => P[t] === P[e]).map(W)), pe = Array(y + 1).fill(0), me = Array(y + 1).fill(0);
|
|
219
|
+
for (let e = 0; e < a; e++) N[e] > P[e] || (pe[N[e]] = Math.max(pe[N[e]], U(e)), me[P[e]] = Math.max(me[P[e]], W(e)));
|
|
220
|
+
let G = [];
|
|
221
|
+
for (let e = 0; e <= y; e++) G[e] = e === 0 ? de[0] / 2 + pe[0] : G[e - 1] + de[e - 1] / 2 + me[e - 1] + r.ranksep + pe[e] + de[e] / 2;
|
|
222
|
+
let K = G[y] + de[y] / 2 + me[y], q = (e) => w[e] === 2 || w[e] === 3 ? 0 : S[e] / 2, he = (e, t) => {
|
|
223
|
+
let i = D[e], a = w[e], o = w[t];
|
|
224
|
+
return a === 2 && (i += n[O[e]].pad[0]), a === 3 && (i += r.nodesep / 2), o === 3 && (i += n[O[t]].pad[1]), o === 2 && (i += r.nodesep / 2), a < 2 && o < 2 && (i += a === 1 && o === 1 ? r.edgesep : a === 1 || o === 1 ? (r.nodesep + r.edgesep) / 2 : r.nodesep), q(e) + q(t) + i;
|
|
225
|
+
}, J = new Float64Array(I);
|
|
226
|
+
for (let e of L) for (let t = 1; t < e.length; t++) J[e[t]] = J[e[t - 1]] + he(e[t - 1], e[t]);
|
|
227
|
+
let ge = (e, t, n) => {
|
|
228
|
+
let r = e.length, i = [0];
|
|
229
|
+
for (let t = 1; t < r; t++) i[t] = i[t - 1] + he(e[t - 1], e[t]);
|
|
230
|
+
let a = [];
|
|
231
|
+
for (let e = 0; e < r; e++) for (a.push({
|
|
232
|
+
s: e,
|
|
233
|
+
e,
|
|
234
|
+
w: n[e],
|
|
235
|
+
wt: n[e] * (t[e] - i[e])
|
|
236
|
+
}); a.length > 1;) {
|
|
237
|
+
let e = a[a.length - 2], t = a[a.length - 1];
|
|
238
|
+
if (e.wt / e.w < t.wt / t.w) break;
|
|
239
|
+
e.e = t.e, e.w += t.w, e.wt += t.wt, a.pop();
|
|
240
|
+
}
|
|
241
|
+
for (let t of a) for (let n = t.s; n <= t.e; n++) J[e[n]] = t.wt / t.w + i[n];
|
|
242
|
+
};
|
|
243
|
+
for (let e = 0; e < 10; e++) {
|
|
244
|
+
let t = e >= 8, n = e % 2 == 0;
|
|
245
|
+
for (let e = 0; e <= y; e++) {
|
|
246
|
+
let r = n ? e : y - e, i = L[r];
|
|
247
|
+
if (!i.length) continue;
|
|
248
|
+
let a = [], o = [];
|
|
249
|
+
for (let e of i) {
|
|
250
|
+
let r = 0, i = 0, s = (e) => {
|
|
251
|
+
for (let [t, n] of e) r += J[t] * n, i += n;
|
|
252
|
+
};
|
|
253
|
+
(t || n) && s(A[e]), (t || !n) && s(j[e]), s(ae[e]), a.push(i ? r / i : J[e]), o.push(i || .01);
|
|
254
|
+
}
|
|
255
|
+
ge(i, a, o);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
let _e = I, ve = (e) => w[e] === 2 ? _e + 2 * O[e] : w[e] === 3 ? _e + 2 * O[e] + 1 : e;
|
|
259
|
+
if (a) {
|
|
260
|
+
let e = I + 2 * a, t = new Float64Array(e);
|
|
261
|
+
for (let e = 0; e < I; e++) t[e] = J[e];
|
|
262
|
+
for (let e = 0; e < a; e++) t[_e + 2 * e] = Infinity, t[_e + 2 * e + 1] = -Infinity;
|
|
263
|
+
for (let e = 0; e < I; e++) w[e] === 2 && (t[ve(e)] = Math.min(t[ve(e)], J[e])), w[e] === 3 && (t[ve(e)] = Math.max(t[ve(e)], J[e]));
|
|
264
|
+
let r = Array.from({ length: e }, () => []), i = new Int32Array(e), o = (e, t, n) => {
|
|
265
|
+
r[e].push([t, n]), i[t]++;
|
|
266
|
+
};
|
|
267
|
+
for (let e of L) for (let t = 1; t < e.length; t++) o(ve(e[t - 1]), ve(e[t]), he(e[t - 1], e[t]));
|
|
268
|
+
for (let e = 0; e < a; e++) N[e] <= P[e] && o(_e + 2 * e, _e + 2 * e + 1, Math.max(n[e].minW, n[e].pad[0] + n[e].pad[1]));
|
|
269
|
+
let s = [];
|
|
270
|
+
for (let t = 0; t < e; t++) i[t] || s.push(t);
|
|
271
|
+
let c = 0, l = new Float64Array(t);
|
|
272
|
+
for (; s.length;) {
|
|
273
|
+
let e = s.pop();
|
|
274
|
+
c++;
|
|
275
|
+
for (let [t, n] of r[e]) Number.isFinite(l[e]) && (l[t] = Math.max(l[t], l[e] + n)), --i[t] || s.push(t);
|
|
276
|
+
}
|
|
277
|
+
if (c === e) for (let e = 0; e < I; e++) J[e] = l[ve(e)];
|
|
278
|
+
}
|
|
279
|
+
let Y = Infinity, ye = -Infinity;
|
|
280
|
+
for (let e = 0; e < I; e++) Y = Math.min(Y, J[e] - q(e)), ye = Math.max(ye, J[e] + q(e) + D[e]);
|
|
281
|
+
Number.isFinite(Y) || (Y = ye = 0);
|
|
282
|
+
for (let e = 0; e < I; e++) J[e] -= Y;
|
|
283
|
+
let X = (e) => ({
|
|
284
|
+
x: J[e],
|
|
285
|
+
y: G[E[e]]
|
|
286
|
+
}), Z = /* @__PURE__ */ new Map();
|
|
287
|
+
{
|
|
288
|
+
let t = /* @__PURE__ */ new Map(), n = (e, n, r) => {
|
|
289
|
+
let i = t.get(e);
|
|
290
|
+
i || t.set(e, i = []), i.push({
|
|
291
|
+
i: n,
|
|
292
|
+
nx: r
|
|
293
|
+
});
|
|
294
|
+
};
|
|
295
|
+
f.forEach((t, r) => {
|
|
296
|
+
let i = M[r];
|
|
297
|
+
i && !re[r] && (e[i[0]]?.spread && n(`${i[0]}:b`, r, J[i[1]]), e[i[i.length - 1]]?.spread && n(`${i[i.length - 1]}:t`, r, J[i[i.length - 2]]));
|
|
298
|
+
});
|
|
299
|
+
for (let [e, n] of t) {
|
|
300
|
+
if (n.length < 2) continue;
|
|
301
|
+
let t = Number(e.split(":")[0]);
|
|
302
|
+
n.sort((e, t) => e.nx - t.nx || e.i - t.i);
|
|
303
|
+
let r = Math.min(36, S[t] * .7 / (n.length - 1));
|
|
304
|
+
n.forEach((i, a) => Z.set(`${e}:${i.i}`, J[t] + (a - (n.length - 1) / 2) * r));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
let be = f.map((e, n) => {
|
|
308
|
+
if (e.v === e.w) return null;
|
|
309
|
+
if (re[n]) {
|
|
310
|
+
let r = X(e.v), i = X(e.w), a = Math.sign(i.x - r.x) || 1, o = {
|
|
311
|
+
x: r.x + a * S[e.v] / 2,
|
|
312
|
+
y: r.y
|
|
313
|
+
}, s = {
|
|
314
|
+
x: i.x - a * S[e.w] / 2,
|
|
315
|
+
y: i.y
|
|
316
|
+
}, [l, u] = c[n] ? [s, o] : [o, s];
|
|
317
|
+
return {
|
|
318
|
+
start: l,
|
|
319
|
+
segs: [{
|
|
320
|
+
c: "L",
|
|
321
|
+
p: [u]
|
|
322
|
+
}],
|
|
323
|
+
label: t[n].label ? {
|
|
324
|
+
x: (l.x + u.x) / 2,
|
|
325
|
+
y: l.y - 10
|
|
326
|
+
} : void 0
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
let r = M[n];
|
|
330
|
+
if (!r) return null;
|
|
331
|
+
let i = [], a = [], o = X(r[0]);
|
|
332
|
+
i.push({
|
|
333
|
+
x: Z.get(`${r[0]}:b:${n}`) ?? o.x,
|
|
334
|
+
y: o.y + C[r[0]] / 2
|
|
335
|
+
});
|
|
336
|
+
for (let e = 1; e + 1 < r.length; e++) {
|
|
337
|
+
let t = X(r[e]), n = de[E[r[e]]] / 2;
|
|
338
|
+
n > .5 ? (i.push({
|
|
339
|
+
x: t.x,
|
|
340
|
+
y: t.y - n
|
|
341
|
+
}, {
|
|
342
|
+
x: t.x,
|
|
343
|
+
y: t.y + n
|
|
344
|
+
}), a.push(!1, !0)) : (i.push(t), a.push(!1));
|
|
345
|
+
}
|
|
346
|
+
let s = X(r[r.length - 1]);
|
|
347
|
+
i.push({
|
|
348
|
+
x: Z.get(`${r[r.length - 1]}:t:${n}`) ?? s.x,
|
|
349
|
+
y: s.y - C[r[r.length - 1]] / 2
|
|
350
|
+
}), a.push(!1), c[n] && (i.reverse(), a.reverse());
|
|
351
|
+
let l = [];
|
|
352
|
+
for (let e = 1; e < i.length; e++) {
|
|
353
|
+
let t = i[e - 1], n = i[e];
|
|
354
|
+
if (a[e - 1] || Math.abs(t.x - n.x) < .5) l.push({
|
|
355
|
+
c: "L",
|
|
356
|
+
p: [n]
|
|
357
|
+
});
|
|
358
|
+
else {
|
|
359
|
+
let e = (t.y + n.y) / 2;
|
|
360
|
+
l.push({
|
|
361
|
+
c: "C",
|
|
362
|
+
p: [
|
|
363
|
+
{
|
|
364
|
+
x: t.x,
|
|
365
|
+
y: e
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
x: n.x,
|
|
369
|
+
y: e
|
|
370
|
+
},
|
|
371
|
+
n
|
|
372
|
+
]
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
start: i[0],
|
|
378
|
+
segs: l,
|
|
379
|
+
label: ne[n] >= 0 ? X(ne[n]) : void 0
|
|
380
|
+
};
|
|
381
|
+
}), xe = n.map((e, t) => {
|
|
382
|
+
if (N[t] > P[t]) return null;
|
|
383
|
+
let n = Infinity, r = -Infinity;
|
|
384
|
+
for (let e = N[t]; e <= P[t]; e++) n = Math.min(n, J[F[t][e]]), r = Math.max(r, J[ie[t][e]]);
|
|
385
|
+
let i = G[N[t]] - de[N[t]] / 2 - U(t), a = G[P[t]] + de[P[t]] / 2 + W(t);
|
|
386
|
+
return {
|
|
387
|
+
x: n,
|
|
388
|
+
y: i,
|
|
389
|
+
w: r - n,
|
|
390
|
+
h: a - i
|
|
391
|
+
};
|
|
392
|
+
});
|
|
393
|
+
return {
|
|
394
|
+
nodes: Array.from({ length: i }, (e, t) => X(t)),
|
|
395
|
+
edges: be,
|
|
396
|
+
clusters: xe,
|
|
397
|
+
w: ye - Y,
|
|
398
|
+
h: K
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
// src/core/diagram/svg.ts
|
|
402
|
+
var t = [
|
|
403
|
+
278,
|
|
404
|
+
278,
|
|
405
|
+
355,
|
|
406
|
+
556,
|
|
407
|
+
556,
|
|
408
|
+
889,
|
|
409
|
+
667,
|
|
410
|
+
191,
|
|
411
|
+
333,
|
|
412
|
+
333,
|
|
413
|
+
389,
|
|
414
|
+
584,
|
|
415
|
+
278,
|
|
416
|
+
333,
|
|
417
|
+
278,
|
|
418
|
+
278,
|
|
419
|
+
556,
|
|
420
|
+
556,
|
|
421
|
+
556,
|
|
422
|
+
556,
|
|
423
|
+
556,
|
|
424
|
+
556,
|
|
425
|
+
556,
|
|
426
|
+
556,
|
|
427
|
+
556,
|
|
428
|
+
556,
|
|
429
|
+
278,
|
|
430
|
+
278,
|
|
431
|
+
584,
|
|
432
|
+
584,
|
|
433
|
+
584,
|
|
434
|
+
556,
|
|
435
|
+
1015,
|
|
436
|
+
667,
|
|
437
|
+
667,
|
|
438
|
+
722,
|
|
439
|
+
722,
|
|
440
|
+
667,
|
|
441
|
+
611,
|
|
442
|
+
778,
|
|
443
|
+
722,
|
|
444
|
+
278,
|
|
445
|
+
500,
|
|
446
|
+
667,
|
|
447
|
+
556,
|
|
448
|
+
833,
|
|
449
|
+
722,
|
|
450
|
+
778,
|
|
451
|
+
667,
|
|
452
|
+
778,
|
|
453
|
+
722,
|
|
454
|
+
667,
|
|
455
|
+
611,
|
|
456
|
+
722,
|
|
457
|
+
667,
|
|
458
|
+
944,
|
|
459
|
+
667,
|
|
460
|
+
667,
|
|
461
|
+
611,
|
|
462
|
+
278,
|
|
463
|
+
278,
|
|
464
|
+
278,
|
|
465
|
+
469,
|
|
466
|
+
556,
|
|
467
|
+
333,
|
|
468
|
+
556,
|
|
469
|
+
556,
|
|
470
|
+
500,
|
|
471
|
+
556,
|
|
472
|
+
556,
|
|
473
|
+
278,
|
|
474
|
+
556,
|
|
475
|
+
556,
|
|
476
|
+
222,
|
|
477
|
+
222,
|
|
478
|
+
500,
|
|
479
|
+
222,
|
|
480
|
+
833,
|
|
481
|
+
556,
|
|
482
|
+
556,
|
|
483
|
+
556,
|
|
484
|
+
556,
|
|
485
|
+
333,
|
|
486
|
+
500,
|
|
487
|
+
278,
|
|
488
|
+
556,
|
|
489
|
+
500,
|
|
490
|
+
722,
|
|
491
|
+
500,
|
|
492
|
+
500,
|
|
493
|
+
500,
|
|
494
|
+
334,
|
|
495
|
+
260,
|
|
496
|
+
334,
|
|
497
|
+
584
|
|
498
|
+
];
|
|
499
|
+
function n(e) {
|
|
500
|
+
return e >= 32 && e <= 126 ? t[e - 32] : e >= 768 && e <= 879 || e >= 8203 && e <= 8207 || e === 65039 ? 0 : e >= 4352 && e <= 4447 || e >= 11904 && e <= 42191 || e >= 44032 && e <= 55203 || e >= 63744 && e <= 64255 || e >= 65072 && e <= 65103 || e >= 65280 && e <= 65376 || e >= 126976 ? 1e3 : 580;
|
|
501
|
+
}
|
|
502
|
+
function r(e, t = 14, r = !1, i = !1) {
|
|
503
|
+
let a = 0;
|
|
504
|
+
if (i) for (let t of e) a += n(t.codePointAt(0)) ? 600 : 0;
|
|
505
|
+
else for (let t of e) a += n(t.codePointAt(0));
|
|
506
|
+
return a * t * (r ? 1.08 : 1) / 1e3;
|
|
507
|
+
}
|
|
508
|
+
var i = (e) => Math.round(e * 1.3);
|
|
509
|
+
function a(e, t = 14, n = !1) {
|
|
510
|
+
let a = 0;
|
|
511
|
+
for (let i of e) a = Math.max(a, r(i, t, n));
|
|
512
|
+
return {
|
|
513
|
+
w: a,
|
|
514
|
+
h: e.length * i(t)
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
function o(e, t, n = 14, i = !1) {
|
|
518
|
+
let a = [];
|
|
519
|
+
for (let o of e) {
|
|
520
|
+
if (r(o, n, i) <= t) {
|
|
521
|
+
a.push(o);
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
let e = "";
|
|
525
|
+
for (let s of o.split(/ +/)) {
|
|
526
|
+
let o = e ? e + " " + s : s;
|
|
527
|
+
e && r(o, n, i) > t ? (a.push(e), e = s) : e = o;
|
|
528
|
+
}
|
|
529
|
+
a.push(e);
|
|
530
|
+
}
|
|
531
|
+
return a;
|
|
532
|
+
}
|
|
533
|
+
var s = (e) => e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """), c = /^[a-z]{3,24}$/;
|
|
534
|
+
function l(e) {
|
|
535
|
+
if (!e) return;
|
|
536
|
+
let t = e.trim().toLowerCase();
|
|
537
|
+
if (/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(t)) return t;
|
|
538
|
+
if (/^[0-9a-f]{6}$/.test(t)) return "#" + t;
|
|
539
|
+
if (/^rgba?\(\s*[\d.]+%?\s*,\s*[\d.]+%?\s*,\s*[\d.]+%?\s*(,\s*[\d.]+%?\s*)?\)$/.test(t) || /^rgba?\(\s*[\d.]+%?\s+[\d.]+%?\s+[\d.]+%?\s*(\/\s*[\d.]+%?\s*)?\)$/.test(t)) return t;
|
|
540
|
+
if (c.test(t)) return t === "transparent" ? "none" : t;
|
|
541
|
+
}
|
|
542
|
+
var u = {
|
|
543
|
+
ink: "#1f2937",
|
|
544
|
+
line: "#4b5563",
|
|
545
|
+
fill: "#eef2fb",
|
|
546
|
+
stroke: "#5b6f9a",
|
|
547
|
+
muted: "#6b7280",
|
|
548
|
+
cluster: "#f7f8fb",
|
|
549
|
+
clusterStroke: "#a3adc2",
|
|
550
|
+
note: "#fff6c8",
|
|
551
|
+
noteStroke: "#c9a227",
|
|
552
|
+
label: "#ffffff",
|
|
553
|
+
dark: "#2d3748",
|
|
554
|
+
series: [
|
|
555
|
+
"#5b8def",
|
|
556
|
+
"#f2994a",
|
|
557
|
+
"#3fb68b",
|
|
558
|
+
"#e5596b",
|
|
559
|
+
"#9b6be0",
|
|
560
|
+
"#d4b33a",
|
|
561
|
+
"#3bb3c9",
|
|
562
|
+
"#e07bb8",
|
|
563
|
+
"#8c9aaf",
|
|
564
|
+
"#7cbd4a"
|
|
565
|
+
]
|
|
566
|
+
}, d = (e) => Number.isFinite(e) ? Math.round(e * 100) / 100 : 0;
|
|
567
|
+
function f(e) {
|
|
568
|
+
let t = ` fill="${e.fill ?? "none"}"`;
|
|
569
|
+
return e.stroke && (t += ` stroke="${e.stroke}" stroke-width="${d(e.sw ?? 1)}"`), e.stroke && e.dash && (t += ` stroke-dasharray="${e.dash}"`), e.opacity !== void 0 && (t += ` opacity="${d(e.opacity)}"`), t;
|
|
570
|
+
}
|
|
571
|
+
var p = class {
|
|
572
|
+
out = [];
|
|
573
|
+
rect(e, t, n, r, i, a = 0) {
|
|
574
|
+
return this.out.push(`<rect x="${d(e)}" y="${d(t)}" width="${d(n)}" height="${d(r)}"${a ? ` rx="${d(a)}"` : ""}${f(i)}/>`), this;
|
|
575
|
+
}
|
|
576
|
+
circle(e, t, n, r) {
|
|
577
|
+
return this.out.push(`<circle cx="${d(e)}" cy="${d(t)}" r="${d(n)}"${f(r)}/>`), this;
|
|
578
|
+
}
|
|
579
|
+
ellipse(e, t, n, r, i) {
|
|
580
|
+
return this.out.push(`<ellipse cx="${d(e)}" cy="${d(t)}" rx="${d(n)}" ry="${d(r)}"${f(i)}/>`), this;
|
|
581
|
+
}
|
|
582
|
+
line(e, t, n, r, i) {
|
|
583
|
+
return this.out.push(`<line x1="${d(e)}" y1="${d(t)}" x2="${d(n)}" y2="${d(r)}"${f(i)}/>`), this;
|
|
584
|
+
}
|
|
585
|
+
poly(e, t, n = !0) {
|
|
586
|
+
let r = e.map(([e, t]) => `${d(e)},${d(t)}`).join(" ");
|
|
587
|
+
return this.out.push(`<${n ? "polygon" : "polyline"} points="${r}"${f(t)}/>`), this;
|
|
588
|
+
}
|
|
589
|
+
path(e, t) {
|
|
590
|
+
return this.out.push(`<path d="${e}"${f(t)}/>`), this;
|
|
591
|
+
}
|
|
592
|
+
text(e, t, n, r = {}) {
|
|
593
|
+
let a = typeof n == "string" ? [n] : n, o = r.size ?? 14, c = i(o), l = t - a.length * c / 2, f = ` font-family="${s(r.mono ? "Menlo, Consolas, \"Courier New\", monospace" : "Helvetica, Arial, sans-serif")}" font-size="${o}" fill="${r.color ?? u.ink}"`;
|
|
594
|
+
return r.anchor && r.anchor !== "start" && (f += ` text-anchor="${r.anchor}"`), r.bold && (f += " font-weight=\"bold\""), r.italic && (f += " font-style=\"italic\""), r.underline && (f += " text-decoration=\"underline\""), a.forEach((t, n) => {
|
|
595
|
+
t && this.out.push(`<text x="${d(e)}" y="${d(l + n * c + c / 2 + o * .35)}"${f}>${s(t)}</text>`);
|
|
596
|
+
}), this;
|
|
597
|
+
}
|
|
598
|
+
raw(e) {
|
|
599
|
+
return this.out.push(e), this;
|
|
600
|
+
}
|
|
601
|
+
body() {
|
|
602
|
+
return this.out.join("");
|
|
603
|
+
}
|
|
604
|
+
toString(e, t, n = "#ffffff") {
|
|
605
|
+
let r = Math.ceil(e), i = Math.ceil(t);
|
|
606
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${i}" viewBox="0 0 ${r} ${i}">` + (n ? `<rect x="0" y="0" width="${r}" height="${i}" fill="${n}"/>` : "") + this.out.join("") + "</svg>";
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
function m(e) {
|
|
610
|
+
return e.map((e) => e.c + e.p.map((e) => `${d(e.x)} ${d(e.y)}`).join(" ")).join(" ");
|
|
611
|
+
}
|
|
612
|
+
function h(e) {
|
|
613
|
+
return e.replace(/<br\s*\/?>/gi, "\n").replace(/\\n/g, "\n").replace(/<\/?[a-z][^>]*>/gi, "").replace(/#(\d+);/g, (e, t) => String.fromCodePoint(Math.min(Number(t), 1114111))).replace(/#([a-z]+);/gi, (e, t) => ({
|
|
614
|
+
quot: "\"",
|
|
615
|
+
amp: "&",
|
|
616
|
+
lt: "<",
|
|
617
|
+
gt: ">",
|
|
618
|
+
nbsp: " ",
|
|
619
|
+
apos: "'"
|
|
620
|
+
})[t.toLowerCase()] ?? e).replace(/&(quot|amp|lt|gt|nbsp|apos|#\d+);/g, (e, t) => t[0] === "#" ? String.fromCodePoint(Math.min(Number(t.slice(1)), 1114111)) : {
|
|
621
|
+
quot: "\"",
|
|
622
|
+
amp: "&",
|
|
623
|
+
lt: "<",
|
|
624
|
+
gt: ">",
|
|
625
|
+
nbsp: " ",
|
|
626
|
+
apos: "'"
|
|
627
|
+
}[t] ?? e);
|
|
628
|
+
}
|
|
629
|
+
var g = (e) => e.replace(/\*\*(.+?)\*\*|__(.+?)__/g, "$1$2").replace(/(^|\W)[*_](\S.*?\S|\S)[*_](?=\W|$)/g, "$1$2"), _ = class extends Error {}, v = class {
|
|
630
|
+
defShape;
|
|
631
|
+
g;
|
|
632
|
+
byId = /* @__PURE__ */ new Map();
|
|
633
|
+
clusterIds = /* @__PURE__ */ new Map();
|
|
634
|
+
constructor(e = "TB", t = "rect") {
|
|
635
|
+
this.defShape = t, this.g = {
|
|
636
|
+
dir: e,
|
|
637
|
+
nodes: [],
|
|
638
|
+
edges: [],
|
|
639
|
+
clusters: []
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
has(e) {
|
|
643
|
+
return this.byId.has(e);
|
|
644
|
+
}
|
|
645
|
+
get(e) {
|
|
646
|
+
return this.byId.get(e);
|
|
647
|
+
}
|
|
648
|
+
node(e, t = {}, n) {
|
|
649
|
+
let r = this.byId.get(e);
|
|
650
|
+
r || (r = {
|
|
651
|
+
id: e,
|
|
652
|
+
label: e,
|
|
653
|
+
shape: this.defShape,
|
|
654
|
+
cluster: n
|
|
655
|
+
}, this.byId.set(e, r), this.g.nodes.push(r));
|
|
656
|
+
for (let [e, n] of Object.entries(t)) n !== void 0 && (r[e] = n);
|
|
657
|
+
return r;
|
|
658
|
+
}
|
|
659
|
+
edge(e, t) {
|
|
660
|
+
return this.clusterIds.has(e.from) || this.node(e.from, {}, t), this.clusterIds.has(e.to) || this.node(e.to, {}, t), this.g.edges.push(e), e;
|
|
661
|
+
}
|
|
662
|
+
cluster(e, t, n) {
|
|
663
|
+
let r = this.clusterIds.get(e);
|
|
664
|
+
r ? t && (r.label = t) : (r = {
|
|
665
|
+
id: e,
|
|
666
|
+
label: t,
|
|
667
|
+
parent: n
|
|
668
|
+
}, this.clusterIds.set(e, r), this.g.clusters.push(r));
|
|
669
|
+
let i = this.byId.get(e);
|
|
670
|
+
return i && (this.byId.delete(e), this.g.nodes.splice(this.g.nodes.indexOf(i), 1)), r;
|
|
671
|
+
}
|
|
672
|
+
isCluster(e) {
|
|
673
|
+
return this.clusterIds.has(e);
|
|
674
|
+
}
|
|
675
|
+
}, y = 14, b = 13, x = 14, S = 9, C = i(y), w = (e) => e.split("\n"), T = (e) => Math.round(e * 100) / 100;
|
|
676
|
+
function E(e) {
|
|
677
|
+
let t = [];
|
|
678
|
+
for (let n of e.rows) n.forEach((n, i) => t[i] = Math.max(t[i] ?? 0, r(n, b, e.bold)));
|
|
679
|
+
return {
|
|
680
|
+
w: t.reduce((e, t) => e + t, 0) + Math.max(0, t.length - 1) * 12,
|
|
681
|
+
h: e.rows.length ? e.rows.length * i(b) + 10 : 8,
|
|
682
|
+
cols: t
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
function D(e, t) {
|
|
686
|
+
let n = e.shape === "none" || e.label === "" ? w(e.label) : o(w(e.label), 260, y, e.style?.bold), r = e.label === "" ? {
|
|
687
|
+
w: 0,
|
|
688
|
+
h: 0
|
|
689
|
+
} : a(n, y, e.style?.bold), i = t === "TB" || t === "BT";
|
|
690
|
+
if (e.sections?.length) {
|
|
691
|
+
let t = e.sections.map(E);
|
|
692
|
+
return {
|
|
693
|
+
w: Math.max(90, ...t.map((e) => e.w + 28)),
|
|
694
|
+
h: t.reduce((e, t) => e + t.h, 0),
|
|
695
|
+
text: n
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
let s = r.w + 28, c = r.h + 18;
|
|
699
|
+
switch (e.shape) {
|
|
700
|
+
case "start": return {
|
|
701
|
+
w: 20,
|
|
702
|
+
h: 20,
|
|
703
|
+
text: []
|
|
704
|
+
};
|
|
705
|
+
case "end": return {
|
|
706
|
+
w: 22,
|
|
707
|
+
h: 22,
|
|
708
|
+
text: []
|
|
709
|
+
};
|
|
710
|
+
case "point": return {
|
|
711
|
+
w: 8,
|
|
712
|
+
h: 8,
|
|
713
|
+
text: []
|
|
714
|
+
};
|
|
715
|
+
case "bar": return i ? {
|
|
716
|
+
w: 80,
|
|
717
|
+
h: 7,
|
|
718
|
+
text: []
|
|
719
|
+
} : {
|
|
720
|
+
w: 7,
|
|
721
|
+
h: 80,
|
|
722
|
+
text: []
|
|
723
|
+
};
|
|
724
|
+
case "none": return {
|
|
725
|
+
w: r.w + 8,
|
|
726
|
+
h: r.h + 6,
|
|
727
|
+
text: n
|
|
728
|
+
};
|
|
729
|
+
case "circle": {
|
|
730
|
+
let e = Math.max(r.w, r.h) + 18 + 4;
|
|
731
|
+
return {
|
|
732
|
+
w: e,
|
|
733
|
+
h: e,
|
|
734
|
+
text: n
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
case "doublecircle": {
|
|
738
|
+
let e = Math.max(r.w, r.h) + 18 + 14;
|
|
739
|
+
return {
|
|
740
|
+
w: e,
|
|
741
|
+
h: e,
|
|
742
|
+
text: n
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
case "ellipse": return {
|
|
746
|
+
w: Math.max(50, (r.w + x) * 1.42),
|
|
747
|
+
h: Math.max(36, (r.h + S) * 1.42),
|
|
748
|
+
text: n
|
|
749
|
+
};
|
|
750
|
+
case "diamond": {
|
|
751
|
+
let e = s + c / .6;
|
|
752
|
+
return {
|
|
753
|
+
w: e,
|
|
754
|
+
h: .6 * e,
|
|
755
|
+
text: n
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
case "stadium": return {
|
|
759
|
+
w: r.w + c + x,
|
|
760
|
+
h: c,
|
|
761
|
+
text: n
|
|
762
|
+
};
|
|
763
|
+
case "hexagon":
|
|
764
|
+
case "octagon": return {
|
|
765
|
+
w: s + c / 2,
|
|
766
|
+
h: c,
|
|
767
|
+
text: n
|
|
768
|
+
};
|
|
769
|
+
case "lean-r":
|
|
770
|
+
case "lean-l": return {
|
|
771
|
+
w: s + c / 2,
|
|
772
|
+
h: c,
|
|
773
|
+
text: n
|
|
774
|
+
};
|
|
775
|
+
case "trap-b":
|
|
776
|
+
case "trap-t": return {
|
|
777
|
+
w: s + c * .7,
|
|
778
|
+
h: c,
|
|
779
|
+
text: n
|
|
780
|
+
};
|
|
781
|
+
case "flag": return {
|
|
782
|
+
w: s + c / 3,
|
|
783
|
+
h: c,
|
|
784
|
+
text: n
|
|
785
|
+
};
|
|
786
|
+
case "cylinder": return {
|
|
787
|
+
w: Math.max(s, 50),
|
|
788
|
+
h: c + 16,
|
|
789
|
+
text: n
|
|
790
|
+
};
|
|
791
|
+
case "subroutine":
|
|
792
|
+
case "component": return {
|
|
793
|
+
w: s + 16,
|
|
794
|
+
h: c,
|
|
795
|
+
text: n
|
|
796
|
+
};
|
|
797
|
+
case "note":
|
|
798
|
+
case "folder": return {
|
|
799
|
+
w: s + 8,
|
|
800
|
+
h: c + (e.shape === "folder" ? 8 : 0),
|
|
801
|
+
text: n
|
|
802
|
+
};
|
|
803
|
+
case "box3d": return {
|
|
804
|
+
w: s + 8,
|
|
805
|
+
h: c + 8,
|
|
806
|
+
text: n
|
|
807
|
+
};
|
|
808
|
+
case "triangle": return {
|
|
809
|
+
w: s * 1.6,
|
|
810
|
+
h: c * 1.7,
|
|
811
|
+
text: n
|
|
812
|
+
};
|
|
813
|
+
case "actor": return {
|
|
814
|
+
w: Math.max(36, r.w + 8),
|
|
815
|
+
h: 46 + r.h,
|
|
816
|
+
text: n
|
|
817
|
+
};
|
|
818
|
+
default: return {
|
|
819
|
+
w: Math.max(s, 40),
|
|
820
|
+
h: c,
|
|
821
|
+
text: n
|
|
822
|
+
};
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
function O(e) {
|
|
826
|
+
let t = e.style ?? {};
|
|
827
|
+
return {
|
|
828
|
+
fill: t.fill ?? u.fill,
|
|
829
|
+
stroke: t.stroke ?? u.stroke,
|
|
830
|
+
sw: t.sw ?? 1.3,
|
|
831
|
+
dash: t.dash
|
|
832
|
+
};
|
|
833
|
+
}
|
|
834
|
+
function k(e, t, n, r, i) {
|
|
835
|
+
let { w: a, h: o } = n, s = r - a / 2, c = i - o / 2, l = O(t), d = t.style?.color ?? u.ink, f = (a = r, o = i) => e.text(a, o, n.text, {
|
|
836
|
+
anchor: "middle",
|
|
837
|
+
color: d,
|
|
838
|
+
bold: t.style?.bold,
|
|
839
|
+
italic: t.style?.italic
|
|
840
|
+
}), p = (t) => e.poly(t, l);
|
|
841
|
+
switch (t.shape) {
|
|
842
|
+
case "start":
|
|
843
|
+
e.circle(r, i, a / 2, { fill: t.style?.fill ?? u.dark });
|
|
844
|
+
return;
|
|
845
|
+
case "end":
|
|
846
|
+
e.circle(r, i, a / 2, {
|
|
847
|
+
fill: "#ffffff",
|
|
848
|
+
stroke: t.style?.stroke ?? u.dark,
|
|
849
|
+
sw: 1.5
|
|
850
|
+
}).circle(r, i, a / 2 - 4, { fill: t.style?.fill ?? u.dark });
|
|
851
|
+
return;
|
|
852
|
+
case "point":
|
|
853
|
+
e.circle(r, i, a / 2, { fill: t.style?.fill ?? u.dark });
|
|
854
|
+
return;
|
|
855
|
+
case "bar":
|
|
856
|
+
e.rect(s, c, a, o, { fill: t.style?.fill ?? u.dark }, 2);
|
|
857
|
+
return;
|
|
858
|
+
case "none":
|
|
859
|
+
f();
|
|
860
|
+
return;
|
|
861
|
+
case "round":
|
|
862
|
+
e.rect(s, c, a, o, l, 6);
|
|
863
|
+
break;
|
|
864
|
+
case "stadium":
|
|
865
|
+
e.rect(s, c, a, o, l, o / 2);
|
|
866
|
+
break;
|
|
867
|
+
case "subroutine":
|
|
868
|
+
e.rect(s, c, a, o, l).line(s + 8, c, s + 8, c + o, l).line(s + a - 8, c, s + a - 8, c + o, l);
|
|
869
|
+
break;
|
|
870
|
+
case "component":
|
|
871
|
+
e.rect(s + 6, c, a - 6, o, l), e.rect(s, c + o / 2 - 11, 12, 7, l).rect(s, c + o / 2 + 4, 12, 7, l), f(r + 4);
|
|
872
|
+
return;
|
|
873
|
+
case "cylinder":
|
|
874
|
+
e.path(`M${T(s)} ${T(c + 7)} A${T(a / 2)} 7 0 0 1 ${T(s + a)} ${T(c + 7)} L${T(s + a)} ${T(c + o - 7)} A${T(a / 2)} 7 0 0 1 ${T(s)} ${T(c + o - 7)} Z`, l), e.path(`M${T(s)} ${T(c + 7)} A${T(a / 2)} 7 0 0 0 ${T(s + a)} ${T(c + 7)}`, {
|
|
875
|
+
...l,
|
|
876
|
+
fill: "none"
|
|
877
|
+
}), f(r, i + 7 / 2);
|
|
878
|
+
return;
|
|
879
|
+
case "circle":
|
|
880
|
+
e.circle(r, i, a / 2, l);
|
|
881
|
+
break;
|
|
882
|
+
case "doublecircle":
|
|
883
|
+
e.circle(r, i, a / 2, l).circle(r, i, a / 2 - 5, {
|
|
884
|
+
...l,
|
|
885
|
+
fill: "none"
|
|
886
|
+
});
|
|
887
|
+
break;
|
|
888
|
+
case "ellipse":
|
|
889
|
+
e.ellipse(r, i, a / 2, o / 2, l);
|
|
890
|
+
break;
|
|
891
|
+
case "diamond":
|
|
892
|
+
p([
|
|
893
|
+
[r, c],
|
|
894
|
+
[s + a, i],
|
|
895
|
+
[r, c + o],
|
|
896
|
+
[s, i]
|
|
897
|
+
]);
|
|
898
|
+
break;
|
|
899
|
+
case "hexagon": {
|
|
900
|
+
let e = o / 4;
|
|
901
|
+
p([
|
|
902
|
+
[s + e, c],
|
|
903
|
+
[s + a - e, c],
|
|
904
|
+
[s + a, i],
|
|
905
|
+
[s + a - e, c + o],
|
|
906
|
+
[s + e, c + o],
|
|
907
|
+
[s, i]
|
|
908
|
+
]);
|
|
909
|
+
break;
|
|
910
|
+
}
|
|
911
|
+
case "octagon": {
|
|
912
|
+
let e = o / 4;
|
|
913
|
+
p([
|
|
914
|
+
[s + e, c],
|
|
915
|
+
[s + a - e, c],
|
|
916
|
+
[s + a, c + e],
|
|
917
|
+
[s + a, c + o - e],
|
|
918
|
+
[s + a - e, c + o],
|
|
919
|
+
[s + e, c + o],
|
|
920
|
+
[s, c + o - e],
|
|
921
|
+
[s, c + e]
|
|
922
|
+
]);
|
|
923
|
+
break;
|
|
924
|
+
}
|
|
925
|
+
case "lean-r":
|
|
926
|
+
case "lean-l": {
|
|
927
|
+
let e = o / 2, n = t.shape === "lean-r";
|
|
928
|
+
p([
|
|
929
|
+
[n ? s + e : s, c],
|
|
930
|
+
[n ? s + a : s + a - e, c],
|
|
931
|
+
[n ? s + a - e : s + a, c + o],
|
|
932
|
+
[n ? s : s + e, c + o]
|
|
933
|
+
]);
|
|
934
|
+
break;
|
|
935
|
+
}
|
|
936
|
+
case "trap-b":
|
|
937
|
+
case "trap-t": {
|
|
938
|
+
let e = o * .35, n = t.shape === "trap-b";
|
|
939
|
+
p([
|
|
940
|
+
[n ? s + e : s, c],
|
|
941
|
+
[n ? s + a - e : s + a, c],
|
|
942
|
+
[n ? s + a : s + a - e, c + o],
|
|
943
|
+
[n ? s : s + e, c + o]
|
|
944
|
+
]);
|
|
945
|
+
break;
|
|
946
|
+
}
|
|
947
|
+
case "flag": {
|
|
948
|
+
let e = o / 3;
|
|
949
|
+
p([
|
|
950
|
+
[s, c],
|
|
951
|
+
[s + a, c],
|
|
952
|
+
[s + a, c + o],
|
|
953
|
+
[s, c + o],
|
|
954
|
+
[s + e, i]
|
|
955
|
+
]), f(r + e / 2);
|
|
956
|
+
return;
|
|
957
|
+
}
|
|
958
|
+
case "note":
|
|
959
|
+
p([
|
|
960
|
+
[s, c],
|
|
961
|
+
[s + a - 10, c],
|
|
962
|
+
[s + a, c + 10],
|
|
963
|
+
[s + a, c + o],
|
|
964
|
+
[s, c + o]
|
|
965
|
+
]), e.poly([
|
|
966
|
+
[s + a - 10, c],
|
|
967
|
+
[s + a - 10, c + 10],
|
|
968
|
+
[s + a, c + 10]
|
|
969
|
+
], {
|
|
970
|
+
...l,
|
|
971
|
+
fill: "none"
|
|
972
|
+
}, !1);
|
|
973
|
+
break;
|
|
974
|
+
case "folder":
|
|
975
|
+
e.rect(s, c, Math.min(a * .4, 40), 10, l, 2).rect(s, c + 8, a, o - 8, l), f(r, i + 4);
|
|
976
|
+
return;
|
|
977
|
+
case "box3d":
|
|
978
|
+
p([
|
|
979
|
+
[s, c + 8],
|
|
980
|
+
[s + 8, c],
|
|
981
|
+
[s + a, c],
|
|
982
|
+
[s + a, c + o - 8],
|
|
983
|
+
[s + a - 8, c + o],
|
|
984
|
+
[s, c + o]
|
|
985
|
+
]), e.poly([
|
|
986
|
+
[s, c + 8],
|
|
987
|
+
[s + a - 8, c + 8],
|
|
988
|
+
[s + a, c]
|
|
989
|
+
], {
|
|
990
|
+
...l,
|
|
991
|
+
fill: "none"
|
|
992
|
+
}, !1).line(s + a - 8, c + 8, s + a - 8, c + o, l), f(r - 4, i + 4);
|
|
993
|
+
return;
|
|
994
|
+
case "cloud":
|
|
995
|
+
e.rect(s, c, a, o, l, Math.min(o / 2, 20));
|
|
996
|
+
break;
|
|
997
|
+
case "triangle":
|
|
998
|
+
p([
|
|
999
|
+
[r, c],
|
|
1000
|
+
[s + a, c + o],
|
|
1001
|
+
[s, c + o]
|
|
1002
|
+
]), f(r, i + o / 6);
|
|
1003
|
+
return;
|
|
1004
|
+
case "actor": {
|
|
1005
|
+
let i = {
|
|
1006
|
+
fill: "none",
|
|
1007
|
+
stroke: t.style?.stroke ?? u.dark,
|
|
1008
|
+
sw: 1.5
|
|
1009
|
+
}, a = c + 2;
|
|
1010
|
+
e.circle(r, a + 7, 7, {
|
|
1011
|
+
...i,
|
|
1012
|
+
fill: t.style?.fill ?? u.fill
|
|
1013
|
+
}), e.line(r, a + 14, r, a + 28, i).line(r - 11, a + 19, r + 11, a + 19, i), e.line(r, a + 28, r - 9, a + 40, i).line(r, a + 28, r + 9, a + 40, i), e.text(r, a + 44 + n.text.length * C / 2, n.text, {
|
|
1014
|
+
anchor: "middle",
|
|
1015
|
+
color: d
|
|
1016
|
+
});
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
default:
|
|
1020
|
+
if (t.sections?.length) return A(e, t, s, c, a);
|
|
1021
|
+
e.rect(s, c, a, o, l);
|
|
1022
|
+
}
|
|
1023
|
+
f();
|
|
1024
|
+
}
|
|
1025
|
+
function A(e, t, n, r, a) {
|
|
1026
|
+
let o = O(t), s = t.sections.map(E), c = s.reduce((e, t) => e + t.h, 0);
|
|
1027
|
+
e.rect(n, r, a, c, o, t.shape === "round" ? 6 : 0);
|
|
1028
|
+
let l = r;
|
|
1029
|
+
t.sections.forEach((r, c) => {
|
|
1030
|
+
c && e.line(n, l, n + a, l, {
|
|
1031
|
+
stroke: o.stroke,
|
|
1032
|
+
sw: 1
|
|
1033
|
+
});
|
|
1034
|
+
let u = i(b);
|
|
1035
|
+
r.rows.forEach((i, o) => {
|
|
1036
|
+
let d = l + 5 + o * u + u / 2;
|
|
1037
|
+
if (r.center || i.length === 1 && c === 0) {
|
|
1038
|
+
e.text(n + a / 2, d, i.join(" "), {
|
|
1039
|
+
anchor: "middle",
|
|
1040
|
+
size: b,
|
|
1041
|
+
bold: r.bold,
|
|
1042
|
+
italic: r.italic,
|
|
1043
|
+
color: t.style?.color
|
|
1044
|
+
});
|
|
1045
|
+
return;
|
|
1046
|
+
}
|
|
1047
|
+
let f = n + x;
|
|
1048
|
+
i.forEach((n, i) => {
|
|
1049
|
+
e.text(f, d, n, {
|
|
1050
|
+
size: b,
|
|
1051
|
+
bold: r.bold,
|
|
1052
|
+
italic: r.italic,
|
|
1053
|
+
color: t.style?.color
|
|
1054
|
+
}), f += s[c].cols[i] + 12;
|
|
1055
|
+
});
|
|
1056
|
+
}), l += s[c].h;
|
|
1057
|
+
});
|
|
1058
|
+
}
|
|
1059
|
+
var j = {
|
|
1060
|
+
arrow: 10,
|
|
1061
|
+
triangle: 13,
|
|
1062
|
+
diamond: 15,
|
|
1063
|
+
odiamond: 15,
|
|
1064
|
+
circle: 8,
|
|
1065
|
+
ocircle: 8
|
|
1066
|
+
};
|
|
1067
|
+
function ee(e, t) {
|
|
1068
|
+
let n = t.x - e.x, r = t.y - e.y, i = Math.hypot(n, r) || 1;
|
|
1069
|
+
return {
|
|
1070
|
+
x: n / i,
|
|
1071
|
+
y: r / i
|
|
1072
|
+
};
|
|
1073
|
+
}
|
|
1074
|
+
function te(e, t, n, r, i) {
|
|
1075
|
+
let a = -r.y, o = r.x, s = (e, t) => [n.x - r.x * e + a * t, n.y - r.y * e + o * t], c = (t, n) => e.line(t[0], t[1], n[0], n[1], {
|
|
1076
|
+
stroke: i,
|
|
1077
|
+
sw: 1.3
|
|
1078
|
+
});
|
|
1079
|
+
switch (t) {
|
|
1080
|
+
case "arrow":
|
|
1081
|
+
e.poly([
|
|
1082
|
+
s(0, 0),
|
|
1083
|
+
s(10, 4.5),
|
|
1084
|
+
s(10, -4.5)
|
|
1085
|
+
], {
|
|
1086
|
+
fill: i,
|
|
1087
|
+
stroke: i,
|
|
1088
|
+
sw: 1
|
|
1089
|
+
});
|
|
1090
|
+
break;
|
|
1091
|
+
case "open":
|
|
1092
|
+
e.poly([
|
|
1093
|
+
s(10, 5),
|
|
1094
|
+
s(0, 0),
|
|
1095
|
+
s(10, -5)
|
|
1096
|
+
], {
|
|
1097
|
+
stroke: i,
|
|
1098
|
+
sw: 1.4
|
|
1099
|
+
}, !1);
|
|
1100
|
+
break;
|
|
1101
|
+
case "triangle":
|
|
1102
|
+
e.poly([
|
|
1103
|
+
s(0, 0),
|
|
1104
|
+
s(13, 7),
|
|
1105
|
+
s(13, -7)
|
|
1106
|
+
], {
|
|
1107
|
+
fill: "#ffffff",
|
|
1108
|
+
stroke: i,
|
|
1109
|
+
sw: 1.2
|
|
1110
|
+
});
|
|
1111
|
+
break;
|
|
1112
|
+
case "diamond":
|
|
1113
|
+
case "odiamond":
|
|
1114
|
+
e.poly([
|
|
1115
|
+
s(0, 0),
|
|
1116
|
+
s(7.5, 5),
|
|
1117
|
+
s(15, 0),
|
|
1118
|
+
s(7.5, -5)
|
|
1119
|
+
], {
|
|
1120
|
+
fill: t === "diamond" ? i : "#ffffff",
|
|
1121
|
+
stroke: i,
|
|
1122
|
+
sw: 1.2
|
|
1123
|
+
});
|
|
1124
|
+
break;
|
|
1125
|
+
case "circle":
|
|
1126
|
+
case "ocircle": {
|
|
1127
|
+
let [n, r] = s(4, 0);
|
|
1128
|
+
e.circle(n, r, 4, {
|
|
1129
|
+
fill: t === "circle" ? i : "#ffffff",
|
|
1130
|
+
stroke: i,
|
|
1131
|
+
sw: 1.2
|
|
1132
|
+
});
|
|
1133
|
+
break;
|
|
1134
|
+
}
|
|
1135
|
+
case "cross":
|
|
1136
|
+
c(s(1, 5), s(11, -5)), c(s(1, -5), s(11, 5));
|
|
1137
|
+
break;
|
|
1138
|
+
case "one":
|
|
1139
|
+
case "zero-one":
|
|
1140
|
+
case "one-many":
|
|
1141
|
+
case "zero-many":
|
|
1142
|
+
case "many": {
|
|
1143
|
+
let n = t.endsWith("many");
|
|
1144
|
+
if (n && (c(s(0, 7), s(12, 0)), c(s(0, -7), s(12, 0))), (t === "one" || t === "one-many") && c(s(n ? 16 : 7, 6), s(n ? 16 : 7, -6)), t === "one" && c(s(12, 6), s(12, -6)), t === "zero-one" || t === "zero-many") {
|
|
1145
|
+
let [t, r] = s(n ? 20 : 17, 0);
|
|
1146
|
+
e.circle(t, r, 4.5, {
|
|
1147
|
+
fill: "#ffffff",
|
|
1148
|
+
stroke: i,
|
|
1149
|
+
sw: 1.2
|
|
1150
|
+
});
|
|
1151
|
+
}
|
|
1152
|
+
t === "zero-one" && c(s(7, 6), s(7, -6));
|
|
1153
|
+
break;
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
function M(e, t, n) {
|
|
1158
|
+
let r = t[t.length - 1], i = r.p[r.p.length - 1], a = ee(r.c === "C" ? r.p[1] : t.length > 1 ? t[t.length - 2].p[t[t.length - 2].p.length - 1] : e, i);
|
|
1159
|
+
if (n) {
|
|
1160
|
+
let e = {
|
|
1161
|
+
x: i.x - a.x * n,
|
|
1162
|
+
y: i.y - a.y * n
|
|
1163
|
+
};
|
|
1164
|
+
r.p[r.p.length - 1] = e, r.c === "C" && (r.p[1] = {
|
|
1165
|
+
x: r.p[1].x - a.x * Math.min(n, 6),
|
|
1166
|
+
y: r.p[1].y - a.y * Math.min(n, 6)
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
return a;
|
|
1170
|
+
}
|
|
1171
|
+
function ne(e) {
|
|
1172
|
+
return e.color ?? u.line;
|
|
1173
|
+
}
|
|
1174
|
+
var re = 16, N = 3e3, P = 6e3;
|
|
1175
|
+
function F(t) {
|
|
1176
|
+
if (!t.nodes.length) throw new _("The diagram has no nodes");
|
|
1177
|
+
if (t.nodes.length > N || t.edges.length > P) throw new _(`The diagram is too large to draw (${t.nodes.length} nodes, ${t.edges.length} edges)`);
|
|
1178
|
+
let n = t.dir, o = n === "TB" || n === "BT", s = new p(), c = new Map(t.clusters.map((e, t) => [e.id, t])), l = new Map(t.nodes.map((e, t) => [e.id, t])), d = (e) => t.clusters[e].parent === void 0 ? -1 : c.get(t.clusters[e].parent) ?? -1, f = (e, n) => {
|
|
1179
|
+
for (let r = t.nodes[e].cluster === void 0 ? -1 : c.get(t.nodes[e].cluster) ?? -1; r >= 0; r = d(r)) if (r === n) return !0;
|
|
1180
|
+
return !1;
|
|
1181
|
+
}, h = (e, n) => {
|
|
1182
|
+
let r = l.get(e);
|
|
1183
|
+
if (r !== void 0) return r;
|
|
1184
|
+
let i = c.get(e);
|
|
1185
|
+
if (i === void 0) return -1;
|
|
1186
|
+
if (!n) return t.nodes.findIndex((e, t) => f(t, i));
|
|
1187
|
+
for (let e = t.nodes.length - 1; e >= 0; e--) if (f(e, i)) return e;
|
|
1188
|
+
return -1;
|
|
1189
|
+
}, g = t.nodes.map((e) => D(e, n)), v = t.edges.map((e) => ({
|
|
1190
|
+
e,
|
|
1191
|
+
v: h(e.from, !0),
|
|
1192
|
+
w: h(e.to, !1),
|
|
1193
|
+
cv: l.has(e.from) ? -1 : c.get(e.from) ?? -1,
|
|
1194
|
+
cw: l.has(e.to) ? -1 : c.get(e.to) ?? -1
|
|
1195
|
+
})).filter((e) => e.v >= 0 && e.w >= 0), y = v.some((e) => e.e.label), x = (e) => e ? a(w(e), b) : void 0, S = /* @__PURE__ */ new Map();
|
|
1196
|
+
for (let { e, v: t, w: n } of v) {
|
|
1197
|
+
if (t !== n) continue;
|
|
1198
|
+
let r = x(e.label);
|
|
1199
|
+
S.set(t, Math.max(S.get(t) ?? 0, 40 + (r ? (o ? r.w : r.h) + 6 : 0)));
|
|
1200
|
+
}
|
|
1201
|
+
let C = t.nodes.map((e, t) => {
|
|
1202
|
+
let n = g[t], r = e.cluster === void 0 ? -1 : c.get(e.cluster) ?? -1, i = !!e.sections?.length || ae.has(e.shape);
|
|
1203
|
+
return o ? {
|
|
1204
|
+
w: n.w,
|
|
1205
|
+
h: n.h,
|
|
1206
|
+
cluster: r,
|
|
1207
|
+
loop: S.get(t),
|
|
1208
|
+
spread: i
|
|
1209
|
+
} : {
|
|
1210
|
+
w: n.h,
|
|
1211
|
+
h: n.w,
|
|
1212
|
+
cluster: r,
|
|
1213
|
+
loop: S.get(t),
|
|
1214
|
+
spread: i
|
|
1215
|
+
};
|
|
1216
|
+
}), T = v.map(({ e, v: t, w: n }) => {
|
|
1217
|
+
let r = x(e.label), i = r ? {
|
|
1218
|
+
w: r.w + 8,
|
|
1219
|
+
h: r.h + 4
|
|
1220
|
+
} : void 0;
|
|
1221
|
+
return {
|
|
1222
|
+
v: t,
|
|
1223
|
+
w: n,
|
|
1224
|
+
minlen: (e.minlen ?? 1) * (y ? 2 : 1),
|
|
1225
|
+
weight: 1,
|
|
1226
|
+
label: i ? o ? i : {
|
|
1227
|
+
w: i.h,
|
|
1228
|
+
h: i.w
|
|
1229
|
+
} : void 0
|
|
1230
|
+
};
|
|
1231
|
+
}), E = t.clusters.map((e, t) => {
|
|
1232
|
+
let r = e.label ? a(w(e.label), b, !0) : {
|
|
1233
|
+
w: 0,
|
|
1234
|
+
h: 0
|
|
1235
|
+
}, i = 12 + (e.label ? r.h + 6 : 0), s = n === "TB" ? [
|
|
1236
|
+
12,
|
|
1237
|
+
12,
|
|
1238
|
+
i,
|
|
1239
|
+
12
|
|
1240
|
+
] : n === "BT" ? [
|
|
1241
|
+
12,
|
|
1242
|
+
12,
|
|
1243
|
+
12,
|
|
1244
|
+
i
|
|
1245
|
+
] : [
|
|
1246
|
+
i,
|
|
1247
|
+
12,
|
|
1248
|
+
12,
|
|
1249
|
+
12
|
|
1250
|
+
];
|
|
1251
|
+
return {
|
|
1252
|
+
parent: d(t),
|
|
1253
|
+
pad: s,
|
|
1254
|
+
minW: o ? r.w + 24 : r.h + i + 12
|
|
1255
|
+
};
|
|
1256
|
+
}), O = t.sameRank?.map((e) => e.map((e) => l.get(e)).filter((e) => e !== void 0)).filter((e) => e.length > 1), A = e(C, T, E, {
|
|
1257
|
+
nodesep: o ? 40 : 28,
|
|
1258
|
+
ranksep: (o ? 50 : 60) / (y ? 2 : 1),
|
|
1259
|
+
edgesep: 14,
|
|
1260
|
+
sameRank: O
|
|
1261
|
+
}), F = t.title ? 32 : 0, R = A.w, oe = A.h, z = (e) => {
|
|
1262
|
+
let t = n === "TB" ? e : n === "BT" ? {
|
|
1263
|
+
x: e.x,
|
|
1264
|
+
y: oe - e.y
|
|
1265
|
+
} : n === "LR" ? {
|
|
1266
|
+
x: e.y,
|
|
1267
|
+
y: e.x
|
|
1268
|
+
} : {
|
|
1269
|
+
x: oe - e.y,
|
|
1270
|
+
y: e.x
|
|
1271
|
+
};
|
|
1272
|
+
return {
|
|
1273
|
+
x: t.x + re,
|
|
1274
|
+
y: t.y + re + F
|
|
1275
|
+
};
|
|
1276
|
+
}, B = (o ? R : oe) + 32, V = (o ? oe : R) + 32 + F, se = (e) => {
|
|
1277
|
+
let t = 0;
|
|
1278
|
+
for (let n = d(e); n >= 0; n = d(n)) t++;
|
|
1279
|
+
return t;
|
|
1280
|
+
}, H = t.clusters.map((e, t) => t).sort((e, t) => se(e) - se(t)), ce = t.clusters.map(() => null), le = [];
|
|
1281
|
+
for (let e of H) {
|
|
1282
|
+
let r = A.clusters[e];
|
|
1283
|
+
if (!r) continue;
|
|
1284
|
+
let a = t.clusters[e], o = z({
|
|
1285
|
+
x: r.x,
|
|
1286
|
+
y: r.y
|
|
1287
|
+
}), c = z({
|
|
1288
|
+
x: r.x + r.w,
|
|
1289
|
+
y: r.y + r.h
|
|
1290
|
+
}), l = Math.min(o.x, c.x), d = Math.min(o.y, c.y), f = Math.abs(c.x - o.x), p = Math.abs(c.y - o.y), m = a.style ?? {};
|
|
1291
|
+
if (ce[e] = {
|
|
1292
|
+
x: l,
|
|
1293
|
+
y: d,
|
|
1294
|
+
w: f,
|
|
1295
|
+
h: p
|
|
1296
|
+
}, s.rect(l, d, f, p, {
|
|
1297
|
+
fill: m.fill ?? u.cluster,
|
|
1298
|
+
stroke: m.stroke ?? u.clusterStroke,
|
|
1299
|
+
sw: m.sw ?? 1,
|
|
1300
|
+
dash: m.dash
|
|
1301
|
+
}, 4), a.label) {
|
|
1302
|
+
let e = w(a.label), t = n === "BT" ? d + p - 8 - e.length * i(b) / 2 : d + 8 + e.length * i(b) / 2;
|
|
1303
|
+
le.push({
|
|
1304
|
+
x: l + f / 2,
|
|
1305
|
+
y: t,
|
|
1306
|
+
text: e,
|
|
1307
|
+
color: m.color ?? u.ink,
|
|
1308
|
+
bg: m.fill && m.fill !== "none" ? m.fill : u.cluster
|
|
1309
|
+
});
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
let ue = [];
|
|
1313
|
+
v.forEach(({ e, v: t }, n) => {
|
|
1314
|
+
if (e.line === "hidden") return;
|
|
1315
|
+
let r = ne(e), i = {
|
|
1316
|
+
stroke: r,
|
|
1317
|
+
sw: e.sw ?? (e.line === "thick" ? 3 : 1.4),
|
|
1318
|
+
dash: e.line === "dashed" ? "6 4" : e.line === "dotted" ? "2 3" : void 0
|
|
1319
|
+
}, c = A.edges[n];
|
|
1320
|
+
if (!c) {
|
|
1321
|
+
if (v[n].v !== v[n].w) return;
|
|
1322
|
+
let c = z(A.nodes[t]), l = g[t], u, d, f, p, h;
|
|
1323
|
+
o ? (u = {
|
|
1324
|
+
x: c.x + l.w / 2,
|
|
1325
|
+
y: c.y - l.h / 4
|
|
1326
|
+
}, p = {
|
|
1327
|
+
x: c.x + l.w / 2,
|
|
1328
|
+
y: c.y + l.h / 4
|
|
1329
|
+
}, d = {
|
|
1330
|
+
x: u.x + 34,
|
|
1331
|
+
y: u.y - 12
|
|
1332
|
+
}, f = {
|
|
1333
|
+
x: p.x + 34,
|
|
1334
|
+
y: p.y + 12
|
|
1335
|
+
}, h = {
|
|
1336
|
+
x: c.x + l.w / 2 + 34,
|
|
1337
|
+
y: c.y
|
|
1338
|
+
}) : (u = {
|
|
1339
|
+
x: c.x - l.w / 4,
|
|
1340
|
+
y: c.y + l.h / 2
|
|
1341
|
+
}, p = {
|
|
1342
|
+
x: c.x + l.w / 4,
|
|
1343
|
+
y: c.y + l.h / 2
|
|
1344
|
+
}, d = {
|
|
1345
|
+
x: u.x - 12,
|
|
1346
|
+
y: u.y + 34
|
|
1347
|
+
}, f = {
|
|
1348
|
+
x: p.x + 12,
|
|
1349
|
+
y: p.y + 34
|
|
1350
|
+
}, h = {
|
|
1351
|
+
x: c.x,
|
|
1352
|
+
y: c.y + l.h / 2 + 34
|
|
1353
|
+
});
|
|
1354
|
+
let _ = [{
|
|
1355
|
+
c: "C",
|
|
1356
|
+
p: [
|
|
1357
|
+
d,
|
|
1358
|
+
f,
|
|
1359
|
+
p
|
|
1360
|
+
]
|
|
1361
|
+
}], y = e.head ?? "arrow", x = M(u, _, j[y] ?? 0);
|
|
1362
|
+
if (s.path(m([{
|
|
1363
|
+
c: "M",
|
|
1364
|
+
p: [u]
|
|
1365
|
+
}, ..._.map((e) => ({
|
|
1366
|
+
c: e.c,
|
|
1367
|
+
p: e.p
|
|
1368
|
+
}))]), i), te(s, y, p, x, r), e.label) {
|
|
1369
|
+
let t = a(w(e.label), b);
|
|
1370
|
+
ue.push({
|
|
1371
|
+
p: o ? {
|
|
1372
|
+
x: h.x + t.w / 2 + 4,
|
|
1373
|
+
y: h.y
|
|
1374
|
+
} : {
|
|
1375
|
+
x: h.x,
|
|
1376
|
+
y: h.y + t.h / 2 + 4
|
|
1377
|
+
},
|
|
1378
|
+
text: w(e.label)
|
|
1379
|
+
});
|
|
1380
|
+
}
|
|
1381
|
+
return;
|
|
1382
|
+
}
|
|
1383
|
+
let l = {
|
|
1384
|
+
start: z(c.start),
|
|
1385
|
+
segs: c.segs.map((e) => ({
|
|
1386
|
+
c: e.c,
|
|
1387
|
+
p: e.p.map(z)
|
|
1388
|
+
})),
|
|
1389
|
+
label: c.label && z(c.label)
|
|
1390
|
+
}, { cv: u, cw: d } = v[n];
|
|
1391
|
+
if (u >= 0 && !f(v[n].w, u) || d >= 0 && !f(v[n].v, d)) {
|
|
1392
|
+
let e = I(l.start, l.segs);
|
|
1393
|
+
u >= 0 && ce[u] && (e = L(e, ce[u], !0)), d >= 0 && ce[d] && (e = L(e, ce[d], !1)), e.length > 1 && (l = {
|
|
1394
|
+
start: e[0],
|
|
1395
|
+
segs: e.slice(1).map((e) => ({
|
|
1396
|
+
c: "L",
|
|
1397
|
+
p: [e]
|
|
1398
|
+
})),
|
|
1399
|
+
label: l.label
|
|
1400
|
+
});
|
|
1401
|
+
}
|
|
1402
|
+
let p = e.head ?? "none", h = e.tail ?? "none", _ = l.segs[l.segs.length - 1].p[l.segs[l.segs.length - 1].p.length - 1], y = M(l.start, l.segs, j[p] ?? 0), x = l.segs[0], S = ee((x.c, x.p[0]), l.start), C = l.start, T = j[h] ?? 0, E = T ? {
|
|
1403
|
+
x: l.start.x - S.x * T,
|
|
1404
|
+
y: l.start.y - S.y * T
|
|
1405
|
+
} : l.start;
|
|
1406
|
+
if (T && x.c === "C" && (x.p[0] = {
|
|
1407
|
+
x: x.p[0].x - S.x * Math.min(T, 6),
|
|
1408
|
+
y: x.p[0].y - S.y * Math.min(T, 6)
|
|
1409
|
+
}), s.path(m([{
|
|
1410
|
+
c: "M",
|
|
1411
|
+
p: [E]
|
|
1412
|
+
}, ...l.segs.map((e) => ({
|
|
1413
|
+
c: e.c,
|
|
1414
|
+
p: e.p
|
|
1415
|
+
}))]), i), p !== "none" && te(s, p, _, y, r), h !== "none" && te(s, h, C, S, r), e.label) {
|
|
1416
|
+
let t = l.label ?? ie(l.start, _);
|
|
1417
|
+
ue.push({
|
|
1418
|
+
p: t,
|
|
1419
|
+
text: w(e.label)
|
|
1420
|
+
});
|
|
1421
|
+
}
|
|
1422
|
+
let D = (e, t, n) => {
|
|
1423
|
+
let r = a(w(n), b), i = -t.y, o = t.x, s = Math.abs(i) * (r.w / 2 + 5) + Math.abs(o) * (r.h / 2 + 3);
|
|
1424
|
+
ue.push({
|
|
1425
|
+
p: {
|
|
1426
|
+
x: e.x - t.x * (16 + r.h / 2) + i * s,
|
|
1427
|
+
y: e.y - t.y * (14 + r.h / 2) + o * s
|
|
1428
|
+
},
|
|
1429
|
+
text: w(n),
|
|
1430
|
+
plain: !0
|
|
1431
|
+
});
|
|
1432
|
+
};
|
|
1433
|
+
e.headLabel && D(_, y, e.headLabel), e.tailLabel && D(C, S, e.tailLabel);
|
|
1434
|
+
});
|
|
1435
|
+
for (let e of le) {
|
|
1436
|
+
let t = a(e.text, b, !0);
|
|
1437
|
+
s.rect(e.x - t.w / 2 - 4, e.y - t.h / 2 - 1, t.w + 8, t.h + 2, { fill: e.bg }, 2), s.text(e.x, e.y, e.text, {
|
|
1438
|
+
anchor: "middle",
|
|
1439
|
+
size: b,
|
|
1440
|
+
bold: !0,
|
|
1441
|
+
color: e.color
|
|
1442
|
+
});
|
|
1443
|
+
}
|
|
1444
|
+
t.nodes.forEach((e, t) => {
|
|
1445
|
+
if (e.style?.hidden) return;
|
|
1446
|
+
let n = z(A.nodes[t]);
|
|
1447
|
+
k(s, e, g[t], n.x, n.y);
|
|
1448
|
+
});
|
|
1449
|
+
for (let e of ue) {
|
|
1450
|
+
let t = a(e.text, b);
|
|
1451
|
+
e.plain || s.rect(e.p.x - t.w / 2 - 3, e.p.y - t.h / 2 - 1, t.w + 6, t.h + 2, {
|
|
1452
|
+
fill: u.label,
|
|
1453
|
+
opacity: .92
|
|
1454
|
+
}, 2), s.text(e.p.x, e.p.y, e.text, {
|
|
1455
|
+
anchor: "middle",
|
|
1456
|
+
size: b,
|
|
1457
|
+
color: e.color ?? u.ink
|
|
1458
|
+
});
|
|
1459
|
+
}
|
|
1460
|
+
return t.title && (B = Math.max(B, r(t.title, 16, !0) + 32), s.text(B / 2, 27, t.title, {
|
|
1461
|
+
anchor: "middle",
|
|
1462
|
+
size: 16,
|
|
1463
|
+
bold: !0
|
|
1464
|
+
})), {
|
|
1465
|
+
svg: s.toString(B, V),
|
|
1466
|
+
w: Math.ceil(B),
|
|
1467
|
+
h: Math.ceil(V)
|
|
1468
|
+
};
|
|
1469
|
+
}
|
|
1470
|
+
var ie = (e, t) => ({
|
|
1471
|
+
x: (e.x + t.x) / 2,
|
|
1472
|
+
y: (e.y + t.y) / 2
|
|
1473
|
+
}), ae = /* @__PURE__ */ new Set([
|
|
1474
|
+
"rect",
|
|
1475
|
+
"round",
|
|
1476
|
+
"subroutine",
|
|
1477
|
+
"component",
|
|
1478
|
+
"note",
|
|
1479
|
+
"folder",
|
|
1480
|
+
"box3d",
|
|
1481
|
+
"cylinder",
|
|
1482
|
+
"stadium",
|
|
1483
|
+
"cloud"
|
|
1484
|
+
]);
|
|
1485
|
+
function I(e, t) {
|
|
1486
|
+
let n = [e], r = e;
|
|
1487
|
+
for (let e of t) {
|
|
1488
|
+
if (e.c === "L") n.push(e.p[0]);
|
|
1489
|
+
else {
|
|
1490
|
+
let [t, i, a] = e.p;
|
|
1491
|
+
for (let e = 1; e <= 12; e++) {
|
|
1492
|
+
let o = e / 12, s = 1 - o;
|
|
1493
|
+
n.push({
|
|
1494
|
+
x: s * s * s * r.x + 3 * s * s * o * t.x + 3 * s * o * o * i.x + o * o * o * a.x,
|
|
1495
|
+
y: s * s * s * r.y + 3 * s * s * o * t.y + 3 * s * o * o * i.y + o * o * o * a.y
|
|
1496
|
+
});
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
r = n[n.length - 1];
|
|
1500
|
+
}
|
|
1501
|
+
return n;
|
|
1502
|
+
}
|
|
1503
|
+
function L(e, t, n) {
|
|
1504
|
+
let r = (e) => e.x > t.x && e.x < t.x + t.w && e.y > t.y && e.y < t.y + t.h, i = n ? e : [...e].reverse(), a = i.findIndex((e) => !r(e));
|
|
1505
|
+
if (a <= 0) return e;
|
|
1506
|
+
let o = i[a - 1], s = i[a], c = 1, l = s.x - o.x, u = s.y - o.y;
|
|
1507
|
+
l > 0 && (c = Math.min(c, (t.x + t.w - o.x) / l)), l < 0 && (c = Math.min(c, (t.x - o.x) / l)), u > 0 && (c = Math.min(c, (t.y + t.h - o.y) / u)), u < 0 && (c = Math.min(c, (t.y - o.y) / u));
|
|
1508
|
+
let d = [{
|
|
1509
|
+
x: o.x + l * c,
|
|
1510
|
+
y: o.y + u * c
|
|
1511
|
+
}, ...i.slice(a)];
|
|
1512
|
+
return n ? d : d.reverse();
|
|
1513
|
+
}
|
|
1514
|
+
// src/core/diagram/dot.ts
|
|
1515
|
+
function R(e) {
|
|
1516
|
+
let t = [], n = e.length, r = 0, i = !0;
|
|
1517
|
+
for (; r < n;) {
|
|
1518
|
+
let a = e[r];
|
|
1519
|
+
if (a === "\n") {
|
|
1520
|
+
i = !0, r++;
|
|
1521
|
+
continue;
|
|
1522
|
+
}
|
|
1523
|
+
if (a === " " || a === " " || a === "\r" || a === "") {
|
|
1524
|
+
r++;
|
|
1525
|
+
continue;
|
|
1526
|
+
}
|
|
1527
|
+
if (i && a === "#" || (i = !1, a === "/" && e[r + 1] === "/")) {
|
|
1528
|
+
for (; r < n && e[r] !== "\n";) r++;
|
|
1529
|
+
continue;
|
|
1530
|
+
}
|
|
1531
|
+
if (a === "/" && e[r + 1] === "*") {
|
|
1532
|
+
let t = e.indexOf("*/", r + 2);
|
|
1533
|
+
r = t < 0 ? n : t + 2;
|
|
1534
|
+
continue;
|
|
1535
|
+
}
|
|
1536
|
+
if (a === "\"") {
|
|
1537
|
+
let i = "";
|
|
1538
|
+
for (r++; r < n && e[r] !== "\"";) e[r] === "\\" && e[r + 1] === "\"" ? (i += "\"", r += 2) : e[r] === "\\" && e[r + 1] === "\n" ? r += 2 : i += e[r++];
|
|
1539
|
+
r++;
|
|
1540
|
+
let a = t[t.length - 1], o = t[t.length - 2];
|
|
1541
|
+
a?.t === "p" && a.v === "+" && o?.t === "str" ? (t.pop(), o.v += i) : t.push({
|
|
1542
|
+
t: "str",
|
|
1543
|
+
v: i
|
|
1544
|
+
});
|
|
1545
|
+
continue;
|
|
1546
|
+
}
|
|
1547
|
+
if (a === "<") {
|
|
1548
|
+
let i = 0, a = r;
|
|
1549
|
+
for (; r < n; r++) if (e[r] === "<") i++;
|
|
1550
|
+
else if (e[r] === ">" && --i === 0) break;
|
|
1551
|
+
t.push({
|
|
1552
|
+
t: "html",
|
|
1553
|
+
v: e.slice(a + 1, r)
|
|
1554
|
+
}), r++;
|
|
1555
|
+
continue;
|
|
1556
|
+
}
|
|
1557
|
+
if (a === "-" && (e[r + 1] === ">" || e[r + 1] === "-")) {
|
|
1558
|
+
t.push({
|
|
1559
|
+
t: "p",
|
|
1560
|
+
v: e.slice(r, r + 2)
|
|
1561
|
+
}), r += 2;
|
|
1562
|
+
continue;
|
|
1563
|
+
}
|
|
1564
|
+
if ("{}[]=;,:+".includes(a)) {
|
|
1565
|
+
t.push({
|
|
1566
|
+
t: "p",
|
|
1567
|
+
v: a
|
|
1568
|
+
}), r++;
|
|
1569
|
+
continue;
|
|
1570
|
+
}
|
|
1571
|
+
let o = /^(-?(?:\.\d+|\d+(?:\.\d*)?)|[A-Za-z_\u0080-][\w\u0080-]*)/.exec(e.slice(r, r + 256));
|
|
1572
|
+
o ? (t.push({
|
|
1573
|
+
t: "id",
|
|
1574
|
+
v: o[0]
|
|
1575
|
+
}), r += o[0].length) : r++;
|
|
1576
|
+
}
|
|
1577
|
+
return t;
|
|
1578
|
+
}
|
|
1579
|
+
var oe = {
|
|
1580
|
+
box: "rect",
|
|
1581
|
+
rect: "rect",
|
|
1582
|
+
rectangle: "rect",
|
|
1583
|
+
square: "rect",
|
|
1584
|
+
msquare: "rect",
|
|
1585
|
+
ellipse: "ellipse",
|
|
1586
|
+
oval: "ellipse",
|
|
1587
|
+
egg: "ellipse",
|
|
1588
|
+
circle: "circle",
|
|
1589
|
+
doublecircle: "doublecircle",
|
|
1590
|
+
point: "point",
|
|
1591
|
+
plaintext: "none",
|
|
1592
|
+
plain: "none",
|
|
1593
|
+
none: "none",
|
|
1594
|
+
underline: "none",
|
|
1595
|
+
diamond: "diamond",
|
|
1596
|
+
mdiamond: "diamond",
|
|
1597
|
+
hexagon: "hexagon",
|
|
1598
|
+
octagon: "octagon",
|
|
1599
|
+
doubleoctagon: "octagon",
|
|
1600
|
+
tripleoctagon: "octagon",
|
|
1601
|
+
triangle: "triangle",
|
|
1602
|
+
invtriangle: "triangle",
|
|
1603
|
+
parallelogram: "lean-r",
|
|
1604
|
+
trapezium: "trap-b",
|
|
1605
|
+
invtrapezium: "trap-t",
|
|
1606
|
+
house: "trap-b",
|
|
1607
|
+
invhouse: "trap-t",
|
|
1608
|
+
cylinder: "cylinder",
|
|
1609
|
+
note: "note",
|
|
1610
|
+
tab: "folder",
|
|
1611
|
+
folder: "folder",
|
|
1612
|
+
box3d: "box3d",
|
|
1613
|
+
component: "component",
|
|
1614
|
+
cds: "flag",
|
|
1615
|
+
larrow: "flag",
|
|
1616
|
+
rarrow: "flag",
|
|
1617
|
+
lpromoter: "flag",
|
|
1618
|
+
rpromoter: "flag",
|
|
1619
|
+
star: "circle",
|
|
1620
|
+
record: "rect",
|
|
1621
|
+
mrecord: "round",
|
|
1622
|
+
underlinebox: "rect"
|
|
1623
|
+
}, z = {
|
|
1624
|
+
normal: "arrow",
|
|
1625
|
+
inv: "arrow",
|
|
1626
|
+
empty: "triangle",
|
|
1627
|
+
onormal: "triangle",
|
|
1628
|
+
invempty: "triangle",
|
|
1629
|
+
oinv: "triangle",
|
|
1630
|
+
vee: "open",
|
|
1631
|
+
open: "open",
|
|
1632
|
+
halfopen: "open",
|
|
1633
|
+
diamond: "diamond",
|
|
1634
|
+
odiamond: "odiamond",
|
|
1635
|
+
ediamond: "odiamond",
|
|
1636
|
+
box: "diamond",
|
|
1637
|
+
obox: "odiamond",
|
|
1638
|
+
dot: "circle",
|
|
1639
|
+
odot: "ocircle",
|
|
1640
|
+
invdot: "circle",
|
|
1641
|
+
invodot: "ocircle",
|
|
1642
|
+
none: "none",
|
|
1643
|
+
crow: "many",
|
|
1644
|
+
tee: "one",
|
|
1645
|
+
curve: "open",
|
|
1646
|
+
icurve: "open"
|
|
1647
|
+
};
|
|
1648
|
+
function B(e, t) {
|
|
1649
|
+
if (!e) return t;
|
|
1650
|
+
let n = e.toLowerCase().replace(/^[lr](?=[a-z])/, "");
|
|
1651
|
+
return z[n] ?? z[n.replace(/^o/, "")] ?? t;
|
|
1652
|
+
}
|
|
1653
|
+
function V(e) {
|
|
1654
|
+
if (!e) return;
|
|
1655
|
+
let t = e.split(/[:;]/)[0].trim(), n = /^([\d.]+)[ ,]+([\d.]+)[ ,]+([\d.]+)$/.exec(t);
|
|
1656
|
+
if (n) {
|
|
1657
|
+
let [e, t, r] = [
|
|
1658
|
+
Number(n[1]),
|
|
1659
|
+
Number(n[2]),
|
|
1660
|
+
Number(n[3])
|
|
1661
|
+
], i = (n) => {
|
|
1662
|
+
let i = (n + e * 6) % 6;
|
|
1663
|
+
return Math.round((r - r * t * Math.max(0, Math.min(i, 4 - i, 1))) * 255);
|
|
1664
|
+
};
|
|
1665
|
+
return "#" + [
|
|
1666
|
+
i(5),
|
|
1667
|
+
i(3),
|
|
1668
|
+
i(1)
|
|
1669
|
+
].map((e) => e.toString(16).padStart(2, "0")).join("");
|
|
1670
|
+
}
|
|
1671
|
+
let r = t.replace(/^\/\w+\//, "").toLowerCase(), i = /^gr[ae]y(\d{1,3})$/.exec(r);
|
|
1672
|
+
if (i) {
|
|
1673
|
+
let e = Math.round(Math.min(100, Number(i[1])) * 255 / 100).toString(16).padStart(2, "0");
|
|
1674
|
+
return `#${e}${e}${e}`;
|
|
1675
|
+
}
|
|
1676
|
+
return l(/^[a-z]+\d+$/.test(r) ? r.replace(/\d+$/, "") : r);
|
|
1677
|
+
}
|
|
1678
|
+
function se(e) {
|
|
1679
|
+
return h(e.replace(/<br\s*\/?>/gi, "\n").replace(/<\/tr>/gi, "\n").replace(/<\/td>\s*<td/gi, " <td").replace(/<[^>]+>/g, "").replace(/\n\s*\n/g, "\n")).split("\n").map((e) => e.trim()).filter(Boolean).join("\n");
|
|
1680
|
+
}
|
|
1681
|
+
function H(e, t, n = "") {
|
|
1682
|
+
return e.replace(/\\[nlr]/g, "\n").replace(/\\N/g, t).replace(/\\G/g, n).replace(/\\(.)/g, "$1").replace(/\n$/, "");
|
|
1683
|
+
}
|
|
1684
|
+
function ce(e, t) {
|
|
1685
|
+
return H(e, t).replace(/<[^>]*>/g, "").split(/[|{}]/).map((e) => e.trim()).filter(Boolean);
|
|
1686
|
+
}
|
|
1687
|
+
function le(e) {
|
|
1688
|
+
let t = R(e), n = 0, r = (e = 0) => t[n + e], i = (e, t = 0) => r(t)?.t === "p" && r(t).v === e, a = (e) => i(e) ? (n++, !0) : !1, o = (e) => r()?.t === "id" && r().v.toLowerCase() === e, s = [];
|
|
1689
|
+
for (; n < t.length;) {
|
|
1690
|
+
if (o("strict") && n++, !o("graph") && !o("digraph")) {
|
|
1691
|
+
n++;
|
|
1692
|
+
continue;
|
|
1693
|
+
}
|
|
1694
|
+
let e = r().v.toLowerCase() === "digraph";
|
|
1695
|
+
n++;
|
|
1696
|
+
let c = r()?.t === "p" ? "" : t[n++].v;
|
|
1697
|
+
if (!a("{")) throw new _("Graphviz: “{” expected after the graph name");
|
|
1698
|
+
let l = new v("TB", "ellipse"), u = /* @__PURE__ */ new Map(), d = [], f = [], p = 0, m = {}, h = /* @__PURE__ */ new Map(), g = () => {
|
|
1699
|
+
let e = {};
|
|
1700
|
+
for (; a("[");) {
|
|
1701
|
+
for (; n < t.length && !i("]");) {
|
|
1702
|
+
let r = t[n++];
|
|
1703
|
+
if (r.t !== "p") {
|
|
1704
|
+
if (a("=")) {
|
|
1705
|
+
let i = t[n++];
|
|
1706
|
+
i && (e[r.v.toLowerCase()] = i.t === "html" ? "<" + i.v + ">" : i.v);
|
|
1707
|
+
} else e[r.v.toLowerCase()] = "true";
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
a("]");
|
|
1711
|
+
}
|
|
1712
|
+
return e;
|
|
1713
|
+
}, y = (e) => {
|
|
1714
|
+
let r = t[n++].v;
|
|
1715
|
+
for (; i(":");) n += 2;
|
|
1716
|
+
return u.has(r) ? e.cluster && l.get(r) && l.get(r).cluster === void 0 && (l.get(r).cluster = e.cluster) : (u.set(r, { ...e.node }), l.node(r, {}, e.cluster)), e.members.add(r), r;
|
|
1717
|
+
}, b = (e) => {
|
|
1718
|
+
for (; n < t.length && !i("}");) {
|
|
1719
|
+
if (a(";") || a(",")) continue;
|
|
1720
|
+
let s = r();
|
|
1721
|
+
if (s.t === "id" && [
|
|
1722
|
+
"graph",
|
|
1723
|
+
"node",
|
|
1724
|
+
"edge"
|
|
1725
|
+
].includes(s.v.toLowerCase()) && i("[", 1)) {
|
|
1726
|
+
n++;
|
|
1727
|
+
let t = g(), r = s.v.toLowerCase();
|
|
1728
|
+
r === "node" ? Object.assign(e.node, t) : r === "edge" ? Object.assign(e.edge, t) : x(e, t);
|
|
1729
|
+
continue;
|
|
1730
|
+
}
|
|
1731
|
+
if (s.t !== "p" && i("=", 1)) {
|
|
1732
|
+
let r = s.v.toLowerCase();
|
|
1733
|
+
n += 2;
|
|
1734
|
+
let i = t[n++];
|
|
1735
|
+
x(e, { [r]: i ? i.t === "html" ? "<" + i.v + ">" : i.v : "" });
|
|
1736
|
+
continue;
|
|
1737
|
+
}
|
|
1738
|
+
let c = [];
|
|
1739
|
+
for (;;) {
|
|
1740
|
+
if (o("subgraph") || i("{")) c.push([...S(e)]);
|
|
1741
|
+
else if (r() && r().t !== "p") c.push([y(e)]);
|
|
1742
|
+
else {
|
|
1743
|
+
n++;
|
|
1744
|
+
break;
|
|
1745
|
+
}
|
|
1746
|
+
if (i("->") || i("--")) n++;
|
|
1747
|
+
else break;
|
|
1748
|
+
}
|
|
1749
|
+
let l = g();
|
|
1750
|
+
if (c.length === 1) {
|
|
1751
|
+
for (let e of c[0]) Object.keys(l).length && u.has(e) && Object.assign(u.get(e), l);
|
|
1752
|
+
continue;
|
|
1753
|
+
}
|
|
1754
|
+
let f = {
|
|
1755
|
+
...e.edge,
|
|
1756
|
+
...l
|
|
1757
|
+
};
|
|
1758
|
+
for (let e = 0; e + 1 < c.length; e++) for (let t of c[e]) for (let n of c[e + 1]) d.push({
|
|
1759
|
+
e: {
|
|
1760
|
+
from: t,
|
|
1761
|
+
to: n
|
|
1762
|
+
},
|
|
1763
|
+
attrs: f
|
|
1764
|
+
});
|
|
1765
|
+
}
|
|
1766
|
+
}, x = (e, t) => {
|
|
1767
|
+
e.cluster ? Object.assign(h.get(e.cluster), t) : e.name || Object.assign(m, t), t.rank && e.name !== void 0 && (e.rank = t.rank);
|
|
1768
|
+
}, S = (e) => {
|
|
1769
|
+
let i;
|
|
1770
|
+
o("subgraph") && (n++, r() && r().t !== "p" && (i = t[n++].v));
|
|
1771
|
+
let s = !!i && /^cluster/i.test(i), c = {
|
|
1772
|
+
node: { ...e.node },
|
|
1773
|
+
edge: { ...e.edge },
|
|
1774
|
+
cluster: e.cluster,
|
|
1775
|
+
members: /* @__PURE__ */ new Set(),
|
|
1776
|
+
name: i ?? `__anon${p++}`
|
|
1777
|
+
};
|
|
1778
|
+
if (s) {
|
|
1779
|
+
let t = `${i}`;
|
|
1780
|
+
l.cluster(t, "", e.cluster), h.set(t, {}), c.cluster = t;
|
|
1781
|
+
}
|
|
1782
|
+
a("{") && (b(c), a("}")), c.rank && /^(same|min|max|source|sink)$/.test(c.rank) && c.members.size > 1 && f.push([...c.members]);
|
|
1783
|
+
for (let t of c.members) e.members.add(t);
|
|
1784
|
+
return c.members;
|
|
1785
|
+
};
|
|
1786
|
+
b({
|
|
1787
|
+
node: {},
|
|
1788
|
+
edge: {},
|
|
1789
|
+
members: /* @__PURE__ */ new Set()
|
|
1790
|
+
}), a("}");
|
|
1791
|
+
let C = {
|
|
1792
|
+
LR: "LR",
|
|
1793
|
+
RL: "RL",
|
|
1794
|
+
BT: "BT",
|
|
1795
|
+
TB: "TB"
|
|
1796
|
+
}[(m.rankdir ?? "TB").toUpperCase()] ?? "TB";
|
|
1797
|
+
l.g.dir = C, m.label && (l.g.title = m.label.startsWith("<") ? se(m.label.slice(1, -1)) : H(m.label, "", c));
|
|
1798
|
+
for (let e of l.g.nodes) ue(e, u.get(e.id) ?? {});
|
|
1799
|
+
for (let e of l.g.clusters) {
|
|
1800
|
+
let t = h.get(e.id) ?? {};
|
|
1801
|
+
e.label = t.label ? t.label.startsWith("<") ? se(t.label.slice(1, -1)) : H(t.label, "", e.id) : "";
|
|
1802
|
+
let n = {}, r = (t.style ?? "").toLowerCase();
|
|
1803
|
+
r.includes("filled") ? n.fill = V(t.fillcolor ?? t.color ?? t.bgcolor) ?? "#d3d3d3" : t.bgcolor && (n.fill = V(t.bgcolor)), (t.color || t.pencolor) && (n.stroke = V(t.pencolor ?? t.color)), r.includes("dashed") && (n.dash = "6 4"), r.includes("dotted") && (n.dash = "2 3"), t.fontcolor && (n.color = V(t.fontcolor)), r.includes("invis") && (n.stroke = n.fill = "none"), e.style = n;
|
|
1804
|
+
}
|
|
1805
|
+
for (let { e: t, attrs: n } of d) l.g.edges.push(de(t, n, e));
|
|
1806
|
+
l.g.sameRank = f, s.push(l.g);
|
|
1807
|
+
}
|
|
1808
|
+
if (!s.length) throw new _("No “graph” or “digraph” found");
|
|
1809
|
+
return s;
|
|
1810
|
+
}
|
|
1811
|
+
function ue(e, t) {
|
|
1812
|
+
let n = (t.shape ?? "ellipse").toLowerCase();
|
|
1813
|
+
e.shape = oe[n] ?? "ellipse";
|
|
1814
|
+
let r = t.label;
|
|
1815
|
+
if (r !== void 0) {
|
|
1816
|
+
if (r.startsWith("<") && r.endsWith(">")) e.label = se(r.slice(1, -1));
|
|
1817
|
+
else if (n === "record" || n === "mrecord") {
|
|
1818
|
+
let t = ce(r, e.id);
|
|
1819
|
+
e.label = t.join("\n"), t.length > 1 && (e.sections = t.map((e) => ({
|
|
1820
|
+
rows: [[e]],
|
|
1821
|
+
center: !0
|
|
1822
|
+
})));
|
|
1823
|
+
} else e.label = H(r, e.id);
|
|
1824
|
+
}
|
|
1825
|
+
e.shape === "point" && (e.label = "");
|
|
1826
|
+
let i = {}, a = (t.style ?? "").toLowerCase();
|
|
1827
|
+
a.includes("filled") || t.fillcolor ? i.fill = V(t.fillcolor ?? t.color) ?? "#d3d3d3" : e.shape !== "point" && (i.fill = "#ffffff"), i.stroke = t.color ? V(t.color) : "#000000", t.fontcolor && (i.color = V(t.fontcolor)), a.includes("dashed") && (i.dash = "6 4"), a.includes("dotted") && (i.dash = "2 3"), a.includes("bold") && (i.sw = 2.4), t.penwidth && (i.sw = Math.min(8, Number(t.penwidth) || 1)), a.includes("invis") && (i.hidden = !0), a.includes("rounded") && e.shape === "rect" && (e.shape = "round"), e.shape === "none" && (i.fill = void 0), e.style = i;
|
|
1828
|
+
}
|
|
1829
|
+
function de(e, t, n) {
|
|
1830
|
+
let r = (t.style ?? "").toLowerCase(), i = (t.dir ?? (n ? "forward" : "none")).toLowerCase(), a = B(t.arrowhead, "arrow"), o = B(t.arrowtail, "arrow");
|
|
1831
|
+
e.head = i === "forward" || i === "both" ? a : "none", e.tail = i === "back" || i === "both" ? o : "none";
|
|
1832
|
+
let s = t.label ?? t.xlabel;
|
|
1833
|
+
return s && (e.label = s.startsWith("<") && s.endsWith(">") ? se(s.slice(1, -1)) : H(s, "")), t.headlabel && (e.headLabel = H(t.headlabel, "")), t.taillabel && (e.tailLabel = H(t.taillabel, "")), e.line = r.includes("invis") ? "hidden" : r.includes("dashed") ? "dashed" : r.includes("dotted") ? "dotted" : r.includes("bold") ? "thick" : "solid", e.color = V(t.color) ?? "#000000", t.penwidth && (e.sw = Math.min(8, Number(t.penwidth) || 1)), t.minlen && (e.minlen = Math.max(1, Math.min(6, Math.round(Number(t.minlen)) || 1))), e;
|
|
1834
|
+
}
|
|
1835
|
+
function fe(e) {
|
|
1836
|
+
return le(e).map(F);
|
|
1837
|
+
}
|
|
1838
|
+
// src/core/diagram/charts.ts
|
|
1839
|
+
var U = 16, W = (e) => Math.round(e * 100) / 100;
|
|
1840
|
+
function pe(e) {
|
|
1841
|
+
let t = e.slices.filter((e) => e.value > 0 && Number.isFinite(e.value));
|
|
1842
|
+
if (!t.length) throw Error("The pie chart has no values");
|
|
1843
|
+
let n = t.reduce((e, t) => e + t.value, 0), i = new p(), a = U + (e.title ? 36 : 0) + 130, o = (e) => u.series[e % u.series.length], s = -Math.PI / 2, c = (e, t) => ({
|
|
1844
|
+
x: 146 + Math.cos(e) * t,
|
|
1845
|
+
y: a + Math.sin(e) * t
|
|
1846
|
+
});
|
|
1847
|
+
t.forEach((e, t) => {
|
|
1848
|
+
let r = e.value / n, l = s + r * 2 * Math.PI;
|
|
1849
|
+
if (r >= .9999) i.circle(146, a, 130, {
|
|
1850
|
+
fill: o(t),
|
|
1851
|
+
stroke: "#ffffff",
|
|
1852
|
+
sw: 2
|
|
1853
|
+
});
|
|
1854
|
+
else {
|
|
1855
|
+
let e = c(s, 130), n = c(l, 130);
|
|
1856
|
+
i.path(`M${W(146)} ${W(a)} L${W(e.x)} ${W(e.y)} A130 130 0 ${+(r > .5)} 1 ${W(n.x)} ${W(n.y)} Z`, {
|
|
1857
|
+
fill: o(t),
|
|
1858
|
+
stroke: "#ffffff",
|
|
1859
|
+
sw: 2
|
|
1860
|
+
});
|
|
1861
|
+
}
|
|
1862
|
+
if (r >= .06) {
|
|
1863
|
+
let e = c((s + l) / 2, 85.8);
|
|
1864
|
+
i.text(e.x, e.y, `${Math.round(r * 1e3) / 10}%`, {
|
|
1865
|
+
anchor: "middle",
|
|
1866
|
+
size: 13,
|
|
1867
|
+
bold: !0,
|
|
1868
|
+
color: "#ffffff"
|
|
1869
|
+
});
|
|
1870
|
+
}
|
|
1871
|
+
s = l;
|
|
1872
|
+
});
|
|
1873
|
+
let l = a - t.length * 24 / 2 + 12, d = 0;
|
|
1874
|
+
t.forEach((t, n) => {
|
|
1875
|
+
let a = e.showData ? `${t.label} [${me(t.value)}]` : t.label;
|
|
1876
|
+
i.rect(306, l + n * 24 - 8, 16, 16, { fill: o(n) }, 3), i.text(330, l + n * 24, a), d = Math.max(d, r(a, 14));
|
|
1877
|
+
});
|
|
1878
|
+
let f = 330 + d + U, m = Math.max(a + 130, l + t.length * 24) + U;
|
|
1879
|
+
return e.title && (f = Math.max(f, r(e.title, 16, !0) + 32), i.text(f / 2, 28, e.title, {
|
|
1880
|
+
anchor: "middle",
|
|
1881
|
+
size: 16,
|
|
1882
|
+
bold: !0
|
|
1883
|
+
})), {
|
|
1884
|
+
svg: i.toString(f, m),
|
|
1885
|
+
w: Math.ceil(f),
|
|
1886
|
+
h: Math.ceil(m)
|
|
1887
|
+
};
|
|
1888
|
+
}
|
|
1889
|
+
var me = (e) => String(Number.isInteger(e) ? e : Math.round(e * 100) / 100), G = 36e5, K = 24 * G, q = (e) => String(e).padStart(2, "0");
|
|
1890
|
+
function he(e) {
|
|
1891
|
+
let t = e.sections.flatMap((e) => e.tasks);
|
|
1892
|
+
if (!t.length) throw Error("The Gantt chart has no tasks");
|
|
1893
|
+
let n = Math.min(...t.map((e) => e.start)), i = Math.max(...t.map((e) => Math.max(e.end, e.start))), a = Math.max(i - n, G), s = Math.min(180, Math.max(0, ...e.sections.map((e) => r(e.name, 13, !0))) + 24), c = Math.max(560, Math.min(1100, t.length * 60)), l = c / a, d = e.title ? 36 : 0, f = U + s, m = U + d, h = (e) => f + (e - n) * l, g = new p(), _ = m + t.length * 28 + 24 + U + 6, v = [
|
|
1894
|
+
G,
|
|
1895
|
+
3 * G,
|
|
1896
|
+
6 * G,
|
|
1897
|
+
12 * G,
|
|
1898
|
+
K,
|
|
1899
|
+
2 * K,
|
|
1900
|
+
7 * K,
|
|
1901
|
+
14 * K,
|
|
1902
|
+
30 * K,
|
|
1903
|
+
91 * K,
|
|
1904
|
+
365 * K
|
|
1905
|
+
].find((e) => a / e <= 12) ?? 365 * K, y = Math.ceil(n / v) * v, b = (e) => {
|
|
1906
|
+
let t = new Date(e);
|
|
1907
|
+
return v < K ? `${q(t.getUTCHours())}:${q(t.getUTCMinutes())}` : v >= 365 * K ? String(t.getUTCFullYear()) : v >= 30 * K ? `${t.getUTCFullYear()}-${q(t.getUTCMonth() + 1)}` : `${t.getUTCFullYear()}-${q(t.getUTCMonth() + 1)}-${q(t.getUTCDate())}`;
|
|
1908
|
+
}, x = m + t.length * 28 + 4;
|
|
1909
|
+
for (let e = y; e <= i; e += v) {
|
|
1910
|
+
let t = h(e);
|
|
1911
|
+
g.line(t, m, t, x, {
|
|
1912
|
+
stroke: "#e3e6ec",
|
|
1913
|
+
sw: 1
|
|
1914
|
+
}), g.text(t, x + 12, b(e), {
|
|
1915
|
+
anchor: "middle",
|
|
1916
|
+
size: 11,
|
|
1917
|
+
color: u.muted
|
|
1918
|
+
});
|
|
1919
|
+
}
|
|
1920
|
+
let S = 0;
|
|
1921
|
+
e.sections.forEach((e, t) => {
|
|
1922
|
+
let n = u.series[t % u.series.length], i = m + S * 28;
|
|
1923
|
+
t % 2 == 0 && g.rect(U, i, s + c, e.tasks.length * 28, { fill: "#f6f7fa" }), e.name && g.text(22, i + e.tasks.length * 28 / 2, o([e.name], s - 12, 13, !0), {
|
|
1924
|
+
size: 13,
|
|
1925
|
+
bold: !0
|
|
1926
|
+
});
|
|
1927
|
+
for (let t of e.tasks) {
|
|
1928
|
+
let e = m + S * 28 + 14;
|
|
1929
|
+
if (t.milestone) {
|
|
1930
|
+
let n = h(t.start);
|
|
1931
|
+
g.poly([
|
|
1932
|
+
[n, e - 8],
|
|
1933
|
+
[n + 8, e],
|
|
1934
|
+
[n, e + 8],
|
|
1935
|
+
[n - 8, e]
|
|
1936
|
+
], { fill: t.crit ? "#e5596b" : u.dark }), g.text(n + 14, e, t.name, { size: 12 });
|
|
1937
|
+
} else {
|
|
1938
|
+
let i = h(t.start), a = Math.max(3, h(t.end) - i), o = t.done ? "#c7ccd6" : n;
|
|
1939
|
+
g.rect(i, e - 9, a, 18, {
|
|
1940
|
+
fill: o,
|
|
1941
|
+
stroke: t.crit ? "#c0392b" : t.active ? u.dark : void 0,
|
|
1942
|
+
sw: t.crit || t.active ? 2 : 0
|
|
1943
|
+
}, 3);
|
|
1944
|
+
let s = r(t.name, 12);
|
|
1945
|
+
s + 10 < a ? g.text(i + a / 2, e, t.name, {
|
|
1946
|
+
anchor: "middle",
|
|
1947
|
+
size: 12,
|
|
1948
|
+
color: t.done ? u.ink : "#ffffff"
|
|
1949
|
+
}) : i + a + 6 + s < f + c + 200 ? g.text(i + a + 6, e, t.name, { size: 12 }) : g.text(i - 6, e, t.name, {
|
|
1950
|
+
anchor: "end",
|
|
1951
|
+
size: 12
|
|
1952
|
+
});
|
|
1953
|
+
}
|
|
1954
|
+
S++;
|
|
1955
|
+
}
|
|
1956
|
+
});
|
|
1957
|
+
let C = f + c + U;
|
|
1958
|
+
for (let e of t) C = Math.max(C, h(e.end) + 12 + r(e.name, 12) + U);
|
|
1959
|
+
return e.title && (C = Math.max(C, r(e.title, 16, !0) + 32), g.text(C / 2, 28, e.title, {
|
|
1960
|
+
anchor: "middle",
|
|
1961
|
+
size: 16,
|
|
1962
|
+
bold: !0
|
|
1963
|
+
})), {
|
|
1964
|
+
svg: g.toString(C, _),
|
|
1965
|
+
w: Math.ceil(C),
|
|
1966
|
+
h: Math.ceil(_)
|
|
1967
|
+
};
|
|
1968
|
+
}
|
|
1969
|
+
var J = 44, ge = 12;
|
|
1970
|
+
function _e(e, t) {
|
|
1971
|
+
let n = new p(), i = (e, t) => {
|
|
1972
|
+
let n = t === 0 ? 16 : t === 1 ? 14 : 13, r = o(e.label.split("\n"), 220, n, t === 0), i = a(r, n, t === 0), s = e.shape === "circle", c = Math.max(i.w, i.h) + 20;
|
|
1973
|
+
return {
|
|
1974
|
+
text: r,
|
|
1975
|
+
w: s ? c : i.w + (e.shape === "none" ? 8 : 24),
|
|
1976
|
+
h: s ? c : i.h + (e.shape === "none" ? 6 : 14),
|
|
1977
|
+
fs: n
|
|
1978
|
+
};
|
|
1979
|
+
}, s = (e, t, n) => {
|
|
1980
|
+
let r = i(e, t), a = e.children.map((e, r) => s(e, t + 1, t === 0 ? u.series[r % u.series.length] : n)), o = Math.max(r.h, a.reduce((e, t) => e + t.span, 0) + Math.max(0, a.length - 1) * ge);
|
|
1981
|
+
return {
|
|
1982
|
+
n: e,
|
|
1983
|
+
w: r.w,
|
|
1984
|
+
h: r.h,
|
|
1985
|
+
text: r.text,
|
|
1986
|
+
x: 0,
|
|
1987
|
+
y: 0,
|
|
1988
|
+
color: n,
|
|
1989
|
+
depth: t,
|
|
1990
|
+
kids: a,
|
|
1991
|
+
span: o
|
|
1992
|
+
};
|
|
1993
|
+
}, c = s(e, 0, u.dark), l = [], d = [];
|
|
1994
|
+
if (c.kids.some((e) => e.n.side)) l = c.kids.filter((e) => e.n.side !== "left"), d = c.kids.filter((e) => e.n.side === "left");
|
|
1995
|
+
else if (c.kids.length > 3) {
|
|
1996
|
+
let e = c.kids.reduce((e, t) => e + t.span, 0), t = 0;
|
|
1997
|
+
for (let n of c.kids) t < e / 2 ? l.push(n) : d.push(n), t += n.span;
|
|
1998
|
+
} else l = c.kids;
|
|
1999
|
+
let f = (e, t, n, r) => {
|
|
2000
|
+
e.x = t;
|
|
2001
|
+
let i = n + (e.span - (e.kids.reduce((e, t) => e + t.span, 0) + Math.max(0, e.kids.length - 1) * ge)) / 2;
|
|
2002
|
+
for (let n of e.kids) f(n, t + r * (e.w / 2 + J + n.w / 2), i, r), i += n.span + ge;
|
|
2003
|
+
e.y = e.kids.length ? (e.kids[0].y + e.kids[e.kids.length - 1].y) / 2 : n + e.span / 2;
|
|
2004
|
+
}, h = (e) => e.reduce((e, t) => e + t.span, 0) + Math.max(0, e.length - 1) * ge, g = h(l), _ = h(d), v = Math.max(c.h, g, _), y = (v - g) / 2;
|
|
2005
|
+
for (let e of l) f(e, c.w / 2 + J + e.w / 2, y, 1), y += e.span + ge;
|
|
2006
|
+
y = (v - _) / 2;
|
|
2007
|
+
for (let e of d) f(e, -(c.w / 2 + J + e.w / 2), y, -1), y += e.span + ge;
|
|
2008
|
+
c.x = 0, c.y = v / 2;
|
|
2009
|
+
let b = Infinity, x = -Infinity, S = Infinity, C = -Infinity, w = [], T = (e) => {
|
|
2010
|
+
w.push(e), b = Math.min(b, e.x - e.w / 2), x = Math.max(x, e.x + e.w / 2), S = Math.min(S, e.y - e.h / 2), C = Math.max(C, e.y + e.h / 2), e.kids.forEach(T);
|
|
2011
|
+
};
|
|
2012
|
+
T(c);
|
|
2013
|
+
let E = t ? 36 : 0, D = U - b, O = U + E - S, k = (e) => ({
|
|
2014
|
+
x: e.x + D,
|
|
2015
|
+
y: e.y + O
|
|
2016
|
+
});
|
|
2017
|
+
for (let e of w) for (let t of e.kids) {
|
|
2018
|
+
let r = k(e), i = k(t), a = Math.sign(i.x - r.x) || 1, o = {
|
|
2019
|
+
x: r.x + a * e.w / 2,
|
|
2020
|
+
y: r.y
|
|
2021
|
+
}, s = {
|
|
2022
|
+
x: i.x - a * t.w / 2,
|
|
2023
|
+
y: i.y
|
|
2024
|
+
}, c = (o.x + s.x) / 2;
|
|
2025
|
+
n.path(m([{
|
|
2026
|
+
c: "M",
|
|
2027
|
+
p: [o]
|
|
2028
|
+
}, {
|
|
2029
|
+
c: "C",
|
|
2030
|
+
p: [
|
|
2031
|
+
{
|
|
2032
|
+
x: c,
|
|
2033
|
+
y: o.y
|
|
2034
|
+
},
|
|
2035
|
+
{
|
|
2036
|
+
x: c,
|
|
2037
|
+
y: s.y
|
|
2038
|
+
},
|
|
2039
|
+
s
|
|
2040
|
+
]
|
|
2041
|
+
}]), {
|
|
2042
|
+
stroke: t.color,
|
|
2043
|
+
sw: Math.max(1.2, 3.2 - t.depth * .6)
|
|
2044
|
+
});
|
|
2045
|
+
}
|
|
2046
|
+
for (let e of w) {
|
|
2047
|
+
let t = k(e), r = e.depth === 0 ? 16 : e.depth === 1 ? 14 : 13, i = t.x - e.w / 2, a = t.y - e.h / 2, o = e.n.shape ?? (e.depth, "round"), s = e.depth === 0 ? u.dark : e.depth === 1 ? e.color : ve(e.color), c = e.depth <= 1 ? "#ffffff" : u.ink;
|
|
2048
|
+
if (o === "none") n.line(i, a + e.h, i + e.w, a + e.h, {
|
|
2049
|
+
stroke: e.color,
|
|
2050
|
+
sw: 1.5
|
|
2051
|
+
}), n.text(t.x, t.y, e.text, {
|
|
2052
|
+
anchor: "middle",
|
|
2053
|
+
size: r
|
|
2054
|
+
});
|
|
2055
|
+
else {
|
|
2056
|
+
if (o === "circle") n.circle(t.x, t.y, e.w / 2, {
|
|
2057
|
+
fill: s,
|
|
2058
|
+
stroke: e.color,
|
|
2059
|
+
sw: 1.2
|
|
2060
|
+
});
|
|
2061
|
+
else if (o === "hexagon") {
|
|
2062
|
+
let r = e.h / 4;
|
|
2063
|
+
n.poly([
|
|
2064
|
+
[i + r, a],
|
|
2065
|
+
[i + e.w - r, a],
|
|
2066
|
+
[i + e.w, t.y],
|
|
2067
|
+
[i + e.w - r, a + e.h],
|
|
2068
|
+
[i + r, a + e.h],
|
|
2069
|
+
[i, t.y]
|
|
2070
|
+
], {
|
|
2071
|
+
fill: s,
|
|
2072
|
+
stroke: e.color,
|
|
2073
|
+
sw: 1.2
|
|
2074
|
+
});
|
|
2075
|
+
} else n.rect(i, a, e.w, e.h, {
|
|
2076
|
+
fill: s,
|
|
2077
|
+
stroke: e.depth === 0 ? void 0 : e.color,
|
|
2078
|
+
sw: 1.2
|
|
2079
|
+
}, o === "rect" ? 2 : o === "cloud" ? e.h / 2 : 8);
|
|
2080
|
+
n.text(t.x, t.y, e.text, {
|
|
2081
|
+
anchor: "middle",
|
|
2082
|
+
size: r,
|
|
2083
|
+
bold: e.depth === 0,
|
|
2084
|
+
color: c
|
|
2085
|
+
});
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2088
|
+
let A = x - b + 32, j = C - S + 32 + E;
|
|
2089
|
+
return t && (A = Math.max(A, r(t, 16, !0) + 32), n.text(A / 2, 28, t, {
|
|
2090
|
+
anchor: "middle",
|
|
2091
|
+
size: 16,
|
|
2092
|
+
bold: !0
|
|
2093
|
+
})), {
|
|
2094
|
+
svg: n.toString(A, j),
|
|
2095
|
+
w: Math.ceil(A),
|
|
2096
|
+
h: Math.ceil(j)
|
|
2097
|
+
};
|
|
2098
|
+
}
|
|
2099
|
+
function ve(e) {
|
|
2100
|
+
let t = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);
|
|
2101
|
+
return t ? "#" + [
|
|
2102
|
+
t[1],
|
|
2103
|
+
t[2],
|
|
2104
|
+
t[3]
|
|
2105
|
+
].map((e) => Math.round(parseInt(e, 16) * .22 + 198.9).toString(16).padStart(2, "0")).join("") : "#f1f3f7";
|
|
2106
|
+
}
|
|
2107
|
+
// src/core/diagram/sequence.ts
|
|
2108
|
+
var Y = (e) => Math.round(e * 100) / 100, ye = class {
|
|
2109
|
+
s = {
|
|
2110
|
+
participants: [],
|
|
2111
|
+
events: []
|
|
2112
|
+
};
|
|
2113
|
+
ids = /* @__PURE__ */ new Map();
|
|
2114
|
+
participant(e, t = {}) {
|
|
2115
|
+
let n = this.ids.get(e);
|
|
2116
|
+
n || (n = {
|
|
2117
|
+
id: e,
|
|
2118
|
+
label: e,
|
|
2119
|
+
kind: "participant"
|
|
2120
|
+
}, this.ids.set(e, n), this.s.participants.push(n));
|
|
2121
|
+
for (let [e, r] of Object.entries(t)) r !== void 0 && (n[e] = r);
|
|
2122
|
+
return n;
|
|
2123
|
+
}
|
|
2124
|
+
has(e) {
|
|
2125
|
+
return this.ids.has(e);
|
|
2126
|
+
}
|
|
2127
|
+
push(e) {
|
|
2128
|
+
e.t === "msg" ? (this.participant(e.from), this.participant(e.to)) : e.t === "note" ? e.who.forEach((e) => this.participant(e)) : (e.t === "act" || e.t === "destroy") && this.participant(e.who), this.s.events.push(e);
|
|
2129
|
+
}
|
|
2130
|
+
}, X = 14, Z = 13, be = i(Z), xe = 16, Se = (e) => e ? e.split("\n") : [];
|
|
2131
|
+
function Ce(e) {
|
|
2132
|
+
let t = Se(e.label), n = a(t, X);
|
|
2133
|
+
switch (e.kind) {
|
|
2134
|
+
case "actor": return {
|
|
2135
|
+
w: Math.max(44, n.w + 8),
|
|
2136
|
+
h: 44 + n.h,
|
|
2137
|
+
text: t
|
|
2138
|
+
};
|
|
2139
|
+
case "boundary":
|
|
2140
|
+
case "control":
|
|
2141
|
+
case "entity": return {
|
|
2142
|
+
w: Math.max(44, n.w + 8),
|
|
2143
|
+
h: 34 + n.h,
|
|
2144
|
+
text: t
|
|
2145
|
+
};
|
|
2146
|
+
case "database": return {
|
|
2147
|
+
w: Math.max(64, n.w + 24),
|
|
2148
|
+
h: n.h + 30,
|
|
2149
|
+
text: t
|
|
2150
|
+
};
|
|
2151
|
+
default: return {
|
|
2152
|
+
w: Math.max(64, n.w + 24),
|
|
2153
|
+
h: n.h + 18,
|
|
2154
|
+
text: t
|
|
2155
|
+
};
|
|
2156
|
+
}
|
|
2157
|
+
}
|
|
2158
|
+
function we(e, t, n, r, a) {
|
|
2159
|
+
let o = t.fill ?? u.fill, s = {
|
|
2160
|
+
fill: o,
|
|
2161
|
+
stroke: u.stroke,
|
|
2162
|
+
sw: 1.3
|
|
2163
|
+
}, c = {
|
|
2164
|
+
fill: "none",
|
|
2165
|
+
stroke: u.dark,
|
|
2166
|
+
sw: 1.5
|
|
2167
|
+
}, l = (t) => e.text(r, t + n.text.length * i(X) / 2, n.text, { anchor: "middle" }), d = r - n.w / 2;
|
|
2168
|
+
switch (t.kind) {
|
|
2169
|
+
case "actor":
|
|
2170
|
+
e.circle(r, a + 8, 7, {
|
|
2171
|
+
...c,
|
|
2172
|
+
fill: o
|
|
2173
|
+
}), e.line(r, a + 15, r, a + 29, c).line(r - 11, a + 20, r + 11, a + 20, c), e.line(r, a + 29, r - 9, a + 41, c).line(r, a + 29, r + 9, a + 41, c), l(a + 44);
|
|
2174
|
+
return;
|
|
2175
|
+
case "boundary":
|
|
2176
|
+
e.circle(r + 4, a + 14, 12, s).line(r - 14, a + 4, r - 14, a + 24, c).line(r - 14, a + 14, r - 8, a + 14, c), l(a + 32);
|
|
2177
|
+
return;
|
|
2178
|
+
case "control":
|
|
2179
|
+
e.circle(r, a + 15, 12, s).poly([
|
|
2180
|
+
[r + 4, a - 1],
|
|
2181
|
+
[r - 2, a + 3],
|
|
2182
|
+
[r + 4, a + 7]
|
|
2183
|
+
], c, !1), l(a + 32);
|
|
2184
|
+
return;
|
|
2185
|
+
case "entity":
|
|
2186
|
+
e.circle(r, a + 13, 12, s).line(r - 12, a + 27, r + 12, a + 27, c), l(a + 32);
|
|
2187
|
+
return;
|
|
2188
|
+
case "database": {
|
|
2189
|
+
let t = n.w, i = n.h;
|
|
2190
|
+
e.path(`M${Y(d)} ${Y(a + 6)} A${Y(t / 2)} 6 0 0 1 ${Y(d + t)} ${Y(a + 6)} L${Y(d + t)} ${Y(a + i - 6)} A${Y(t / 2)} 6 0 0 1 ${Y(d)} ${Y(a + i - 6)} Z`, s), e.path(`M${Y(d)} ${Y(a + 6)} A${Y(t / 2)} 6 0 0 0 ${Y(d + t)} ${Y(a + 6)}`, {
|
|
2191
|
+
...s,
|
|
2192
|
+
fill: "none"
|
|
2193
|
+
}), e.text(r, a + i / 2 + 3, n.text, { anchor: "middle" });
|
|
2194
|
+
return;
|
|
2195
|
+
}
|
|
2196
|
+
case "collections":
|
|
2197
|
+
e.rect(d + 4, a - 4, n.w, n.h, s, 3), e.rect(d, a, n.w, n.h, s, 3);
|
|
2198
|
+
break;
|
|
2199
|
+
case "queue":
|
|
2200
|
+
e.rect(d, a, n.w, n.h, s, n.h / 2);
|
|
2201
|
+
break;
|
|
2202
|
+
default: e.rect(d, a, n.w, n.h, s, 3);
|
|
2203
|
+
}
|
|
2204
|
+
e.text(r, a + n.h / 2, n.text, { anchor: "middle" });
|
|
2205
|
+
}
|
|
2206
|
+
function Te(e, t, n, r, i) {
|
|
2207
|
+
let a = u.line;
|
|
2208
|
+
switch (t) {
|
|
2209
|
+
case "filled":
|
|
2210
|
+
e.poly([
|
|
2211
|
+
[n, r],
|
|
2212
|
+
[n - i * 10, r - 4.5],
|
|
2213
|
+
[n - i * 10, r + 4.5]
|
|
2214
|
+
], {
|
|
2215
|
+
fill: a,
|
|
2216
|
+
stroke: a,
|
|
2217
|
+
sw: 1
|
|
2218
|
+
});
|
|
2219
|
+
break;
|
|
2220
|
+
case "open":
|
|
2221
|
+
e.poly([
|
|
2222
|
+
[n - i * 10, r - 5],
|
|
2223
|
+
[n, r],
|
|
2224
|
+
[n - i * 10, r + 5]
|
|
2225
|
+
], {
|
|
2226
|
+
stroke: a,
|
|
2227
|
+
sw: 1.4
|
|
2228
|
+
}, !1);
|
|
2229
|
+
break;
|
|
2230
|
+
case "half":
|
|
2231
|
+
e.poly([[n - i * 10, r - 5], [n, r]], {
|
|
2232
|
+
stroke: a,
|
|
2233
|
+
sw: 1.4
|
|
2234
|
+
}, !1);
|
|
2235
|
+
break;
|
|
2236
|
+
case "cross": e.line(n - 5 - i * 4, r - 5, n + 5 - i * 4, r + 5, {
|
|
2237
|
+
stroke: a,
|
|
2238
|
+
sw: 1.6
|
|
2239
|
+
}).line(n - 5 - i * 4, r + 5, n + 5 - i * 4, r - 5, {
|
|
2240
|
+
stroke: a,
|
|
2241
|
+
sw: 1.6
|
|
2242
|
+
});
|
|
2243
|
+
}
|
|
2244
|
+
}
|
|
2245
|
+
function Ee(e) {
|
|
2246
|
+
let t = e.participants;
|
|
2247
|
+
if (!t.length) throw new _("The sequence diagram has no participants");
|
|
2248
|
+
if (t.length > 300 || e.events.length > 8e3) throw new _("The sequence diagram is too large to draw");
|
|
2249
|
+
let n = new Map(t.map((e, t) => [e.id, t])), i = t.map(Ce), o = t.length, s = Array(o).fill(0);
|
|
2250
|
+
for (let e = 1; e < o; e++) s[e] = (i[e - 1].w + i[e].w) / 2 + 28;
|
|
2251
|
+
let c = 0, l = 0, d = (e, t, n) => {
|
|
2252
|
+
if (e > t && ([e, t] = [t, e]), e === t) return;
|
|
2253
|
+
let r = 0;
|
|
2254
|
+
for (let n = e + 1; n <= t; n++) r += s[n];
|
|
2255
|
+
if (r >= n) return;
|
|
2256
|
+
let i = (n - r) / (t - e);
|
|
2257
|
+
for (let n = e + 1; n <= t; n++) s[n] += i;
|
|
2258
|
+
}, f = (t) => e.autonumber ? r(String(t), 10) + 14 : 0, m = 0;
|
|
2259
|
+
for (let t of e.events) if (t.t === "msg") {
|
|
2260
|
+
m++;
|
|
2261
|
+
let e = n.get(t.from), a = n.get(t.to), s = Math.max(0, ...Se(t.text).map((e) => r(e, Z))) + f(m);
|
|
2262
|
+
e === a ? e + 1 < o ? d(e, e + 1, i[e + 1].w / 2 + s + 44) : l = Math.max(l, s + 44 - i[e].w / 2) : d(e, a, s + 30);
|
|
2263
|
+
} else if (t.t === "note") {
|
|
2264
|
+
let e = a(Se(t.text), Z).w + 20, r = t.who.map((e) => n.get(e)), s = Math.min(...r), u = Math.max(...r);
|
|
2265
|
+
t.pos === "over" ? s !== u && d(s, u, e - 50) : t.pos === "left" ? s > 0 ? d(s - 1, s, e + 16 + i[s - 1].w / 2) : c = Math.max(c, e + 16 - i[0].w / 2) : u + 1 < o ? d(u, u + 1, e + 16 + i[u + 1].w / 2) : l = Math.max(l, e + 16 - i[u].w / 2);
|
|
2266
|
+
}
|
|
2267
|
+
let h = [], g = (() => {
|
|
2268
|
+
let t = 0, n = 0;
|
|
2269
|
+
for (let r of e.events) r.t === "block" ? n = Math.max(n, ++t) : r.t === "end" && (t = Math.max(0, t - 1));
|
|
2270
|
+
return n;
|
|
2271
|
+
})(), v = g ? 12 + g * 8 : 0;
|
|
2272
|
+
h[0] = xe + Math.max(i[0].w / 2, c + i[0].w / 2, v + 10);
|
|
2273
|
+
for (let e = 1; e < o; e++) h[e] = h[e - 1] + s[e];
|
|
2274
|
+
let y = h[o - 1] + Math.max(i[o - 1].w / 2, l + i[o - 1].w / 2, v + 10) + xe, b = xe + (e.title ? 34 : 0), x = Math.max(...i.map((e) => e.h)), S = b + x + 18, C = new p(), w = new p(), T = new p(), E = t.map(() => []), D = [], O = [], k = [], A = /* @__PURE__ */ new Map(), j = (e, t) => {
|
|
2275
|
+
for (let n of k) n.lo = Math.min(n.lo, e), n.hi = Math.max(n.hi, t);
|
|
2276
|
+
}, ee = (e, t) => {
|
|
2277
|
+
let n = E[e].length;
|
|
2278
|
+
return h[e] + (n ? t * 5 + (n - 1) * 5 : 0);
|
|
2279
|
+
}, te = (e, t) => E[e].push(t), M = (e, t) => {
|
|
2280
|
+
let n = E[e].pop();
|
|
2281
|
+
n !== void 0 && D.push({
|
|
2282
|
+
k: e,
|
|
2283
|
+
y0: n,
|
|
2284
|
+
y1: t,
|
|
2285
|
+
depth: E[e].length
|
|
2286
|
+
});
|
|
2287
|
+
};
|
|
2288
|
+
m = 0;
|
|
2289
|
+
for (let t of e.events) switch (t.t) {
|
|
2290
|
+
case "msg": {
|
|
2291
|
+
m++;
|
|
2292
|
+
let i = n.get(t.from), a = n.get(t.to), o = Se(t.text), s = o.length * be, c = {
|
|
2293
|
+
stroke: u.line,
|
|
2294
|
+
sw: 1.4,
|
|
2295
|
+
dash: t.dashed ? "6 4" : void 0
|
|
2296
|
+
}, l = f(m);
|
|
2297
|
+
if (i === a) {
|
|
2298
|
+
S += s + 4;
|
|
2299
|
+
let n = ee(i, 1);
|
|
2300
|
+
w.poly([
|
|
2301
|
+
[n, S],
|
|
2302
|
+
[n + 34, S],
|
|
2303
|
+
[n + 34, S + 20],
|
|
2304
|
+
[n + 2, S + 20]
|
|
2305
|
+
], c, !1), Te(w, t.head, n, S + 20, -1), T.text(n + 6 + l, S - 4 - s / 2, o, { size: Z }), e.autonumber && De(T, n, S, m), j(h[i] - 10, n + 34 + 6 + l + Math.max(...o.map((e) => r(e, Z)))), S += 20, t.activate && te(a, S), t.deactivate && M(i, S), S += 14;
|
|
2306
|
+
break;
|
|
2307
|
+
}
|
|
2308
|
+
S += s + 6;
|
|
2309
|
+
let d = a > i ? 1 : -1;
|
|
2310
|
+
t.activate && te(a, S);
|
|
2311
|
+
let p = ee(i, d), g = ee(a, -d);
|
|
2312
|
+
w.line(p, S, g, S, c), Te(w, t.head, g, S, d), t.both && Te(w, t.head, p, S, -d), T.text((p + g) / 2 + d * l / 2, S - 5 - s / 2, o, {
|
|
2313
|
+
anchor: "middle",
|
|
2314
|
+
size: Z
|
|
2315
|
+
}), e.autonumber && De(T, p, S, m), t.deactivate && M(i, S), j(Math.min(h[i], h[a]), Math.max(h[i], h[a])), S += 14;
|
|
2316
|
+
break;
|
|
2317
|
+
}
|
|
2318
|
+
case "act": {
|
|
2319
|
+
let e = n.get(t.who);
|
|
2320
|
+
t.on ? te(e, S - 6) : M(e, S - 6);
|
|
2321
|
+
break;
|
|
2322
|
+
}
|
|
2323
|
+
case "note": {
|
|
2324
|
+
let e = t.who.map((e) => n.get(e)), r = Math.min(...e), i = Math.max(...e), o = Se(t.text), s = a(o, Z), c = Math.max(s.w + 20, t.pos === "over" && r !== i ? h[i] - h[r] + 50 : 0, 60), l = s.h + 12;
|
|
2325
|
+
S += 6;
|
|
2326
|
+
let d = t.pos === "left" ? h[r] - 12 - c : t.pos === "right" ? h[i] + 12 : (h[r] + h[i]) / 2 - c / 2;
|
|
2327
|
+
T.poly([
|
|
2328
|
+
[d, S],
|
|
2329
|
+
[d + c - 8, S],
|
|
2330
|
+
[d + c, S + 8],
|
|
2331
|
+
[d + c, S + l],
|
|
2332
|
+
[d, S + l]
|
|
2333
|
+
], {
|
|
2334
|
+
fill: u.note,
|
|
2335
|
+
stroke: u.noteStroke,
|
|
2336
|
+
sw: 1
|
|
2337
|
+
}), T.text(d + 10, S + l / 2, o, { size: Z }), j(d, d + c), S += l + 8;
|
|
2338
|
+
break;
|
|
2339
|
+
}
|
|
2340
|
+
case "block": {
|
|
2341
|
+
S += 10;
|
|
2342
|
+
let e = {
|
|
2343
|
+
kind: t.kind,
|
|
2344
|
+
label: t.label,
|
|
2345
|
+
fill: t.fill,
|
|
2346
|
+
y0: S,
|
|
2347
|
+
y1: S,
|
|
2348
|
+
lo: Infinity,
|
|
2349
|
+
hi: -Infinity,
|
|
2350
|
+
depth: k.length,
|
|
2351
|
+
elses: []
|
|
2352
|
+
};
|
|
2353
|
+
O.push(e), k.push(e), S += t.kind === "rect" ? 8 : 26;
|
|
2354
|
+
break;
|
|
2355
|
+
}
|
|
2356
|
+
case "else": {
|
|
2357
|
+
let e = k[k.length - 1];
|
|
2358
|
+
if (!e) break;
|
|
2359
|
+
S += 8, e.elses.push({
|
|
2360
|
+
y: S,
|
|
2361
|
+
label: t.label
|
|
2362
|
+
}), S += 24;
|
|
2363
|
+
break;
|
|
2364
|
+
}
|
|
2365
|
+
case "end": {
|
|
2366
|
+
let e = k.pop();
|
|
2367
|
+
if (!e) break;
|
|
2368
|
+
S += 10, e.y1 = S, S += 6;
|
|
2369
|
+
break;
|
|
2370
|
+
}
|
|
2371
|
+
case "divider": {
|
|
2372
|
+
S += 16;
|
|
2373
|
+
let e = a(Se(t.text), Z);
|
|
2374
|
+
T.line(xe / 2, S - 2, y - xe / 2, S - 2, {
|
|
2375
|
+
stroke: u.muted,
|
|
2376
|
+
sw: 1
|
|
2377
|
+
}).line(xe / 2, S + 2, y - xe / 2, S + 2, {
|
|
2378
|
+
stroke: u.muted,
|
|
2379
|
+
sw: 1
|
|
2380
|
+
}), t.text && (T.rect(y / 2 - e.w / 2 - 10, S - e.h / 2 - 4, e.w + 20, e.h + 8, {
|
|
2381
|
+
fill: "#ffffff",
|
|
2382
|
+
stroke: u.muted,
|
|
2383
|
+
sw: 1
|
|
2384
|
+
}, 3), T.text(y / 2, S, Se(t.text), {
|
|
2385
|
+
anchor: "middle",
|
|
2386
|
+
size: Z,
|
|
2387
|
+
bold: !0
|
|
2388
|
+
})), S += 22;
|
|
2389
|
+
break;
|
|
2390
|
+
}
|
|
2391
|
+
case "delay":
|
|
2392
|
+
S += 14, t.text && T.text(y / 2, S, Se(t.text), {
|
|
2393
|
+
anchor: "middle",
|
|
2394
|
+
size: Z,
|
|
2395
|
+
italic: !0,
|
|
2396
|
+
color: u.muted
|
|
2397
|
+
}), S += 18;
|
|
2398
|
+
break;
|
|
2399
|
+
case "space":
|
|
2400
|
+
S += t.h;
|
|
2401
|
+
break;
|
|
2402
|
+
case "destroy": {
|
|
2403
|
+
let e = n.get(t.who);
|
|
2404
|
+
S += 6, T.line(h[e] - 8, S - 8, h[e] + 8, S + 8, {
|
|
2405
|
+
stroke: "#c0392b",
|
|
2406
|
+
sw: 2
|
|
2407
|
+
}).line(h[e] - 8, S + 8, h[e] + 8, S - 8, {
|
|
2408
|
+
stroke: "#c0392b",
|
|
2409
|
+
sw: 2
|
|
2410
|
+
}), A.set(e, S), S += 14;
|
|
2411
|
+
break;
|
|
2412
|
+
}
|
|
2413
|
+
}
|
|
2414
|
+
for (let e = 0; e < o; e++) for (; E[e].length;) M(e, S);
|
|
2415
|
+
for (let e of k.splice(0)) e.y1 = S;
|
|
2416
|
+
S += 14;
|
|
2417
|
+
let ne = e.footer !== !1, re = S + (ne ? x : 0) + xe;
|
|
2418
|
+
for (let e of O) {
|
|
2419
|
+
let t = 12 + (g - e.depth) * 8;
|
|
2420
|
+
e.lo > e.hi && (e.lo = h[0], e.hi = h[o - 1]);
|
|
2421
|
+
let n = Math.max(4, e.lo - t), i = r(e.kind, 12, !0) + 16, a = [e.label ? i + 8 + r(`[${e.label}]`, 12) : i, ...e.elses.map((e) => 10 + r(`[${e.label}]`, 12))], s = Math.max(Math.min(y - 4, e.hi + t), e.kind === "rect" ? 0 : n + Math.max(...a) + 10);
|
|
2422
|
+
if (y = Math.max(y, s + 4), e.kind === "rect") {
|
|
2423
|
+
C.rect(n, e.y0, s - n, e.y1 - e.y0, { fill: e.fill ?? "rgba(200, 210, 230, 0.35)" }, 2);
|
|
2424
|
+
continue;
|
|
2425
|
+
}
|
|
2426
|
+
let c = {
|
|
2427
|
+
stroke: u.muted,
|
|
2428
|
+
sw: 1.2
|
|
2429
|
+
};
|
|
2430
|
+
w.rect(n, e.y0, s - n, e.y1 - e.y0, c);
|
|
2431
|
+
let l = i;
|
|
2432
|
+
w.poly([
|
|
2433
|
+
[n, e.y0],
|
|
2434
|
+
[n + l, e.y0],
|
|
2435
|
+
[n + l, e.y0 + 12],
|
|
2436
|
+
[n + l - 7, e.y0 + 19],
|
|
2437
|
+
[n, e.y0 + 19]
|
|
2438
|
+
], {
|
|
2439
|
+
fill: "#eef0f4",
|
|
2440
|
+
stroke: u.muted,
|
|
2441
|
+
sw: 1.2
|
|
2442
|
+
}), w.text(n + 7, e.y0 + 10, e.kind, {
|
|
2443
|
+
size: 12,
|
|
2444
|
+
bold: !0
|
|
2445
|
+
}), e.label && w.text(n + l + 8, e.y0 + 11, `[${e.label}]`, {
|
|
2446
|
+
size: 12,
|
|
2447
|
+
color: u.ink,
|
|
2448
|
+
italic: !0
|
|
2449
|
+
});
|
|
2450
|
+
for (let t of e.elses) w.line(n, t.y, s, t.y, {
|
|
2451
|
+
...c,
|
|
2452
|
+
dash: "5 4"
|
|
2453
|
+
}), t.label && w.text(n + 10, t.y + 12, `[${t.label}]`, {
|
|
2454
|
+
size: 12,
|
|
2455
|
+
italic: !0
|
|
2456
|
+
});
|
|
2457
|
+
}
|
|
2458
|
+
let N = new p(), P = b + x;
|
|
2459
|
+
for (let e = 0; e < o; e++) N.line(h[e], P, h[e], A.get(e) ?? (ne ? S : S - 6), {
|
|
2460
|
+
stroke: "#9aa3b2",
|
|
2461
|
+
sw: 1,
|
|
2462
|
+
dash: "5 4"
|
|
2463
|
+
});
|
|
2464
|
+
N.raw(C.body());
|
|
2465
|
+
for (let e of D) {
|
|
2466
|
+
let t = h[e.k] - 5 + e.depth * 5;
|
|
2467
|
+
N.rect(t, e.y0, 10, Math.max(8, e.y1 - e.y0), {
|
|
2468
|
+
fill: "#f3f4f6",
|
|
2469
|
+
stroke: u.stroke,
|
|
2470
|
+
sw: 1
|
|
2471
|
+
});
|
|
2472
|
+
}
|
|
2473
|
+
return N.raw(w.body()), N.raw(T.body()), t.forEach((e, t) => {
|
|
2474
|
+
we(N, e, i[t], h[t], b + x - i[t].h), ne && !A.has(t) && we(N, e, i[t], h[t], S);
|
|
2475
|
+
}), e.title && (y = Math.max(y, r(e.title, 16, !0) + 32), N.text(y / 2, 28, e.title, {
|
|
2476
|
+
anchor: "middle",
|
|
2477
|
+
size: 16,
|
|
2478
|
+
bold: !0
|
|
2479
|
+
})), {
|
|
2480
|
+
svg: N.toString(y, re),
|
|
2481
|
+
w: Math.ceil(y),
|
|
2482
|
+
h: Math.ceil(re)
|
|
2483
|
+
};
|
|
2484
|
+
}
|
|
2485
|
+
function De(e, t, n, i) {
|
|
2486
|
+
let a = Math.max(8, r(String(i), 10) / 2 + 4);
|
|
2487
|
+
e.circle(t, n, a, { fill: u.dark }), e.text(t, n, String(i), {
|
|
2488
|
+
anchor: "middle",
|
|
2489
|
+
size: 10,
|
|
2490
|
+
color: "#ffffff",
|
|
2491
|
+
bold: !0
|
|
2492
|
+
});
|
|
2493
|
+
}
|
|
2494
|
+
// src/core/diagram/model.ts
|
|
2495
|
+
function Oe(e) {
|
|
2496
|
+
switch (e.t) {
|
|
2497
|
+
case "graph": return F(e.graph);
|
|
2498
|
+
case "sequence": return Ee(e.seq);
|
|
2499
|
+
case "pie": return pe(e.pie);
|
|
2500
|
+
case "gantt": return he(e.gantt);
|
|
2501
|
+
case "tree": return _e(e.root, e.title);
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2504
|
+
// src/core/diagram/mermaid.ts
|
|
2505
|
+
function ke(e) {
|
|
2506
|
+
let t = e.replace(/^/, "").replace(/\r\n?/g, "\n"), n, r = /^\s*---\n([\s\S]*?)\n---[ \t]*(\n|$)/.exec(t);
|
|
2507
|
+
return r && (n = /^title:\s*(.+)$/m.exec(r[1])?.[1].trim().replace(/^(["'])(.*)\1$/, "$2"), t = t.slice(r[0].length)), t = t.replace(/%%\{[\s\S]*?\}%%/g, ""), {
|
|
2508
|
+
lines: t.split("\n").filter((e) => !/^\s*%%/.test(e)),
|
|
2509
|
+
title: n
|
|
2510
|
+
};
|
|
2511
|
+
}
|
|
2512
|
+
function Ae(e) {
|
|
2513
|
+
let { lines: t, title: n } = ke(e), r = t.findIndex((e) => e.trim());
|
|
2514
|
+
if (r < 0) throw new _("The diagram is empty");
|
|
2515
|
+
let i = t[r].trim(), a = /^[\w-]+/.exec(i)?.[0] ?? i, o = t.slice(r + 1);
|
|
2516
|
+
switch (a) {
|
|
2517
|
+
case "graph":
|
|
2518
|
+
case "flowchart":
|
|
2519
|
+
case "flowchart-elk": return {
|
|
2520
|
+
t: "graph",
|
|
2521
|
+
graph: He(i, o, n)
|
|
2522
|
+
};
|
|
2523
|
+
case "sequenceDiagram": return {
|
|
2524
|
+
t: "sequence",
|
|
2525
|
+
seq: Ge(o, n)
|
|
2526
|
+
};
|
|
2527
|
+
case "classDiagram":
|
|
2528
|
+
case "classDiagram-v2": return {
|
|
2529
|
+
t: "graph",
|
|
2530
|
+
graph: Je(o, n)
|
|
2531
|
+
};
|
|
2532
|
+
case "stateDiagram":
|
|
2533
|
+
case "stateDiagram-v2": return {
|
|
2534
|
+
t: "graph",
|
|
2535
|
+
graph: Ye(o, n)
|
|
2536
|
+
};
|
|
2537
|
+
case "erDiagram": return {
|
|
2538
|
+
t: "graph",
|
|
2539
|
+
graph: Qe(o, n)
|
|
2540
|
+
};
|
|
2541
|
+
case "pie": return {
|
|
2542
|
+
t: "pie",
|
|
2543
|
+
pie: $e(i, o, n)
|
|
2544
|
+
};
|
|
2545
|
+
case "gantt": return {
|
|
2546
|
+
t: "gantt",
|
|
2547
|
+
gantt: nt(o, n)
|
|
2548
|
+
};
|
|
2549
|
+
case "mindmap": return {
|
|
2550
|
+
t: "tree",
|
|
2551
|
+
root: it(o),
|
|
2552
|
+
title: n
|
|
2553
|
+
};
|
|
2554
|
+
default: throw new _(`Mermaid “${a}” diagrams are not supported yet`);
|
|
2555
|
+
}
|
|
2556
|
+
}
|
|
2557
|
+
var je = (e) => Oe(Ae(e)), Me = {
|
|
2558
|
+
TB: "TB",
|
|
2559
|
+
TD: "TB",
|
|
2560
|
+
BT: "BT",
|
|
2561
|
+
LR: "LR",
|
|
2562
|
+
RL: "RL"
|
|
2563
|
+
};
|
|
2564
|
+
function Q(e) {
|
|
2565
|
+
let t = e.trim();
|
|
2566
|
+
return /^".*"$/s.test(t) && (t = t.slice(1, -1)), /^`.*`$/s.test(t) && (t = g(t.slice(1, -1))), t = t.replace(/\bfa[bkrs]?:fa-[\w-]+\s*/g, ""), h(t).trim();
|
|
2567
|
+
}
|
|
2568
|
+
function Ne(e) {
|
|
2569
|
+
let t = {};
|
|
2570
|
+
for (let n of e.split(/,(?![^(]*\))/)) {
|
|
2571
|
+
let e = n.indexOf(":");
|
|
2572
|
+
if (e < 0) continue;
|
|
2573
|
+
let r = n.slice(0, e).trim().toLowerCase(), i = n.slice(e + 1).trim().replace(/;$/, "");
|
|
2574
|
+
r === "fill" || r === "background" ? t.fill = l(i) : r === "stroke" ? t.stroke = l(i) : r === "color" ? t.color = l(i) : r === "stroke-width" ? t.sw = Math.min(8, parseFloat(i) || 1) : r === "stroke-dasharray" ? t.dash = /^[\d.\s]+$/.test(i) ? i : "5 5" : r === "font-weight" ? t.bold = /bold|[6-9]00/.test(i) : r === "font-style" && (t.italic = i === "italic");
|
|
2575
|
+
}
|
|
2576
|
+
return t;
|
|
2577
|
+
}
|
|
2578
|
+
var Pe = (e, t) => {
|
|
2579
|
+
let n = { ...e };
|
|
2580
|
+
for (let [e, r] of Object.entries(t)) r !== void 0 && (n[e] = r);
|
|
2581
|
+
return n;
|
|
2582
|
+
};
|
|
2583
|
+
function Fe(e, t) {
|
|
2584
|
+
let n = [], r = 0, i = "", a = "";
|
|
2585
|
+
for (let o of e) {
|
|
2586
|
+
if (i) o === i && (i = "");
|
|
2587
|
+
else if (o === "\"" || o === "`") i = o;
|
|
2588
|
+
else if ("([{".includes(o)) r++;
|
|
2589
|
+
else if (")]}".includes(o)) r = Math.max(0, r - 1);
|
|
2590
|
+
else if (o === t && !r) {
|
|
2591
|
+
n.push(a), a = "";
|
|
2592
|
+
continue;
|
|
2593
|
+
}
|
|
2594
|
+
a += o;
|
|
2595
|
+
}
|
|
2596
|
+
return n.push(a), n;
|
|
2597
|
+
}
|
|
2598
|
+
var Ie = [
|
|
2599
|
+
[
|
|
2600
|
+
"(((",
|
|
2601
|
+
[")))"],
|
|
2602
|
+
["doublecircle"]
|
|
2603
|
+
],
|
|
2604
|
+
[
|
|
2605
|
+
"((",
|
|
2606
|
+
["))"],
|
|
2607
|
+
["circle"]
|
|
2608
|
+
],
|
|
2609
|
+
[
|
|
2610
|
+
"([",
|
|
2611
|
+
["])"],
|
|
2612
|
+
["stadium"]
|
|
2613
|
+
],
|
|
2614
|
+
[
|
|
2615
|
+
"[[",
|
|
2616
|
+
["]]"],
|
|
2617
|
+
["subroutine"]
|
|
2618
|
+
],
|
|
2619
|
+
[
|
|
2620
|
+
"[(",
|
|
2621
|
+
[")]"],
|
|
2622
|
+
["cylinder"]
|
|
2623
|
+
],
|
|
2624
|
+
[
|
|
2625
|
+
"{{",
|
|
2626
|
+
["}}"],
|
|
2627
|
+
["hexagon"]
|
|
2628
|
+
],
|
|
2629
|
+
[
|
|
2630
|
+
"[/",
|
|
2631
|
+
["/]", "\\]"],
|
|
2632
|
+
["lean-r", "trap-b"]
|
|
2633
|
+
],
|
|
2634
|
+
[
|
|
2635
|
+
"[\\",
|
|
2636
|
+
["\\]", "/]"],
|
|
2637
|
+
["lean-l", "trap-t"]
|
|
2638
|
+
],
|
|
2639
|
+
[
|
|
2640
|
+
"[",
|
|
2641
|
+
["]"],
|
|
2642
|
+
["rect"]
|
|
2643
|
+
],
|
|
2644
|
+
[
|
|
2645
|
+
"(",
|
|
2646
|
+
[")"],
|
|
2647
|
+
["round"]
|
|
2648
|
+
],
|
|
2649
|
+
[
|
|
2650
|
+
"{",
|
|
2651
|
+
["}"],
|
|
2652
|
+
["diamond"]
|
|
2653
|
+
],
|
|
2654
|
+
[
|
|
2655
|
+
">",
|
|
2656
|
+
["]"],
|
|
2657
|
+
["flag"]
|
|
2658
|
+
]
|
|
2659
|
+
], Le = {
|
|
2660
|
+
rect: "rect",
|
|
2661
|
+
rectangle: "rect",
|
|
2662
|
+
proc: "rect",
|
|
2663
|
+
process: "rect",
|
|
2664
|
+
rounded: "round",
|
|
2665
|
+
event: "round",
|
|
2666
|
+
stadium: "stadium",
|
|
2667
|
+
pill: "stadium",
|
|
2668
|
+
terminal: "stadium",
|
|
2669
|
+
subproc: "subroutine",
|
|
2670
|
+
subprocess: "subroutine",
|
|
2671
|
+
subroutine: "subroutine",
|
|
2672
|
+
"fr-rect": "subroutine",
|
|
2673
|
+
cyl: "cylinder",
|
|
2674
|
+
cylinder: "cylinder",
|
|
2675
|
+
database: "cylinder",
|
|
2676
|
+
db: "cylinder",
|
|
2677
|
+
circle: "circle",
|
|
2678
|
+
circ: "circle",
|
|
2679
|
+
"dbl-circ": "doublecircle",
|
|
2680
|
+
"double-circle": "doublecircle",
|
|
2681
|
+
diam: "diamond",
|
|
2682
|
+
diamond: "diamond",
|
|
2683
|
+
decision: "diamond",
|
|
2684
|
+
question: "diamond",
|
|
2685
|
+
hex: "hexagon",
|
|
2686
|
+
hexagon: "hexagon",
|
|
2687
|
+
prepare: "hexagon",
|
|
2688
|
+
"lean-r": "lean-r",
|
|
2689
|
+
"lean-right": "lean-r",
|
|
2690
|
+
"in-out": "lean-r",
|
|
2691
|
+
"lean-l": "lean-l",
|
|
2692
|
+
"lean-left": "lean-l",
|
|
2693
|
+
"out-in": "lean-l",
|
|
2694
|
+
"trap-b": "trap-b",
|
|
2695
|
+
trapezoid: "trap-b",
|
|
2696
|
+
priority: "trap-b",
|
|
2697
|
+
"trap-t": "trap-t",
|
|
2698
|
+
"inv-trapezoid": "trap-t",
|
|
2699
|
+
manual: "trap-t",
|
|
2700
|
+
odd: "flag",
|
|
2701
|
+
flag: "flag",
|
|
2702
|
+
doc: "note",
|
|
2703
|
+
document: "note",
|
|
2704
|
+
"sm-circ": "start",
|
|
2705
|
+
start: "start",
|
|
2706
|
+
"small-circle": "start",
|
|
2707
|
+
"fr-circ": "end",
|
|
2708
|
+
stop: "end",
|
|
2709
|
+
"framed-circle": "end",
|
|
2710
|
+
fork: "bar",
|
|
2711
|
+
join: "bar",
|
|
2712
|
+
text: "none",
|
|
2713
|
+
"notch-rect": "note",
|
|
2714
|
+
card: "note",
|
|
2715
|
+
"f-circ": "point",
|
|
2716
|
+
junction: "point"
|
|
2717
|
+
}, Re = /^[\p{L}\p{N}_$]+(?:-[\p{L}\p{N}_$]+)*/u;
|
|
2718
|
+
function ze(e, t, n) {
|
|
2719
|
+
for (; e[t] === " " || e[t] === " ";) t++;
|
|
2720
|
+
let r = Re.exec(e.slice(t));
|
|
2721
|
+
if (!r) return null;
|
|
2722
|
+
let i = r[0];
|
|
2723
|
+
t += i.length;
|
|
2724
|
+
let a = {};
|
|
2725
|
+
if (e.startsWith("@{", t)) {
|
|
2726
|
+
let n = e.indexOf("}", t);
|
|
2727
|
+
if (n > 0) {
|
|
2728
|
+
let r = e.slice(t + 2, n), i = /shape\s*:\s*["']?([\w-]+)/.exec(r)?.[1], o = /label\s*:\s*("([^"]*)"|'([^']*)'|[^,]+)/.exec(r);
|
|
2729
|
+
i && Le[i] && (a.shape = Le[i]), o && (a.label = Q(o[2] ?? o[3] ?? o[1])), t = n + 1;
|
|
2730
|
+
}
|
|
2731
|
+
} else for (let [n, r, i] of Ie) {
|
|
2732
|
+
if (!e.startsWith(n, t)) continue;
|
|
2733
|
+
let o = t + n.length, s = "";
|
|
2734
|
+
for (; e[o] === " ";) o++;
|
|
2735
|
+
if (e[o] === "\"") {
|
|
2736
|
+
let t = e.indexOf("\"", o + 1);
|
|
2737
|
+
if (t < 0) break;
|
|
2738
|
+
for (s = e.slice(o, t + 1), o = t + 1; e[o] === " ";) o++;
|
|
2739
|
+
}
|
|
2740
|
+
let c = -1, l = 0;
|
|
2741
|
+
if (r.forEach((t, n) => {
|
|
2742
|
+
let r = e.indexOf(t, o);
|
|
2743
|
+
r >= 0 && (c < 0 || r < c) && (c = r, l = n);
|
|
2744
|
+
}), c < 0) break;
|
|
2745
|
+
s ||= e.slice(o, c), a = {
|
|
2746
|
+
label: Q(s),
|
|
2747
|
+
shape: i[l]
|
|
2748
|
+
}, t = c + r[l].length;
|
|
2749
|
+
break;
|
|
2750
|
+
}
|
|
2751
|
+
let o = /^:::([\w-]+)/.exec(e.slice(t));
|
|
2752
|
+
if (o && (n.classes.set(i, [...n.classes.get(i) ?? [], o[1]]), t += o[0].length), !n.b.isCluster(i)) {
|
|
2753
|
+
let e = n.b.node(i, a), t = n.clusters[n.clusters.length - 1];
|
|
2754
|
+
t !== void 0 && t !== i && (e.cluster === void 0 || n.clusters.includes(e.cluster)) && (e.cluster = t);
|
|
2755
|
+
}
|
|
2756
|
+
return [i, t];
|
|
2757
|
+
}
|
|
2758
|
+
var Be = {
|
|
2759
|
+
">": "arrow",
|
|
2760
|
+
o: "circle",
|
|
2761
|
+
x: "cross"
|
|
2762
|
+
};
|
|
2763
|
+
function Ve(e, t) {
|
|
2764
|
+
let n = e.slice(t), r = /^\s*([<ox]?)(--|==|-\.)\s+(.+?)\s*(-{2,}|={2,}|\.+-)([>ox]?)(?=[\s\p{L}\p{N}_$"]|$)/u.exec(n), i, a = "", o = "", s = "", c = !1;
|
|
2765
|
+
if (r) [, a, , i, o, s] = r, c = r[2] === "-.";
|
|
2766
|
+
else {
|
|
2767
|
+
if (r = /^\s*(~{3,})/.exec(n), r) return [{
|
|
2768
|
+
line: "hidden",
|
|
2769
|
+
minlen: 1
|
|
2770
|
+
}, t + r[0].length];
|
|
2771
|
+
if (r = /^\s*([<ox]?)(-{2,}|={2,}|-\.+-)([>ox]?)(?![-=.])/.exec(n), !r) return null;
|
|
2772
|
+
[, a, o, s] = r, c = o.includes(".");
|
|
2773
|
+
}
|
|
2774
|
+
let l = r[0].length, u = /^\s*\|([^|]*)\|/.exec(n.slice(l));
|
|
2775
|
+
u && (i = u[1], l += u[0].length), (s === "x" || s === "o") && /^[\p{L}\p{N}_]/u.test(n.slice(l)) && !u && (s = "", l--);
|
|
2776
|
+
let d = o.includes("="), f = c ? (o.match(/\./g)?.length ?? 1) - 1 : o.length - (s ? 2 : 3);
|
|
2777
|
+
return [{
|
|
2778
|
+
label: i !== void 0 && i.trim() ? Q(i) : void 0,
|
|
2779
|
+
head: Be[s] ?? "none",
|
|
2780
|
+
tail: a === "<" ? "arrow" : a === "o" ? "circle" : a === "x" ? "cross" : "none",
|
|
2781
|
+
line: d ? "thick" : c ? "dashed" : "solid",
|
|
2782
|
+
minlen: 1 + Math.max(0, Math.min(f, 6))
|
|
2783
|
+
}, t + l];
|
|
2784
|
+
}
|
|
2785
|
+
function He(e, t, n) {
|
|
2786
|
+
let r = /^\w+\s+(\w+)/.exec(e)?.[1]?.toUpperCase(), i = new v(Me[r ?? "TB"] ?? "TB", "rect"), a = {
|
|
2787
|
+
b: i,
|
|
2788
|
+
clusters: [],
|
|
2789
|
+
classes: /* @__PURE__ */ new Map(),
|
|
2790
|
+
defs: /* @__PURE__ */ new Map()
|
|
2791
|
+
}, o = [], s = t.flatMap((e) => Fe(e, ";")).map((e) => e.trim()).filter(Boolean), c = Fe(e, ";").slice(1).map((e) => e.trim()).filter(Boolean);
|
|
2792
|
+
for (let e of [...c, ...s]) {
|
|
2793
|
+
let t;
|
|
2794
|
+
if (t = /^subgraph\s+(.*)$/.exec(e)) {
|
|
2795
|
+
let e = t[1].trim(), n = e, r = e, o = /^([^\s[]+)\s*\[(.*)\]$/.exec(e);
|
|
2796
|
+
o && (n = o[1], r = o[2]), r = Q(r), n = n.replace(/^"(.*)"$/, "$1");
|
|
2797
|
+
let s = a.clusters[a.clusters.length - 1];
|
|
2798
|
+
i.cluster(n, r, s), a.clusters.push(n);
|
|
2799
|
+
continue;
|
|
2800
|
+
}
|
|
2801
|
+
if (e === "end") {
|
|
2802
|
+
a.clusters.pop();
|
|
2803
|
+
continue;
|
|
2804
|
+
}
|
|
2805
|
+
if (/^direction\s+\w+$/.test(e)) continue;
|
|
2806
|
+
if (t = /^classDef\s+([\w,-]+)\s+(.+)$/.exec(e)) {
|
|
2807
|
+
for (let e of t[1].split(",")) a.defs.set(e.trim(), Pe(a.defs.get(e.trim()), Ne(t[2])));
|
|
2808
|
+
continue;
|
|
2809
|
+
}
|
|
2810
|
+
if (t = /^class\s+([^\s]+)\s+([\w-]+)$/.exec(e)) {
|
|
2811
|
+
for (let e of t[1].split(",")) a.classes.set(e.trim(), [...a.classes.get(e.trim()) ?? [], t[2]]);
|
|
2812
|
+
continue;
|
|
2813
|
+
}
|
|
2814
|
+
if (t = /^style\s+([^\s]+)\s+(.+)$/.exec(e)) {
|
|
2815
|
+
let e = Ne(t[2]);
|
|
2816
|
+
for (let n of t[1].split(",")) if (i.isCluster(n)) {
|
|
2817
|
+
let t = i.g.clusters.find((e) => e.id === n);
|
|
2818
|
+
t.style = Pe(t.style, e);
|
|
2819
|
+
} else i.node(n).style = Pe(i.get(n)?.style, e);
|
|
2820
|
+
continue;
|
|
2821
|
+
}
|
|
2822
|
+
if (t = /^linkStyle\s+([\d,\s]+|default)\s+(.+)$/.exec(e)) {
|
|
2823
|
+
o.push([t[1].trim(), Ne(t[2])]);
|
|
2824
|
+
continue;
|
|
2825
|
+
}
|
|
2826
|
+
if (/^(click|accTitle|accDescr|callback)\b/.test(e)) continue;
|
|
2827
|
+
let n = 0, r = [], s = null;
|
|
2828
|
+
for (;;) {
|
|
2829
|
+
let t = [];
|
|
2830
|
+
for (;;) {
|
|
2831
|
+
let r = ze(e, n, a);
|
|
2832
|
+
if (!r) break;
|
|
2833
|
+
t.push(r[0]), n = r[1];
|
|
2834
|
+
let i = /^\s*&\s*/.exec(e.slice(n));
|
|
2835
|
+
if (!i) break;
|
|
2836
|
+
n += i[0].length;
|
|
2837
|
+
}
|
|
2838
|
+
if (!t.length) break;
|
|
2839
|
+
if (s) for (let e of r) for (let n of t) i.edge({
|
|
2840
|
+
...s,
|
|
2841
|
+
from: e,
|
|
2842
|
+
to: n
|
|
2843
|
+
});
|
|
2844
|
+
r = t;
|
|
2845
|
+
let o = Ve(e, n);
|
|
2846
|
+
if (!o) break;
|
|
2847
|
+
s = o[0], n = o[1];
|
|
2848
|
+
}
|
|
2849
|
+
}
|
|
2850
|
+
let l = a.defs.get("default");
|
|
2851
|
+
for (let e of i.g.nodes) {
|
|
2852
|
+
let t = l ? Pe(void 0, l) : e.style;
|
|
2853
|
+
l && e.style && (t = Pe(t, e.style));
|
|
2854
|
+
for (let n of a.classes.get(e.id) ?? []) t = Pe(t, a.defs.get(n) ?? {});
|
|
2855
|
+
t && (e.style = t);
|
|
2856
|
+
}
|
|
2857
|
+
for (let e of i.g.clusters) for (let t of a.classes.get(e.id) ?? []) e.style = Pe(e.style, a.defs.get(t) ?? {});
|
|
2858
|
+
for (let [e, t] of o) {
|
|
2859
|
+
let n = e === "default" ? i.g.edges.map((e, t) => t) : e.split(",").map((e) => Number(e.trim()));
|
|
2860
|
+
for (let e of n) {
|
|
2861
|
+
let n = i.g.edges[e];
|
|
2862
|
+
n && (t.stroke && (n.color = t.stroke), t.sw && (n.sw = t.sw), t.dash && (n.line = "dashed"));
|
|
2863
|
+
}
|
|
2864
|
+
}
|
|
2865
|
+
return i.g.title = n, i.g;
|
|
2866
|
+
}
|
|
2867
|
+
var Ue = [
|
|
2868
|
+
[
|
|
2869
|
+
"<<-->>",
|
|
2870
|
+
!0,
|
|
2871
|
+
"filled",
|
|
2872
|
+
!0
|
|
2873
|
+
],
|
|
2874
|
+
[
|
|
2875
|
+
"<<->>",
|
|
2876
|
+
!1,
|
|
2877
|
+
"filled",
|
|
2878
|
+
!0
|
|
2879
|
+
],
|
|
2880
|
+
[
|
|
2881
|
+
"-->>",
|
|
2882
|
+
!0,
|
|
2883
|
+
"filled",
|
|
2884
|
+
!1
|
|
2885
|
+
],
|
|
2886
|
+
[
|
|
2887
|
+
"->>",
|
|
2888
|
+
!1,
|
|
2889
|
+
"filled",
|
|
2890
|
+
!1
|
|
2891
|
+
],
|
|
2892
|
+
[
|
|
2893
|
+
"--x",
|
|
2894
|
+
!0,
|
|
2895
|
+
"cross",
|
|
2896
|
+
!1
|
|
2897
|
+
],
|
|
2898
|
+
[
|
|
2899
|
+
"-x",
|
|
2900
|
+
!1,
|
|
2901
|
+
"cross",
|
|
2902
|
+
!1
|
|
2903
|
+
],
|
|
2904
|
+
[
|
|
2905
|
+
"--)",
|
|
2906
|
+
!0,
|
|
2907
|
+
"open",
|
|
2908
|
+
!1
|
|
2909
|
+
],
|
|
2910
|
+
[
|
|
2911
|
+
"-)",
|
|
2912
|
+
!1,
|
|
2913
|
+
"open",
|
|
2914
|
+
!1
|
|
2915
|
+
],
|
|
2916
|
+
[
|
|
2917
|
+
"-->",
|
|
2918
|
+
!0,
|
|
2919
|
+
"none",
|
|
2920
|
+
!1
|
|
2921
|
+
],
|
|
2922
|
+
[
|
|
2923
|
+
"->",
|
|
2924
|
+
!1,
|
|
2925
|
+
"none",
|
|
2926
|
+
!1
|
|
2927
|
+
]
|
|
2928
|
+
], We = {
|
|
2929
|
+
participant: "participant",
|
|
2930
|
+
actor: "actor",
|
|
2931
|
+
boundary: "boundary",
|
|
2932
|
+
control: "control",
|
|
2933
|
+
entity: "entity",
|
|
2934
|
+
database: "database",
|
|
2935
|
+
collections: "collections",
|
|
2936
|
+
queue: "queue"
|
|
2937
|
+
};
|
|
2938
|
+
function Ge(e, t) {
|
|
2939
|
+
let n = new ye();
|
|
2940
|
+
n.s.title = t;
|
|
2941
|
+
let r = [], i = RegExp(`^(.+?)\\s*(${Ue.map(([e]) => e.replace(/[()|]/g, "\\$&")).join("|")})\\s*([+-]?)\\s*([^:]+?)\\s*(?::(.*))?$`);
|
|
2942
|
+
for (let t of e) {
|
|
2943
|
+
let e = t.trim();
|
|
2944
|
+
if (!e) continue;
|
|
2945
|
+
let a;
|
|
2946
|
+
if (a = /^(?:create\s+)?(participant|actor)\s+(.+?)(?:@\{(.*)\})?(?:\s+as\s+(.+))?$/.exec(e)) {
|
|
2947
|
+
let e = a[2].trim(), t = a[3] ? /"type"\s*:\s*"(\w+)"/.exec(a[3])?.[1] : void 0;
|
|
2948
|
+
n.participant(e, {
|
|
2949
|
+
kind: We[t ?? a[1]] ?? "participant",
|
|
2950
|
+
label: a[4] ? Q(a[4]) : e
|
|
2951
|
+
});
|
|
2952
|
+
} else if (a = /^destroy\s+(.+)$/.exec(e)) n.push({
|
|
2953
|
+
t: "destroy",
|
|
2954
|
+
who: a[1].trim()
|
|
2955
|
+
});
|
|
2956
|
+
else if (/^autonumber\b/.test(e)) n.s.autonumber = !/\boff\b/.test(e);
|
|
2957
|
+
else if (a = /^title\s*:?\s*(.+)$/.exec(e)) n.s.title = Q(a[1]);
|
|
2958
|
+
else if (a = /^(activate|deactivate)\s+(.+)$/.exec(e)) n.push({
|
|
2959
|
+
t: "act",
|
|
2960
|
+
who: a[2].trim(),
|
|
2961
|
+
on: a[1] === "activate"
|
|
2962
|
+
});
|
|
2963
|
+
else if (a = /^note\s+(left of|right of|over)\s+([^:]+):(.*)$/i.exec(e)) {
|
|
2964
|
+
let e = a[1].toLowerCase().startsWith("left") ? "left" : a[1].toLowerCase().startsWith("right") ? "right" : "over";
|
|
2965
|
+
n.push({
|
|
2966
|
+
t: "note",
|
|
2967
|
+
pos: e,
|
|
2968
|
+
who: a[2].split(",").map((e) => e.trim()),
|
|
2969
|
+
text: Q(a[3])
|
|
2970
|
+
});
|
|
2971
|
+
} else if (a = /^box\b/.exec(e)) r.push("box");
|
|
2972
|
+
else if (a = /^(loop|alt|opt|par|par_over|critical|break|rect)\b\s*(.*)$/.exec(e)) {
|
|
2973
|
+
r.push("frag");
|
|
2974
|
+
let e = a[1] === "par_over" ? "par" : a[1];
|
|
2975
|
+
n.push({
|
|
2976
|
+
t: "block",
|
|
2977
|
+
kind: e,
|
|
2978
|
+
label: e === "rect" ? "" : Q(a[2]),
|
|
2979
|
+
fill: e === "rect" ? l(a[2]) : void 0
|
|
2980
|
+
});
|
|
2981
|
+
} else if (a = /^(else|and|option)\b\s*(.*)$/.exec(e)) n.push({
|
|
2982
|
+
t: "else",
|
|
2983
|
+
label: Q(a[2])
|
|
2984
|
+
});
|
|
2985
|
+
else if (e === "end") r.pop() === "frag" && n.push({ t: "end" });
|
|
2986
|
+
else if (a = i.exec(e)) {
|
|
2987
|
+
let e = Ue.find(([e]) => e === a[2]);
|
|
2988
|
+
n.push({
|
|
2989
|
+
t: "msg",
|
|
2990
|
+
from: a[1].trim(),
|
|
2991
|
+
to: a[4].trim(),
|
|
2992
|
+
text: Q(a[5] ?? ""),
|
|
2993
|
+
dashed: e[1],
|
|
2994
|
+
head: e[2],
|
|
2995
|
+
both: e[3],
|
|
2996
|
+
activate: a[3] === "+",
|
|
2997
|
+
deactivate: a[3] === "-"
|
|
2998
|
+
});
|
|
2999
|
+
}
|
|
3000
|
+
}
|
|
3001
|
+
return n.s;
|
|
3002
|
+
}
|
|
3003
|
+
var Ke = (e) => e.replace(/~([^~]*)~/g, "<$1>"), qe = {
|
|
3004
|
+
"<|": "triangle",
|
|
3005
|
+
"|>": "triangle",
|
|
3006
|
+
"*": "diamond",
|
|
3007
|
+
o: "odiamond",
|
|
3008
|
+
"<": "open",
|
|
3009
|
+
">": "open",
|
|
3010
|
+
"()": "ocircle"
|
|
3011
|
+
};
|
|
3012
|
+
function Je(e, t) {
|
|
3013
|
+
let n = new v("TB", "rect"), r = /* @__PURE__ */ new Map(), i = [], a = (e) => {
|
|
3014
|
+
let t = e.replace(/~.*~$/, "");
|
|
3015
|
+
return r.has(t) || r.set(t, {
|
|
3016
|
+
attrs: [],
|
|
3017
|
+
methods: [],
|
|
3018
|
+
label: e === t ? void 0 : Ke(e)
|
|
3019
|
+
}), n.node(t, {}, i[i.length - 1]), r.get(t);
|
|
3020
|
+
}, o = (e, t) => {
|
|
3021
|
+
let n = Ke(t.trim());
|
|
3022
|
+
if (!n) return;
|
|
3023
|
+
let r = /^<<(.+)>>$/.exec(n);
|
|
3024
|
+
r ? e.stereo = r[1] : n.includes("(") ? e.methods.push(n.replace(/[$*]$/, "")) : e.attrs.push(n.replace(/[$*]$/, ""));
|
|
3025
|
+
}, s = null, c = 0, l = /^([^\s"]+?)\s*(?:"([^"]*)"\s*)?(<\||\*|o|<|\(\))?(--|\.\.)(\|>|\*|o|>|\(\))?\s*(?:"([^"]*)"\s*)?([^\s":]+)\s*(?::\s*(.*))?$/;
|
|
3026
|
+
for (let t of e) {
|
|
3027
|
+
let e = t.trim();
|
|
3028
|
+
if (!e) continue;
|
|
3029
|
+
if (s) {
|
|
3030
|
+
e === "}" ? s = null : o(s, e);
|
|
3031
|
+
continue;
|
|
3032
|
+
}
|
|
3033
|
+
let r;
|
|
3034
|
+
if (r = /^direction\s+(\w+)$/.exec(e)) n.g.dir = Me[r[1].toUpperCase()] ?? "TB";
|
|
3035
|
+
else if (r = /^namespace\s+([\w.]+)\s*\{$/.exec(e)) n.cluster(r[1], r[1], i[i.length - 1]), i.push(r[1]);
|
|
3036
|
+
else if (e === "}" && i.length) i.pop();
|
|
3037
|
+
else if (r = /^class\s+([\w$~,<>.-]+?)(?:\["([^"]*)"\])?(?::::[\w-]+)?\s*(\{)?\s*(\})?$/.exec(e)) {
|
|
3038
|
+
let e = a(r[1]);
|
|
3039
|
+
r[2] && (e.label = r[2]), r[3] && !r[4] && (s = e);
|
|
3040
|
+
} else if (r = /^<<(.+)>>\s+(\S+)$/.exec(e)) a(r[2]).stereo = r[1];
|
|
3041
|
+
else if (r = /^note\s+(?:for\s+(\S+)\s+)?"(.*)"$/.exec(e)) {
|
|
3042
|
+
let e = `__note${c++}`;
|
|
3043
|
+
n.node(e, {
|
|
3044
|
+
label: Q(r[2]),
|
|
3045
|
+
shape: "note",
|
|
3046
|
+
style: {
|
|
3047
|
+
fill: "#fff6c8",
|
|
3048
|
+
stroke: "#c9a227"
|
|
3049
|
+
}
|
|
3050
|
+
}), r[1] && n.edge({
|
|
3051
|
+
from: e,
|
|
3052
|
+
to: r[1].replace(/~.*~$/, ""),
|
|
3053
|
+
line: "dashed",
|
|
3054
|
+
head: "none"
|
|
3055
|
+
});
|
|
3056
|
+
} else if (!/^(classDef|cssClass|click|callback|link|style)\b/.test(e)) {
|
|
3057
|
+
if (r = l.exec(e)) {
|
|
3058
|
+
let [, e, t, i, o, s, c, l, u] = r;
|
|
3059
|
+
a(e), a(l), n.edge({
|
|
3060
|
+
from: e.replace(/~.*~$/, ""),
|
|
3061
|
+
to: l.replace(/~.*~$/, ""),
|
|
3062
|
+
tail: i ? qe[i] : "none",
|
|
3063
|
+
head: s ? qe[s] : "none",
|
|
3064
|
+
line: o === ".." ? "dashed" : "solid",
|
|
3065
|
+
label: u ? Q(u) : void 0,
|
|
3066
|
+
tailLabel: t || void 0,
|
|
3067
|
+
headLabel: c || void 0
|
|
3068
|
+
});
|
|
3069
|
+
} else (r = /^([\w$~.-]+)\s*:\s*(.+)$/.exec(e)) && o(a(r[1]), r[2]);
|
|
3070
|
+
}
|
|
3071
|
+
}
|
|
3072
|
+
for (let e of n.g.nodes) {
|
|
3073
|
+
let t = r.get(e.id);
|
|
3074
|
+
if (!t) continue;
|
|
3075
|
+
let n = [];
|
|
3076
|
+
t.stereo && n.push([`«${t.stereo}»`]), n.push([t.label ?? e.id]);
|
|
3077
|
+
let i = [{
|
|
3078
|
+
rows: n,
|
|
3079
|
+
bold: !0,
|
|
3080
|
+
center: !0
|
|
3081
|
+
}];
|
|
3082
|
+
(t.attrs.length || t.methods.length) && i.push({ rows: t.attrs.map((e) => [e]) }, { rows: t.methods.map((e) => [e]) }), e.sections = i;
|
|
3083
|
+
}
|
|
3084
|
+
return n.g.title = t, n.g;
|
|
3085
|
+
}
|
|
3086
|
+
function Ye(e, t) {
|
|
3087
|
+
let n = new v("TB", "round"), r = [], i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s = 0, c = null, l = null, u = () => r[r.length - 1], d = (e, t) => {
|
|
3088
|
+
let r = e.trim(), i = /:::([\w-]+)$/.exec(r);
|
|
3089
|
+
if (i && (r = r.slice(0, i.index), o.set(r, [...o.get(r) ?? [], i[1]])), r === "[*]") {
|
|
3090
|
+
let e = `${u() ?? ""}__${t ? "end" : "start"}`;
|
|
3091
|
+
return n.node(e, {
|
|
3092
|
+
label: "",
|
|
3093
|
+
shape: t ? "end" : "start"
|
|
3094
|
+
}, u()), e;
|
|
3095
|
+
}
|
|
3096
|
+
return n.isCluster(r) || n.node(r, {}, u()), r;
|
|
3097
|
+
};
|
|
3098
|
+
for (let t of e) {
|
|
3099
|
+
let e = t.trim();
|
|
3100
|
+
if (c) {
|
|
3101
|
+
if (/^end\s*note$/i.test(e)) {
|
|
3102
|
+
let e = `__note${s++}`;
|
|
3103
|
+
n.node(e, {
|
|
3104
|
+
label: c.join("\n"),
|
|
3105
|
+
shape: "note",
|
|
3106
|
+
style: {
|
|
3107
|
+
fill: "#fff6c8",
|
|
3108
|
+
stroke: "#c9a227"
|
|
3109
|
+
}
|
|
3110
|
+
}, u()), l && n.edge({
|
|
3111
|
+
from: l.id,
|
|
3112
|
+
to: e,
|
|
3113
|
+
line: "dashed",
|
|
3114
|
+
head: "none"
|
|
3115
|
+
}), c = null;
|
|
3116
|
+
} else c.push(e);
|
|
3117
|
+
continue;
|
|
3118
|
+
}
|
|
3119
|
+
if (!e || e === "--") continue;
|
|
3120
|
+
let f;
|
|
3121
|
+
if (f = /^direction\s+(\w+)$/.exec(e)) r.length || (n.g.dir = Me[f[1].toUpperCase()] ?? "TB");
|
|
3122
|
+
else if (f = /^state\s+(?:"([^"]+)"\s+as\s+)?([\w.-]+)\s*(<<(fork|join|choice)>>)?\s*(\{)?$/.exec(e)) {
|
|
3123
|
+
let e = f[2];
|
|
3124
|
+
if (f[5]) {
|
|
3125
|
+
n.cluster(e, f[1] ? Q(f[1]) : e, u()), r.push(e);
|
|
3126
|
+
continue;
|
|
3127
|
+
}
|
|
3128
|
+
let t = f[4];
|
|
3129
|
+
n.node(e, t === "fork" || t === "join" ? {
|
|
3130
|
+
shape: "bar",
|
|
3131
|
+
label: ""
|
|
3132
|
+
} : t === "choice" ? {
|
|
3133
|
+
shape: "diamond",
|
|
3134
|
+
label: ""
|
|
3135
|
+
} : f[1] ? { label: Q(f[1]) } : {}, u());
|
|
3136
|
+
} else if (f = /^state\s+"([^"]+)"\s+as\s+([\w.-]+)\s*\{$/.exec(e)) n.cluster(f[2], Q(f[1]), u()), r.push(f[2]);
|
|
3137
|
+
else if (e === "}") r.pop();
|
|
3138
|
+
else if (f = /^note\s+(left of|right of|over)\s+([\w.-]+)\s*(?::\s*(.*))?$/i.exec(e)) {
|
|
3139
|
+
let e = f[2];
|
|
3140
|
+
if (f[3] !== void 0) {
|
|
3141
|
+
let t = `__note${s++}`;
|
|
3142
|
+
n.node(t, {
|
|
3143
|
+
label: Q(f[3]),
|
|
3144
|
+
shape: "note",
|
|
3145
|
+
style: {
|
|
3146
|
+
fill: "#fff6c8",
|
|
3147
|
+
stroke: "#c9a227"
|
|
3148
|
+
}
|
|
3149
|
+
}, u()), n.edge({
|
|
3150
|
+
from: e,
|
|
3151
|
+
to: t,
|
|
3152
|
+
line: "dashed",
|
|
3153
|
+
head: "none"
|
|
3154
|
+
});
|
|
3155
|
+
} else c = [], l = { id: e };
|
|
3156
|
+
} else if (f = /^classDef\s+([\w-]+)\s+(.+)$/.exec(e)) a.set(f[1], Ne(f[2]));
|
|
3157
|
+
else if (f = /^class\s+([\w,\s-]+?)\s+([\w-]+)$/.exec(e)) for (let e of f[1].split(",")) o.set(e.trim(), [...o.get(e.trim()) ?? [], f[2]]);
|
|
3158
|
+
else if (f = /^(.+?)\s*-->\s*([^:]+?)\s*(?::\s*(.*))?$/.exec(e)) {
|
|
3159
|
+
let e = d(f[1], !1), t = d(f[2], !0);
|
|
3160
|
+
n.edge({
|
|
3161
|
+
from: e,
|
|
3162
|
+
to: t,
|
|
3163
|
+
head: "arrow",
|
|
3164
|
+
label: f[3] ? Q(f[3]) : void 0
|
|
3165
|
+
});
|
|
3166
|
+
} else (f = /^([\w.-]+)\s*:\s*(.+)$/.exec(e)) ? (d(f[1], !1), i.set(f[1], [...i.get(f[1]) ?? [], Q(f[2])])) : (f = /^([\w.-]+)$/.exec(e)) && d(f[1], !1);
|
|
3167
|
+
}
|
|
3168
|
+
for (let e of n.g.nodes) {
|
|
3169
|
+
let t = i.get(e.id);
|
|
3170
|
+
t && e.shape === "round" && (e.sections = [{
|
|
3171
|
+
rows: [[e.label]],
|
|
3172
|
+
bold: !0,
|
|
3173
|
+
center: !0
|
|
3174
|
+
}, { rows: t.map((e) => [e]) }]);
|
|
3175
|
+
for (let t of o.get(e.id) ?? []) e.style = Pe(e.style, a.get(t) ?? {});
|
|
3176
|
+
}
|
|
3177
|
+
return n.g.title = t, n.g;
|
|
3178
|
+
}
|
|
3179
|
+
var Xe = {
|
|
3180
|
+
"|o": "zero-one",
|
|
3181
|
+
"o|": "zero-one",
|
|
3182
|
+
"||": "one",
|
|
3183
|
+
"}o": "zero-many",
|
|
3184
|
+
"o{": "zero-many",
|
|
3185
|
+
"}|": "one-many",
|
|
3186
|
+
"|{": "one-many"
|
|
3187
|
+
}, Ze = {
|
|
3188
|
+
"one or zero": "zero-one",
|
|
3189
|
+
"zero or one": "zero-one",
|
|
3190
|
+
"one or more": "one-many",
|
|
3191
|
+
"one or many": "one-many",
|
|
3192
|
+
"many(1)": "one-many",
|
|
3193
|
+
"1+": "one-many",
|
|
3194
|
+
"zero or more": "zero-many",
|
|
3195
|
+
"zero or many": "zero-many",
|
|
3196
|
+
"many(0)": "zero-many",
|
|
3197
|
+
"0+": "zero-many",
|
|
3198
|
+
"only one": "one",
|
|
3199
|
+
1: "one"
|
|
3200
|
+
};
|
|
3201
|
+
function Qe(e, t) {
|
|
3202
|
+
let n = new v("TB", "rect"), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = null, o = (e) => {
|
|
3203
|
+
let t = /^([\w-]+)(?:\[\s*"?([^"\]]*)"?\s*\])?$/.exec(e.trim().replace(/^"(.*)"$/, "$1")), a = t ? t[1] : e.trim().replace(/^"(.*)"$/, "$1");
|
|
3204
|
+
return t?.[2] && i.set(a, t[2]), n.node(a), r.has(a) || r.set(a, []), a;
|
|
3205
|
+
}, s = Object.keys(Ze).sort((e, t) => t.length - e.length).map((e) => e.replace(/[()+]/g, "\\$&")).join("|"), c = /^(\S+)\s+(\|o|\|\||\}o|\}\|)(--|\.\.)(o\||\|\||o\{|\|\{)\s+(\S+)\s*:\s*(.*)$/, l = RegExp(`^(\\S+)\\s+(${s})\\s+(to|optionally to)\\s+(${s})\\s+(\\S+)\\s*:\\s*(.*)$`, "i");
|
|
3206
|
+
for (let t of e) {
|
|
3207
|
+
let e = t.trim();
|
|
3208
|
+
if (!e) continue;
|
|
3209
|
+
if (a) {
|
|
3210
|
+
if (e === "}") {
|
|
3211
|
+
a = null;
|
|
3212
|
+
continue;
|
|
3213
|
+
}
|
|
3214
|
+
let t = /^(\S+)\s+(\S+)((?:\s+(?:PK|FK|UK)\s*,?)*)\s*(?:"(.*)")?$/.exec(e);
|
|
3215
|
+
t && r.get(a).push([
|
|
3216
|
+
t[1].replace(/~([^~]*)~/g, "<$1>"),
|
|
3217
|
+
t[2],
|
|
3218
|
+
t[3].replace(/\s+/g, " ").trim(),
|
|
3219
|
+
t[4] ?? ""
|
|
3220
|
+
]);
|
|
3221
|
+
continue;
|
|
3222
|
+
}
|
|
3223
|
+
let i;
|
|
3224
|
+
if (i = /^direction\s+(\w+)$/.exec(e)) n.g.dir = Me[i[1].toUpperCase()] ?? "TB";
|
|
3225
|
+
else if (i = /^(.+?)\s*\{$/.exec(e)) a = o(i[1]);
|
|
3226
|
+
else if (i = c.exec(e)) {
|
|
3227
|
+
let e = o(i[1]), t = o(i[5]);
|
|
3228
|
+
n.edge({
|
|
3229
|
+
from: e,
|
|
3230
|
+
to: t,
|
|
3231
|
+
tail: Xe[i[2]],
|
|
3232
|
+
head: Xe[i[4]],
|
|
3233
|
+
line: i[3] === ".." ? "dashed" : "solid",
|
|
3234
|
+
label: Q(i[6]) || void 0
|
|
3235
|
+
});
|
|
3236
|
+
} else if (i = l.exec(e)) {
|
|
3237
|
+
let e = o(i[1]), t = o(i[5]);
|
|
3238
|
+
n.edge({
|
|
3239
|
+
from: e,
|
|
3240
|
+
to: t,
|
|
3241
|
+
tail: Ze[i[2].toLowerCase()],
|
|
3242
|
+
head: Ze[i[4].toLowerCase()],
|
|
3243
|
+
line: i[3].toLowerCase() === "to" ? "solid" : "dashed",
|
|
3244
|
+
label: Q(i[6]) || void 0
|
|
3245
|
+
});
|
|
3246
|
+
} else (i = /^([\w-]+(?:\[[^\]]*\])?)$/.exec(e)) && o(i[1]);
|
|
3247
|
+
}
|
|
3248
|
+
for (let e of n.g.nodes) {
|
|
3249
|
+
let t = r.get(e.id) ?? [], n = t.map((e) => e.filter((e, t) => t < 2 || e));
|
|
3250
|
+
e.sections = [{
|
|
3251
|
+
rows: [[i.get(e.id) ?? e.id]],
|
|
3252
|
+
bold: !0,
|
|
3253
|
+
center: !0
|
|
3254
|
+
}], t.length && e.sections.push({ rows: n });
|
|
3255
|
+
}
|
|
3256
|
+
return n.g.title = t, n.g;
|
|
3257
|
+
}
|
|
3258
|
+
function $e(e, t, n) {
|
|
3259
|
+
let r = /\bshowData\b/.test(e), i = /\btitle\s+(.+)$/.exec(e)?.[1] ?? n, a = [];
|
|
3260
|
+
for (let e of t) {
|
|
3261
|
+
let t = e.trim(), n;
|
|
3262
|
+
(n = /^title\s+(.+)$/.exec(t)) ? i = n[1] : (n = /^"([^"]*)"\s*:\s*([-\d.eE+]+)$/.exec(t)) && a.push({
|
|
3263
|
+
label: Q(n[1]),
|
|
3264
|
+
value: Number(n[2])
|
|
3265
|
+
});
|
|
3266
|
+
}
|
|
3267
|
+
return {
|
|
3268
|
+
title: i ? Q(i) : void 0,
|
|
3269
|
+
showData: r,
|
|
3270
|
+
slices: a
|
|
3271
|
+
};
|
|
3272
|
+
}
|
|
3273
|
+
var et = {
|
|
3274
|
+
ms: 1,
|
|
3275
|
+
s: 1e3,
|
|
3276
|
+
m: 6e4,
|
|
3277
|
+
h: 36e5,
|
|
3278
|
+
d: 864e5,
|
|
3279
|
+
w: 6048e5,
|
|
3280
|
+
M: 2592e6,
|
|
3281
|
+
y: 31536e6
|
|
3282
|
+
};
|
|
3283
|
+
function tt(e, t) {
|
|
3284
|
+
if (e = e.trim(), t === "X") return Number(e) * 1e3;
|
|
3285
|
+
if (t === "x") return Number(e);
|
|
3286
|
+
let n = [], r = t.replace(/YYYY|YY|MM|M|DD|D|HH|H|mm|ss|SSS|[.*+?^${}()|[\]\\]/g, (e) => /^[.*+?^${}()|[\]\\]$/.test(e) ? "\\" + e : (n.push(e), e === "YYYY" ? "(\\d{4})" : e === "SSS" ? "(\\d{3})" : e.length === 1 ? "(\\d{1,2})" : "(\\d{2})")), i = RegExp(`^${r}$`).exec(e);
|
|
3287
|
+
if (!i) {
|
|
3288
|
+
let t = Date.parse(e.length === 10 ? e + "T00:00:00Z" : e);
|
|
3289
|
+
return Number.isFinite(t) ? t : void 0;
|
|
3290
|
+
}
|
|
3291
|
+
let a = {};
|
|
3292
|
+
n.forEach((e, t) => a[e[0]] = Number(i[t + 1]));
|
|
3293
|
+
let o = a.Y === void 0 ? 1970 : n.includes("YY") ? 2e3 + a.Y : a.Y;
|
|
3294
|
+
return Date.UTC(o, (a.M ?? 1) - 1, a.D ?? 1, a.H ?? 0, a.m ?? 0, a.s ?? 0, a.S ?? 0);
|
|
3295
|
+
}
|
|
3296
|
+
function nt(e, t) {
|
|
3297
|
+
let n = "YYYY-MM-DD", r = t, i = [], a = /* @__PURE__ */ new Map(), o, s = (() => {
|
|
3298
|
+
let e = /* @__PURE__ */ new Date();
|
|
3299
|
+
return Date.UTC(e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate());
|
|
3300
|
+
})();
|
|
3301
|
+
for (let t of e) {
|
|
3302
|
+
let e = t.trim();
|
|
3303
|
+
if (!e) continue;
|
|
3304
|
+
let c;
|
|
3305
|
+
if (c = /^dateFormat\s+(.+)$/.exec(e)) n = c[1].trim();
|
|
3306
|
+
else if (c = /^title\s+(.+)$/.exec(e)) r = c[1];
|
|
3307
|
+
else if (/^(axisFormat|tickInterval|excludes|includes|todayMarker|weekday|inclusiveEndDates|topAxis|displayMode)\b/.test(e)) continue;
|
|
3308
|
+
else if (c = /^section\s+(.*)$/.exec(e)) i.push({
|
|
3309
|
+
name: Q(c[1]),
|
|
3310
|
+
tasks: []
|
|
3311
|
+
});
|
|
3312
|
+
else if (c = /^(.+?)\s*:\s*(.+)$/.exec(e)) {
|
|
3313
|
+
let e = Q(c[1]), t = c[2].split(",").map((e) => e.trim()).filter(Boolean), r = {
|
|
3314
|
+
name: e,
|
|
3315
|
+
start: 0,
|
|
3316
|
+
end: 0
|
|
3317
|
+
};
|
|
3318
|
+
for (; t.length && /^(done|active|crit|milestone)$/.test(t[0]);) {
|
|
3319
|
+
let e = t.shift();
|
|
3320
|
+
r[e] = !0;
|
|
3321
|
+
}
|
|
3322
|
+
let l;
|
|
3323
|
+
t.length >= 3 && (l = t.shift());
|
|
3324
|
+
let u, d;
|
|
3325
|
+
t.length >= 2 ? [u, d] = t : d = t[0], t.length === 2 && !/^after\s/.test(u) && tt(u, n) === void 0 && !/^\d/.test(u) && (l = u, u = void 0), r.start = ((e) => {
|
|
3326
|
+
if (!e) return o ? o.end : s;
|
|
3327
|
+
let t = /^after\s+(.+)$/.exec(e);
|
|
3328
|
+
if (t) {
|
|
3329
|
+
let e = t[1].split(/\s+/).map((e) => a.get(e)?.end).filter((e) => e !== void 0);
|
|
3330
|
+
return e.length ? Math.max(...e) : o ? o.end : s;
|
|
3331
|
+
}
|
|
3332
|
+
return tt(e, n) ?? (o ? o.end : s);
|
|
3333
|
+
})(u);
|
|
3334
|
+
let f = d && /^([\d.]+)\s*(ms|s|m|h|d|w|M|y)$/.exec(d), p = d && /^until\s+(.+)$/.exec(d);
|
|
3335
|
+
r.end = f ? r.start + Number(f[1]) * et[f[2]] : p ? a.get(p[1].trim())?.start ?? r.start : d ? tt(d, n) ?? r.start + 864e5 : r.start + 864e5, r.milestone && (r.end = r.start), l && a.set(l, r), i.length || i.push({
|
|
3336
|
+
name: "",
|
|
3337
|
+
tasks: []
|
|
3338
|
+
}), i[i.length - 1].tasks.push(r), o = r;
|
|
3339
|
+
}
|
|
3340
|
+
}
|
|
3341
|
+
return {
|
|
3342
|
+
title: r ? Q(r) : void 0,
|
|
3343
|
+
sections: i
|
|
3344
|
+
};
|
|
3345
|
+
}
|
|
3346
|
+
var rt = [
|
|
3347
|
+
[/^[\w-]*\(\((.*)\)\)$/, "circle"],
|
|
3348
|
+
[/^[\w-]*\)\)(.*)\(\($/, "cloud"],
|
|
3349
|
+
[/^[\w-]*\)(.*)\($/, "cloud"],
|
|
3350
|
+
[/^[\w-]*\{\{(.*)\}\}$/, "hexagon"],
|
|
3351
|
+
[/^[\w-]*\[(.*)\]$/, "rect"],
|
|
3352
|
+
[/^[\w-]*\((.*)\)$/, "round"]
|
|
3353
|
+
];
|
|
3354
|
+
function it(e) {
|
|
3355
|
+
let t = [], n;
|
|
3356
|
+
for (let r of e) {
|
|
3357
|
+
if (!r.trim()) continue;
|
|
3358
|
+
let e = r.trim().replace(/:::[\w\s-]+$/, "").trim();
|
|
3359
|
+
if (/^::icon\(/.test(e) || !e) continue;
|
|
3360
|
+
let i = r.replace(/\t/g, " ").search(/\S/), a = e, o;
|
|
3361
|
+
for (let [t, n] of rt) {
|
|
3362
|
+
let r = t.exec(e);
|
|
3363
|
+
if (r) {
|
|
3364
|
+
a = r[1], o = n;
|
|
3365
|
+
break;
|
|
3366
|
+
}
|
|
3367
|
+
}
|
|
3368
|
+
let s = {
|
|
3369
|
+
label: Q(a),
|
|
3370
|
+
shape: o,
|
|
3371
|
+
children: []
|
|
3372
|
+
};
|
|
3373
|
+
if (!n) n = s, t.push({
|
|
3374
|
+
indent: i,
|
|
3375
|
+
n: s
|
|
3376
|
+
});
|
|
3377
|
+
else {
|
|
3378
|
+
for (; t.length > 1 && t[t.length - 1].indent >= i;) t.pop();
|
|
3379
|
+
t[t.length - 1].n.children.push(s), t.push({
|
|
3380
|
+
indent: i,
|
|
3381
|
+
n: s
|
|
3382
|
+
});
|
|
3383
|
+
}
|
|
3384
|
+
}
|
|
3385
|
+
if (!n) throw new _("The mind map is empty");
|
|
3386
|
+
return n;
|
|
3387
|
+
}
|
|
3388
|
+
// src/core/diagram/plantuml.ts
|
|
3389
|
+
function at(e) {
|
|
3390
|
+
let t = e.replace(/^/, "").replace(/\r\n?/g, "\n"), n = [], r = /^[ \t]*@start(\w+)[^\n]*\n([\s\S]*?)^[ \t]*@end\1\b/gm, i;
|
|
3391
|
+
for (; i = r.exec(t);) n.push({
|
|
3392
|
+
kind: i[1].toLowerCase(),
|
|
3393
|
+
lines: i[2].split("\n")
|
|
3394
|
+
});
|
|
3395
|
+
return n.length || n.push({
|
|
3396
|
+
kind: "uml",
|
|
3397
|
+
lines: t.split("\n")
|
|
3398
|
+
}), n;
|
|
3399
|
+
}
|
|
3400
|
+
function ot(e) {
|
|
3401
|
+
return at(e).map(({ kind: e, lines: t }) => ct(e, t));
|
|
3402
|
+
}
|
|
3403
|
+
var st = (e) => ot(e).map(Oe);
|
|
3404
|
+
function ct(e, t) {
|
|
3405
|
+
if (e === "dot") return {
|
|
3406
|
+
t: "graph",
|
|
3407
|
+
graph: le(t.join("\n"))[0]
|
|
3408
|
+
};
|
|
3409
|
+
let { lines: n, title: r, dir: i } = lt(t);
|
|
3410
|
+
switch (e) {
|
|
3411
|
+
case "uml": break;
|
|
3412
|
+
case "mindmap":
|
|
3413
|
+
case "wbs": return {
|
|
3414
|
+
t: "tree",
|
|
3415
|
+
root: Ct(n, e === "wbs"),
|
|
3416
|
+
title: r
|
|
3417
|
+
};
|
|
3418
|
+
default: throw new _(`PlantUML @start${e} diagrams are not supported yet`);
|
|
3419
|
+
}
|
|
3420
|
+
switch (ut(n)) {
|
|
3421
|
+
case "activity": return {
|
|
3422
|
+
t: "graph",
|
|
3423
|
+
graph: {
|
|
3424
|
+
...St(n),
|
|
3425
|
+
title: r
|
|
3426
|
+
}
|
|
3427
|
+
};
|
|
3428
|
+
case "sequence": return {
|
|
3429
|
+
t: "sequence",
|
|
3430
|
+
seq: {
|
|
3431
|
+
...ft(n),
|
|
3432
|
+
title: r
|
|
3433
|
+
}
|
|
3434
|
+
};
|
|
3435
|
+
case "state": return {
|
|
3436
|
+
t: "graph",
|
|
3437
|
+
graph: {
|
|
3438
|
+
...xt(n, i),
|
|
3439
|
+
title: r
|
|
3440
|
+
}
|
|
3441
|
+
};
|
|
3442
|
+
default: return {
|
|
3443
|
+
t: "graph",
|
|
3444
|
+
graph: {
|
|
3445
|
+
...bt(n, i),
|
|
3446
|
+
title: r
|
|
3447
|
+
}
|
|
3448
|
+
};
|
|
3449
|
+
}
|
|
3450
|
+
}
|
|
3451
|
+
function $(e) {
|
|
3452
|
+
return h(e.trim().replace(/^"(.*)"$/s, "$1").replace(/\*\*(.+?)\*\*|\/\/(.+?)\/\/|""(.+?)""|__(.+?)__|~~(.+?)~~|--(.+?)--/g, (...e) => e.slice(1, 7).find((e) => e !== void 0) ?? "").replace(/<\/?(?:b|i|u|s|font|color|size|back|code|plain|strike|w|sub|sup)\b[^>]*>/gi, "").replace(/<&[\w-]+>/g, "").replace(/\\t/g, " "));
|
|
3453
|
+
}
|
|
3454
|
+
function lt(e) {
|
|
3455
|
+
let t = [], n, r, i = null, a = null, o = !1;
|
|
3456
|
+
for (let s of e) {
|
|
3457
|
+
if (o) {
|
|
3458
|
+
let e = s.indexOf("'/");
|
|
3459
|
+
if (e < 0) continue;
|
|
3460
|
+
s = s.slice(e + 2), o = !1;
|
|
3461
|
+
}
|
|
3462
|
+
s = s.replace(/\/'.*?'\//g, "");
|
|
3463
|
+
let e = s.indexOf("/'");
|
|
3464
|
+
e >= 0 && (s = s.slice(0, e), o = !0);
|
|
3465
|
+
let c = s.trim();
|
|
3466
|
+
if (i) {
|
|
3467
|
+
i.test(c) && (i = null);
|
|
3468
|
+
continue;
|
|
3469
|
+
}
|
|
3470
|
+
if (a) {
|
|
3471
|
+
/^end\s*title$/i.test(c) ? (n = $(a.join("\n")), a = null) : a.push(c);
|
|
3472
|
+
continue;
|
|
3473
|
+
}
|
|
3474
|
+
if (!c || c.startsWith("'")) continue;
|
|
3475
|
+
let l;
|
|
3476
|
+
/^skinparam\b.*\{$/i.test(c) || /^(legend|header|footer)\b(?!.*:)/i.test(c) && !/^(header|footer)\s+\S/i.test(c) ? i = /^(\}|end\s*legend|endlegend|end\s*header|endheader|end\s*footer|endfooter)$/i : /^(skinparam|!|hide|show|scale|caption|header|footer|newpage|allowmixing|autoactivate|set\s+namespaceSeparator|page|mainframe|sprite|remove|restore|together|left\s+header|right\s+footer)\b/i.test(c) || ((l = /^title\s*:?\s*(.*)$/i.exec(c)) ? l[1] ? n = $(l[1]) : a = [] : /^left\s+to\s+right\s+direction$/i.test(c) ? r = "LR" : /^top\s+to\s+bottom\s+direction$/i.test(c) ? r = "TB" : t.push(c));
|
|
3477
|
+
}
|
|
3478
|
+
return {
|
|
3479
|
+
lines: t,
|
|
3480
|
+
title: n,
|
|
3481
|
+
dir: r
|
|
3482
|
+
};
|
|
3483
|
+
}
|
|
3484
|
+
function ut(e) {
|
|
3485
|
+
let t = (t) => e.some((e) => t.test(e));
|
|
3486
|
+
return t(/^(start|stop)$/) || t(/^:[\s\S]*[;|<>/\]}]$/) || t(/^:/) || t(/^(if\s*\(.*\)\s*then|while\s*\(|repeat\b|fork$|endif$)/) ? "activity" : t(/\[\*\]/) || t(/^state\s/) ? "state" : t(/^(participant|boundary|control|collections|queue|autonumber|activate|deactivate|alt|loop|return|ref\s+over)\b/) || t(/^(==.*==|\.\.\.|\|\|\d*\|\|)$/) ? "sequence" : t(/^(abstract|class|interface|enum|annotation|struct|protocol|object|map|json|usecase|component|node|cloud|package|namespace|folder|frame|rectangle|artifact|storage|card|file|agent|person|hexagon|together)\b/) || t(/\([^)]*\)|\[[^\]*]+\]|<\|--|--\|>|\*--|o--|\.\.>/) ? "description" : t(/^(actor|database|entity)\b/) || t(/^\S+\s*<?-{1,2}>?>?\s*\S+\s*:/) ? "sequence" : "description";
|
|
3487
|
+
}
|
|
3488
|
+
var dt = {
|
|
3489
|
+
participant: "participant",
|
|
3490
|
+
actor: "actor",
|
|
3491
|
+
boundary: "boundary",
|
|
3492
|
+
control: "control",
|
|
3493
|
+
entity: "entity",
|
|
3494
|
+
database: "database",
|
|
3495
|
+
collections: "collections",
|
|
3496
|
+
queue: "queue"
|
|
3497
|
+
};
|
|
3498
|
+
function ft(e) {
|
|
3499
|
+
let t = new ye(), n = [], r = null, i = null, a = null, o = (e) => e.trim().replace(/^"(.*)"$/, "$1");
|
|
3500
|
+
for (let s of e) {
|
|
3501
|
+
if (r) {
|
|
3502
|
+
/^end\s*(note|ref|rnote|hnote)$/i.test(s) ? (i && i.who.length && t.push({
|
|
3503
|
+
t: "note",
|
|
3504
|
+
pos: i.pos,
|
|
3505
|
+
who: i.who,
|
|
3506
|
+
text: $(r.join("\n"))
|
|
3507
|
+
}), r = null) : r.push(s);
|
|
3508
|
+
continue;
|
|
3509
|
+
}
|
|
3510
|
+
let e;
|
|
3511
|
+
if (e = /^(?:create\s+)?(participant|actor|boundary|control|entity|database|collections|queue)\s+(.+)$/.exec(s)) {
|
|
3512
|
+
let n = e[2].replace(/\s+order\s+-?\d+/, "").trim(), r = /\s+(#\w+)\s*$/.exec(n);
|
|
3513
|
+
r && (n = n.slice(0, r.index).trim()), n = n.replace(/<<[^>]*>>/g, "").trim();
|
|
3514
|
+
let i = n, a = n, s = /^"([^"]+)"\s+as\s+(\S+)$/.exec(n), c = /^(\S+)\s+as\s+"?([^"]+)"?$/.exec(n);
|
|
3515
|
+
s ? [i, a] = [s[2], s[1]] : c ? [i, a] = [c[1], c[2]] : i = a = o(n), t.participant(i, {
|
|
3516
|
+
kind: dt[e[1].toLowerCase()],
|
|
3517
|
+
label: $(a),
|
|
3518
|
+
fill: r ? l(r[1].slice(1)) ?? l(r[1]) : void 0
|
|
3519
|
+
});
|
|
3520
|
+
continue;
|
|
3521
|
+
}
|
|
3522
|
+
if (/^hide\s+footbox$/i.test(s)) {
|
|
3523
|
+
t.s.footer = !1;
|
|
3524
|
+
continue;
|
|
3525
|
+
}
|
|
3526
|
+
if (/^autonumber\b/i.test(s)) {
|
|
3527
|
+
t.s.autonumber = !/\bstop\b/i.test(s);
|
|
3528
|
+
continue;
|
|
3529
|
+
}
|
|
3530
|
+
if (e = /^(activate|deactivate|destroy)\s+(\S+)/i.exec(s)) {
|
|
3531
|
+
let n = o(e[2]);
|
|
3532
|
+
e[1].toLowerCase() === "destroy" ? t.push({
|
|
3533
|
+
t: "destroy",
|
|
3534
|
+
who: n
|
|
3535
|
+
}) : t.push({
|
|
3536
|
+
t: "act",
|
|
3537
|
+
who: n,
|
|
3538
|
+
on: e[1].toLowerCase() === "activate"
|
|
3539
|
+
});
|
|
3540
|
+
continue;
|
|
3541
|
+
}
|
|
3542
|
+
if (e = /^return\b\s*(.*)$/i.exec(s)) {
|
|
3543
|
+
let r = n.pop() ?? (a ? {
|
|
3544
|
+
from: a.from,
|
|
3545
|
+
to: a.to
|
|
3546
|
+
} : null);
|
|
3547
|
+
r && t.push({
|
|
3548
|
+
t: "msg",
|
|
3549
|
+
from: r.to,
|
|
3550
|
+
to: r.from,
|
|
3551
|
+
text: $(e[1]),
|
|
3552
|
+
dashed: !0,
|
|
3553
|
+
head: "filled",
|
|
3554
|
+
deactivate: !0
|
|
3555
|
+
});
|
|
3556
|
+
continue;
|
|
3557
|
+
}
|
|
3558
|
+
if ((e = /^[rh]?note\s+(left|right|over)(?:\s+of)?\s*([^:]*?)\s*(?:#\w+)?\s*(?::\s*(.*))?$/i.exec(s)) || (e = /^ref\s+over\s+()([^:]+?)\s*(?::\s*(.*))?$/i.exec(s))) {
|
|
3559
|
+
let n = (e[1] || "over").toLowerCase(), s = e[2] ? e[2].split(",").map(o).filter(Boolean) : [];
|
|
3560
|
+
!s.length && a && (s = [n === "left" ? a.from : a.to]), !s.length && t.s.participants.length && (s = [t.s.participants[0].id]), e[3] === void 0 ? (r = [], i = {
|
|
3561
|
+
pos: n,
|
|
3562
|
+
who: s
|
|
3563
|
+
}) : s.length && t.push({
|
|
3564
|
+
t: "note",
|
|
3565
|
+
pos: n,
|
|
3566
|
+
who: s,
|
|
3567
|
+
text: $(e[3])
|
|
3568
|
+
});
|
|
3569
|
+
continue;
|
|
3570
|
+
}
|
|
3571
|
+
if (e = /^note\s+across\s*:\s*(.*)$/i.exec(s)) {
|
|
3572
|
+
let n = t.s.participants;
|
|
3573
|
+
n.length && t.push({
|
|
3574
|
+
t: "note",
|
|
3575
|
+
pos: "over",
|
|
3576
|
+
who: [n[0].id, n[n.length - 1].id],
|
|
3577
|
+
text: $(e[1])
|
|
3578
|
+
});
|
|
3579
|
+
continue;
|
|
3580
|
+
}
|
|
3581
|
+
if (e = /^(alt|opt|loop|par|break|critical|group)\b\s*(.*)$/i.exec(s)) {
|
|
3582
|
+
let n = e[1].toLowerCase();
|
|
3583
|
+
t.push({
|
|
3584
|
+
t: "block",
|
|
3585
|
+
kind: n === "group" ? $(e[2]) || "group" : n,
|
|
3586
|
+
label: n === "group" ? "" : $(e[2])
|
|
3587
|
+
});
|
|
3588
|
+
continue;
|
|
3589
|
+
}
|
|
3590
|
+
if (e = /^else\b\s*(.*)$/i.exec(s)) {
|
|
3591
|
+
t.push({
|
|
3592
|
+
t: "else",
|
|
3593
|
+
label: $(e[1])
|
|
3594
|
+
});
|
|
3595
|
+
continue;
|
|
3596
|
+
}
|
|
3597
|
+
if (/^end$/i.test(s)) {
|
|
3598
|
+
t.push({ t: "end" });
|
|
3599
|
+
continue;
|
|
3600
|
+
}
|
|
3601
|
+
if (/^(box\b|end\s*box)/i.test(s)) continue;
|
|
3602
|
+
if (e = /^==\s*(.*?)\s*==$/.exec(s)) {
|
|
3603
|
+
t.push({
|
|
3604
|
+
t: "divider",
|
|
3605
|
+
text: $(e[1])
|
|
3606
|
+
});
|
|
3607
|
+
continue;
|
|
3608
|
+
}
|
|
3609
|
+
if (e = /^\.\.\.\s*(.*?)\s*(?:\.\.\.)?$/.exec(s)) {
|
|
3610
|
+
t.push({
|
|
3611
|
+
t: "delay",
|
|
3612
|
+
text: $(e[1])
|
|
3613
|
+
});
|
|
3614
|
+
continue;
|
|
3615
|
+
}
|
|
3616
|
+
if ((e = /^\|\|(\d*)\|\|$/.exec(s)) || s === "|||") {
|
|
3617
|
+
t.push({
|
|
3618
|
+
t: "space",
|
|
3619
|
+
h: e?.[1] ? Math.min(400, Number(e[1])) : 20
|
|
3620
|
+
});
|
|
3621
|
+
continue;
|
|
3622
|
+
}
|
|
3623
|
+
let c = mt(s);
|
|
3624
|
+
if (c) {
|
|
3625
|
+
let { from: e, to: r, dashed: i, head: o, both: s, act: l, text: u } = c;
|
|
3626
|
+
t.push({
|
|
3627
|
+
t: "msg",
|
|
3628
|
+
from: e,
|
|
3629
|
+
to: r,
|
|
3630
|
+
text: u,
|
|
3631
|
+
dashed: i,
|
|
3632
|
+
head: o,
|
|
3633
|
+
both: s,
|
|
3634
|
+
activate: l === "++",
|
|
3635
|
+
deactivate: l === "--"
|
|
3636
|
+
}), a = {
|
|
3637
|
+
from: e,
|
|
3638
|
+
to: r
|
|
3639
|
+
}, l === "++" && n.push({
|
|
3640
|
+
from: e,
|
|
3641
|
+
to: r
|
|
3642
|
+
}), l === "--" && n.length && n.pop(), l === "**" && t.participant(r), l === "!!" && t.push({
|
|
3643
|
+
t: "destroy",
|
|
3644
|
+
who: r
|
|
3645
|
+
});
|
|
3646
|
+
}
|
|
3647
|
+
}
|
|
3648
|
+
return t.s;
|
|
3649
|
+
}
|
|
3650
|
+
var pt = /^(\[|\]|[\w.$À-]+|"[^"]+")?\s*(<<?|[\\/]{1,2})?(-{1,2}|\.{1,2})(?:\[[^\]]*\])?(-?)(>>?|[\\/]{1,2})?\s*([ox])?\s*(\[|\]|[\w.$À-]+|"[^"]+")?\s*(\+\+|--|\*\*|!!)?\s*(?::\s*(.*))?$/u;
|
|
3651
|
+
function mt(e) {
|
|
3652
|
+
let t = pt.exec(e.replace(/^(\S+)\s*([ox])(?=<|-)/, "$1 "));
|
|
3653
|
+
if (!t) return null;
|
|
3654
|
+
let [, n, r, i, , a, , o, s, c] = t;
|
|
3655
|
+
if (!r && !a || !n || !o) return null;
|
|
3656
|
+
let l = (e) => e.replace(/^"(.*)"$/, "$1"), u = l(n), d = l(o);
|
|
3657
|
+
if (u === "[" || u === "]" || d === "[" || d === "]") return null;
|
|
3658
|
+
let f = i === "--" || i.startsWith("."), p = (e) => e ? e === ">>" || e === "<<" ? "open" : e.length && /[\\/]/.test(e) ? "half" : "filled" : "none", m, h = !1;
|
|
3659
|
+
return r && a ? (m = p(a), h = !0) : r ? ([u, d] = [d, u], m = p(r)) : m = p(a), /x\s*$/.test(e.split(":")[0].replace(o, "").trim()) && !r && (m = "cross"), {
|
|
3660
|
+
from: u,
|
|
3661
|
+
to: d,
|
|
3662
|
+
dashed: f,
|
|
3663
|
+
head: m,
|
|
3664
|
+
both: h,
|
|
3665
|
+
act: s,
|
|
3666
|
+
text: $(c ?? "")
|
|
3667
|
+
};
|
|
3668
|
+
}
|
|
3669
|
+
var ht = {
|
|
3670
|
+
actor: "actor",
|
|
3671
|
+
person: "actor",
|
|
3672
|
+
usecase: "ellipse",
|
|
3673
|
+
component: "component",
|
|
3674
|
+
node: "box3d",
|
|
3675
|
+
database: "cylinder",
|
|
3676
|
+
cloud: "cloud",
|
|
3677
|
+
folder: "folder",
|
|
3678
|
+
frame: "folder",
|
|
3679
|
+
package: "folder",
|
|
3680
|
+
artifact: "note",
|
|
3681
|
+
file: "note",
|
|
3682
|
+
storage: "stadium",
|
|
3683
|
+
queue: "stadium",
|
|
3684
|
+
stack: "rect",
|
|
3685
|
+
card: "rect",
|
|
3686
|
+
rectangle: "rect",
|
|
3687
|
+
agent: "rect",
|
|
3688
|
+
label: "none",
|
|
3689
|
+
boundary: "circle",
|
|
3690
|
+
control: "circle",
|
|
3691
|
+
entity: "rect",
|
|
3692
|
+
collections: "rect",
|
|
3693
|
+
hexagon: "hexagon",
|
|
3694
|
+
interface: "rect",
|
|
3695
|
+
circle: "circle",
|
|
3696
|
+
port: "point",
|
|
3697
|
+
portin: "point",
|
|
3698
|
+
portout: "point",
|
|
3699
|
+
action: "rect",
|
|
3700
|
+
process: "round",
|
|
3701
|
+
usecase_: "ellipse",
|
|
3702
|
+
object: "rect",
|
|
3703
|
+
map: "rect",
|
|
3704
|
+
json: "rect",
|
|
3705
|
+
diamond: "diamond",
|
|
3706
|
+
state: "round"
|
|
3707
|
+
}, gt = /* @__PURE__ */ new Set([
|
|
3708
|
+
"class",
|
|
3709
|
+
"abstract",
|
|
3710
|
+
"abstract class",
|
|
3711
|
+
"interface",
|
|
3712
|
+
"enum",
|
|
3713
|
+
"annotation",
|
|
3714
|
+
"struct",
|
|
3715
|
+
"protocol",
|
|
3716
|
+
"entity",
|
|
3717
|
+
"exception",
|
|
3718
|
+
"metaclass",
|
|
3719
|
+
"stereotype",
|
|
3720
|
+
"object",
|
|
3721
|
+
"map",
|
|
3722
|
+
"json"
|
|
3723
|
+
]), _t = {
|
|
3724
|
+
">": "arrow",
|
|
3725
|
+
"<": "arrow",
|
|
3726
|
+
"|>": "triangle",
|
|
3727
|
+
"<|": "triangle",
|
|
3728
|
+
"^": "triangle",
|
|
3729
|
+
"*": "diamond",
|
|
3730
|
+
o: "odiamond",
|
|
3731
|
+
"#": "odiamond",
|
|
3732
|
+
x: "cross",
|
|
3733
|
+
"+": "ocircle",
|
|
3734
|
+
"{": "many",
|
|
3735
|
+
"}": "many",
|
|
3736
|
+
">>": "open",
|
|
3737
|
+
"<<": "open",
|
|
3738
|
+
"|o": "zero-one",
|
|
3739
|
+
"o|": "zero-one",
|
|
3740
|
+
"||": "one",
|
|
3741
|
+
"}o": "zero-many",
|
|
3742
|
+
"o{": "zero-many",
|
|
3743
|
+
"}|": "one-many",
|
|
3744
|
+
"|{": "one-many"
|
|
3745
|
+
}, vt = String.raw`\[\*\]|\[[^\]]+\]|\([^)]*\)|:[^:]+:|"[^"]+"|\(\)\s*"[^"]+"|\(\)\s*[\w.]+|[\w.$À--]+`, yt = new RegExp(String.raw`^(${vt})\s*(?:"([^"]*)"\s*)?((?:<\||<<|\}o|\}\||\|o|\|\||[<*o#x+^}])?)([-.=~]+)(?:\[([^\]]*)\])?((?:up|down|left|right|u|d|l|r|le|ri|do)?)([-.=~]*)(?:\[([^\]]*)\])?((?:\|>|>>|o\{|\|\{|o\||\|\||[>*#+^{]|[ox](?=\s|\[|\(|"|:|$))?)\s*(?:"([^"]*)"\s*)?(${vt})\s*(?::\s*(.*))?$`, "u");
|
|
3746
|
+
function bt(e, t) {
|
|
3747
|
+
let n = new v(t ?? "TB", "rect"), r = /* @__PURE__ */ new Map(), i = [], a = [], o = null, s = null, c, u = "", d = 0, f = 0, p = () => i[i.length - 1], m = (e) => {
|
|
3748
|
+
let t = e.trim(), r;
|
|
3749
|
+
return t === "(*)" ? "start" : (r = /^\[(.+)\]$/.exec(t)) ? h(r[1], "component") : (r = /^\((.*)\)$/.exec(t)) ? h(r[1], "ellipse") : (r = /^:(.+):$/.exec(t)) ? h(r[1], "actor") : (r = /^\(\)\s*"?([^"]+)"?$/.exec(t)) ? h(r[1], "circle") : (t = t.replace(/^"(.*)"$/, "$1"), !n.has(t) && !n.isCluster(t) && n.node(t, { label: $(t) }, p()), t);
|
|
3750
|
+
}, h = (e, t) => {
|
|
3751
|
+
let r = e.trim();
|
|
3752
|
+
return !n.has(r) && !n.isCluster(r) && n.node(r, {
|
|
3753
|
+
label: $(r),
|
|
3754
|
+
shape: t
|
|
3755
|
+
}, p()), r;
|
|
3756
|
+
};
|
|
3757
|
+
for (let t of e) {
|
|
3758
|
+
if (s) {
|
|
3759
|
+
/^end\s*note$/i.test(t) ? (n.node(u, {
|
|
3760
|
+
label: $(s.join("\n")),
|
|
3761
|
+
shape: "note",
|
|
3762
|
+
style: {
|
|
3763
|
+
fill: "#fff6c8",
|
|
3764
|
+
stroke: "#c9a227"
|
|
3765
|
+
}
|
|
3766
|
+
}, p()), c && n.edge({
|
|
3767
|
+
from: c,
|
|
3768
|
+
to: u,
|
|
3769
|
+
line: "dashed",
|
|
3770
|
+
head: "none"
|
|
3771
|
+
}), s = null) : s.push(t);
|
|
3772
|
+
continue;
|
|
3773
|
+
}
|
|
3774
|
+
if (o) {
|
|
3775
|
+
if (t === "}") {
|
|
3776
|
+
o = null;
|
|
3777
|
+
continue;
|
|
3778
|
+
}
|
|
3779
|
+
/^(--|==|\.\.|__)(.*?)(--|==|\.\.|__)?$/.test(t) ? o.c.sections.push([]) : o.c.sections[o.c.sections.length - 1].push($(t.replace(/\{(static|abstract|classifier|field|method)\}\s*/g, "")));
|
|
3780
|
+
continue;
|
|
3781
|
+
}
|
|
3782
|
+
let e;
|
|
3783
|
+
if (t === "}" || /^end\s*(package|namespace|rectangle|node|folder|frame|together)$/i.test(t)) i.pop(), a.pop();
|
|
3784
|
+
else if (e = /^note\s+(left|right|top|bottom)(?:\s+of)?\s+(\S+?)\s*(?:#\w+)?\s*(?::\s*(.*))?$/i.exec(t)) {
|
|
3785
|
+
let t = m(e[2]), r = `__note${d++}`;
|
|
3786
|
+
e[3] === void 0 ? (s = [], c = t, u = r) : (n.node(r, {
|
|
3787
|
+
label: $(e[3]),
|
|
3788
|
+
shape: "note",
|
|
3789
|
+
style: {
|
|
3790
|
+
fill: "#fff6c8",
|
|
3791
|
+
stroke: "#c9a227"
|
|
3792
|
+
}
|
|
3793
|
+
}, p()), n.edge({
|
|
3794
|
+
from: t,
|
|
3795
|
+
to: r,
|
|
3796
|
+
line: "dashed",
|
|
3797
|
+
head: "none"
|
|
3798
|
+
}));
|
|
3799
|
+
} else if (e = /^note\s+"([^"]*)"\s+as\s+(\S+)$/i.exec(t)) n.node(e[2], {
|
|
3800
|
+
label: $(e[1]),
|
|
3801
|
+
shape: "note",
|
|
3802
|
+
style: {
|
|
3803
|
+
fill: "#fff6c8",
|
|
3804
|
+
stroke: "#c9a227"
|
|
3805
|
+
}
|
|
3806
|
+
}, p());
|
|
3807
|
+
else if (e = /^note\s+as\s+(\S+)$/i.exec(t)) s = [], c = void 0, u = e[1];
|
|
3808
|
+
else if (e = /^(package|namespace|rectangle|node|folder|frame|cloud|database|component|card|storage|artifact|file|stack|queue|agent|hexagon|together)\s*(?:"([^"]*)"|([^\s{<#]+))?\s*(?:as\s+(\S+))?\s*(<<[^>]*>>)?\s*(#\S+)?\s*\{$/.exec(t)) {
|
|
3809
|
+
let t = e[1].toLowerCase(), r = e[2] ?? e[3] ?? "", o = e[4] ?? (e[3] || e[2] || `__group${f++}`), s = n.cluster(o, t === "together" ? "" : $(r), p()), c = e[6] ? l(e[6].slice(1)) ?? l(e[6]) : void 0;
|
|
3810
|
+
c && (s.style = { fill: c }), t === "together" && (s.style = {
|
|
3811
|
+
fill: "none",
|
|
3812
|
+
stroke: "none"
|
|
3813
|
+
}), i.push(o), a.push(t);
|
|
3814
|
+
} else if ((e = /^(abstract\s+class|abstract|class|interface|enum|annotation|struct|protocol|entity|exception|metaclass|stereotype|object|map|json)\s+(?:"([^"]+)"\s+as\s+(\S+)|(\S+)\s+as\s+"([^"]+)"|([^\s{<#]+))(?:\s*<([^>]+)>)?\s*(<<.+?>>)?\s*(#\S+)?\s*(\{)?\s*(\})?$/.exec(t)) && gt.has(e[1].toLowerCase().replace(/\s+/, " "))) {
|
|
3815
|
+
let t = e[1].toLowerCase().replace(/\s+/, " "), i = e[3] ?? e[4] ?? e[6], a = e[2] ?? e[5] ?? i, s = e[7] ? `<${e[7]}>` : "";
|
|
3816
|
+
n.node(i, {
|
|
3817
|
+
label: $(a) + s,
|
|
3818
|
+
shape: "rect"
|
|
3819
|
+
}, p());
|
|
3820
|
+
let c = r.get(i) ?? {
|
|
3821
|
+
kind: t,
|
|
3822
|
+
sections: [[], []]
|
|
3823
|
+
};
|
|
3824
|
+
c.kind = t, e[8] && (c.stereo = e[8].replace(/^<<|>>$/g, "").trim());
|
|
3825
|
+
let u = e[9] ? l(e[9].slice(1)) ?? l(e[9]) : void 0;
|
|
3826
|
+
u && (n.node(i).style = { fill: u }), r.set(i, c), e[10] && !e[11] && (c.sections = [[]], o = {
|
|
3827
|
+
id: i,
|
|
3828
|
+
c
|
|
3829
|
+
});
|
|
3830
|
+
} else if (e = /^(actor\/?|usecase\/?|component|node|database|cloud|folder|frame|package|artifact|file|storage|queue|stack|card|rectangle|agent|label|boundary|control|entity|collections|hexagon|interface|circle|person|port|portin|portout|action|process|diamond)\s+(.+)$/.exec(t)) {
|
|
3831
|
+
let t = e[1].toLowerCase().replace("/", ""), r = e[2].trim(), i = /\s+(#[\w]+)\s*$/.exec(r);
|
|
3832
|
+
i && (r = r.slice(0, i.index).trim());
|
|
3833
|
+
let a = /\s*<<(.+?)>>\s*$/.exec(r);
|
|
3834
|
+
a && (r = r.slice(0, a.index).trim());
|
|
3835
|
+
let o = r, s = r, c = /^(.+?)\s+as\s+(.+)$/.exec(r);
|
|
3836
|
+
if (c) {
|
|
3837
|
+
let [e, t] = [c[1].trim(), c[2].trim()];
|
|
3838
|
+
/^["([:]/.test(e) ? [s, o] = [e, t] : [o, s] = [e, t];
|
|
3839
|
+
}
|
|
3840
|
+
s = s.replace(/^\((.*)\)$|^\[(.*)\]$|^:(.*):$/, "$1$2$3"), o = o.replace(/^\((.*)\)$|^\[(.*)\]$|^:(.*):$/, "$1$2$3").replace(/^"(.*)"$/, "$1");
|
|
3841
|
+
let u = t === "usecase" ? "ellipse" : t === "actor" ? "actor" : ht[t] ?? "rect", d = n.node(o, {
|
|
3842
|
+
label: $(s) + (a ? `\n«${a[1]}»` : ""),
|
|
3843
|
+
shape: u
|
|
3844
|
+
}, p()), f = i ? l(i[1].slice(1)) ?? l(i[1]) : void 0;
|
|
3845
|
+
f && (d.style = {
|
|
3846
|
+
...d.style,
|
|
3847
|
+
fill: f
|
|
3848
|
+
});
|
|
3849
|
+
} else if (e = /^(\[[^\]]+\]|\([^)]+\)|:[^:]+:)(?:\s+as\s+(\S+))?$/.exec(t)) {
|
|
3850
|
+
let t = m(e[1]);
|
|
3851
|
+
if (e[2]) {
|
|
3852
|
+
let r = n.get(t);
|
|
3853
|
+
n.node(e[2], {
|
|
3854
|
+
label: r.label,
|
|
3855
|
+
shape: r.shape
|
|
3856
|
+
}, p()), n.g.nodes.splice(n.g.nodes.indexOf(r), 1);
|
|
3857
|
+
}
|
|
3858
|
+
} else if (e = yt.exec(t)) {
|
|
3859
|
+
let [, t, r, i, a, , o, s, , c, l, u, d] = e, f = m(t), p = m(u), h = a + s, g = i ? _t[i] ?? "none" : "none", _ = c ? _t[c] ?? "none" : "none", v = r, y = l;
|
|
3860
|
+
/^(up|u|left|l|le)$/i.test(o) && ([f, p] = [p, f], [g, _] = [_, g], [v, y] = [y, v]);
|
|
3861
|
+
let b = {
|
|
3862
|
+
from: f,
|
|
3863
|
+
to: p,
|
|
3864
|
+
head: _,
|
|
3865
|
+
tail: g,
|
|
3866
|
+
line: h.includes(".") ? "dashed" : h.includes("=") ? "thick" : h.includes("~") ? "dotted" : "solid"
|
|
3867
|
+
};
|
|
3868
|
+
d && (b.label = $(d.replace(/\s*[<>]\s*$|^\s*[<>]\s*/g, ""))), v && (b.tailLabel = v), y && (b.headLabel = y), n.edge(b);
|
|
3869
|
+
} else if ((e = /^([\w.$]+)\s*:\s*(.+)$/.exec(t)) && (r.has(e[1]) || n.has(e[1]))) {
|
|
3870
|
+
let t = r.get(e[1]) ?? {
|
|
3871
|
+
kind: "class",
|
|
3872
|
+
sections: [[], []]
|
|
3873
|
+
};
|
|
3874
|
+
r.set(e[1], t);
|
|
3875
|
+
let n = $(e[2]);
|
|
3876
|
+
n.includes("(") && t.sections.length > 1 ? t.sections[1].push(n) : t.sections[0].push(n);
|
|
3877
|
+
}
|
|
3878
|
+
}
|
|
3879
|
+
let g = n.get("start");
|
|
3880
|
+
if (g && g.label === "start" && n.g.edges.some((e) => e.from === "start" || e.to === "start")) {
|
|
3881
|
+
g.shape = "start", g.label = "";
|
|
3882
|
+
let e = n.g.edges.filter((e) => e.to === "start");
|
|
3883
|
+
if (e.length) {
|
|
3884
|
+
n.node("__end", {
|
|
3885
|
+
shape: "end",
|
|
3886
|
+
label: ""
|
|
3887
|
+
});
|
|
3888
|
+
for (let t of e) t.to = "__end";
|
|
3889
|
+
}
|
|
3890
|
+
}
|
|
3891
|
+
for (let e of n.g.nodes) {
|
|
3892
|
+
let t = r.get(e.id);
|
|
3893
|
+
if (!t) continue;
|
|
3894
|
+
let n = [], i = t.stereo ?? (t.kind === "interface" ? "interface" : t.kind === "enum" ? "enumeration" : t.kind === "annotation" ? "annotation" : t.kind === "abstract" || t.kind === "abstract class" ? "abstract" : void 0);
|
|
3895
|
+
i && n.push([`«${i}»`]), n.push([e.label]);
|
|
3896
|
+
let a = [{
|
|
3897
|
+
rows: n,
|
|
3898
|
+
bold: !0,
|
|
3899
|
+
center: !0,
|
|
3900
|
+
italic: t.kind.startsWith("abstract")
|
|
3901
|
+
}];
|
|
3902
|
+
for (let e of t.sections) a.push({ rows: e.map((e) => [e]) });
|
|
3903
|
+
e.sections = a;
|
|
3904
|
+
}
|
|
3905
|
+
return n.g;
|
|
3906
|
+
}
|
|
3907
|
+
function xt(e, t) {
|
|
3908
|
+
let n = new v(t ?? "TB", "round"), r = [], i = /* @__PURE__ */ new Map(), a = 0, o = null, s, c = () => r[r.length - 1], u = (e, t) => {
|
|
3909
|
+
let r = e.trim().replace(/^"(.*)"$/, "$1");
|
|
3910
|
+
if (r === "[*]") {
|
|
3911
|
+
let e = `${c() ?? ""}__${t ? "end" : "start"}`;
|
|
3912
|
+
return n.node(e, {
|
|
3913
|
+
label: "",
|
|
3914
|
+
shape: t ? "end" : "start"
|
|
3915
|
+
}, c()), e;
|
|
3916
|
+
}
|
|
3917
|
+
return !n.isCluster(r) && !n.has(r) && n.node(r, { label: r }, c()), r;
|
|
3918
|
+
};
|
|
3919
|
+
for (let t of e) {
|
|
3920
|
+
if (o) {
|
|
3921
|
+
if (/^end\s*note$/i.test(t)) {
|
|
3922
|
+
let e = `__note${a++}`;
|
|
3923
|
+
n.node(e, {
|
|
3924
|
+
label: $(o.join("\n")),
|
|
3925
|
+
shape: "note",
|
|
3926
|
+
style: {
|
|
3927
|
+
fill: "#fff6c8",
|
|
3928
|
+
stroke: "#c9a227"
|
|
3929
|
+
}
|
|
3930
|
+
}, c()), s && n.edge({
|
|
3931
|
+
from: s,
|
|
3932
|
+
to: e,
|
|
3933
|
+
line: "dashed",
|
|
3934
|
+
head: "none"
|
|
3935
|
+
}), o = null;
|
|
3936
|
+
} else o.push(t);
|
|
3937
|
+
continue;
|
|
3938
|
+
}
|
|
3939
|
+
if (t === "--" || t === "||") continue;
|
|
3940
|
+
let e;
|
|
3941
|
+
if (e = /^state\s+(?:"([^"]+)"\s+as\s+(\S+?)|(\S+?)\s+as\s+"([^"]+)"|("[^"]+"|[^\s{<#]+))\s*(<<(\w+)>>)?\s*(#\S+)?\s*(\{)?$/i.exec(t)) {
|
|
3942
|
+
let t = (e[2] ?? e[3] ?? e[5]).replace(/^"(.*)"$/, "$1"), i = e[1] ?? e[4] ?? t, a = e[7]?.toLowerCase();
|
|
3943
|
+
if (e[9]) {
|
|
3944
|
+
n.cluster(t, $(i), c()), r.push(t);
|
|
3945
|
+
continue;
|
|
3946
|
+
}
|
|
3947
|
+
let o = a === "fork" || a === "join" ? "bar" : a === "choice" ? "diamond" : a === "start" || a === "entrypoint" ? "start" : a === "end" || a === "exitpoint" ? "end" : void 0;
|
|
3948
|
+
n.node(t, {
|
|
3949
|
+
label: o ? "" : $(i),
|
|
3950
|
+
shape: o
|
|
3951
|
+
}, c());
|
|
3952
|
+
let s = e[8] ? l(e[8].slice(1)) ?? l(e[8]) : void 0;
|
|
3953
|
+
s && (n.node(t).style = { fill: s });
|
|
3954
|
+
} else if (t === "}") r.pop();
|
|
3955
|
+
else if (e = /^note\s+(left|right|top|bottom)\s+of\s+(\S+)\s*(?::\s*(.*))?$/i.exec(t)) {
|
|
3956
|
+
if (e[3] !== void 0) {
|
|
3957
|
+
let t = `__note${a++}`;
|
|
3958
|
+
n.node(t, {
|
|
3959
|
+
label: $(e[3]),
|
|
3960
|
+
shape: "note",
|
|
3961
|
+
style: {
|
|
3962
|
+
fill: "#fff6c8",
|
|
3963
|
+
stroke: "#c9a227"
|
|
3964
|
+
}
|
|
3965
|
+
}, c()), n.edge({
|
|
3966
|
+
from: u(e[2], !1),
|
|
3967
|
+
to: t,
|
|
3968
|
+
line: "dashed",
|
|
3969
|
+
head: "none"
|
|
3970
|
+
});
|
|
3971
|
+
} else o = [], s = u(e[2], !1);
|
|
3972
|
+
} else if (e = /^(\[\*\]|"[^"]+"|[\w.$À-]+)\s*(-+|\.+)(?:\[[^\]]*\])?((?:up|down|left|right|u|d|l|r)?)(-*|\.*)(?:\[[^\]]*\])?>\s*(\[\*\]|"[^"]+"|[\w.$À-]+)\s*(?::\s*(.*))?$/u.exec(t)) {
|
|
3973
|
+
let t = u(e[1], !1), r = u(e[5], !0), i = !1;
|
|
3974
|
+
/^(up|u|left|l)$/i.test(e[3]) && ([t, r] = [r, t], i = !0), n.edge({
|
|
3975
|
+
from: t,
|
|
3976
|
+
to: r,
|
|
3977
|
+
head: i ? "none" : "arrow",
|
|
3978
|
+
tail: i ? "arrow" : "none",
|
|
3979
|
+
line: e[2].includes(".") ? "dashed" : "solid",
|
|
3980
|
+
label: e[6] ? $(e[6]) : void 0
|
|
3981
|
+
});
|
|
3982
|
+
} else (e = /^([\w.$À-]+)\s*:\s*(.+)$/u.exec(t)) && (u(e[1], !1), i.set(e[1], [...i.get(e[1]) ?? [], $(e[2])]));
|
|
3983
|
+
}
|
|
3984
|
+
for (let e of n.g.nodes) {
|
|
3985
|
+
let t = i.get(e.id);
|
|
3986
|
+
t && e.shape === "round" && (e.sections = [{
|
|
3987
|
+
rows: [[e.label]],
|
|
3988
|
+
bold: !0,
|
|
3989
|
+
center: !0
|
|
3990
|
+
}, { rows: t.map((e) => [e]) }]);
|
|
3991
|
+
}
|
|
3992
|
+
return n.g;
|
|
3993
|
+
}
|
|
3994
|
+
function St(e) {
|
|
3995
|
+
let t = new v("TB", "round"), n = [];
|
|
3996
|
+
for (let t = 0; t < e.length; t++) {
|
|
3997
|
+
let r = e[t];
|
|
3998
|
+
if (/^:/.test(r) && !/[;|<>/\]}]$/.test(r)) for (; t + 1 < e.length && !/[;|<>/\]}]$/.test(r);) r += "\n" + e[++t];
|
|
3999
|
+
n.push(r);
|
|
4000
|
+
}
|
|
4001
|
+
let r = 0, i = 0, a = [], o = (e, n = "") => {
|
|
4002
|
+
let r = `a${i++}`;
|
|
4003
|
+
return t.node(r, {
|
|
4004
|
+
shape: e,
|
|
4005
|
+
label: n
|
|
4006
|
+
}, a[a.length - 1]), r;
|
|
4007
|
+
}, s, c = (e, n) => {
|
|
4008
|
+
for (let r of e) t.edge({
|
|
4009
|
+
from: r.from,
|
|
4010
|
+
to: n,
|
|
4011
|
+
head: "arrow",
|
|
4012
|
+
label: r.label
|
|
4013
|
+
});
|
|
4014
|
+
}, l = (e) => $(e.replace(/^\((.*)\)$/, "$1")), u = (e, d) => {
|
|
4015
|
+
let f = e, p = (e) => {
|
|
4016
|
+
s !== void 0 && (f = f.map((e) => ({
|
|
4017
|
+
...e,
|
|
4018
|
+
label: e.label ?? s
|
|
4019
|
+
}))), s = void 0, c(f, e);
|
|
4020
|
+
};
|
|
4021
|
+
for (; r < n.length;) {
|
|
4022
|
+
let e = n[r];
|
|
4023
|
+
if (d.test(e)) return f;
|
|
4024
|
+
r++;
|
|
4025
|
+
let m;
|
|
4026
|
+
if (/^start$/i.test(e)) {
|
|
4027
|
+
let e = o("start");
|
|
4028
|
+
p(e), f = [{ from: e }];
|
|
4029
|
+
} else if (/^(stop|end)$/i.test(e)) p(o("end")), f = [];
|
|
4030
|
+
else if (/^(kill|detach|break)$/i.test(e)) f = [];
|
|
4031
|
+
else if (m = /^:([\s\S]*?)[;|<>/\]}]$/.exec(e)) {
|
|
4032
|
+
let e = o("round", $(m[1]));
|
|
4033
|
+
p(e), f = [{ from: e }];
|
|
4034
|
+
} else if (m = /^->\s*(.*?);?$/.exec(e)) s = $(m[1]) || void 0;
|
|
4035
|
+
else if ((m = /^if\s*(\(.*?\))\s*(?:then\s*(?:\((.*)\))?)?\s*$/i.exec(e)) || (m = /^if\s*(\(.*\))\s*(?:is\s*\((.*)\))?\s*then\s*$/i.exec(e))) {
|
|
4036
|
+
let e = o("diamond", l(m[1]));
|
|
4037
|
+
p(e);
|
|
4038
|
+
let i = u([{
|
|
4039
|
+
from: e,
|
|
4040
|
+
label: m[2] ? $(m[2]) : void 0
|
|
4041
|
+
}], /^(elseif|else\s*if|else|endif|end\s*if)\b/i), a = !0;
|
|
4042
|
+
for (; r < n.length;) {
|
|
4043
|
+
let s = n[r++], c;
|
|
4044
|
+
if (c = /^(?:elseif|else\s*if)\s*(\(.*?\))\s*(?:then\s*(?:\((.*)\))?)?$/i.exec(s)) {
|
|
4045
|
+
let n = o("diamond", l(c[1]));
|
|
4046
|
+
t.edge({
|
|
4047
|
+
from: e,
|
|
4048
|
+
to: n,
|
|
4049
|
+
head: "arrow"
|
|
4050
|
+
}), e = n, i = i.concat(u([{
|
|
4051
|
+
from: n,
|
|
4052
|
+
label: c[2] ? $(c[2]) : void 0
|
|
4053
|
+
}], /^(elseif|else\s*if|else|endif|end\s*if)\b/i));
|
|
4054
|
+
} else if (c = /^else\s*(?:\((.*)\))?$/i.exec(s)) i = i.concat(u([{
|
|
4055
|
+
from: e,
|
|
4056
|
+
label: c[1] ? $(c[1]) : void 0
|
|
4057
|
+
}], /^(endif|end\s*if)\b/i)), a = !1;
|
|
4058
|
+
else break;
|
|
4059
|
+
}
|
|
4060
|
+
a && i.push({ from: e }), f = i;
|
|
4061
|
+
} else if (m = /^switch\s*(\(.*\))$/i.exec(e)) {
|
|
4062
|
+
let e = o("diamond", l(m[1]));
|
|
4063
|
+
p(e);
|
|
4064
|
+
let t = [];
|
|
4065
|
+
for (; r < n.length;) {
|
|
4066
|
+
let i = n[r++], a = /^case\s*(\(.*\))$/i.exec(i);
|
|
4067
|
+
if (!a) break;
|
|
4068
|
+
t = t.concat(u([{
|
|
4069
|
+
from: e,
|
|
4070
|
+
label: l(a[1])
|
|
4071
|
+
}], /^(case\s*\(|endswitch)/i));
|
|
4072
|
+
}
|
|
4073
|
+
f = t;
|
|
4074
|
+
} else if (m = /^while\s*(\(.*?\))\s*(?:is\s*\((.*)\))?$/i.exec(e)) {
|
|
4075
|
+
let e = o("diamond", l(m[1]));
|
|
4076
|
+
p(e);
|
|
4077
|
+
let t = u([{
|
|
4078
|
+
from: e,
|
|
4079
|
+
label: m[2] ? $(m[2]) : void 0
|
|
4080
|
+
}], /^(endwhile|end\s*while)\b/i);
|
|
4081
|
+
c(t, e);
|
|
4082
|
+
let i = /^(?:endwhile|end\s*while)\s*(?:\((.*)\))?$/i.exec(n[r++] ?? "");
|
|
4083
|
+
f = [{
|
|
4084
|
+
from: e,
|
|
4085
|
+
label: i?.[1] ? $(i[1]) : void 0
|
|
4086
|
+
}];
|
|
4087
|
+
} else if ((m = /^repeat\s*(?::([\s\S]*?)[;|<>/\]}])?$/i.exec(e)) && !/^repeat\s*while/i.test(e)) {
|
|
4088
|
+
let e = m[1] === void 0 ? o("diamond", "") : o("round", $(m[1]));
|
|
4089
|
+
p(e);
|
|
4090
|
+
let i = u([{ from: e }], /^(repeat\s*while|backward)/i), a, s;
|
|
4091
|
+
(s = /^backward\s*:([\s\S]*?)[;|<>/\]}]$/i.exec(n[r] ?? "")) && (a = o("round", $(s[1])), r++);
|
|
4092
|
+
let d = /^repeat\s*while\s*(\(.*?\))?\s*(?:is\s*\((.*?)\))?\s*(?:not\s*\((.*?)\))?$/i.exec(n[r++] ?? ""), h = o("diamond", d?.[1] ? l(d[1]) : "");
|
|
4093
|
+
c(i, h), a ? (t.edge({
|
|
4094
|
+
from: h,
|
|
4095
|
+
to: a,
|
|
4096
|
+
head: "arrow",
|
|
4097
|
+
label: d?.[2] ? $(d[2]) : void 0
|
|
4098
|
+
}), t.edge({
|
|
4099
|
+
from: a,
|
|
4100
|
+
to: e,
|
|
4101
|
+
head: "arrow"
|
|
4102
|
+
})) : t.edge({
|
|
4103
|
+
from: h,
|
|
4104
|
+
to: e,
|
|
4105
|
+
head: "arrow",
|
|
4106
|
+
label: d?.[2] ? $(d[2]) : void 0
|
|
4107
|
+
}), f = [{
|
|
4108
|
+
from: h,
|
|
4109
|
+
label: d?.[3] ? $(d[3]) : void 0
|
|
4110
|
+
}];
|
|
4111
|
+
} else if (/^(fork|split)$/i.test(e)) {
|
|
4112
|
+
let t = /^fork$/i.test(e), i, a = f;
|
|
4113
|
+
t ? (i = o("bar"), p(i), a = [{ from: i }]) : s !== void 0 && (s = void 0);
|
|
4114
|
+
let l = [];
|
|
4115
|
+
for (;;) {
|
|
4116
|
+
l = l.concat(u(a, /^(fork\s+again|split\s+again|end\s*fork|end\s*merge|end\s*split)\b/i));
|
|
4117
|
+
let e = n[r++] ?? "";
|
|
4118
|
+
if (!/again/i.test(e)) break;
|
|
4119
|
+
}
|
|
4120
|
+
if (t) {
|
|
4121
|
+
let e = o("bar");
|
|
4122
|
+
c(l, e), f = [{ from: e }];
|
|
4123
|
+
} else f = l;
|
|
4124
|
+
} else if (m = /^(?:partition|group|package|rectangle|card)\s+(?:"([^"]*)"|(\S[^{]*?))\s*(?:#\S+)?\s*\{?$/i.exec(e)) {
|
|
4125
|
+
let e = (m[1] ?? m[2]).trim(), n = `__p${i++}`;
|
|
4126
|
+
t.cluster(n, $(e), a[a.length - 1]), a.push(n);
|
|
4127
|
+
} else if (e === "}" || /^end\s*group$/i.test(e)) a.pop();
|
|
4128
|
+
else if ((/^[rh]?note\b/i.test(e) || /^floating\s+note\b/i.test(e)) && !/:/.test(e)) for (; r < n.length && !/^end\s*note$/i.test(n[r++]););
|
|
4129
|
+
}
|
|
4130
|
+
return f;
|
|
4131
|
+
};
|
|
4132
|
+
return u([], /^\u0000$/), t.g;
|
|
4133
|
+
}
|
|
4134
|
+
function Ct(e, t) {
|
|
4135
|
+
let n = [], r;
|
|
4136
|
+
for (let i = 0; i < e.length; i++) {
|
|
4137
|
+
let a = e[i], o = /^([*+\-#]+)(_)?\s*(?:\[#[\w]+\])?\s*(.*)$/.exec(a);
|
|
4138
|
+
if (!o) continue;
|
|
4139
|
+
let s = o[3];
|
|
4140
|
+
if (s.startsWith(":")) {
|
|
4141
|
+
for (s = s.slice(1); !/;\s*$/.test(s) && i + 1 < e.length;) s += "\n" + e[++i];
|
|
4142
|
+
s = s.replace(/;\s*$/, "");
|
|
4143
|
+
}
|
|
4144
|
+
let c = o[1].length, l = o[1][0] === "-" ? "left" : "right", u = {
|
|
4145
|
+
label: $(s),
|
|
4146
|
+
shape: o[2] ? "none" : void 0,
|
|
4147
|
+
side: t ? void 0 : l,
|
|
4148
|
+
children: []
|
|
4149
|
+
};
|
|
4150
|
+
if (!r) r = u, n.push({
|
|
4151
|
+
depth: c,
|
|
4152
|
+
n: u
|
|
4153
|
+
});
|
|
4154
|
+
else {
|
|
4155
|
+
for (; n.length > 1 && n[n.length - 1].depth >= c;) n.pop();
|
|
4156
|
+
n[n.length - 1].n.children.push(u), n.push({
|
|
4157
|
+
depth: c,
|
|
4158
|
+
n: u
|
|
4159
|
+
});
|
|
4160
|
+
}
|
|
4161
|
+
}
|
|
4162
|
+
if (!r) throw new _("The mind map is empty");
|
|
4163
|
+
let i = (e, t) => e.children.forEach((e) => (t || (e.side = void 0), i(e, !1)));
|
|
4164
|
+
return i(r, !0), r;
|
|
4165
|
+
}
|
|
4166
|
+
// src/core/diagram/index.ts
|
|
4167
|
+
var wt = /^(?:(?:graph|flowchart)(?:\s+(?:TB|TD|BT|RL|LR))?\s*(?:;.*)?|(?:sequenceDiagram|classDiagram(?:-v2)?|stateDiagram(?:-v2)?|erDiagram|gantt|mindmap|journey|gitGraph|timeline|quadrantChart|requirementDiagram|C4Context|C4Container|C4Component|C4Dynamic|C4Deployment|sankey-beta|xychart-beta|block-beta|packet-beta|kanban|architecture-beta)\s*|pie(?:\s+showData)?(?:\s+title\s+.*)?\s*)$/, Tt = /^(strict\s+)?(di)?graph(\s+("[^"]*"|[\w.]+))?\s*\{/i;
|
|
4168
|
+
function Et(e) {
|
|
4169
|
+
if (/^\s*@start(uml|mindmap|wbs|dot|salt|gantt|json|yaml)\b/m.test(e.slice(0, 2e3))) return "plantuml";
|
|
4170
|
+
let t = e.replace(/^/, "").replace(/^\s*---\r?\n[\s\S]*?\r?\n---[ \t]*\r?\n/, "").replace(/%%\{[\s\S]*?\}%%/g, "").split(/\r?\n/).map((e) => e.trim()), n = e.replace(/\/\*[\s\S]*?\*\//g, "").split(/\r?\n/).map((e) => e.trim()).find((e) => e && !e.startsWith("//") && !e.startsWith("#"));
|
|
4171
|
+
if (n && (Tt.test(n) || /^(strict\s+)?(di)?graph(\s+("[^"]*"|[\w.]+))?\s*$/i.test(n) && /^\s*\{/m.test(e) && !wt.test(n))) return "graphviz";
|
|
4172
|
+
let r = t.find((e) => e && !e.startsWith("%%"));
|
|
4173
|
+
return r && wt.test(r) ? "mermaid" : null;
|
|
4174
|
+
}
|
|
4175
|
+
var Dt = 2e6;
|
|
4176
|
+
function Ot(e, t) {
|
|
4177
|
+
if (t.length > Dt) throw new _("The diagram is too large to draw");
|
|
4178
|
+
try {
|
|
4179
|
+
switch (e) {
|
|
4180
|
+
case "mermaid": return [je(t)];
|
|
4181
|
+
case "plantuml": return st(t);
|
|
4182
|
+
case "graphviz": return fe(t);
|
|
4183
|
+
}
|
|
4184
|
+
} catch (e) {
|
|
4185
|
+
throw e instanceof _ ? e : new _(e?.message || String(e));
|
|
4186
|
+
}
|
|
4187
|
+
}
|
|
4188
|
+
// packages/diagram/src/dom.ts
|
|
4189
|
+
async function kt(e, t = 2) {
|
|
4190
|
+
let n = (t) => Number(RegExp(`<svg[^>]*\\s${t}="([\\d.]+)"`).exec(e)?.[1] ?? 0), r = n("width"), i = n("height");
|
|
4191
|
+
if (!r || !i) throw Error("Not a picture with a size");
|
|
4192
|
+
let a = new Image();
|
|
4193
|
+
a.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`, await a.decode();
|
|
4194
|
+
let o = document.createElement("canvas");
|
|
4195
|
+
o.width = Math.max(1, Math.round(r * t)), o.height = Math.max(1, Math.round(i * t));
|
|
4196
|
+
let s = o.getContext("2d");
|
|
4197
|
+
if (!s) throw Error("No 2D canvas");
|
|
4198
|
+
return s.scale(t, t), s.drawImage(a, 0, 0, r, i), new Promise((e, t) => o.toBlob((n) => n ? e(n) : t(/* @__PURE__ */ Error("PNG export failed")), "image/png"));
|
|
4199
|
+
}
|
|
4200
|
+
function At(e, t) {
|
|
4201
|
+
e.innerHTML = t.join("");
|
|
4202
|
+
}
|
|
4203
|
+
// packages/diagram/src/index.ts
|
|
4204
|
+
var jt = class extends Error {
|
|
4205
|
+
constructor(e) {
|
|
4206
|
+
super(e), this.name = "DiagramError";
|
|
4207
|
+
}
|
|
4208
|
+
};
|
|
4209
|
+
function Mt(e) {
|
|
4210
|
+
return Et(e);
|
|
4211
|
+
}
|
|
4212
|
+
function Nt(e, t) {
|
|
4213
|
+
let n = t ?? Et(e);
|
|
4214
|
+
if (!n) throw new jt("Not a Mermaid, PlantUML or Graphviz diagram");
|
|
4215
|
+
try {
|
|
4216
|
+
return Ot(n, e).map((e) => ({
|
|
4217
|
+
svg: e.svg,
|
|
4218
|
+
width: e.w,
|
|
4219
|
+
height: e.h
|
|
4220
|
+
}));
|
|
4221
|
+
} catch (e) {
|
|
4222
|
+
throw new jt(e.message);
|
|
4223
|
+
}
|
|
4224
|
+
}
|
|
4225
|
+
function Pt(e, t) {
|
|
4226
|
+
return Nt(e, t)[0];
|
|
4227
|
+
}
|
|
4228
|
+
function Ft(e, t, n) {
|
|
4229
|
+
let r = Nt(t, n);
|
|
4230
|
+
return At(e, r.map((e) => e.svg)), r;
|
|
4231
|
+
}
|
|
4232
|
+
var It = [
|
|
4233
|
+
[".mermaid", "mermaid"],
|
|
4234
|
+
[".language-mermaid", "mermaid"],
|
|
4235
|
+
[".plantuml", "plantuml"],
|
|
4236
|
+
[".language-plantuml", "plantuml"],
|
|
4237
|
+
[".language-puml", "plantuml"],
|
|
4238
|
+
[".graphviz", "graphviz"],
|
|
4239
|
+
[".language-graphviz", "graphviz"],
|
|
4240
|
+
[".language-dot", "graphviz"],
|
|
4241
|
+
[".diagram", null]
|
|
4242
|
+
];
|
|
4243
|
+
function Lt(e = document) {
|
|
4244
|
+
let t = 0;
|
|
4245
|
+
for (let [n, r] of It) for (let i of Array.from(e.querySelectorAll(n))) {
|
|
4246
|
+
if (!i.isConnected || i.hasAttribute("data-diagram-error") || i.closest("figure.diagram")) continue;
|
|
4247
|
+
let e = i.tagName === "CODE" && i.parentElement?.tagName === "PRE" ? i.parentElement : i, n = i.textContent ?? "";
|
|
4248
|
+
try {
|
|
4249
|
+
let a = Nt(n, r ?? void 0), o = i.ownerDocument.createElement("figure");
|
|
4250
|
+
o.className = `diagram diagram-${r ?? Et(n)}`, At(o, a.map((e) => e.svg)), e.replaceWith(o), t++;
|
|
4251
|
+
} catch (e) {
|
|
4252
|
+
i.setAttribute("data-diagram-error", e.message);
|
|
4253
|
+
}
|
|
4254
|
+
}
|
|
4255
|
+
return t;
|
|
4256
|
+
}
|
|
4257
|
+
function Rt(e, t = 2) {
|
|
4258
|
+
return kt(e, t);
|
|
4259
|
+
}
|
|
4260
|
+
export { jt as DiagramError, Mt as detect, Pt as render, Nt as renderEach, Lt as renderPage, Ft as renderTo, Rt as toPng };
|
|
4261
|
+
|
|
4262
|
+
//# sourceMappingURL=index.js.map
|