@diagrammo/dgmo 0.45.0 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advanced.cjs +31 -25
- package/dist/advanced.d.cts +3 -855
- package/dist/advanced.d.ts +3 -855
- package/dist/advanced.js +541 -70101
- package/dist/analyzer-UYKBXAKR.js +15 -0
- package/dist/auto.cjs +500 -341
- package/dist/auto.css +342 -159
- package/dist/auto.d.cts +10 -8
- package/dist/auto.d.ts +10 -8
- package/dist/auto.js +373 -265
- package/dist/auto.mjs +500 -341
- package/dist/block.cjs +31 -25
- package/dist/block.js +83 -69411
- package/dist/calculator-LDYQCDDY.js +11 -0
- package/dist/charts-d3-QOZHKTCT.js +25 -0
- package/dist/chunk-2DXMZRWJ.js +800 -0
- package/dist/chunk-2LACINWN.js +786 -0
- package/dist/chunk-33LCUH4H.js +893 -0
- package/dist/chunk-3CIOJ5YJ.js +35 -0
- package/dist/chunk-3HDBAXF5.js +86 -0
- package/dist/chunk-3JLKYGBQ.js +290 -0
- package/dist/chunk-3MQQNXPD.js +415 -0
- package/dist/chunk-3R5POCTZ.js +967 -0
- package/dist/chunk-3SMGIJDD.js +112 -0
- package/dist/chunk-44CM72SQ.js +409 -0
- package/dist/chunk-4GRI7MEB.js +1604 -0
- package/dist/chunk-4OHACBGX.js +606 -0
- package/dist/chunk-5DH3KYFH.js +21 -0
- package/dist/chunk-5MLYVTYM.js +76 -0
- package/dist/chunk-5QXL4NYS.js +553 -0
- package/dist/chunk-5WRI5ZAA.js +31 -0
- package/dist/chunk-6EK55ART.js +117 -0
- package/dist/chunk-6FZYCKXB.js +2065 -0
- package/dist/chunk-6HO5ZTXK.js +277 -0
- package/dist/chunk-6KFWC4CO.js +7 -0
- package/dist/chunk-6MTWIQVO.js +121 -0
- package/dist/chunk-6NYWYNBI.js +329 -0
- package/dist/chunk-6SM5NJQH.js +620 -0
- package/dist/chunk-725LDASD.js +422 -0
- package/dist/chunk-76OWZ3BA.js +130 -0
- package/dist/chunk-7JEGTRLD.js +338 -0
- package/dist/chunk-A44USUV7.js +923 -0
- package/dist/chunk-A4GOY3PE.js +25 -0
- package/dist/chunk-A4VFQH5G.js +251 -0
- package/dist/chunk-AELOBFW5.js +375 -0
- package/dist/chunk-AN2MOO5T.js +522 -0
- package/dist/chunk-BMR4CIEO.js +41 -0
- package/dist/chunk-BS7SV7C3.js +51 -0
- package/dist/chunk-BUPDIHML.js +613 -0
- package/dist/chunk-BUVJFRPY.js +887 -0
- package/dist/chunk-C3Z4DX3V.js +112 -0
- package/dist/chunk-CI2G3OEB.js +1818 -0
- package/dist/chunk-CKNVO24D.js +54 -0
- package/dist/chunk-CUVHQHZ7.js +391 -0
- package/dist/chunk-CXK4DZH3.js +114 -0
- package/dist/chunk-DKEPS5LH.js +315 -0
- package/dist/chunk-DU7W62N5.js +487 -0
- package/dist/chunk-DZAQBW35.js +751 -0
- package/dist/chunk-EB6FPQUP.js +316 -0
- package/dist/chunk-EMS2SK26.js +376 -0
- package/dist/chunk-ERLBPDGU.js +510 -0
- package/dist/chunk-EVCVDTXE.js +732 -0
- package/dist/chunk-FCIIHT24.js +384 -0
- package/dist/chunk-FFUN5D66.js +97 -0
- package/dist/chunk-FITOLXSX.js +714 -0
- package/dist/chunk-FMDSF3OV.js +68 -0
- package/dist/chunk-FNB3PNGF.js +410 -0
- package/dist/chunk-G2H74XJZ.js +2104 -0
- package/dist/chunk-GMR5MFHJ.js +339 -0
- package/dist/chunk-H6PI3KJT.js +305 -0
- package/dist/chunk-I46X5VUA.js +59 -0
- package/dist/chunk-I5IGB56C.js +255 -0
- package/dist/chunk-IH6ZMVQ5.js +3950 -0
- package/dist/chunk-IJZFN3HM.js +463 -0
- package/dist/chunk-IPWPWM6R.js +3079 -0
- package/dist/chunk-IYULMRBE.js +23 -0
- package/dist/chunk-IZMRON6C.js +167 -0
- package/dist/chunk-J5FIXQRT.js +813 -0
- package/dist/chunk-JED6ZDEE.js +73 -0
- package/dist/chunk-JEUJOX5X.js +136 -0
- package/dist/chunk-JM4LEPY3.js +436 -0
- package/dist/chunk-L3UHP6TD.js +101 -0
- package/dist/chunk-L66GEFB6.js +524 -0
- package/dist/chunk-LIOHW36Z.js +469 -0
- package/dist/chunk-LP7EC4MI.js +16 -0
- package/dist/chunk-MITI6NOL.js +548 -0
- package/dist/chunk-MO5YHHMQ.js +168 -0
- package/dist/chunk-MZSBFAPJ.js +885 -0
- package/dist/chunk-NNAAJVBU.js +9 -0
- package/dist/chunk-NOTA6TEI.js +47 -0
- package/dist/chunk-NURGB5Z4.js +335 -0
- package/dist/chunk-NX4EQS3U.js +1062 -0
- package/dist/chunk-NXMESY4J.js +1 -0
- package/dist/chunk-OJR3MQYV.js +1458 -0
- package/dist/chunk-OURHMODR.js +454 -0
- package/dist/chunk-P235SVAH.js +1057 -0
- package/dist/chunk-P4RH4OSP.js +1038 -0
- package/dist/chunk-P6T66CCZ.js +226 -0
- package/dist/chunk-PBAHEPLQ.js +223 -0
- package/dist/chunk-PBHE5UG6.js +1530 -0
- package/dist/chunk-PDKUANDZ.js +35 -0
- package/dist/chunk-PWIHZ6NJ.js +296 -0
- package/dist/chunk-QEBUY5NY.js +1685 -0
- package/dist/chunk-QLCCJEJI.js +253 -0
- package/dist/chunk-QOOUC2J5.js +52 -0
- package/dist/chunk-QYTPPDAO.js +402 -0
- package/dist/chunk-R3XI2VC7.js +801 -0
- package/dist/chunk-RCERWOJR.js +154 -0
- package/dist/chunk-RJE5JTVK.js +362 -0
- package/dist/chunk-RTLBSQ3G.js +1155 -0
- package/dist/chunk-RUNNI6VE.js +448 -0
- package/dist/chunk-RVMRZAPB.js +354 -0
- package/dist/chunk-RYEGFMUO.js +955 -0
- package/dist/chunk-RZCF2VVM.js +528 -0
- package/dist/chunk-SML67VPV.js +1025 -0
- package/dist/chunk-SQ7IY53Q.js +44 -0
- package/dist/chunk-SQAG3UXH.js +161 -0
- package/dist/chunk-SRTU6HMQ.js +1851 -0
- package/dist/chunk-T2OE3YQB.js +550 -0
- package/dist/chunk-T3UBLACL.js +299 -0
- package/dist/chunk-TLVIHFRO.js +296 -0
- package/dist/chunk-TYS6CSS5.js +52 -0
- package/dist/chunk-U6EQI3U6.js +130 -0
- package/dist/chunk-UJ4FJLBF.js +86 -0
- package/dist/chunk-ULOEATBZ.js +347 -0
- package/dist/chunk-UNCCZ3NU.js +127 -0
- package/dist/chunk-USZW2HHU.js +197 -0
- package/dist/chunk-UWN33VNX.js +1610 -0
- package/dist/chunk-UZ7EZW3B.js +40 -0
- package/dist/chunk-VOKGH627.js +37 -0
- package/dist/chunk-WBRZJOEC.js +204 -0
- package/dist/chunk-WCSOJFU3.js +380 -0
- package/dist/chunk-WCT3NYCV.js +160 -0
- package/dist/chunk-WVAJFAIA.js +529 -0
- package/dist/chunk-X5LCYCL5.js +394 -0
- package/dist/chunk-XAKEUMEJ.js +1256 -0
- package/dist/chunk-Y2ZE3MSG.js +590 -0
- package/dist/chunk-Y3J7VR52.js +646 -0
- package/dist/chunk-Y5QGVTVC.js +33 -0
- package/dist/chunk-YAA6IID3.js +548 -0
- package/dist/chunk-YGJTDXVR.js +692 -0
- package/dist/chunk-YRYKTYMQ.js +186 -0
- package/dist/chunk-YYVTBZZC.js +61 -0
- package/dist/chunk-Z5CGSFJB.js +647 -0
- package/dist/chunk-Z72XRXD4.js +787 -0
- package/dist/chunk-ZGR7ULFJ.js +978 -0
- package/dist/chunk-ZJEL4H2R.js +851 -0
- package/dist/chunk-ZO27FGJS.js +554 -0
- package/dist/cli.cjs +112 -112
- package/dist/collapse-CLPJD2RL.js +11 -0
- package/dist/collapse-SLINJQW6.js +9 -0
- package/dist/collapse-ZWUFFCK2.js +9 -0
- package/dist/compute-G55RG53N.js +8 -0
- package/dist/dgmo-router-DZCIDUO5.js +73 -0
- package/dist/dimensions-J3FHIMJ6.js +22 -0
- package/dist/element.cjs +492 -325
- package/dist/element.js +367 -259
- package/dist/element.mjs +492 -325
- package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
- package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
- package/dist/index.cjs +34 -28
- package/dist/index.d.cts +3 -469
- package/dist/index.d.ts +3 -469
- package/dist/index.js +137 -69679
- package/dist/layout-46N4JJYK.js +17 -0
- package/dist/layout-5RA6QWR6.js +26 -0
- package/dist/layout-5T6RH5M6.js +14 -0
- package/dist/layout-7QXCNOVS.js +13 -0
- package/dist/layout-EE6GE46Y.js +17 -0
- package/dist/layout-G23F7LDH.js +9 -0
- package/dist/layout-HRBZPFCN.js +23 -0
- package/dist/layout-HWDSRX5E.js +20 -0
- package/dist/layout-HYZPWAK5.js +18 -0
- package/dist/layout-N76NR4ZO.js +19 -0
- package/dist/layout-OB3RI63S.js +14 -0
- package/dist/layout-S2QBYSK2.js +15 -0
- package/dist/layout-UM5F4DJB.js +15 -0
- package/dist/layout-search-OYV77HHS.js +1655 -0
- package/dist/load-data-EHDDZ5ZS.js +8 -0
- package/dist/palettes-PRJ2RI6D.js +56 -0
- package/dist/parser-2MFP2H2E.js +11 -0
- package/dist/parser-3STE62GB.js +21 -0
- package/dist/parser-4FL2CMDG.js +18 -0
- package/dist/parser-4OGOBJJ4.js +13 -0
- package/dist/parser-6BTRLKRZ.js +15 -0
- package/dist/parser-AQETEVRW.js +21 -0
- package/dist/parser-CFZD5IBL.js +12 -0
- package/dist/parser-FUSKFGZN.js +16 -0
- package/dist/parser-I6KXEYFK.js +13 -0
- package/dist/parser-IXSZZQHY.js +18 -0
- package/dist/parser-JAL2HD4I.js +13 -0
- package/dist/parser-KNSQSKQO.js +20 -0
- package/dist/parser-N5O4IHUN.js +13 -0
- package/dist/parser-NGU3ETO6.js +16 -0
- package/dist/parser-NRAI6O25.js +19 -0
- package/dist/parser-O5J4VBII.js +11 -0
- package/dist/parser-OV7NOBW6.js +21 -0
- package/dist/parser-PQ3POX45.js +23 -0
- package/dist/parser-TFZFBVWN.js +11 -0
- package/dist/parser-TRTHDFPP.js +18 -0
- package/dist/parser-VQP2UJ6W.js +11 -0
- package/dist/parser-XDVELHRK.js +13 -0
- package/dist/parser-XKRP7QKP.js +11 -0
- package/dist/parser-Y6WTBU76.js +14 -0
- package/dist/parser-ZSDPZYQP.js +12 -0
- package/dist/renderer-2XQQQ6QR.js +28 -0
- package/dist/renderer-5NDVNDAZ.js +26 -0
- package/dist/renderer-6EEZHMH4.js +26 -0
- package/dist/renderer-6W5462RB.js +43 -0
- package/dist/renderer-7MVLWWQD.js +22 -0
- package/dist/renderer-AWWAF6XD.js +33 -0
- package/dist/renderer-BYCNMBF7.js +34 -0
- package/dist/renderer-CLJHQPBJ.js +29 -0
- package/dist/renderer-GHPZMFU2.js +15 -0
- package/dist/renderer-JGBKUCZD.js +16 -0
- package/dist/renderer-KQB7UGDS.js +19 -0
- package/dist/renderer-PGX2TKVS.js +24 -0
- package/dist/renderer-QIWVHWZO.js +15 -0
- package/dist/renderer-RPOA5YPZ.js +35 -0
- package/dist/renderer-SMIBCRVB.js +24 -0
- package/dist/renderer-T7YKC5VP.js +28 -0
- package/dist/renderer-TOCOVLHS.js +37 -0
- package/dist/renderer-UWA5XS74.js +39 -0
- package/dist/renderer-VACVQYML.js +25 -0
- package/dist/renderer-W4M6QLIJ.js +37 -0
- package/dist/renderer-WZRREQ2P.js +23 -0
- package/dist/renderer-YY2OSF6E.js +27 -0
- package/dist/renderer-Z7I3W2PP.js +24 -0
- package/dist/renderer-ZGNTUWC4.js +22 -0
- package/dist/renderer-ZTR3DER3.js +19 -0
- package/dist/renderer-radial-C32GPJQ7.js +21 -0
- package/dist/resolver-NOAA7ID7.js +13 -0
- package/dist/state-collapse-HCGD6IVJ.js +8 -0
- package/dist/state-parser-Z2V23ATR.js +18 -0
- package/dist/state-renderer-RFYHSP4K.js +34 -0
- package/dist/themes-1-CuKpeH.d.cts +908 -0
- package/dist/themes-1-CuKpeH.d.ts +908 -0
- package/package.json +1 -1
- package/src/auto/index.ts +55 -57
- package/src/auto/shared.ts +142 -142
- package/src/auto/styles.ts +44 -199
- package/src/c4/renderer.ts +2 -2
- package/src/element/index.ts +29 -21
- package/src/infra/renderer.ts +1 -1
- package/src/render.ts +34 -14
- package/src/sitemap/renderer.ts +1 -1
- package/src/timeline/renderer.ts +1 -1
- package/src/utils/hover-styles.ts +6 -1
- package/src/utils/legend-d3.ts +1 -4
- package/src/utils/legend-svg.ts +1 -1
|
@@ -0,0 +1,813 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LEGEND_CAPSULE_PAD,
|
|
3
|
+
LEGEND_DOT_R,
|
|
4
|
+
LEGEND_ENTRY_DOT_GAP,
|
|
5
|
+
LEGEND_ENTRY_FONT_SIZE,
|
|
6
|
+
LEGEND_ENTRY_TRAIL,
|
|
7
|
+
LEGEND_EYE_GAP,
|
|
8
|
+
LEGEND_EYE_SIZE,
|
|
9
|
+
LEGEND_GROUP_GAP,
|
|
10
|
+
LEGEND_HEIGHT,
|
|
11
|
+
LEGEND_PILL_FONT_SIZE,
|
|
12
|
+
LEGEND_PILL_PAD,
|
|
13
|
+
measureLegendText
|
|
14
|
+
} from "./chunk-QOOUC2J5.js";
|
|
15
|
+
import {
|
|
16
|
+
measureText
|
|
17
|
+
} from "./chunk-WCT3NYCV.js";
|
|
18
|
+
import {
|
|
19
|
+
injectDefaultTagMetadata,
|
|
20
|
+
resolveTagColor,
|
|
21
|
+
tagAttrKey
|
|
22
|
+
} from "./chunk-QLCCJEJI.js";
|
|
23
|
+
|
|
24
|
+
// src/org/layout.ts
|
|
25
|
+
import { hierarchy, tree } from "d3-hierarchy";
|
|
26
|
+
var LABEL_FONT_SIZE = 13;
|
|
27
|
+
var META_FONT_SIZE = 11;
|
|
28
|
+
var META_LINE_HEIGHT = 16;
|
|
29
|
+
var HEADER_HEIGHT = 28;
|
|
30
|
+
var SEPARATOR_GAP = 6;
|
|
31
|
+
var CARD_H_PAD = 20;
|
|
32
|
+
var CARD_V_PAD = 10;
|
|
33
|
+
var MIN_CARD_WIDTH = 140;
|
|
34
|
+
var H_GAP = 30;
|
|
35
|
+
var V_GAP = 50;
|
|
36
|
+
var MARGIN = 40;
|
|
37
|
+
var CONTAINER_PAD_X = 24;
|
|
38
|
+
var CONTAINER_PAD_BOTTOM = 24;
|
|
39
|
+
var CONTAINER_LABEL_HEIGHT = 28;
|
|
40
|
+
var CONTAINER_META_LINE_HEIGHT = 16;
|
|
41
|
+
var STACK_V_GAP = 20;
|
|
42
|
+
function countDescendantNodes(node, hiddenCounts) {
|
|
43
|
+
let count = 0;
|
|
44
|
+
for (const child of node.children) {
|
|
45
|
+
count += (child.isContainer ? 0 : 1) + countDescendantNodes(child, hiddenCounts);
|
|
46
|
+
const hc = hiddenCounts?.get(child.id);
|
|
47
|
+
if (hc) count += hc;
|
|
48
|
+
}
|
|
49
|
+
return count;
|
|
50
|
+
}
|
|
51
|
+
function filterMetadata(metadata, hiddenAttributes) {
|
|
52
|
+
if (!hiddenAttributes || hiddenAttributes.size === 0) return metadata;
|
|
53
|
+
const filtered = {};
|
|
54
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
55
|
+
if (!hiddenAttributes.has(key)) {
|
|
56
|
+
filtered[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return filtered;
|
|
60
|
+
}
|
|
61
|
+
function computeCardWidth(label, meta) {
|
|
62
|
+
let maxTextWidth = measureText(label, LABEL_FONT_SIZE);
|
|
63
|
+
for (const [key, value] of Object.entries(meta)) {
|
|
64
|
+
const lineWidth = measureText(`${key}: ${value}`, META_FONT_SIZE);
|
|
65
|
+
if (lineWidth > maxTextWidth) maxTextWidth = lineWidth;
|
|
66
|
+
}
|
|
67
|
+
return Math.max(MIN_CARD_WIDTH, Math.ceil(maxTextWidth) + CARD_H_PAD * 2);
|
|
68
|
+
}
|
|
69
|
+
function computeCardHeight(meta) {
|
|
70
|
+
const metaCount = Object.keys(meta).length;
|
|
71
|
+
if (metaCount === 0) return HEADER_HEIGHT + CARD_V_PAD;
|
|
72
|
+
return HEADER_HEIGHT + SEPARATOR_GAP + metaCount * META_LINE_HEIGHT + CARD_V_PAD;
|
|
73
|
+
}
|
|
74
|
+
function resolveNodeColor(node, tagGroups, activeGroupName) {
|
|
75
|
+
if (node.color) return node.color;
|
|
76
|
+
return resolveTagColor(
|
|
77
|
+
node.metadata,
|
|
78
|
+
[...tagGroups],
|
|
79
|
+
activeGroupName,
|
|
80
|
+
node.isContainer
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
function buildTreeNodes(nodes, hiddenCounts, hiddenAttributes, subNodeLabel, showSubNodeCount) {
|
|
84
|
+
return nodes.map((orgNode) => {
|
|
85
|
+
const meta = filterMetadata(orgNode.metadata, hiddenAttributes);
|
|
86
|
+
const hc = hiddenCounts?.get(orgNode.id);
|
|
87
|
+
if (!orgNode.isContainer && showSubNodeCount && !(hc != null && hc > 0)) {
|
|
88
|
+
const count = countDescendantNodes(orgNode, hiddenCounts);
|
|
89
|
+
if (count > 0) {
|
|
90
|
+
meta[subNodeLabel ?? "Sub-node Count"] = String(count);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
orgNode,
|
|
95
|
+
children: buildTreeNodes(
|
|
96
|
+
orgNode.children,
|
|
97
|
+
hiddenCounts,
|
|
98
|
+
hiddenAttributes,
|
|
99
|
+
subNodeLabel,
|
|
100
|
+
showSubNodeCount
|
|
101
|
+
),
|
|
102
|
+
width: computeCardWidth(orgNode.label, meta),
|
|
103
|
+
height: computeCardHeight(meta)
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function countDescendants(node) {
|
|
108
|
+
let count = 0;
|
|
109
|
+
for (const child of node.children) {
|
|
110
|
+
count += 1 + countDescendants(child);
|
|
111
|
+
}
|
|
112
|
+
return count;
|
|
113
|
+
}
|
|
114
|
+
function centerHeavyChildren(node) {
|
|
115
|
+
for (const child of node.children) {
|
|
116
|
+
centerHeavyChildren(child);
|
|
117
|
+
}
|
|
118
|
+
if (node.children.length <= 2) return;
|
|
119
|
+
const weighted = node.children.map((child) => ({ child, weight: countDescendants(child) })).sort((a, b) => b.weight - a.weight);
|
|
120
|
+
const result = new Array(weighted.length);
|
|
121
|
+
const mid = Math.floor((weighted.length - 1) / 2);
|
|
122
|
+
let left = mid;
|
|
123
|
+
let right = mid;
|
|
124
|
+
for (let i = 0; i < weighted.length; i++) {
|
|
125
|
+
const w = weighted[i];
|
|
126
|
+
if (i === 0) {
|
|
127
|
+
result[mid] = w.child;
|
|
128
|
+
} else if (i % 2 === 1) {
|
|
129
|
+
right++;
|
|
130
|
+
result[right] = w.child;
|
|
131
|
+
} else {
|
|
132
|
+
left--;
|
|
133
|
+
result[left] = w.child;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
node.children = result;
|
|
137
|
+
}
|
|
138
|
+
function computeLegendGroups(tagGroups, showEyeIcons, usedValuesByGroup) {
|
|
139
|
+
const groups = [];
|
|
140
|
+
for (const group of tagGroups) {
|
|
141
|
+
if (group.entries.length === 0) continue;
|
|
142
|
+
const usedValues = usedValuesByGroup?.get(tagAttrKey(group.name));
|
|
143
|
+
const visibleEntries = usedValues ? group.entries.filter((e) => usedValues.has(e.value.toLowerCase())) : group.entries;
|
|
144
|
+
if (visibleEntries.length === 0) continue;
|
|
145
|
+
const pillWidth = measureLegendText(group.name, LEGEND_PILL_FONT_SIZE) + LEGEND_PILL_PAD;
|
|
146
|
+
const minPillWidth = pillWidth;
|
|
147
|
+
let entriesWidth = 0;
|
|
148
|
+
for (const entry of visibleEntries) {
|
|
149
|
+
entriesWidth += LEGEND_DOT_R * 2 + LEGEND_ENTRY_DOT_GAP + measureLegendText(entry.value, LEGEND_ENTRY_FONT_SIZE) + LEGEND_ENTRY_TRAIL;
|
|
150
|
+
}
|
|
151
|
+
const eyeSpace = showEyeIcons ? LEGEND_EYE_SIZE + LEGEND_EYE_GAP : 0;
|
|
152
|
+
const capsuleWidth = LEGEND_CAPSULE_PAD * 2 + pillWidth + 4 + eyeSpace + entriesWidth;
|
|
153
|
+
groups.push({
|
|
154
|
+
name: group.name,
|
|
155
|
+
...group.alias !== void 0 && { alias: group.alias },
|
|
156
|
+
entries: visibleEntries.map((e) => ({
|
|
157
|
+
value: e.value,
|
|
158
|
+
color: e.color
|
|
159
|
+
})),
|
|
160
|
+
x: 0,
|
|
161
|
+
y: 0,
|
|
162
|
+
width: capsuleWidth,
|
|
163
|
+
height: LEGEND_HEIGHT,
|
|
164
|
+
minifiedWidth: minPillWidth,
|
|
165
|
+
minifiedHeight: LEGEND_HEIGHT
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return groups;
|
|
169
|
+
}
|
|
170
|
+
function injectDefaultMetadata(roots, tagGroups) {
|
|
171
|
+
const allNodes = [];
|
|
172
|
+
const collect = (node) => {
|
|
173
|
+
allNodes.push(node);
|
|
174
|
+
for (const child of node.children) collect(child);
|
|
175
|
+
};
|
|
176
|
+
for (const root of roots) collect(root);
|
|
177
|
+
injectDefaultTagMetadata(
|
|
178
|
+
allNodes,
|
|
179
|
+
tagGroups,
|
|
180
|
+
(entity) => entity.isContainer
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
function layoutOrg(parsed, hiddenCounts, activeTagGroup, hiddenAttributes, expandAllLegend) {
|
|
184
|
+
if (parsed.roots.length === 0) {
|
|
185
|
+
const showEyeIcons2 = hiddenAttributes !== void 0;
|
|
186
|
+
const legendGroups2 = computeLegendGroups(parsed.tagGroups, showEyeIcons2);
|
|
187
|
+
if (legendGroups2.length === 0) {
|
|
188
|
+
return {
|
|
189
|
+
nodes: [],
|
|
190
|
+
edges: [],
|
|
191
|
+
containers: [],
|
|
192
|
+
legend: [],
|
|
193
|
+
width: 0,
|
|
194
|
+
height: 0
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
let cy = MARGIN;
|
|
198
|
+
let maxWidth2 = 0;
|
|
199
|
+
for (const g of legendGroups2) {
|
|
200
|
+
g.x = MARGIN;
|
|
201
|
+
g.y = cy;
|
|
202
|
+
cy += LEGEND_HEIGHT + LEGEND_GROUP_GAP;
|
|
203
|
+
if (g.width > maxWidth2) maxWidth2 = g.width;
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
nodes: [],
|
|
207
|
+
edges: [],
|
|
208
|
+
containers: [],
|
|
209
|
+
legend: legendGroups2,
|
|
210
|
+
width: maxWidth2 + MARGIN * 2,
|
|
211
|
+
height: cy - LEGEND_GROUP_GAP + MARGIN
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
injectDefaultMetadata(parsed.roots, parsed.tagGroups);
|
|
215
|
+
const subNodeLabel = parsed.options["sub-node-label"] ?? void 0;
|
|
216
|
+
const showSubNodeCount = ["yes", "on"].includes(
|
|
217
|
+
parsed.options["show-sub-node-count"]?.toLowerCase() ?? ""
|
|
218
|
+
);
|
|
219
|
+
const treeNodes = buildTreeNodes(
|
|
220
|
+
parsed.roots,
|
|
221
|
+
hiddenCounts,
|
|
222
|
+
hiddenAttributes,
|
|
223
|
+
subNodeLabel,
|
|
224
|
+
showSubNodeCount
|
|
225
|
+
);
|
|
226
|
+
let root;
|
|
227
|
+
if (treeNodes.length === 1) {
|
|
228
|
+
root = treeNodes[0];
|
|
229
|
+
} else {
|
|
230
|
+
root = {
|
|
231
|
+
orgNode: {
|
|
232
|
+
id: "__virtual_root__",
|
|
233
|
+
label: "",
|
|
234
|
+
metadata: {},
|
|
235
|
+
children: parsed.roots,
|
|
236
|
+
parentId: null,
|
|
237
|
+
isContainer: false,
|
|
238
|
+
lineNumber: 0
|
|
239
|
+
},
|
|
240
|
+
children: treeNodes,
|
|
241
|
+
width: 0,
|
|
242
|
+
height: 0
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
let maxWidth = 0;
|
|
246
|
+
let maxHeight = 0;
|
|
247
|
+
const allTreeNodes = [];
|
|
248
|
+
const collectNodes = (tn) => {
|
|
249
|
+
if (tn.orgNode.id !== "__virtual_root__") {
|
|
250
|
+
allTreeNodes.push(tn);
|
|
251
|
+
if (tn.width > maxWidth) maxWidth = tn.width;
|
|
252
|
+
if (tn.height > maxHeight) maxHeight = tn.height;
|
|
253
|
+
}
|
|
254
|
+
for (const child of tn.children) collectNodes(child);
|
|
255
|
+
};
|
|
256
|
+
collectNodes(root);
|
|
257
|
+
for (const tn of allTreeNodes) {
|
|
258
|
+
tn.width = maxWidth;
|
|
259
|
+
}
|
|
260
|
+
const leafStacks = /* @__PURE__ */ new Map();
|
|
261
|
+
const collapseLeafContainers = (tn) => {
|
|
262
|
+
for (const child of tn.children) collapseLeafContainers(child);
|
|
263
|
+
if (tn.orgNode.isContainer && tn.children.length > 0 && tn.children.every((c) => c.children.length === 0)) {
|
|
264
|
+
const placeholderId = `__stack_${tn.orgNode.id}`;
|
|
265
|
+
leafStacks.set(tn.orgNode.id, {
|
|
266
|
+
children: [...tn.children],
|
|
267
|
+
placeholderId
|
|
268
|
+
});
|
|
269
|
+
const maxW = Math.max(...tn.children.map((c) => c.width));
|
|
270
|
+
for (const child of tn.children) {
|
|
271
|
+
child.width = maxW;
|
|
272
|
+
}
|
|
273
|
+
const totalH = tn.children.reduce((s, c) => s + c.height, 0) + (tn.children.length - 1) * STACK_V_GAP;
|
|
274
|
+
tn.children = [
|
|
275
|
+
{
|
|
276
|
+
orgNode: {
|
|
277
|
+
id: placeholderId,
|
|
278
|
+
label: "",
|
|
279
|
+
metadata: {},
|
|
280
|
+
children: [],
|
|
281
|
+
parentId: tn.orgNode.id,
|
|
282
|
+
isContainer: false,
|
|
283
|
+
lineNumber: 0
|
|
284
|
+
},
|
|
285
|
+
children: [],
|
|
286
|
+
width: maxW,
|
|
287
|
+
height: totalH
|
|
288
|
+
}
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
collapseLeafContainers(root);
|
|
293
|
+
centerHeavyChildren(root);
|
|
294
|
+
const h = hierarchy(root, (d) => d.children);
|
|
295
|
+
const treeLayout = tree().nodeSize([
|
|
296
|
+
maxWidth + H_GAP,
|
|
297
|
+
maxHeight + V_GAP
|
|
298
|
+
]);
|
|
299
|
+
treeLayout(h);
|
|
300
|
+
{
|
|
301
|
+
const descendants = h.descendants().filter((d) => d.data.orgNode.id !== "__virtual_root__");
|
|
302
|
+
const levelMaxHeight = /* @__PURE__ */ new Map();
|
|
303
|
+
for (const d of descendants) {
|
|
304
|
+
if (d.data.orgNode.id.startsWith("__stack_")) continue;
|
|
305
|
+
const cur = levelMaxHeight.get(d.depth) ?? 0;
|
|
306
|
+
if (d.data.height > cur) levelMaxHeight.set(d.depth, d.data.height);
|
|
307
|
+
}
|
|
308
|
+
const maxDepth = Math.max(...levelMaxHeight.keys(), 0);
|
|
309
|
+
const compactedY = /* @__PURE__ */ new Map();
|
|
310
|
+
const rootDepth = treeNodes.length === 1 ? 0 : 1;
|
|
311
|
+
compactedY.set(rootDepth, 0);
|
|
312
|
+
for (let d = rootDepth + 1; d <= maxDepth; d++) {
|
|
313
|
+
const parentH = levelMaxHeight.get(d - 1) ?? maxHeight;
|
|
314
|
+
const prevY = compactedY.get(d - 1) ?? 0;
|
|
315
|
+
compactedY.set(d, prevY + parentH + V_GAP);
|
|
316
|
+
}
|
|
317
|
+
for (const d of h.descendants()) {
|
|
318
|
+
if (d.data.orgNode.id === "__virtual_root__") continue;
|
|
319
|
+
d.y = compactedY.get(d.depth) ?? d.y;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
for (const d of h.descendants()) {
|
|
323
|
+
if (d.data.orgNode.id === "__virtual_root__") continue;
|
|
324
|
+
if (!d.data.orgNode.isContainer) continue;
|
|
325
|
+
if (!d.children || d.children.length === 0) continue;
|
|
326
|
+
const childY = d.children[0].y;
|
|
327
|
+
const actualLevelGap = childY - d.y;
|
|
328
|
+
const metaCount = Object.keys(d.data.orgNode.metadata).length;
|
|
329
|
+
const headerHeight = CONTAINER_LABEL_HEIGHT + metaCount * CONTAINER_META_LINE_HEIGHT;
|
|
330
|
+
const desiredGap = headerHeight + 15;
|
|
331
|
+
const shiftUp = actualLevelGap - desiredGap;
|
|
332
|
+
if (shiftUp <= 0) continue;
|
|
333
|
+
const shift = (node) => {
|
|
334
|
+
if (node.children) {
|
|
335
|
+
for (const child of node.children) {
|
|
336
|
+
child.y -= shiftUp;
|
|
337
|
+
shift(child);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
shift(d);
|
|
342
|
+
}
|
|
343
|
+
for (const d of h.descendants()) {
|
|
344
|
+
if (d.data.orgNode.id === "__virtual_root__") continue;
|
|
345
|
+
if (d.data.orgNode.isContainer) continue;
|
|
346
|
+
if (!d.children || d.children.length === 0) continue;
|
|
347
|
+
if (!d.children.every((c) => c.data.orgNode.isContainer)) continue;
|
|
348
|
+
const parentBottomY = d.y + d.data.height;
|
|
349
|
+
const firstChildY = Math.min(...d.children.map((c) => c.y));
|
|
350
|
+
const currentGap = firstChildY - parentBottomY;
|
|
351
|
+
const desiredGap = V_GAP * 0.6;
|
|
352
|
+
const shiftUp = currentGap - desiredGap;
|
|
353
|
+
if (shiftUp <= 0) continue;
|
|
354
|
+
const shiftDown = (node) => {
|
|
355
|
+
node.y -= shiftUp;
|
|
356
|
+
if (node.children) {
|
|
357
|
+
for (const child of node.children) {
|
|
358
|
+
shiftDown(child);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
for (const child of d.children) {
|
|
363
|
+
shiftDown(child);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
{
|
|
367
|
+
const subtreeExtent = (node) => {
|
|
368
|
+
let min = node.x - node.data.width / 2;
|
|
369
|
+
let max = node.x + node.data.width / 2;
|
|
370
|
+
if (node.children) {
|
|
371
|
+
for (const child of node.children) {
|
|
372
|
+
const childExt = subtreeExtent(child);
|
|
373
|
+
if (childExt.minX < min) min = childExt.minX;
|
|
374
|
+
if (childExt.maxX > max) max = childExt.maxX;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (node.data.orgNode.isContainer) {
|
|
378
|
+
min -= CONTAINER_PAD_X;
|
|
379
|
+
max += CONTAINER_PAD_X;
|
|
380
|
+
}
|
|
381
|
+
return { minX: min, maxX: max };
|
|
382
|
+
};
|
|
383
|
+
const shiftX = (node, dx) => {
|
|
384
|
+
node.x += dx;
|
|
385
|
+
if (node.children) node.children.forEach((c) => shiftX(c, dx));
|
|
386
|
+
};
|
|
387
|
+
const internalNodes = h.descendants().filter((d) => d.children && d.children.length >= 2).sort((a, b) => b.depth - a.depth);
|
|
388
|
+
for (const parent of internalNodes) {
|
|
389
|
+
const children = parent.children;
|
|
390
|
+
const extents = children.map((child) => {
|
|
391
|
+
const ext = subtreeExtent(child);
|
|
392
|
+
return {
|
|
393
|
+
relLeft: ext.minX - child.x,
|
|
394
|
+
relRight: ext.maxX - child.x
|
|
395
|
+
};
|
|
396
|
+
});
|
|
397
|
+
const currentCenter = (children[0].x + children[children.length - 1].x) / 2;
|
|
398
|
+
const positions = [0];
|
|
399
|
+
for (let i = 1; i < children.length; i++) {
|
|
400
|
+
const prevRight = positions[i - 1] + extents[i - 1].relRight;
|
|
401
|
+
positions[i] = prevRight + H_GAP - extents[i].relLeft;
|
|
402
|
+
}
|
|
403
|
+
const newCenter = (positions[0] + positions[positions.length - 1]) / 2;
|
|
404
|
+
const centerShift = currentCenter - newCenter;
|
|
405
|
+
for (let i = 0; i < children.length; i++) {
|
|
406
|
+
const newX = positions[i] + centerShift;
|
|
407
|
+
const dx = newX - children[i].x;
|
|
408
|
+
if (Math.abs(dx) > 1e-3) {
|
|
409
|
+
shiftX(children[i], dx);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
{
|
|
415
|
+
const parentNodes = h.descendants().filter(
|
|
416
|
+
(d) => d.children && d.children.length >= 1 && d.data.orgNode.id !== "__virtual_root__"
|
|
417
|
+
).sort((a, b) => b.depth - a.depth);
|
|
418
|
+
for (const parent of parentNodes) {
|
|
419
|
+
const childXs = parent.children.map((c) => c.x);
|
|
420
|
+
const desiredX = (Math.min(...childXs) + Math.max(...childXs)) / 2;
|
|
421
|
+
parent.x = desiredX;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
const layoutNodes = [];
|
|
425
|
+
const layoutEdges = [];
|
|
426
|
+
let minX = Infinity;
|
|
427
|
+
let maxX = -Infinity;
|
|
428
|
+
let minY = Infinity;
|
|
429
|
+
let maxY = -Infinity;
|
|
430
|
+
const expandedChildren = [];
|
|
431
|
+
for (const d of h.descendants()) {
|
|
432
|
+
if (d.data.orgNode.id === "__virtual_root__") continue;
|
|
433
|
+
if (!d.data.orgNode.id.startsWith("__stack_")) continue;
|
|
434
|
+
const containerId = d.data.orgNode.id.replace("__stack_", "");
|
|
435
|
+
const stack = leafStacks.get(containerId);
|
|
436
|
+
if (!stack) continue;
|
|
437
|
+
let currentY = d.y;
|
|
438
|
+
for (const child of stack.children) {
|
|
439
|
+
expandedChildren.push({
|
|
440
|
+
orgNode: child.orgNode,
|
|
441
|
+
width: child.width,
|
|
442
|
+
height: child.height,
|
|
443
|
+
cx: d.x,
|
|
444
|
+
cy: currentY
|
|
445
|
+
});
|
|
446
|
+
currentY += child.height + STACK_V_GAP;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
for (const d of h.descendants()) {
|
|
450
|
+
if (d.data.orgNode.id === "__virtual_root__") continue;
|
|
451
|
+
if (d.data.orgNode.id.startsWith("__stack_")) continue;
|
|
452
|
+
const w = d.data.width;
|
|
453
|
+
const ht = d.data.height;
|
|
454
|
+
const cx = d.x;
|
|
455
|
+
const cy = d.y;
|
|
456
|
+
if (cx - w / 2 < minX) minX = cx - w / 2;
|
|
457
|
+
if (cx + w / 2 > maxX) maxX = cx + w / 2;
|
|
458
|
+
if (cy < minY) minY = cy;
|
|
459
|
+
if (cy + ht > maxY) maxY = cy + ht;
|
|
460
|
+
}
|
|
461
|
+
for (const ec of expandedChildren) {
|
|
462
|
+
if (ec.cx - ec.width / 2 < minX) minX = ec.cx - ec.width / 2;
|
|
463
|
+
if (ec.cx + ec.width / 2 > maxX) maxX = ec.cx + ec.width / 2;
|
|
464
|
+
if (ec.cy < minY) minY = ec.cy;
|
|
465
|
+
if (ec.cy + ec.height > maxY) maxY = ec.cy + ec.height;
|
|
466
|
+
}
|
|
467
|
+
const offsetX = -minX + MARGIN;
|
|
468
|
+
const offsetY = -minY + MARGIN;
|
|
469
|
+
const subNodeKey = subNodeLabel ?? "Sub-node Count";
|
|
470
|
+
for (const ec of expandedChildren) {
|
|
471
|
+
const hc = hiddenCounts?.get(ec.orgNode.id);
|
|
472
|
+
const meta = filterMetadata(ec.orgNode.metadata, hiddenAttributes);
|
|
473
|
+
if (!ec.orgNode.isContainer && showSubNodeCount && !(hc != null && hc > 0)) {
|
|
474
|
+
const count = countDescendantNodes(ec.orgNode, hiddenCounts);
|
|
475
|
+
if (count > 0) meta[subNodeKey] = String(count);
|
|
476
|
+
}
|
|
477
|
+
const ecColor = resolveNodeColor(
|
|
478
|
+
ec.orgNode,
|
|
479
|
+
parsed.tagGroups,
|
|
480
|
+
activeTagGroup ?? null
|
|
481
|
+
);
|
|
482
|
+
const ecHasChildren = ec.orgNode.children.length > 0 || hc != null && hc > 0 || void 0;
|
|
483
|
+
layoutNodes.push({
|
|
484
|
+
id: ec.orgNode.id,
|
|
485
|
+
label: ec.orgNode.label,
|
|
486
|
+
metadata: meta,
|
|
487
|
+
tagMetadata: { ...ec.orgNode.metadata },
|
|
488
|
+
isContainer: ec.orgNode.isContainer,
|
|
489
|
+
lineNumber: ec.orgNode.lineNumber,
|
|
490
|
+
...ecColor !== void 0 && { color: ecColor },
|
|
491
|
+
x: ec.cx + offsetX,
|
|
492
|
+
y: ec.cy + offsetY,
|
|
493
|
+
width: ec.width,
|
|
494
|
+
height: ec.height,
|
|
495
|
+
...hc !== void 0 && { hiddenCount: hc },
|
|
496
|
+
...ecHasChildren !== void 0 && { hasChildren: ecHasChildren }
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
const busGroups = /* @__PURE__ */ new Map();
|
|
500
|
+
for (const d of h.descendants()) {
|
|
501
|
+
if (d.data.orgNode.id === "__virtual_root__") continue;
|
|
502
|
+
if (d.data.orgNode.id.startsWith("__stack_")) continue;
|
|
503
|
+
const orgNode = d.data.orgNode;
|
|
504
|
+
const w = d.data.width;
|
|
505
|
+
const ht = d.data.height;
|
|
506
|
+
const x = d.x + offsetX;
|
|
507
|
+
const y = d.y + offsetY;
|
|
508
|
+
const hc = hiddenCounts?.get(orgNode.id);
|
|
509
|
+
const nodeMeta = filterMetadata(orgNode.metadata, hiddenAttributes);
|
|
510
|
+
if (!orgNode.isContainer && showSubNodeCount && !(hc != null && hc > 0)) {
|
|
511
|
+
const count = countDescendantNodes(orgNode, hiddenCounts);
|
|
512
|
+
if (count > 0) nodeMeta[subNodeKey] = String(count);
|
|
513
|
+
}
|
|
514
|
+
const nodeColor = resolveNodeColor(
|
|
515
|
+
orgNode,
|
|
516
|
+
parsed.tagGroups,
|
|
517
|
+
activeTagGroup ?? null
|
|
518
|
+
);
|
|
519
|
+
const nodeHasChildren = d.children != null && d.children.length > 0 || hc != null && hc > 0 || void 0;
|
|
520
|
+
layoutNodes.push({
|
|
521
|
+
id: orgNode.id,
|
|
522
|
+
label: orgNode.label,
|
|
523
|
+
metadata: nodeMeta,
|
|
524
|
+
tagMetadata: { ...orgNode.metadata },
|
|
525
|
+
isContainer: orgNode.isContainer,
|
|
526
|
+
lineNumber: orgNode.lineNumber,
|
|
527
|
+
...nodeColor !== void 0 && { color: nodeColor },
|
|
528
|
+
x,
|
|
529
|
+
y,
|
|
530
|
+
width: w,
|
|
531
|
+
height: ht,
|
|
532
|
+
...hc !== void 0 && { hiddenCount: hc },
|
|
533
|
+
...nodeHasChildren !== void 0 && { hasChildren: nodeHasChildren }
|
|
534
|
+
});
|
|
535
|
+
const parentIsContainerBox = d.parent?.data.orgNode.isContainer && d.parent.children && d.parent.children.length > 0;
|
|
536
|
+
if (d.parent && d.parent.data.orgNode.id !== "__virtual_root__" && !parentIsContainerBox) {
|
|
537
|
+
const parentId = d.parent.data.orgNode.id;
|
|
538
|
+
if (!busGroups.has(parentId)) {
|
|
539
|
+
const px = d.parent.x + offsetX;
|
|
540
|
+
const py = d.parent.y + offsetY;
|
|
541
|
+
const parentH = d.parent.data.height;
|
|
542
|
+
busGroups.set(parentId, {
|
|
543
|
+
parentX: px,
|
|
544
|
+
parentBottomY: py + parentH,
|
|
545
|
+
children: []
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
busGroups.get(parentId).children.push({
|
|
549
|
+
id: orgNode.id,
|
|
550
|
+
x,
|
|
551
|
+
topY: y
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
for (const [parentId, group] of busGroups) {
|
|
556
|
+
const { parentX, parentBottomY, children } = group;
|
|
557
|
+
if (children.length === 1) {
|
|
558
|
+
const child = children[0];
|
|
559
|
+
const midY = (parentBottomY + child.topY) / 2;
|
|
560
|
+
layoutEdges.push({
|
|
561
|
+
sourceId: parentId,
|
|
562
|
+
targetId: child.id,
|
|
563
|
+
points: [
|
|
564
|
+
{ x: parentX, y: parentBottomY },
|
|
565
|
+
{ x: parentX, y: midY },
|
|
566
|
+
{ x: child.x, y: midY },
|
|
567
|
+
{ x: child.x, y: child.topY }
|
|
568
|
+
]
|
|
569
|
+
});
|
|
570
|
+
} else {
|
|
571
|
+
const midY = (parentBottomY + children[0].topY) / 2;
|
|
572
|
+
const childXs = children.map((c) => c.x);
|
|
573
|
+
const leftX = Math.min(...childXs);
|
|
574
|
+
const rightX = Math.max(...childXs);
|
|
575
|
+
layoutEdges.push({
|
|
576
|
+
sourceId: parentId,
|
|
577
|
+
targetId: parentId,
|
|
578
|
+
points: [
|
|
579
|
+
{ x: parentX, y: parentBottomY },
|
|
580
|
+
{ x: parentX, y: midY }
|
|
581
|
+
]
|
|
582
|
+
});
|
|
583
|
+
layoutEdges.push({
|
|
584
|
+
sourceId: parentId,
|
|
585
|
+
targetId: parentId,
|
|
586
|
+
points: [
|
|
587
|
+
{ x: leftX, y: midY },
|
|
588
|
+
{ x: rightX, y: midY }
|
|
589
|
+
]
|
|
590
|
+
});
|
|
591
|
+
for (const child of children) {
|
|
592
|
+
layoutEdges.push({
|
|
593
|
+
sourceId: parentId,
|
|
594
|
+
targetId: child.id,
|
|
595
|
+
points: [
|
|
596
|
+
{ x: child.x, y: midY },
|
|
597
|
+
{ x: child.x, y: child.topY }
|
|
598
|
+
]
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
const allContainerNodes = h.descendants().filter(
|
|
604
|
+
(d) => d.data.orgNode.id !== "__virtual_root__" && d.data.orgNode.isContainer
|
|
605
|
+
);
|
|
606
|
+
const containerBoundsMap = /* @__PURE__ */ new Map();
|
|
607
|
+
const containers = [];
|
|
608
|
+
const EMPTY_CONTAINER_MIN_HEIGHT = 60;
|
|
609
|
+
for (const d of allContainerNodes) {
|
|
610
|
+
if (d.children && d.children.length > 0) continue;
|
|
611
|
+
const cx = d.x + offsetX;
|
|
612
|
+
const cy = d.y + offsetY;
|
|
613
|
+
const metaCount = Object.keys(d.data.orgNode.metadata).length;
|
|
614
|
+
const labelHeight = CONTAINER_LABEL_HEIGHT + metaCount * CONTAINER_META_LINE_HEIGHT;
|
|
615
|
+
const boxWidth = d.data.width;
|
|
616
|
+
const boxHeight = Math.max(
|
|
617
|
+
labelHeight + CONTAINER_PAD_BOTTOM,
|
|
618
|
+
EMPTY_CONTAINER_MIN_HEIGHT
|
|
619
|
+
);
|
|
620
|
+
const boxX = cx - boxWidth / 2;
|
|
621
|
+
const boxY = cy;
|
|
622
|
+
containerBoundsMap.set(d.data.orgNode.id, {
|
|
623
|
+
minX: boxX,
|
|
624
|
+
maxX: boxX + boxWidth,
|
|
625
|
+
minY: boxY,
|
|
626
|
+
maxY: boxY + boxHeight
|
|
627
|
+
});
|
|
628
|
+
const chc = hiddenCounts?.get(d.data.orgNode.id);
|
|
629
|
+
const cMeta = filterMetadata(d.data.orgNode.metadata, hiddenAttributes);
|
|
630
|
+
const cColor = resolveNodeColor(
|
|
631
|
+
d.data.orgNode,
|
|
632
|
+
parsed.tagGroups,
|
|
633
|
+
activeTagGroup ?? null
|
|
634
|
+
);
|
|
635
|
+
const cHasChildren = chc != null && chc > 0 || void 0;
|
|
636
|
+
containers.push({
|
|
637
|
+
nodeId: d.data.orgNode.id,
|
|
638
|
+
label: d.data.orgNode.label,
|
|
639
|
+
lineNumber: d.data.orgNode.lineNumber,
|
|
640
|
+
...cColor !== void 0 && { color: cColor },
|
|
641
|
+
metadata: cMeta,
|
|
642
|
+
tagMetadata: { ...d.data.orgNode.metadata },
|
|
643
|
+
x: boxX,
|
|
644
|
+
y: boxY,
|
|
645
|
+
width: boxWidth,
|
|
646
|
+
height: boxHeight,
|
|
647
|
+
labelHeight,
|
|
648
|
+
...chc !== void 0 && { hiddenCount: chc },
|
|
649
|
+
...cHasChildren !== void 0 && { hasChildren: cHasChildren }
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
const containerCandidates = allContainerNodes.filter(
|
|
653
|
+
(d) => d.children && d.children.length > 0
|
|
654
|
+
);
|
|
655
|
+
containerCandidates.sort((a, b) => b.depth - a.depth);
|
|
656
|
+
for (const d of containerCandidates) {
|
|
657
|
+
const allDesc = [];
|
|
658
|
+
const collectDesc = (node) => {
|
|
659
|
+
if (node.children) {
|
|
660
|
+
for (const child of node.children) {
|
|
661
|
+
allDesc.push(child);
|
|
662
|
+
collectDesc(child);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
collectDesc(d);
|
|
667
|
+
if (allDesc.length === 0) continue;
|
|
668
|
+
let descMinX = Infinity;
|
|
669
|
+
let descMaxX = -Infinity;
|
|
670
|
+
let descMaxY = -Infinity;
|
|
671
|
+
for (const desc of allDesc) {
|
|
672
|
+
const innerBounds = containerBoundsMap.get(desc.data.orgNode.id);
|
|
673
|
+
if (innerBounds) {
|
|
674
|
+
if (innerBounds.minX < descMinX) descMinX = innerBounds.minX;
|
|
675
|
+
if (innerBounds.maxX > descMaxX) descMaxX = innerBounds.maxX;
|
|
676
|
+
if (innerBounds.maxY > descMaxY) descMaxY = innerBounds.maxY;
|
|
677
|
+
} else if (desc.data.orgNode.id.startsWith("__stack_")) {
|
|
678
|
+
const cid = desc.data.orgNode.id.replace("__stack_", "");
|
|
679
|
+
const stack = leafStacks.get(cid);
|
|
680
|
+
if (stack) {
|
|
681
|
+
for (const ec of expandedChildren) {
|
|
682
|
+
if (ec.orgNode.parentId !== cid) continue;
|
|
683
|
+
const ex = ec.cx + offsetX;
|
|
684
|
+
const ey = ec.cy + offsetY;
|
|
685
|
+
if (ex - ec.width / 2 < descMinX) descMinX = ex - ec.width / 2;
|
|
686
|
+
if (ex + ec.width / 2 > descMaxX) descMaxX = ex + ec.width / 2;
|
|
687
|
+
if (ey + ec.height > descMaxY) descMaxY = ey + ec.height;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
} else {
|
|
691
|
+
const dw = desc.data.width;
|
|
692
|
+
const dh = desc.data.height;
|
|
693
|
+
const dx = desc.x + offsetX;
|
|
694
|
+
const dy = desc.y + offsetY;
|
|
695
|
+
if (dx - dw / 2 < descMinX) descMinX = dx - dw / 2;
|
|
696
|
+
if (dx + dw / 2 > descMaxX) descMaxX = dx + dw / 2;
|
|
697
|
+
if (dy + dh > descMaxY) descMaxY = dy + dh;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
const containerX = d.x + offsetX;
|
|
701
|
+
const containerY = d.y + offsetY;
|
|
702
|
+
const metaCount = Object.keys(d.data.orgNode.metadata).length;
|
|
703
|
+
const labelHeight = CONTAINER_LABEL_HEIGHT + metaCount * CONTAINER_META_LINE_HEIGHT;
|
|
704
|
+
const boxY = containerY;
|
|
705
|
+
const boxHeight = descMaxY - containerY + CONTAINER_PAD_BOTTOM;
|
|
706
|
+
const boxX = descMinX - CONTAINER_PAD_X;
|
|
707
|
+
const contentWidth = descMaxX - descMinX + CONTAINER_PAD_X * 2;
|
|
708
|
+
const finalBoxWidth = Math.max(contentWidth, d.data.width);
|
|
709
|
+
const centeredBoxX = finalBoxWidth > contentWidth ? containerX - finalBoxWidth / 2 : boxX;
|
|
710
|
+
containerBoundsMap.set(d.data.orgNode.id, {
|
|
711
|
+
minX: centeredBoxX,
|
|
712
|
+
maxX: centeredBoxX + finalBoxWidth,
|
|
713
|
+
minY: boxY,
|
|
714
|
+
maxY: boxY + boxHeight
|
|
715
|
+
});
|
|
716
|
+
const chc2 = hiddenCounts?.get(d.data.orgNode.id);
|
|
717
|
+
const cMeta2 = filterMetadata(d.data.orgNode.metadata, hiddenAttributes);
|
|
718
|
+
const c2Color = resolveNodeColor(
|
|
719
|
+
d.data.orgNode,
|
|
720
|
+
parsed.tagGroups,
|
|
721
|
+
activeTagGroup ?? null
|
|
722
|
+
);
|
|
723
|
+
containers.push({
|
|
724
|
+
nodeId: d.data.orgNode.id,
|
|
725
|
+
label: d.data.orgNode.label,
|
|
726
|
+
lineNumber: d.data.orgNode.lineNumber,
|
|
727
|
+
...c2Color !== void 0 && { color: c2Color },
|
|
728
|
+
metadata: cMeta2,
|
|
729
|
+
tagMetadata: { ...d.data.orgNode.metadata },
|
|
730
|
+
x: centeredBoxX,
|
|
731
|
+
y: boxY,
|
|
732
|
+
width: finalBoxWidth,
|
|
733
|
+
height: boxHeight,
|
|
734
|
+
labelHeight,
|
|
735
|
+
...chc2 !== void 0 && { hiddenCount: chc2 },
|
|
736
|
+
hasChildren: true
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
containers.reverse();
|
|
740
|
+
let finalMinX = minX;
|
|
741
|
+
let finalMaxX = maxX;
|
|
742
|
+
let finalMaxY = maxY;
|
|
743
|
+
for (const c of containers) {
|
|
744
|
+
const cLeft = c.x - offsetX;
|
|
745
|
+
const cRight = cLeft + c.width;
|
|
746
|
+
const cBottom = c.y - offsetY + c.height;
|
|
747
|
+
if (cLeft < finalMinX) finalMinX = cLeft;
|
|
748
|
+
if (cRight > finalMaxX) finalMaxX = cRight;
|
|
749
|
+
if (cBottom > finalMaxY) finalMaxY = cBottom;
|
|
750
|
+
}
|
|
751
|
+
const totalWidth = finalMaxX - finalMinX + MARGIN * 2;
|
|
752
|
+
const totalHeight = finalMaxY - minY + MARGIN * 2;
|
|
753
|
+
const usedValuesByGroup = /* @__PURE__ */ new Map();
|
|
754
|
+
for (const group of parsed.tagGroups) {
|
|
755
|
+
const key = tagAttrKey(group.name);
|
|
756
|
+
const used = /* @__PURE__ */ new Set();
|
|
757
|
+
const walk = (node) => {
|
|
758
|
+
if (!node.isContainer && node.metadata[key]) {
|
|
759
|
+
used.add(node.metadata[key].toLowerCase());
|
|
760
|
+
}
|
|
761
|
+
for (const child of node.children) walk(child);
|
|
762
|
+
};
|
|
763
|
+
for (const root2 of parsed.roots) walk(root2);
|
|
764
|
+
usedValuesByGroup.set(key, used);
|
|
765
|
+
}
|
|
766
|
+
const showEyeIcons = hiddenAttributes !== void 0;
|
|
767
|
+
const legendGroups = computeLegendGroups(
|
|
768
|
+
parsed.tagGroups,
|
|
769
|
+
showEyeIcons,
|
|
770
|
+
usedValuesByGroup
|
|
771
|
+
);
|
|
772
|
+
let finalWidth = totalWidth;
|
|
773
|
+
let finalHeight = totalHeight;
|
|
774
|
+
const visibleGroups = activeTagGroup != null ? legendGroups.filter(
|
|
775
|
+
(g) => g.name.toLowerCase() === activeTagGroup.toLowerCase()
|
|
776
|
+
) : legendGroups;
|
|
777
|
+
const allExpanded = expandAllLegend && activeTagGroup == null;
|
|
778
|
+
const effectiveW = (g) => activeTagGroup != null || allExpanded ? g.width : g.minifiedWidth;
|
|
779
|
+
if (visibleGroups.length > 0) {
|
|
780
|
+
const legendShift = LEGEND_HEIGHT + LEGEND_GROUP_GAP;
|
|
781
|
+
for (const n of layoutNodes) n.y += legendShift;
|
|
782
|
+
for (const c of containers) c.y += legendShift;
|
|
783
|
+
for (const e of layoutEdges) {
|
|
784
|
+
for (const p of e.points)
|
|
785
|
+
p.y += legendShift;
|
|
786
|
+
}
|
|
787
|
+
const totalGroupsWidth = visibleGroups.reduce((s, g) => s + effectiveW(g), 0) + (visibleGroups.length - 1) * LEGEND_GROUP_GAP;
|
|
788
|
+
let cx = MARGIN;
|
|
789
|
+
for (const g of visibleGroups) {
|
|
790
|
+
g.x = cx;
|
|
791
|
+
g.y = MARGIN;
|
|
792
|
+
cx += effectiveW(g) + LEGEND_GROUP_GAP;
|
|
793
|
+
}
|
|
794
|
+
finalHeight += legendShift;
|
|
795
|
+
const neededWidth = totalGroupsWidth + MARGIN * 2;
|
|
796
|
+
if (neededWidth > finalWidth) {
|
|
797
|
+
finalWidth = neededWidth;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
return {
|
|
801
|
+
nodes: layoutNodes,
|
|
802
|
+
edges: layoutEdges,
|
|
803
|
+
containers,
|
|
804
|
+
legend: legendGroups,
|
|
805
|
+
width: finalWidth,
|
|
806
|
+
height: finalHeight
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
export {
|
|
811
|
+
layoutOrg
|
|
812
|
+
};
|
|
813
|
+
//# sourceMappingURL=chunk-J5FIXQRT.js.map
|