@p10node/graphviz 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 +49 -2
- package/dist/index.d.ts +18 -0
- package/dist/index.js +1882 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -4
package/dist/index.js
ADDED
|
@@ -0,0 +1,1882 @@
|
|
|
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), ee = (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), k = [], A = [], te = (e, t, n) => {
|
|
83
|
+
for (; k.length < S.length;) k.push([]), A.push([]);
|
|
84
|
+
A[e].push([t, n]), k[t].push([e, n]);
|
|
85
|
+
}, ne = 6e4;
|
|
86
|
+
for (let e of f) ne -= Math.max(0, Math.abs(g[e.w] - g[e.v]) - 1);
|
|
87
|
+
if (ne < 0) throw Error("The diagram is too large to draw");
|
|
88
|
+
let re = [], j = [];
|
|
89
|
+
f.forEach((e, n) => {
|
|
90
|
+
if (e.v === e.w) {
|
|
91
|
+
re.push(null), j.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 ? ee(a.w, a.h, 1, s, t) : ee(0, 0, 1, s, t);
|
|
97
|
+
t === o && (c = e), r.push(e);
|
|
98
|
+
}
|
|
99
|
+
r.push(e.w), re.push(i > 0 ? r : null), j.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
|
+
te(n, i, e.weight * (a === 2 ? 8 : a === 1 ? 2 : 1));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
let ie = f.map((e, t) => e.v !== e.w && g[e.v] === g[e.w] && !re[t]), M = Array(a).fill(Infinity), N = Array(a).fill(-Infinity);
|
|
106
|
+
for (let e = 0; e < S.length; e++) for (let t of b(T[e])) M[t] = Math.min(M[t], E[e]), N[t] = Math.max(N[t], E[e]);
|
|
107
|
+
let P = Array.from({ length: a }, () => []), F = Array.from({ length: a }, () => []), I = [];
|
|
108
|
+
for (let e = 0; e < a; e++) if (!(M[e] > N[e])) for (let t = M[e]; t <= N[e]; t++) P[e][t] = ee(0, 0, 2, e, t), F[e][t] = ee(0, 0, 3, e, t);
|
|
109
|
+
for (; k.length < S.length;) k.push([]), A.push([]);
|
|
110
|
+
for (let e = 0; e < S.length; e++) I.push([]);
|
|
111
|
+
for (let e = 0; e < a; e++) for (let t = M[e]; t < N[e]; t++) I[P[e][t]].push([P[e][t + 1], 1]), I[P[e][t + 1]].push([P[e][t], 1]), I[F[e][t]].push([F[e][t + 1], 1]), I[F[e][t + 1]].push([F[e][t], 1]);
|
|
112
|
+
let L = S.length;
|
|
113
|
+
y = E.reduce((e, t) => Math.max(e, t), y);
|
|
114
|
+
let R = Array.from({ length: y + 1 }, () => []);
|
|
115
|
+
{
|
|
116
|
+
let e = new Uint8Array(L), t = Array.from({ length: L }, (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, R[E[n]].push(n);
|
|
124
|
+
for (let r = A[n].length - 1; r >= 0; r--) e[A[n][r][0]] || t.push(A[n][r][0]);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (let e = 0; e < L; e++) (w[e] === 2 || w[e] === 3) && R[E[e]].push(e);
|
|
129
|
+
}
|
|
130
|
+
let z = new Float64Array(L), B = () => R.forEach((e) => e.forEach((e, t) => z[e] = t));
|
|
131
|
+
B();
|
|
132
|
+
let V = new Float64Array(L), H = new Float64Array(a), U = () => {
|
|
133
|
+
for (let e = 0; e < a; e++) {
|
|
134
|
+
if (M[e] > N[e]) continue;
|
|
135
|
+
let t = 0;
|
|
136
|
+
for (let n = M[e]; n <= N[e]; n++) t += z[P[e][n]] / Math.max(1, R[n].length);
|
|
137
|
+
H[e] = t / (N[e] - M[e] + 1);
|
|
138
|
+
}
|
|
139
|
+
}, W = (e, t) => {
|
|
140
|
+
if (!a) return [...e].sort((e, t) => V[e] - V[t] || z[e] - z[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: z[P[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: V[t],
|
|
162
|
+
idx: z[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 : V[P[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) => H[e.cluster] - H[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(P[n.cluster][t]), l(n), c.push(F[n.cluster][t]));
|
|
179
|
+
};
|
|
180
|
+
return l(r), c;
|
|
181
|
+
}, ae = (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 A[t]) r.push([z[t], z[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
|
+
}, G = (e, t) => {
|
|
197
|
+
let n = 0, r = 0;
|
|
198
|
+
for (let [i, a] of t[e]) n += z[i] * a, r += a;
|
|
199
|
+
return r ? n / r : z[e];
|
|
200
|
+
};
|
|
201
|
+
for (let e of R) for (let t of e) V[t] = z[t];
|
|
202
|
+
U(), R = R.map((e, t) => W(e, t)), B();
|
|
203
|
+
let oe = R.map((e) => [...e]), K = ae(R);
|
|
204
|
+
for (let e = 0; e < 24 && K > 0; e++) {
|
|
205
|
+
U();
|
|
206
|
+
let t = e % 2 == 0;
|
|
207
|
+
for (let e = 1; e <= y; e++) {
|
|
208
|
+
let n = t ? e : y - e, r = t ? k : A;
|
|
209
|
+
for (let e of R[n]) V[e] = G(e, r);
|
|
210
|
+
R[n] = W(R[n], n), R[n].forEach((e, t) => z[e] = t);
|
|
211
|
+
}
|
|
212
|
+
let n = ae(R);
|
|
213
|
+
n < K && (K = n, oe = R.map((e) => [...e]));
|
|
214
|
+
}
|
|
215
|
+
R = oe, B();
|
|
216
|
+
let q = R.map((e) => e.reduce((e, t) => Math.max(e, C[t]), 0)), se = Array.from({ length: a }, () => []);
|
|
217
|
+
n.forEach((e, t) => e.parent >= 0 && se[e.parent].push(t));
|
|
218
|
+
let ce = (e) => n[e].pad[2] + Math.max(0, ...se[e].filter((t) => M[t] === M[e]).map(ce)), le = (e) => n[e].pad[3] + Math.max(0, ...se[e].filter((t) => N[t] === N[e]).map(le)), J = Array(y + 1).fill(0), ue = Array(y + 1).fill(0);
|
|
219
|
+
for (let e = 0; e < a; e++) M[e] > N[e] || (J[M[e]] = Math.max(J[M[e]], ce(e)), ue[N[e]] = Math.max(ue[N[e]], le(e)));
|
|
220
|
+
let Y = [];
|
|
221
|
+
for (let e = 0; e <= y; e++) Y[e] = e === 0 ? q[0] / 2 + J[0] : Y[e - 1] + q[e - 1] / 2 + ue[e - 1] + r.ranksep + J[e] + q[e] / 2;
|
|
222
|
+
let de = Y[y] + q[y] / 2 + ue[y], fe = (e) => w[e] === 2 || w[e] === 3 ? 0 : S[e] / 2, pe = (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), fe(e) + fe(t) + i;
|
|
225
|
+
}, X = new Float64Array(L);
|
|
226
|
+
for (let e of R) for (let t = 1; t < e.length; t++) X[e[t]] = X[e[t - 1]] + pe(e[t - 1], e[t]);
|
|
227
|
+
let me = (e, t, n) => {
|
|
228
|
+
let r = e.length, i = [0];
|
|
229
|
+
for (let t = 1; t < r; t++) i[t] = i[t - 1] + pe(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++) X[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 = R[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 += X[t] * n, i += n;
|
|
252
|
+
};
|
|
253
|
+
(t || n) && s(k[e]), (t || !n) && s(A[e]), s(I[e]), a.push(i ? r / i : X[e]), o.push(i || .01);
|
|
254
|
+
}
|
|
255
|
+
me(i, a, o);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
let he = L, Z = (e) => w[e] === 2 ? he + 2 * O[e] : w[e] === 3 ? he + 2 * O[e] + 1 : e;
|
|
259
|
+
if (a) {
|
|
260
|
+
let e = L + 2 * a, t = new Float64Array(e);
|
|
261
|
+
for (let e = 0; e < L; e++) t[e] = X[e];
|
|
262
|
+
for (let e = 0; e < a; e++) t[he + 2 * e] = Infinity, t[he + 2 * e + 1] = -Infinity;
|
|
263
|
+
for (let e = 0; e < L; e++) w[e] === 2 && (t[Z(e)] = Math.min(t[Z(e)], X[e])), w[e] === 3 && (t[Z(e)] = Math.max(t[Z(e)], X[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 R) for (let t = 1; t < e.length; t++) o(Z(e[t - 1]), Z(e[t]), pe(e[t - 1], e[t]));
|
|
268
|
+
for (let e = 0; e < a; e++) M[e] <= N[e] && o(he + 2 * e, he + 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 < L; e++) X[e] = l[Z(e)];
|
|
278
|
+
}
|
|
279
|
+
let Q = Infinity, ge = -Infinity;
|
|
280
|
+
for (let e = 0; e < L; e++) Q = Math.min(Q, X[e] - fe(e)), ge = Math.max(ge, X[e] + fe(e) + D[e]);
|
|
281
|
+
Number.isFinite(Q) || (Q = ge = 0);
|
|
282
|
+
for (let e = 0; e < L; e++) X[e] -= Q;
|
|
283
|
+
let $ = (e) => ({
|
|
284
|
+
x: X[e],
|
|
285
|
+
y: Y[E[e]]
|
|
286
|
+
}), _e = /* @__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 = re[r];
|
|
297
|
+
i && !ie[r] && (e[i[0]]?.spread && n(`${i[0]}:b`, r, X[i[1]]), e[i[i.length - 1]]?.spread && n(`${i[i.length - 1]}:t`, r, X[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) => _e.set(`${e}:${i.i}`, X[t] + (a - (n.length - 1) / 2) * r));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
let ve = f.map((e, n) => {
|
|
308
|
+
if (e.v === e.w) return null;
|
|
309
|
+
if (ie[n]) {
|
|
310
|
+
let r = $(e.v), i = $(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 = re[n];
|
|
330
|
+
if (!r) return null;
|
|
331
|
+
let i = [], a = [], o = $(r[0]);
|
|
332
|
+
i.push({
|
|
333
|
+
x: _e.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 = $(r[e]), n = q[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 = $(r[r.length - 1]);
|
|
347
|
+
i.push({
|
|
348
|
+
x: _e.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: j[n] >= 0 ? $(j[n]) : void 0
|
|
380
|
+
};
|
|
381
|
+
}), ye = n.map((e, t) => {
|
|
382
|
+
if (M[t] > N[t]) return null;
|
|
383
|
+
let n = Infinity, r = -Infinity;
|
|
384
|
+
for (let e = M[t]; e <= N[t]; e++) n = Math.min(n, X[P[t][e]]), r = Math.max(r, X[F[t][e]]);
|
|
385
|
+
let i = Y[M[t]] - q[M[t]] / 2 - ce(t), a = Y[N[t]] + q[N[t]] / 2 + le(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) => $(t)),
|
|
395
|
+
edges: ve,
|
|
396
|
+
clusters: ye,
|
|
397
|
+
w: ge - Q,
|
|
398
|
+
h: de
|
|
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 = class extends Error {}, _ = 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
|
+
}, v = 14, y = 13, b = 14, x = 9, S = i(v), C = (e) => e.split("\n"), w = (e) => Math.round(e * 100) / 100;
|
|
676
|
+
function T(e) {
|
|
677
|
+
let t = [];
|
|
678
|
+
for (let n of e.rows) n.forEach((n, i) => t[i] = Math.max(t[i] ?? 0, r(n, y, 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(y) + 10 : 8,
|
|
682
|
+
cols: t
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
function E(e, t) {
|
|
686
|
+
let n = e.shape === "none" || e.label === "" ? C(e.label) : o(C(e.label), 260, v, e.style?.bold), r = e.label === "" ? {
|
|
687
|
+
w: 0,
|
|
688
|
+
h: 0
|
|
689
|
+
} : a(n, v, e.style?.bold), i = t === "TB" || t === "BT";
|
|
690
|
+
if (e.sections?.length) {
|
|
691
|
+
let t = e.sections.map(T);
|
|
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 + b) * 1.42),
|
|
747
|
+
h: Math.max(36, (r.h + x) * 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 + b,
|
|
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 D(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 O(e, t, n, r, i) {
|
|
835
|
+
let { w: a, h: o } = n, s = r - a / 2, c = i - o / 2, l = D(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${w(s)} ${w(c + 7)} A${w(a / 2)} 7 0 0 1 ${w(s + a)} ${w(c + 7)} L${w(s + a)} ${w(c + o - 7)} A${w(a / 2)} 7 0 0 1 ${w(s)} ${w(c + o - 7)} Z`, l), e.path(`M${w(s)} ${w(c + 7)} A${w(a / 2)} 7 0 0 0 ${w(s + a)} ${w(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 * S / 2, n.text, {
|
|
1014
|
+
anchor: "middle",
|
|
1015
|
+
color: d
|
|
1016
|
+
});
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
default:
|
|
1020
|
+
if (t.sections?.length) return ee(e, t, s, c, a);
|
|
1021
|
+
e.rect(s, c, a, o, l);
|
|
1022
|
+
}
|
|
1023
|
+
f();
|
|
1024
|
+
}
|
|
1025
|
+
function ee(e, t, n, r, a) {
|
|
1026
|
+
let o = D(t), s = t.sections.map(T), 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(y);
|
|
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: y,
|
|
1041
|
+
bold: r.bold,
|
|
1042
|
+
italic: r.italic,
|
|
1043
|
+
color: t.style?.color
|
|
1044
|
+
});
|
|
1045
|
+
return;
|
|
1046
|
+
}
|
|
1047
|
+
let f = n + b;
|
|
1048
|
+
i.forEach((n, i) => {
|
|
1049
|
+
e.text(f, d, n, {
|
|
1050
|
+
size: y,
|
|
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 k = {
|
|
1060
|
+
arrow: 10,
|
|
1061
|
+
triangle: 13,
|
|
1062
|
+
diamond: 15,
|
|
1063
|
+
odiamond: 15,
|
|
1064
|
+
circle: 8,
|
|
1065
|
+
ocircle: 8
|
|
1066
|
+
};
|
|
1067
|
+
function A(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 ne(e, t, n) {
|
|
1158
|
+
let r = t[t.length - 1], i = r.p[r.p.length - 1], a = A(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 re(e) {
|
|
1172
|
+
return e.color ?? u.line;
|
|
1173
|
+
}
|
|
1174
|
+
var j = 16, ie = 3e3, M = 6e3;
|
|
1175
|
+
function N(t) {
|
|
1176
|
+
if (!t.nodes.length) throw new g("The diagram has no nodes");
|
|
1177
|
+
if (t.nodes.length > ie || t.edges.length > M) throw new g(`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
|
+
}, _ = t.nodes.map((e) => E(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), b = v.some((e) => e.e.label), x = (e) => e ? a(C(e), y) : 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 w = t.nodes.map((e, t) => {
|
|
1202
|
+
let n = _[t], r = e.cluster === void 0 ? -1 : c.get(e.cluster) ?? -1, i = !!e.sections?.length || F.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) * (b ? 2 : 1),
|
|
1225
|
+
weight: 1,
|
|
1226
|
+
label: i ? o ? i : {
|
|
1227
|
+
w: i.h,
|
|
1228
|
+
h: i.w
|
|
1229
|
+
} : void 0
|
|
1230
|
+
};
|
|
1231
|
+
}), D = t.clusters.map((e, t) => {
|
|
1232
|
+
let r = e.label ? a(C(e.label), y, !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
|
+
}), ee = t.sameRank?.map((e) => e.map((e) => l.get(e)).filter((e) => e !== void 0)).filter((e) => e.length > 1), N = e(w, T, D, {
|
|
1257
|
+
nodesep: o ? 40 : 28,
|
|
1258
|
+
ranksep: (o ? 50 : 60) / (b ? 2 : 1),
|
|
1259
|
+
edgesep: 14,
|
|
1260
|
+
sameRank: ee
|
|
1261
|
+
}), R = t.title ? 32 : 0, z = N.w, B = N.h, V = (e) => {
|
|
1262
|
+
let t = n === "TB" ? e : n === "BT" ? {
|
|
1263
|
+
x: e.x,
|
|
1264
|
+
y: B - e.y
|
|
1265
|
+
} : n === "LR" ? {
|
|
1266
|
+
x: e.y,
|
|
1267
|
+
y: e.x
|
|
1268
|
+
} : {
|
|
1269
|
+
x: B - e.y,
|
|
1270
|
+
y: e.x
|
|
1271
|
+
};
|
|
1272
|
+
return {
|
|
1273
|
+
x: t.x + j,
|
|
1274
|
+
y: t.y + j + R
|
|
1275
|
+
};
|
|
1276
|
+
}, H = (o ? z : B) + 32, U = (o ? B : z) + 32 + R, W = (e) => {
|
|
1277
|
+
let t = 0;
|
|
1278
|
+
for (let n = d(e); n >= 0; n = d(n)) t++;
|
|
1279
|
+
return t;
|
|
1280
|
+
}, ae = t.clusters.map((e, t) => t).sort((e, t) => W(e) - W(t)), G = t.clusters.map(() => null), oe = [];
|
|
1281
|
+
for (let e of ae) {
|
|
1282
|
+
let r = N.clusters[e];
|
|
1283
|
+
if (!r) continue;
|
|
1284
|
+
let a = t.clusters[e], o = V({
|
|
1285
|
+
x: r.x,
|
|
1286
|
+
y: r.y
|
|
1287
|
+
}), c = V({
|
|
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 (G[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 = C(a.label), t = n === "BT" ? d + p - 8 - e.length * i(y) / 2 : d + 8 + e.length * i(y) / 2;
|
|
1303
|
+
oe.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 K = [];
|
|
1313
|
+
v.forEach(({ e, v: t }, n) => {
|
|
1314
|
+
if (e.line === "hidden") return;
|
|
1315
|
+
let r = re(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 = N.edges[n];
|
|
1320
|
+
if (!c) {
|
|
1321
|
+
if (v[n].v !== v[n].w) return;
|
|
1322
|
+
let c = V(N.nodes[t]), l = _[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 g = [{
|
|
1355
|
+
c: "C",
|
|
1356
|
+
p: [
|
|
1357
|
+
d,
|
|
1358
|
+
f,
|
|
1359
|
+
p
|
|
1360
|
+
]
|
|
1361
|
+
}], b = e.head ?? "arrow", x = ne(u, g, k[b] ?? 0);
|
|
1362
|
+
if (s.path(m([{
|
|
1363
|
+
c: "M",
|
|
1364
|
+
p: [u]
|
|
1365
|
+
}, ...g.map((e) => ({
|
|
1366
|
+
c: e.c,
|
|
1367
|
+
p: e.p
|
|
1368
|
+
}))]), i), te(s, b, p, x, r), e.label) {
|
|
1369
|
+
let t = a(C(e.label), y);
|
|
1370
|
+
K.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: C(e.label)
|
|
1379
|
+
});
|
|
1380
|
+
}
|
|
1381
|
+
return;
|
|
1382
|
+
}
|
|
1383
|
+
let l = {
|
|
1384
|
+
start: V(c.start),
|
|
1385
|
+
segs: c.segs.map((e) => ({
|
|
1386
|
+
c: e.c,
|
|
1387
|
+
p: e.p.map(V)
|
|
1388
|
+
})),
|
|
1389
|
+
label: c.label && V(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 && G[u] && (e = L(e, G[u], !0)), d >= 0 && G[d] && (e = L(e, G[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", g = l.segs[l.segs.length - 1].p[l.segs[l.segs.length - 1].p.length - 1], b = ne(l.start, l.segs, k[p] ?? 0), x = l.segs[0], S = A((x.c, x.p[0]), l.start), w = l.start, T = k[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, g, b, r), h !== "none" && te(s, h, w, S, r), e.label) {
|
|
1416
|
+
let t = l.label ?? P(l.start, g);
|
|
1417
|
+
K.push({
|
|
1418
|
+
p: t,
|
|
1419
|
+
text: C(e.label)
|
|
1420
|
+
});
|
|
1421
|
+
}
|
|
1422
|
+
let D = (e, t, n) => {
|
|
1423
|
+
let r = a(C(n), y), i = -t.y, o = t.x, s = Math.abs(i) * (r.w / 2 + 5) + Math.abs(o) * (r.h / 2 + 3);
|
|
1424
|
+
K.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: C(n),
|
|
1430
|
+
plain: !0
|
|
1431
|
+
});
|
|
1432
|
+
};
|
|
1433
|
+
e.headLabel && D(g, b, e.headLabel), e.tailLabel && D(w, S, e.tailLabel);
|
|
1434
|
+
});
|
|
1435
|
+
for (let e of oe) {
|
|
1436
|
+
let t = a(e.text, y, !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: y,
|
|
1440
|
+
bold: !0,
|
|
1441
|
+
color: e.color
|
|
1442
|
+
});
|
|
1443
|
+
}
|
|
1444
|
+
t.nodes.forEach((e, t) => {
|
|
1445
|
+
if (e.style?.hidden) return;
|
|
1446
|
+
let n = V(N.nodes[t]);
|
|
1447
|
+
O(s, e, _[t], n.x, n.y);
|
|
1448
|
+
});
|
|
1449
|
+
for (let e of K) {
|
|
1450
|
+
let t = a(e.text, y);
|
|
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: y,
|
|
1457
|
+
color: e.color ?? u.ink
|
|
1458
|
+
});
|
|
1459
|
+
}
|
|
1460
|
+
return t.title && (H = Math.max(H, r(t.title, 16, !0) + 32), s.text(H / 2, 27, t.title, {
|
|
1461
|
+
anchor: "middle",
|
|
1462
|
+
size: 16,
|
|
1463
|
+
bold: !0
|
|
1464
|
+
})), {
|
|
1465
|
+
svg: s.toString(H, U),
|
|
1466
|
+
w: Math.ceil(H),
|
|
1467
|
+
h: Math.ceil(U)
|
|
1468
|
+
};
|
|
1469
|
+
}
|
|
1470
|
+
var P = (e, t) => ({
|
|
1471
|
+
x: (e.x + t.x) / 2,
|
|
1472
|
+
y: (e.y + t.y) / 2
|
|
1473
|
+
}), F = /* @__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 z = {
|
|
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
|
+
}, B = {
|
|
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 V(e, t) {
|
|
1649
|
+
if (!e) return t;
|
|
1650
|
+
let n = e.toLowerCase().replace(/^[lr](?=[a-z])/, "");
|
|
1651
|
+
return B[n] ?? B[n.replace(/^o/, "")] ?? t;
|
|
1652
|
+
}
|
|
1653
|
+
function H(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 U(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 W(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 ae(e, t) {
|
|
1685
|
+
return W(e, t).replace(/<[^>]*>/g, "").split(/[|{}]/).map((e) => e.trim()).filter(Boolean);
|
|
1686
|
+
}
|
|
1687
|
+
function G(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 g("Graphviz: “{” expected after the graph name");
|
|
1698
|
+
let l = new _("TB", "ellipse"), u = /* @__PURE__ */ new Map(), d = [], f = [], p = 0, m = {}, h = /* @__PURE__ */ new Map(), v = () => {
|
|
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 = v(), 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 = v();
|
|
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("<") ? U(m.label.slice(1, -1)) : W(m.label, "", c));
|
|
1798
|
+
for (let e of l.g.nodes) oe(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("<") ? U(t.label.slice(1, -1)) : W(t.label, "", e.id) : "";
|
|
1802
|
+
let n = {}, r = (t.style ?? "").toLowerCase();
|
|
1803
|
+
r.includes("filled") ? n.fill = H(t.fillcolor ?? t.color ?? t.bgcolor) ?? "#d3d3d3" : t.bgcolor && (n.fill = H(t.bgcolor)), (t.color || t.pencolor) && (n.stroke = H(t.pencolor ?? t.color)), r.includes("dashed") && (n.dash = "6 4"), r.includes("dotted") && (n.dash = "2 3"), t.fontcolor && (n.color = H(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(K(t, n, e));
|
|
1806
|
+
l.g.sameRank = f, s.push(l.g);
|
|
1807
|
+
}
|
|
1808
|
+
if (!s.length) throw new g("No “graph” or “digraph” found");
|
|
1809
|
+
return s;
|
|
1810
|
+
}
|
|
1811
|
+
function oe(e, t) {
|
|
1812
|
+
let n = (t.shape ?? "ellipse").toLowerCase();
|
|
1813
|
+
e.shape = z[n] ?? "ellipse";
|
|
1814
|
+
let r = t.label;
|
|
1815
|
+
if (r !== void 0) {
|
|
1816
|
+
if (r.startsWith("<") && r.endsWith(">")) e.label = U(r.slice(1, -1));
|
|
1817
|
+
else if (n === "record" || n === "mrecord") {
|
|
1818
|
+
let t = ae(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 = W(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 = H(t.fillcolor ?? t.color) ?? "#d3d3d3" : e.shape !== "point" && (i.fill = "#ffffff"), i.stroke = t.color ? H(t.color) : "#000000", t.fontcolor && (i.color = H(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 K(e, t, n) {
|
|
1830
|
+
let r = (t.style ?? "").toLowerCase(), i = (t.dir ?? (n ? "forward" : "none")).toLowerCase(), a = V(t.arrowhead, "arrow"), o = V(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(">") ? U(s.slice(1, -1)) : W(s, "")), t.headlabel && (e.headLabel = W(t.headlabel, "")), t.taillabel && (e.tailLabel = W(t.taillabel, "")), e.line = r.includes("invis") ? "hidden" : r.includes("dashed") ? "dashed" : r.includes("dotted") ? "dotted" : r.includes("bold") ? "thick" : "solid", e.color = H(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 q(e) {
|
|
1836
|
+
return G(e).map(N);
|
|
1837
|
+
}
|
|
1838
|
+
// packages/diagram/src/dom.ts
|
|
1839
|
+
async function se(e, t = 2) {
|
|
1840
|
+
let n = (t) => Number(RegExp(`<svg[^>]*\\s${t}="([\\d.]+)"`).exec(e)?.[1] ?? 0), r = n("width"), i = n("height");
|
|
1841
|
+
if (!r || !i) throw Error("Not a picture with a size");
|
|
1842
|
+
let a = new Image();
|
|
1843
|
+
a.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`, await a.decode();
|
|
1844
|
+
let o = document.createElement("canvas");
|
|
1845
|
+
o.width = Math.max(1, Math.round(r * t)), o.height = Math.max(1, Math.round(i * t));
|
|
1846
|
+
let s = o.getContext("2d");
|
|
1847
|
+
if (!s) throw Error("No 2D canvas");
|
|
1848
|
+
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"));
|
|
1849
|
+
}
|
|
1850
|
+
function ce(e, t) {
|
|
1851
|
+
e.innerHTML = t.join("");
|
|
1852
|
+
}
|
|
1853
|
+
// packages/graphviz/src/index.ts
|
|
1854
|
+
var le = class extends Error {
|
|
1855
|
+
constructor(e) {
|
|
1856
|
+
super(e), this.name = "DiagramError";
|
|
1857
|
+
}
|
|
1858
|
+
};
|
|
1859
|
+
function J(e) {
|
|
1860
|
+
try {
|
|
1861
|
+
return q(e).map((e) => ({
|
|
1862
|
+
svg: e.svg,
|
|
1863
|
+
width: e.w,
|
|
1864
|
+
height: e.h
|
|
1865
|
+
}));
|
|
1866
|
+
} catch (e) {
|
|
1867
|
+
throw new le(e.message);
|
|
1868
|
+
}
|
|
1869
|
+
}
|
|
1870
|
+
function ue(e) {
|
|
1871
|
+
return J(e)[0];
|
|
1872
|
+
}
|
|
1873
|
+
function Y(e, t) {
|
|
1874
|
+
let n = J(t);
|
|
1875
|
+
return ce(e, n.map((e) => e.svg)), n;
|
|
1876
|
+
}
|
|
1877
|
+
function de(e, t = 2) {
|
|
1878
|
+
return se(e, t);
|
|
1879
|
+
}
|
|
1880
|
+
export { le as DiagramError, ue as render, J as renderEach, Y as renderTo, de as toPng };
|
|
1881
|
+
|
|
1882
|
+
//# sourceMappingURL=index.js.map
|