@diagrammo/dgmo 0.86.0 → 0.88.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.d.ts +6 -18
- package/dist/advanced.js +40 -37
- package/dist/block.js +6 -17
- package/dist/{chunk-FAV4RDVT.js → chunk-2A4DQAXG.js} +1 -1
- package/dist/{chunk-JIPUBFAM.js → chunk-5KGM44TG.js} +2 -2
- package/dist/{chunk-VEE777MD.js → chunk-5LD7SHXO.js} +3 -3
- package/dist/{chunk-QJ2JOLFN.js → chunk-6I5UN4FD.js} +2 -2
- package/dist/{chunk-ETBXIKK6.js → chunk-ABP5BUD6.js} +9 -430
- package/dist/{chunk-PKXKWHDW.js → chunk-AUS7V54P.js} +1 -1
- package/dist/{chunk-BF7JAFJI.js → chunk-B7CU2HW5.js} +2 -2
- package/dist/{chunk-X2VEJ5NT.js → chunk-BMUWF77V.js} +2 -2
- package/dist/{chunk-BP4BT5TH.js → chunk-CLQIXD2C.js} +1 -1
- package/dist/{chunk-QJFT5MAH.js → chunk-DSG6GBUQ.js} +2 -2
- package/dist/{chunk-EWSESGC2.js → chunk-EJS3K44P.js} +117 -78
- package/dist/{chunk-5JO443MB.js → chunk-HAH5X345.js} +1 -1
- package/dist/{chunk-HBCAY3KR.js → chunk-HTNLLT34.js} +1 -1
- package/dist/{chunk-HUMQIRJK.js → chunk-HTPZDZKQ.js} +2 -2
- package/dist/{chunk-VPVWG2GH.js → chunk-J7Q4VPBJ.js} +1 -1
- package/dist/{chunk-QPE646M2.js → chunk-JLETTWUJ.js} +30 -10
- package/dist/{chunk-3CQS3CIO.js → chunk-LL6D3MES.js} +1 -1
- package/dist/{chunk-ERYHC4KJ.js → chunk-LSQGJN5H.js} +1 -1
- package/dist/{chunk-AGO3PFGS.js → chunk-MVCPO6LI.js} +15 -10
- package/dist/{chunk-E6S2K6O2.js → chunk-N7XRBWXA.js} +2 -2
- package/dist/{chunk-WMIKC5XO.js → chunk-NPWVOFB3.js} +1 -1
- package/dist/{chunk-MYHPRQHR.js → chunk-O6MMQQLF.js} +3 -3
- package/dist/{chunk-GYORDNOM.js → chunk-P5V63L35.js} +1 -1
- package/dist/{chunk-BHZE36F7.js → chunk-PUVTFUNH.js} +1 -1
- package/dist/{chunk-TW6WMZFW.js → chunk-QT3KDDXK.js} +156 -7
- package/dist/{chunk-ZGHV4QLK.js → chunk-RJNZHFNG.js} +1 -1
- package/dist/{chunk-FWNJDD4U.js → chunk-S7W75MIM.js} +3 -20
- package/dist/{chunk-4YA5XW43.js → chunk-VW52W5F6.js} +981 -107
- package/dist/chunk-WXPBP4IT.js +438 -0
- package/dist/{chunk-C6FZZFYD.js → chunk-WZ23JJ7U.js} +1 -1
- package/dist/{chunk-LIYWJ6DV.js → chunk-XIFK423U.js} +108 -13
- package/dist/{chunk-4ELXLATB.js → chunk-XUDGZJTJ.js} +2 -2
- package/dist/{chunk-H6AFNCN3.js → chunk-XVSJYAK7.js} +1 -1
- package/dist/{chunk-LHBMQJC3.js → chunk-XWYR5T52.js} +2 -2
- package/dist/{chunk-QNKHJ5CK.js → chunk-YK4N6TBN.js} +4 -2
- package/dist/{chunk-XFMQSFS4.js → chunk-YMG7JDEY.js} +16 -6
- package/dist/chunk-Z6DXWULM.js +23 -0
- package/dist/{chunk-PBEH52A2.js → chunk-ZNNVI5SR.js} +1 -1
- package/dist/{flowchart-renderer-H72L7BEC.js → flowchart-renderer-THC6Y7EH.js} +7 -6
- package/dist/index.d.ts +68 -1
- package/dist/index.js +76 -7
- package/dist/{layout-QIPCNUSB.js → layout-BOVTLAOT.js} +7 -6
- package/dist/{layout-6JARW64V.js → layout-EHTYSMV4.js} +6 -5
- package/dist/{layout-YELNBVPC.js → layout-P6DTD4RT.js} +6 -5
- package/dist/{layout-T6TAB5OI.js → layout-RANVNAKI.js} +3 -3
- package/dist/{layout-FMKSENGL.js → layout-XUW444O5.js} +5 -4
- package/dist/{layout-search-AW5VBDCV.js → layout-search-VKSBUCDM.js} +57 -28
- package/dist/{renderer-AI2MD52D.js → renderer-222OTVQV.js} +3 -2
- package/dist/{renderer-UUWR7NGF.js → renderer-2KVQGGTT.js} +4 -3
- package/dist/{renderer-E5EKGIX2.js → renderer-2OOPQ4CH.js} +4 -3
- package/dist/{renderer-CZJ4AMYV.js → renderer-3FF4QVGW.js} +3 -2
- package/dist/{renderer-R6VJDZFO.js → renderer-4BHOELCE.js} +4 -3
- package/dist/{renderer-425QUIYO.js → renderer-4BIMRO4X.js} +4 -3
- package/dist/{renderer-5JVVJBAS.js → renderer-A4LMOBZL.js} +8 -7
- package/dist/{renderer-3AOOLHJU.js → renderer-A6ACVK4X.js} +3 -2
- package/dist/{renderer-ML2CLU25.js → renderer-DCFQDBGJ.js} +4 -3
- package/dist/{renderer-RH4U3UVM.js → renderer-LODEVN3V.js} +3 -2
- package/dist/{renderer-E7WF75GY.js → renderer-NHPKNNBD.js} +5 -4
- package/dist/{renderer-JEEGPLMM.js → renderer-R34GJL7U.js} +8 -7
- package/dist/{renderer-2BWRW23Z.js → renderer-RENDISO5.js} +1 -1
- package/dist/{renderer-NX4YKWCJ.js → renderer-RNCYODNF.js} +1 -1
- package/dist/{renderer-VKAJ52UO.js → renderer-SDUSBCJI.js} +3 -2
- package/dist/{renderer-RLSR7N6I.js → renderer-TPOZOAXR.js} +5 -4
- package/dist/{renderer-RUGMKHX5.js → renderer-WH2HWE5Z.js} +3 -2
- package/dist/{renderer-V6LLASGN.js → renderer-X5A5VIRD.js} +5 -4
- package/dist/{renderer-ADX4DWRJ.js → renderer-XUPLAO4B.js} +4 -2
- package/dist/{renderer-EWJS2RAZ.js → renderer-YDAVCRTP.js} +3 -2
- package/dist/{state-renderer-DDVJ43HR.js → state-renderer-5IQ4OJUI.js} +7 -6
- package/gallery/fixtures/journey-map.dgmo +28 -0
- package/gallery/fixtures/mindmap.dgmo +31 -0
- package/gallery/fixtures/pert.dgmo +27 -0
- package/gallery/fixtures/wireframe.dgmo +30 -0
- package/package.json +2 -2
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
layoutBracket
|
|
3
|
+
} from "./chunk-ABP5BUD6.js";
|
|
1
4
|
import {
|
|
2
5
|
getRenderCategory,
|
|
3
6
|
parseArc,
|
|
@@ -12,15 +15,32 @@ import {
|
|
|
12
15
|
import {
|
|
13
16
|
MAP_DX
|
|
14
17
|
} from "./chunk-EOYPX6SF.js";
|
|
18
|
+
import {
|
|
19
|
+
parseClock
|
|
20
|
+
} from "./chunk-WP2RLGDI.js";
|
|
21
|
+
import {
|
|
22
|
+
parseBracket
|
|
23
|
+
} from "./chunk-ZUCXFXLD.js";
|
|
24
|
+
import {
|
|
25
|
+
parseBody
|
|
26
|
+
} from "./chunk-47E5UTXE.js";
|
|
15
27
|
import {
|
|
16
28
|
renderDataChartD3
|
|
17
29
|
} from "./chunk-H2GEIFUF.js";
|
|
18
30
|
import {
|
|
19
31
|
computeQuadrantPointLabels
|
|
20
32
|
} from "./chunk-KMU65FYM.js";
|
|
33
|
+
import {
|
|
34
|
+
parseChart,
|
|
35
|
+
parseFunctionChart,
|
|
36
|
+
parseFunnel,
|
|
37
|
+
parseHeatmap,
|
|
38
|
+
parseSankey,
|
|
39
|
+
parseScatter
|
|
40
|
+
} from "./chunk-7UDAIP6W.js";
|
|
21
41
|
import {
|
|
22
42
|
renderTimeline
|
|
23
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-JLETTWUJ.js";
|
|
24
44
|
import {
|
|
25
45
|
ScaleContext
|
|
26
46
|
} from "./chunk-24YPR5EH.js";
|
|
@@ -43,13 +63,118 @@ import {
|
|
|
43
63
|
import {
|
|
44
64
|
legendInlineSupported
|
|
45
65
|
} from "./chunk-3DOQOXXI.js";
|
|
66
|
+
import {
|
|
67
|
+
compactNumber
|
|
68
|
+
} from "./chunk-FM3WAVB6.js";
|
|
46
69
|
import {
|
|
47
70
|
FONT_FAMILY
|
|
48
71
|
} from "./chunk-ICLB27PZ.js";
|
|
72
|
+
import {
|
|
73
|
+
parseCycle
|
|
74
|
+
} from "./chunk-WQ6G6FFM.js";
|
|
75
|
+
import {
|
|
76
|
+
parseJourneyMap
|
|
77
|
+
} from "./chunk-NF5YKFRH.js";
|
|
78
|
+
import {
|
|
79
|
+
parsePyramid
|
|
80
|
+
} from "./chunk-PIXJL77H.js";
|
|
81
|
+
import {
|
|
82
|
+
parseRing
|
|
83
|
+
} from "./chunk-3C2FWS2J.js";
|
|
84
|
+
import {
|
|
85
|
+
parseTreemap
|
|
86
|
+
} from "./chunk-P3SKSKJI.js";
|
|
87
|
+
import {
|
|
88
|
+
parseBlock
|
|
89
|
+
} from "./chunk-MY6GUH26.js";
|
|
90
|
+
import {
|
|
91
|
+
isBlockNode
|
|
92
|
+
} from "./chunk-XSVWUOUZ.js";
|
|
93
|
+
import {
|
|
94
|
+
parseGoal
|
|
95
|
+
} from "./chunk-BOO24UMJ.js";
|
|
96
|
+
import {
|
|
97
|
+
parseCountdown
|
|
98
|
+
} from "./chunk-JQ57AWDL.js";
|
|
99
|
+
import {
|
|
100
|
+
parseMap
|
|
101
|
+
} from "./chunk-HTWH2XQL.js";
|
|
102
|
+
import {
|
|
103
|
+
parseBoxesAndLines
|
|
104
|
+
} from "./chunk-MHAYUS65.js";
|
|
105
|
+
import {
|
|
106
|
+
parseSketch
|
|
107
|
+
} from "./chunk-RU725VCJ.js";
|
|
108
|
+
import {
|
|
109
|
+
parseSwimlane
|
|
110
|
+
} from "./chunk-C7QRRTAW.js";
|
|
111
|
+
import {
|
|
112
|
+
parseFamily
|
|
113
|
+
} from "./chunk-FKZ2Y3Q5.js";
|
|
114
|
+
import {
|
|
115
|
+
parseMindmap
|
|
116
|
+
} from "./chunk-NGC3IZRY.js";
|
|
117
|
+
import {
|
|
118
|
+
parseTechRadar
|
|
119
|
+
} from "./chunk-6K7RODXG.js";
|
|
120
|
+
import {
|
|
121
|
+
parseEventLine
|
|
122
|
+
} from "./chunk-66YFDTT6.js";
|
|
123
|
+
import {
|
|
124
|
+
parseTimelineDate
|
|
125
|
+
} from "./chunk-GDJW64XE.js";
|
|
126
|
+
import {
|
|
127
|
+
parseVersionControl
|
|
128
|
+
} from "./chunk-QFHWYWQL.js";
|
|
129
|
+
import {
|
|
130
|
+
parseKanban
|
|
131
|
+
} from "./chunk-GUYVKGFN.js";
|
|
132
|
+
import {
|
|
133
|
+
parseC4
|
|
134
|
+
} from "./chunk-GSYZZFI5.js";
|
|
135
|
+
import {
|
|
136
|
+
parseInfra
|
|
137
|
+
} from "./chunk-GUTZCRBT.js";
|
|
138
|
+
import {
|
|
139
|
+
parseGantt
|
|
140
|
+
} from "./chunk-BAZT6CIF.js";
|
|
49
141
|
import {
|
|
50
142
|
measureText,
|
|
51
143
|
wrapTextToWidth
|
|
52
144
|
} from "./chunk-KAO7JL4I.js";
|
|
145
|
+
import {
|
|
146
|
+
parseRaci
|
|
147
|
+
} from "./chunk-3RYBTEF5.js";
|
|
148
|
+
import {
|
|
149
|
+
parsePert
|
|
150
|
+
} from "./chunk-UNNJCSSQ.js";
|
|
151
|
+
import {
|
|
152
|
+
parseLiveLink
|
|
153
|
+
} from "./chunk-7WGCQE2E.js";
|
|
154
|
+
import {
|
|
155
|
+
parseSequenceDgmo
|
|
156
|
+
} from "./chunk-VPASQOR3.js";
|
|
157
|
+
import {
|
|
158
|
+
parseFlowchart
|
|
159
|
+
} from "./chunk-JRUEIRJB.js";
|
|
160
|
+
import {
|
|
161
|
+
parseState
|
|
162
|
+
} from "./chunk-AYOVY75O.js";
|
|
163
|
+
import {
|
|
164
|
+
parseClassDiagram
|
|
165
|
+
} from "./chunk-A4XPI4YN.js";
|
|
166
|
+
import {
|
|
167
|
+
parseERDiagram
|
|
168
|
+
} from "./chunk-WPL5PFXE.js";
|
|
169
|
+
import {
|
|
170
|
+
parseOrg
|
|
171
|
+
} from "./chunk-FJNXXGTR.js";
|
|
172
|
+
import {
|
|
173
|
+
parseSitemap
|
|
174
|
+
} from "./chunk-UG2XG57E.js";
|
|
175
|
+
import {
|
|
176
|
+
parseWireframe
|
|
177
|
+
} from "./chunk-HSRQDWV7.js";
|
|
53
178
|
import {
|
|
54
179
|
resolveActiveTagGroup,
|
|
55
180
|
tagAttrKey
|
|
@@ -128,8 +253,8 @@ function renderSlopeChart(container, parsed, palette, isDark, onClickItem, expor
|
|
|
128
253
|
);
|
|
129
254
|
const innerWidth = width - sMarginLeft - rightMargin;
|
|
130
255
|
const innerHeight = height - sMarginTop - sMarginBottom;
|
|
131
|
-
const
|
|
132
|
-
const [minVal, maxVal] = d3Array.extent(
|
|
256
|
+
const allValues2 = data.flatMap((d) => d.values);
|
|
257
|
+
const [minVal, maxVal] = d3Array.extent(allValues2);
|
|
133
258
|
const valuePadding = (maxVal - minVal) * 0.1 || 1;
|
|
134
259
|
const yScale = d3Scale.scaleLinear().domain([minVal - valuePadding, maxVal + valuePadding]).range([innerHeight, 0]);
|
|
135
260
|
const xScale = d3Scale.scalePoint().domain(periods).range([0, innerWidth]).padding(0);
|
|
@@ -1990,10 +2115,10 @@ function ctxTagOverride(ctx) {
|
|
|
1990
2115
|
}
|
|
1991
2116
|
async function exportEventLine(ctx) {
|
|
1992
2117
|
const { content, theme, palette } = ctx;
|
|
1993
|
-
const { parseEventLine } = await import("./parser-KFYRTGTC.js");
|
|
1994
|
-
const { renderEventLineForExport } = await import("./renderer-
|
|
2118
|
+
const { parseEventLine: parseEventLine2 } = await import("./parser-KFYRTGTC.js");
|
|
2119
|
+
const { renderEventLineForExport } = await import("./renderer-TPOZOAXR.js");
|
|
1995
2120
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
1996
|
-
const parsed =
|
|
2121
|
+
const parsed = parseEventLine2(content, effectivePalette);
|
|
1997
2122
|
if (parsed.error || parsed.events.length === 0) return "";
|
|
1998
2123
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
1999
2124
|
renderEventLineForExport(
|
|
@@ -2009,10 +2134,10 @@ async function exportEventLine(ctx) {
|
|
|
2009
2134
|
}
|
|
2010
2135
|
async function exportBody(ctx) {
|
|
2011
2136
|
const { content, theme, palette } = ctx;
|
|
2012
|
-
const { parseBody } = await import("./parser-AKBVJHMK.js");
|
|
2137
|
+
const { parseBody: parseBody2 } = await import("./parser-AKBVJHMK.js");
|
|
2013
2138
|
const { renderBodyForExport } = await import("./renderer-JKV2DBYP.js");
|
|
2014
2139
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2015
|
-
const parsed =
|
|
2140
|
+
const parsed = parseBody2(content, effectivePalette);
|
|
2016
2141
|
if (parsed.error) return "";
|
|
2017
2142
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2018
2143
|
renderBodyForExport(
|
|
@@ -2027,10 +2152,10 @@ async function exportBody(ctx) {
|
|
|
2027
2152
|
}
|
|
2028
2153
|
async function exportVersionControl(ctx) {
|
|
2029
2154
|
const { content, theme, palette } = ctx;
|
|
2030
|
-
const { parseVersionControl } = await import("./parser-KZMJNKDW.js");
|
|
2155
|
+
const { parseVersionControl: parseVersionControl2 } = await import("./parser-KZMJNKDW.js");
|
|
2031
2156
|
const { renderVersionControlForExport } = await import("./renderer-BICLPGAH.js");
|
|
2032
2157
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2033
|
-
const parsed =
|
|
2158
|
+
const parsed = parseVersionControl2(content, effectivePalette);
|
|
2034
2159
|
if (parsed.error || parsed.nodes.length === 0) return "";
|
|
2035
2160
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2036
2161
|
renderVersionControlForExport(
|
|
@@ -2052,13 +2177,13 @@ function unionHiddenAttributes(hideOption, ha) {
|
|
|
2052
2177
|
}
|
|
2053
2178
|
async function exportOrg(ctx) {
|
|
2054
2179
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2055
|
-
const { parseOrg, findOrgNodeIdByName } = await import("./parser-JOOAVBJI.js");
|
|
2180
|
+
const { parseOrg: parseOrg2, findOrgNodeIdByName } = await import("./parser-JOOAVBJI.js");
|
|
2056
2181
|
const { layoutOrg } = await import("./layout-QX5T6ZNE.js");
|
|
2057
2182
|
const { collapseOrgTree, focusOrgTree, unionCollapsedOrgNodes } = await import("./collapse-JRGPUE67.js");
|
|
2058
2183
|
const { renderOrg, ancestorTrailReserve } = await import("./renderer-36JH4OMC.js");
|
|
2059
2184
|
const isDark = ctx.isDark;
|
|
2060
2185
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2061
|
-
const orgParsed =
|
|
2186
|
+
const orgParsed = parseOrg2(content, effectivePalette);
|
|
2062
2187
|
if (orgParsed.error) return "";
|
|
2063
2188
|
const collapsedNodes = unionCollapsedOrgNodes(orgParsed, viewState?.cg);
|
|
2064
2189
|
const activeTagGroup = resolveActiveTagGroup(
|
|
@@ -2116,13 +2241,13 @@ async function exportOrg(ctx) {
|
|
|
2116
2241
|
}
|
|
2117
2242
|
async function exportSitemap(ctx) {
|
|
2118
2243
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2119
|
-
const { parseSitemap } = await import("./parser-OKB64MMN.js");
|
|
2244
|
+
const { parseSitemap: parseSitemap2 } = await import("./parser-OKB64MMN.js");
|
|
2120
2245
|
const { layoutSitemap } = await import("./layout-LUQKAGGT.js");
|
|
2121
2246
|
const { collapseSitemapTree } = await import("./collapse-ZWUFFCK2.js");
|
|
2122
|
-
const { renderSitemap } = await import("./renderer-
|
|
2247
|
+
const { renderSitemap } = await import("./renderer-WH2HWE5Z.js");
|
|
2123
2248
|
const isDark = ctx.isDark;
|
|
2124
2249
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2125
|
-
const sitemapParsed =
|
|
2250
|
+
const sitemapParsed = parseSitemap2(content, effectivePalette);
|
|
2126
2251
|
if (sitemapParsed.error || sitemapParsed.roots.length === 0) return "";
|
|
2127
2252
|
const collapsedNodes = viewState?.cg ? new Set(viewState.cg) : void 0;
|
|
2128
2253
|
const activeTagGroup = resolveActiveTagGroup(
|
|
@@ -2168,10 +2293,10 @@ async function exportSitemap(ctx) {
|
|
|
2168
2293
|
}
|
|
2169
2294
|
async function exportKanban(ctx) {
|
|
2170
2295
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2171
|
-
const { parseKanban } = await import("./parser-ACW6C6OY.js");
|
|
2172
|
-
const { renderKanban } = await import("./renderer-
|
|
2296
|
+
const { parseKanban: parseKanban2 } = await import("./parser-ACW6C6OY.js");
|
|
2297
|
+
const { renderKanban } = await import("./renderer-3FF4QVGW.js");
|
|
2173
2298
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2174
|
-
const kanbanParsed =
|
|
2299
|
+
const kanbanParsed = parseKanban2(content, effectivePalette);
|
|
2175
2300
|
if (kanbanParsed.error || kanbanParsed.columns.length === 0) return "";
|
|
2176
2301
|
const container = document.createElement("div");
|
|
2177
2302
|
container.style.position = "absolute";
|
|
@@ -2200,11 +2325,11 @@ async function exportKanban(ctx) {
|
|
|
2200
2325
|
}
|
|
2201
2326
|
async function exportClass(ctx) {
|
|
2202
2327
|
const { content, theme, palette, exportMode } = ctx;
|
|
2203
|
-
const { parseClassDiagram } = await import("./parser-GPW4ZHPQ.js");
|
|
2204
|
-
const { layoutClassDiagram } = await import("./layout-
|
|
2205
|
-
const { renderClassDiagram } = await import("./renderer-
|
|
2328
|
+
const { parseClassDiagram: parseClassDiagram2 } = await import("./parser-GPW4ZHPQ.js");
|
|
2329
|
+
const { layoutClassDiagram } = await import("./layout-P6DTD4RT.js");
|
|
2330
|
+
const { renderClassDiagram } = await import("./renderer-A4LMOBZL.js");
|
|
2206
2331
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2207
|
-
const classParsed =
|
|
2332
|
+
const classParsed = parseClassDiagram2(content, effectivePalette);
|
|
2208
2333
|
if (classParsed.error || classParsed.classes.length === 0) return "";
|
|
2209
2334
|
const classLayout = layoutClassDiagram(classParsed);
|
|
2210
2335
|
const PADDING = 20;
|
|
@@ -2227,11 +2352,11 @@ async function exportClass(ctx) {
|
|
|
2227
2352
|
}
|
|
2228
2353
|
async function exportEr(ctx) {
|
|
2229
2354
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2230
|
-
const { parseERDiagram } = await import("./parser-J4DVNL4W.js");
|
|
2231
|
-
const { layoutERDiagram } = await import("./layout-
|
|
2232
|
-
const { renderERDiagram } = await import("./renderer-
|
|
2355
|
+
const { parseERDiagram: parseERDiagram2 } = await import("./parser-J4DVNL4W.js");
|
|
2356
|
+
const { layoutERDiagram } = await import("./layout-EHTYSMV4.js");
|
|
2357
|
+
const { renderERDiagram } = await import("./renderer-R34GJL7U.js");
|
|
2233
2358
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2234
|
-
const erParsed =
|
|
2359
|
+
const erParsed = parseERDiagram2(content, effectivePalette);
|
|
2235
2360
|
if (erParsed.error || erParsed.tables.length === 0) return "";
|
|
2236
2361
|
const erLayout = layoutERDiagram(erParsed);
|
|
2237
2362
|
const PADDING = 20;
|
|
@@ -2261,9 +2386,9 @@ async function exportEr(ctx) {
|
|
|
2261
2386
|
}
|
|
2262
2387
|
async function exportSketch(ctx) {
|
|
2263
2388
|
const { content, theme, viewState, exportMode } = ctx;
|
|
2264
|
-
const { parseSketch } = await import("./parser-KZMALSB2.js");
|
|
2389
|
+
const { parseSketch: parseSketch2 } = await import("./parser-KZMALSB2.js");
|
|
2265
2390
|
const effectivePalette = await resolveExportPalette(theme, ctx.palette);
|
|
2266
|
-
const parsed =
|
|
2391
|
+
const parsed = parseSketch2(content, effectivePalette);
|
|
2267
2392
|
if (parsed.error || parsed.nodes.length === 0 && parsed.boxes.length === 0) {
|
|
2268
2393
|
return "";
|
|
2269
2394
|
}
|
|
@@ -2295,9 +2420,9 @@ async function exportSketch(ctx) {
|
|
|
2295
2420
|
}
|
|
2296
2421
|
async function exportBoxesAndLines(ctx) {
|
|
2297
2422
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2298
|
-
const { parseBoxesAndLines } = await import("./parser-KYPP2DX6.js");
|
|
2423
|
+
const { parseBoxesAndLines: parseBoxesAndLines2 } = await import("./parser-KYPP2DX6.js");
|
|
2299
2424
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2300
|
-
const blParsed =
|
|
2425
|
+
const blParsed = parseBoxesAndLines2(content, effectivePalette);
|
|
2301
2426
|
if (blParsed.error || blParsed.nodes.length === 0) return "";
|
|
2302
2427
|
let blHiddenTagValues;
|
|
2303
2428
|
if (viewState?.htv) {
|
|
@@ -2306,8 +2431,8 @@ async function exportBoxesAndLines(ctx) {
|
|
|
2306
2431
|
blHiddenTagValues.set(k, new Set(v));
|
|
2307
2432
|
}
|
|
2308
2433
|
}
|
|
2309
|
-
const { renderBoxesAndLinesForExport } = await import("./renderer-
|
|
2310
|
-
const { layoutBoxesAndLines } = await import("./layout-
|
|
2434
|
+
const { renderBoxesAndLinesForExport } = await import("./renderer-X5A5VIRD.js");
|
|
2435
|
+
const { layoutBoxesAndLines } = await import("./layout-BOVTLAOT.js");
|
|
2311
2436
|
const blLayout = await layoutBoxesAndLines(blParsed);
|
|
2312
2437
|
const PADDING = 20;
|
|
2313
2438
|
const titleOffset = blParsed.title ? 40 : 0;
|
|
@@ -2336,11 +2461,11 @@ async function exportBoxesAndLines(ctx) {
|
|
|
2336
2461
|
}
|
|
2337
2462
|
async function exportSwimlane(ctx) {
|
|
2338
2463
|
const { content, theme, palette } = ctx;
|
|
2339
|
-
const { parseSwimlane } = await import("./parser-ZLKYDFI5.js");
|
|
2340
|
-
const { layoutSwimlane } = await import("./layout-
|
|
2464
|
+
const { parseSwimlane: parseSwimlane2 } = await import("./parser-ZLKYDFI5.js");
|
|
2465
|
+
const { layoutSwimlane } = await import("./layout-RANVNAKI.js");
|
|
2341
2466
|
const { renderSwimlaneForExport } = await import("./renderer-QM23SWAM.js");
|
|
2342
2467
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2343
|
-
const swimParsed =
|
|
2468
|
+
const swimParsed = parseSwimlane2(content, effectivePalette);
|
|
2344
2469
|
if (swimParsed.error || swimParsed.nodes.length === 0) return "";
|
|
2345
2470
|
const swimLayout = layoutSwimlane(swimParsed);
|
|
2346
2471
|
const PADDING = 20;
|
|
@@ -2368,11 +2493,11 @@ async function exportSwimlane(ctx) {
|
|
|
2368
2493
|
}
|
|
2369
2494
|
async function exportFamily(ctx) {
|
|
2370
2495
|
const { content, theme, palette } = ctx;
|
|
2371
|
-
const { parseFamily } = await import("./parser-NPXPJHWN.js");
|
|
2496
|
+
const { parseFamily: parseFamily2 } = await import("./parser-NPXPJHWN.js");
|
|
2372
2497
|
const { layoutFamily } = await import("./layout-5VSMZPMG.js");
|
|
2373
2498
|
const { renderFamilyForExport } = await import("./renderer-4NZZ5J2F.js");
|
|
2374
2499
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2375
|
-
const parsed =
|
|
2500
|
+
const parsed = parseFamily2(content, effectivePalette);
|
|
2376
2501
|
if (parsed.error || parsed.persons.size === 0) return "";
|
|
2377
2502
|
const layout = layoutFamily(parsed);
|
|
2378
2503
|
const PADDING = 20;
|
|
@@ -2400,13 +2525,13 @@ async function exportFamily(ctx) {
|
|
|
2400
2525
|
}
|
|
2401
2526
|
async function exportMindmap(ctx) {
|
|
2402
2527
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2403
|
-
const { parseMindmap } = await import("./parser-NGHQQGD2.js");
|
|
2528
|
+
const { parseMindmap: parseMindmap2 } = await import("./parser-NGHQQGD2.js");
|
|
2404
2529
|
const { layoutMindmap } = await import("./layout-5NPBHV5F.js");
|
|
2405
2530
|
const { collapseMindmapTree } = await import("./collapse-SLINJQW6.js");
|
|
2406
|
-
const { renderMindmap } = await import("./renderer-
|
|
2531
|
+
const { renderMindmap } = await import("./renderer-LODEVN3V.js");
|
|
2407
2532
|
const isDark = ctx.isDark;
|
|
2408
2533
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2409
|
-
const mmParsed =
|
|
2534
|
+
const mmParsed = parseMindmap2(content, effectivePalette);
|
|
2410
2535
|
if (mmParsed.error) return "";
|
|
2411
2536
|
const collapsedNodes = new Set(viewState?.cg ?? []);
|
|
2412
2537
|
const collectCollapsed = (nodes) => {
|
|
@@ -2453,11 +2578,11 @@ async function exportMindmap(ctx) {
|
|
|
2453
2578
|
}
|
|
2454
2579
|
async function exportWireframe(ctx) {
|
|
2455
2580
|
const { content, theme, palette } = ctx;
|
|
2456
|
-
const { parseWireframe } = await import("./parser-HCGXNHHL.js");
|
|
2581
|
+
const { parseWireframe: parseWireframe2 } = await import("./parser-HCGXNHHL.js");
|
|
2457
2582
|
const { layoutWireframe } = await import("./layout-UIV56NUA.js");
|
|
2458
2583
|
const { renderWireframe } = await import("./renderer-RWJ45DWH.js");
|
|
2459
2584
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2460
|
-
const wireframeParsed =
|
|
2585
|
+
const wireframeParsed = parseWireframe2(content);
|
|
2461
2586
|
if (wireframeParsed.error || wireframeParsed.roots.length === 0 && wireframeParsed.modals.length === 0)
|
|
2462
2587
|
return "";
|
|
2463
2588
|
const wireframeLayout = layoutWireframe(wireframeParsed);
|
|
@@ -2478,16 +2603,16 @@ async function exportWireframe(ctx) {
|
|
|
2478
2603
|
}
|
|
2479
2604
|
async function exportC4(ctx) {
|
|
2480
2605
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2481
|
-
const { parseC4 } = await import("./parser-WEVTMBJ5.js");
|
|
2606
|
+
const { parseC4: parseC42 } = await import("./parser-WEVTMBJ5.js");
|
|
2482
2607
|
const {
|
|
2483
2608
|
layoutC4Context,
|
|
2484
2609
|
layoutC4Containers,
|
|
2485
2610
|
layoutC4Components,
|
|
2486
2611
|
layoutC4Deployment
|
|
2487
2612
|
} = await import("./layout-CUFA7XJD.js");
|
|
2488
|
-
const { renderC4Context, renderC4Containers } = await import("./renderer-
|
|
2613
|
+
const { renderC4Context, renderC4Containers } = await import("./renderer-YDAVCRTP.js");
|
|
2489
2614
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2490
|
-
const c4Parsed =
|
|
2615
|
+
const c4Parsed = parseC42(content, effectivePalette);
|
|
2491
2616
|
if (c4Parsed.error || c4Parsed.elements.length === 0) return "";
|
|
2492
2617
|
const c4Level = ctx.options?.c4Level ?? viewState?.c4l ?? "context";
|
|
2493
2618
|
const c4System = ctx.options?.c4System ?? viewState?.c4s;
|
|
@@ -2519,11 +2644,11 @@ async function exportC4(ctx) {
|
|
|
2519
2644
|
}
|
|
2520
2645
|
async function exportFlowchart(ctx) {
|
|
2521
2646
|
const { content, theme, palette } = ctx;
|
|
2522
|
-
const { parseFlowchart } = await import("./flowchart-parser-GG7XBLQH.js");
|
|
2523
|
-
const { layoutGraph } = await import("./layout-
|
|
2524
|
-
const { renderFlowchart } = await import("./flowchart-renderer-
|
|
2647
|
+
const { parseFlowchart: parseFlowchart2 } = await import("./flowchart-parser-GG7XBLQH.js");
|
|
2648
|
+
const { layoutGraph } = await import("./layout-XUW444O5.js");
|
|
2649
|
+
const { renderFlowchart } = await import("./flowchart-renderer-THC6Y7EH.js");
|
|
2525
2650
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2526
|
-
const fcParsed =
|
|
2651
|
+
const fcParsed = parseFlowchart2(content, effectivePalette);
|
|
2527
2652
|
if (fcParsed.error || fcParsed.nodes.length === 0) return "";
|
|
2528
2653
|
const layout = layoutGraph(fcParsed);
|
|
2529
2654
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
@@ -2540,12 +2665,12 @@ async function exportFlowchart(ctx) {
|
|
|
2540
2665
|
}
|
|
2541
2666
|
async function exportInfra(ctx) {
|
|
2542
2667
|
const { content, theme, palette, viewState } = ctx;
|
|
2543
|
-
const { parseInfra } = await import("./parser-DGF3ZEO6.js");
|
|
2668
|
+
const { parseInfra: parseInfra2 } = await import("./parser-DGF3ZEO6.js");
|
|
2544
2669
|
const { computeInfra } = await import("./compute-JAP5E2E4.js");
|
|
2545
2670
|
const { layoutInfra } = await import("./layout-SW3XWYKC.js");
|
|
2546
|
-
const { renderInfra, computeInfraLegendGroups } = await import("./renderer-
|
|
2671
|
+
const { renderInfra, computeInfraLegendGroups } = await import("./renderer-SDUSBCJI.js");
|
|
2547
2672
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2548
|
-
const infraParsed =
|
|
2673
|
+
const infraParsed = parseInfra2(content);
|
|
2549
2674
|
if (infraParsed.error || infraParsed.nodes.length === 0) return "";
|
|
2550
2675
|
const infraComputed = computeInfra(infraParsed);
|
|
2551
2676
|
const infraLayout = layoutInfra(infraComputed);
|
|
@@ -2590,12 +2715,12 @@ async function exportInfra(ctx) {
|
|
|
2590
2715
|
}
|
|
2591
2716
|
async function exportPert(ctx) {
|
|
2592
2717
|
const { content, theme, palette, viewState } = ctx;
|
|
2593
|
-
const { parsePert } = await import("./parser-JXS4426S.js");
|
|
2718
|
+
const { parsePert: parsePert2 } = await import("./parser-JXS4426S.js");
|
|
2594
2719
|
const { analyzePert } = await import("./analyzer-R5UBTRO2.js");
|
|
2595
2720
|
const { layoutPert } = await import("./layout-AM57TGN5.js");
|
|
2596
|
-
const { renderPert, measurePertAnalysisBlock } = await import("./renderer-
|
|
2721
|
+
const { renderPert, measurePertAnalysisBlock } = await import("./renderer-RENDISO5.js");
|
|
2597
2722
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2598
|
-
const pertParsed =
|
|
2723
|
+
const pertParsed = parsePert2(content, { palette: effectivePalette });
|
|
2599
2724
|
if (pertParsed.error || pertParsed.activities.length === 0) return "";
|
|
2600
2725
|
const pertResolved = analyzePert(pertParsed);
|
|
2601
2726
|
const pertLayout = layoutPert(pertResolved);
|
|
@@ -2636,11 +2761,11 @@ async function exportPert(ctx) {
|
|
|
2636
2761
|
}
|
|
2637
2762
|
async function exportGantt(ctx) {
|
|
2638
2763
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2639
|
-
const { parseGantt } = await import("./parser-WUK6CP5X.js");
|
|
2764
|
+
const { parseGantt: parseGantt2 } = await import("./parser-WUK6CP5X.js");
|
|
2640
2765
|
const { calculateSchedule } = await import("./calculator-35YVW4QO.js");
|
|
2641
|
-
const { renderGantt } = await import("./renderer-
|
|
2766
|
+
const { renderGantt } = await import("./renderer-RNCYODNF.js");
|
|
2642
2767
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2643
|
-
const ganttParsed =
|
|
2768
|
+
const ganttParsed = parseGantt2(content, effectivePalette);
|
|
2644
2769
|
const resolved = calculateSchedule(ganttParsed);
|
|
2645
2770
|
if (resolved.tasks.length === 0) return "";
|
|
2646
2771
|
const EXPORT_W = ctx.width;
|
|
@@ -2679,12 +2804,12 @@ async function exportGantt(ctx) {
|
|
|
2679
2804
|
}
|
|
2680
2805
|
async function exportState(ctx) {
|
|
2681
2806
|
const { content, theme, palette, viewState } = ctx;
|
|
2682
|
-
const { parseState } = await import("./state-parser-FE3RF6XY.js");
|
|
2683
|
-
const { layoutGraph } = await import("./layout-
|
|
2684
|
-
const { renderState } = await import("./state-renderer-
|
|
2807
|
+
const { parseState: parseState2 } = await import("./state-parser-FE3RF6XY.js");
|
|
2808
|
+
const { layoutGraph } = await import("./layout-XUW444O5.js");
|
|
2809
|
+
const { renderState } = await import("./state-renderer-5IQ4OJUI.js");
|
|
2685
2810
|
const { collapseStateGroups } = await import("./state-collapse-HCGD6IVJ.js");
|
|
2686
2811
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2687
|
-
const stateParsed =
|
|
2812
|
+
const stateParsed = parseState2(content, effectivePalette);
|
|
2688
2813
|
if (stateParsed.error || stateParsed.nodes.length === 0) return "";
|
|
2689
2814
|
const sourceCollapsed = (stateParsed.groups ?? []).filter((g) => g.collapsed).map((g) => g.id);
|
|
2690
2815
|
const collapsedGroups = /* @__PURE__ */ new Set([
|
|
@@ -2718,10 +2843,10 @@ async function exportState(ctx) {
|
|
|
2718
2843
|
}
|
|
2719
2844
|
async function exportTechRadar(ctx) {
|
|
2720
2845
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2721
|
-
const { parseTechRadar } = await import("./parser-NOANDFJ4.js");
|
|
2722
|
-
const { renderTechRadarForExport } = await import("./renderer-
|
|
2846
|
+
const { parseTechRadar: parseTechRadar2 } = await import("./parser-NOANDFJ4.js");
|
|
2847
|
+
const { renderTechRadarForExport } = await import("./renderer-A6ACVK4X.js");
|
|
2723
2848
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2724
|
-
const radarParsed =
|
|
2849
|
+
const radarParsed = parseTechRadar2(content);
|
|
2725
2850
|
if (radarParsed.error || radarParsed.quadrants.length === 0) return "";
|
|
2726
2851
|
const RADAR_EXPORT_W = ctx.requestedWidth ?? 1300;
|
|
2727
2852
|
const RADAR_EXPORT_H = ctx.requestedHeight ?? 1500;
|
|
@@ -2739,11 +2864,11 @@ async function exportTechRadar(ctx) {
|
|
|
2739
2864
|
}
|
|
2740
2865
|
async function exportJourneyMap(ctx) {
|
|
2741
2866
|
const { content, theme, palette, exportMode } = ctx;
|
|
2742
|
-
const { parseJourneyMap } = await import("./parser-C327BBE3.js");
|
|
2743
|
-
const { renderJourneyMap } = await import("./renderer-
|
|
2867
|
+
const { parseJourneyMap: parseJourneyMap2 } = await import("./parser-C327BBE3.js");
|
|
2868
|
+
const { renderJourneyMap } = await import("./renderer-NHPKNNBD.js");
|
|
2744
2869
|
const { layoutJourneyMap } = await import("./layout-SOPAVXIH.js");
|
|
2745
2870
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2746
|
-
const jmParsed =
|
|
2871
|
+
const jmParsed = parseJourneyMap2(content, effectivePalette);
|
|
2747
2872
|
if (jmParsed.error || jmParsed.phases.length === 0 && jmParsed.steps.length === 0)
|
|
2748
2873
|
return "";
|
|
2749
2874
|
const jmLayout = layoutJourneyMap(jmParsed, effectivePalette, {
|
|
@@ -2761,10 +2886,10 @@ async function exportJourneyMap(ctx) {
|
|
|
2761
2886
|
}
|
|
2762
2887
|
async function exportCycle(ctx) {
|
|
2763
2888
|
const { content, theme, palette, viewState, exportMode } = ctx;
|
|
2764
|
-
const { parseCycle } = await import("./parser-7OEE7QT6.js");
|
|
2765
|
-
const { renderCycleForExport } = await import("./renderer-
|
|
2889
|
+
const { parseCycle: parseCycle2 } = await import("./parser-7OEE7QT6.js");
|
|
2890
|
+
const { renderCycleForExport } = await import("./renderer-4BIMRO4X.js");
|
|
2766
2891
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2767
|
-
const cycleParsed =
|
|
2892
|
+
const cycleParsed = parseCycle2(content);
|
|
2768
2893
|
if (cycleParsed.error || cycleParsed.nodes.length === 0) return "";
|
|
2769
2894
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2770
2895
|
renderCycleForExport(
|
|
@@ -2780,12 +2905,12 @@ async function exportCycle(ctx) {
|
|
|
2780
2905
|
}
|
|
2781
2906
|
async function exportMap(ctx) {
|
|
2782
2907
|
const { content, theme, palette, options } = ctx;
|
|
2783
|
-
const { parseMap } = await import("./parser-GEKPWSSK.js");
|
|
2908
|
+
const { parseMap: parseMap2 } = await import("./parser-GEKPWSSK.js");
|
|
2784
2909
|
const { resolveMap } = await import("./resolver-XSXE2TRX.js");
|
|
2785
2910
|
const { renderMapForExport } = await import("./renderer-XRALFCIN.js");
|
|
2786
2911
|
const { mapExportDimensions } = await import("./dimensions-6QAWEGIR.js");
|
|
2787
2912
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2788
|
-
const mapParsed =
|
|
2913
|
+
const mapParsed = parseMap2(content, effectivePalette);
|
|
2789
2914
|
const { data: mapData, reason } = await resolveMapDataSource(
|
|
2790
2915
|
options?.mapData
|
|
2791
2916
|
);
|
|
@@ -2816,10 +2941,10 @@ async function exportMap(ctx) {
|
|
|
2816
2941
|
}
|
|
2817
2942
|
async function exportPyramid(ctx) {
|
|
2818
2943
|
const { content, theme, palette } = ctx;
|
|
2819
|
-
const { parsePyramid } = await import("./parser-OVQTTTUJ.js");
|
|
2820
|
-
const { renderPyramidForExport } = await import("./renderer-
|
|
2944
|
+
const { parsePyramid: parsePyramid2 } = await import("./parser-OVQTTTUJ.js");
|
|
2945
|
+
const { renderPyramidForExport } = await import("./renderer-4BHOELCE.js");
|
|
2821
2946
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2822
|
-
const pyramidParsed =
|
|
2947
|
+
const pyramidParsed = parsePyramid2(content);
|
|
2823
2948
|
if (pyramidParsed.error || pyramidParsed.layers.length === 0) return "";
|
|
2824
2949
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2825
2950
|
renderPyramidForExport(
|
|
@@ -2833,10 +2958,10 @@ async function exportPyramid(ctx) {
|
|
|
2833
2958
|
}
|
|
2834
2959
|
async function exportRing(ctx) {
|
|
2835
2960
|
const { content, theme, palette } = ctx;
|
|
2836
|
-
const { parseRing } = await import("./parser-GZ3LVF72.js");
|
|
2837
|
-
const { renderRingForExport } = await import("./renderer-
|
|
2961
|
+
const { parseRing: parseRing2 } = await import("./parser-GZ3LVF72.js");
|
|
2962
|
+
const { renderRingForExport } = await import("./renderer-2OOPQ4CH.js");
|
|
2838
2963
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2839
|
-
const ringParsed =
|
|
2964
|
+
const ringParsed = parseRing2(content);
|
|
2840
2965
|
if (ringParsed.error || ringParsed.layers.length === 0) return "";
|
|
2841
2966
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2842
2967
|
renderRingForExport(container, ringParsed, effectivePalette, ctx.isDark, {
|
|
@@ -2847,9 +2972,9 @@ async function exportRing(ctx) {
|
|
|
2847
2972
|
}
|
|
2848
2973
|
async function exportTreemap(ctx) {
|
|
2849
2974
|
const { content, theme, palette } = ctx;
|
|
2850
|
-
const { parseTreemap } = await import("./parser-AN3MGHRL.js");
|
|
2975
|
+
const { parseTreemap: parseTreemap2 } = await import("./parser-AN3MGHRL.js");
|
|
2851
2976
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2852
|
-
const treemapParsed =
|
|
2977
|
+
const treemapParsed = parseTreemap2(content, effectivePalette);
|
|
2853
2978
|
if (treemapParsed.error || treemapParsed.roots.length === 0) return "";
|
|
2854
2979
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2855
2980
|
const dims = { width: ctx.width, height: ctx.height };
|
|
@@ -2876,17 +3001,17 @@ async function exportTreemap(ctx) {
|
|
|
2876
3001
|
}
|
|
2877
3002
|
async function exportLiveLink(ctx) {
|
|
2878
3003
|
const { content, theme, palette } = ctx;
|
|
2879
|
-
const { parseLiveLink } = await import("./parser-XYY5NHP4.js");
|
|
3004
|
+
const { parseLiveLink: parseLiveLink2 } = await import("./parser-XYY5NHP4.js");
|
|
2880
3005
|
const { renderLiveLinkCard } = await import("./renderer-YIZ7G4HU.js");
|
|
2881
3006
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2882
|
-
return renderLiveLinkCard(
|
|
3007
|
+
return renderLiveLinkCard(parseLiveLink2(content), effectivePalette, theme);
|
|
2883
3008
|
}
|
|
2884
3009
|
async function exportBlock(ctx) {
|
|
2885
3010
|
const { content, theme, palette } = ctx;
|
|
2886
|
-
const { parseBlock } = await import("./parser-5655XSOR.js");
|
|
3011
|
+
const { parseBlock: parseBlock2 } = await import("./parser-5655XSOR.js");
|
|
2887
3012
|
const { renderBlockForExport } = await import("./renderer-KVAQE7PQ.js");
|
|
2888
3013
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2889
|
-
const blockParsed =
|
|
3014
|
+
const blockParsed = parseBlock2(content, effectivePalette);
|
|
2890
3015
|
if (blockParsed.error || blockParsed.top.rows.length === 0) return "";
|
|
2891
3016
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2892
3017
|
renderBlockForExport(container, blockParsed, effectivePalette, ctx.isDark, {
|
|
@@ -2897,10 +3022,10 @@ async function exportBlock(ctx) {
|
|
|
2897
3022
|
}
|
|
2898
3023
|
async function exportGoal(ctx) {
|
|
2899
3024
|
const { content, theme, palette } = ctx;
|
|
2900
|
-
const { parseGoal } = await import("./parser-SA3RAJFS.js");
|
|
2901
|
-
const { renderGoalForExport } = await import("./renderer-
|
|
3025
|
+
const { parseGoal: parseGoal2 } = await import("./parser-SA3RAJFS.js");
|
|
3026
|
+
const { renderGoalForExport } = await import("./renderer-222OTVQV.js");
|
|
2902
3027
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2903
|
-
const parsed =
|
|
3028
|
+
const parsed = parseGoal2(content, effectivePalette);
|
|
2904
3029
|
if (parsed.error) return "";
|
|
2905
3030
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2906
3031
|
renderGoalForExport(container, parsed, effectivePalette, ctx.isDark, {
|
|
@@ -2911,10 +3036,10 @@ async function exportGoal(ctx) {
|
|
|
2911
3036
|
}
|
|
2912
3037
|
async function exportCountdown(ctx) {
|
|
2913
3038
|
const { content, theme, palette } = ctx;
|
|
2914
|
-
const { parseCountdown } = await import("./parser-LGS65QPN.js");
|
|
2915
|
-
const { renderCountdownForExport } = await import("./renderer-
|
|
3039
|
+
const { parseCountdown: parseCountdown2 } = await import("./parser-LGS65QPN.js");
|
|
3040
|
+
const { renderCountdownForExport } = await import("./renderer-DCFQDBGJ.js");
|
|
2916
3041
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2917
|
-
const parsed =
|
|
3042
|
+
const parsed = parseCountdown2(content, effectivePalette);
|
|
2918
3043
|
if (parsed.error) return "";
|
|
2919
3044
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2920
3045
|
renderCountdownForExport(container, parsed, effectivePalette, ctx.isDark, {
|
|
@@ -2925,10 +3050,10 @@ async function exportCountdown(ctx) {
|
|
|
2925
3050
|
}
|
|
2926
3051
|
async function exportClock(ctx) {
|
|
2927
3052
|
const { content, theme, palette } = ctx;
|
|
2928
|
-
const { parseClock } = await import("./parser-256EIWB2.js");
|
|
3053
|
+
const { parseClock: parseClock2 } = await import("./parser-256EIWB2.js");
|
|
2929
3054
|
const { renderClockForExport } = await import("./renderer-PQYO2HCE.js");
|
|
2930
3055
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2931
|
-
const parsed =
|
|
3056
|
+
const parsed = parseClock2(content, effectivePalette);
|
|
2932
3057
|
if (parsed.error) return "";
|
|
2933
3058
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2934
3059
|
renderClockForExport(container, parsed, effectivePalette, ctx.isDark, {
|
|
@@ -2939,10 +3064,10 @@ async function exportClock(ctx) {
|
|
|
2939
3064
|
}
|
|
2940
3065
|
async function exportBracket(ctx) {
|
|
2941
3066
|
const { content, theme, palette } = ctx;
|
|
2942
|
-
const { parseBracket } = await import("./parser-DHSFIUPU.js");
|
|
2943
|
-
const { renderBracketForExport, bracketExportDimensions } = await import("./renderer-
|
|
3067
|
+
const { parseBracket: parseBracket2 } = await import("./parser-DHSFIUPU.js");
|
|
3068
|
+
const { renderBracketForExport, bracketExportDimensions } = await import("./renderer-XUPLAO4B.js");
|
|
2944
3069
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2945
|
-
const parsed =
|
|
3070
|
+
const parsed = parseBracket2(content, effectivePalette);
|
|
2946
3071
|
if (parsed.error) return "";
|
|
2947
3072
|
const { width, height } = bracketExportDimensions(parsed, effectivePalette);
|
|
2948
3073
|
const container = createExportContainer(width, height);
|
|
@@ -2954,10 +3079,10 @@ async function exportBracket(ctx) {
|
|
|
2954
3079
|
}
|
|
2955
3080
|
async function exportRaci(ctx) {
|
|
2956
3081
|
const { content, theme, palette } = ctx;
|
|
2957
|
-
const { parseRaci } = await import("./parser-LANGKWRG.js");
|
|
3082
|
+
const { parseRaci: parseRaci2 } = await import("./parser-LANGKWRG.js");
|
|
2958
3083
|
const { renderRaciForExport } = await import("./renderer-RMGN3Q7D.js");
|
|
2959
3084
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
2960
|
-
const raciParsed =
|
|
3085
|
+
const raciParsed = parseRaci2(content, effectivePalette);
|
|
2961
3086
|
if (raciParsed.error) return "";
|
|
2962
3087
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
2963
3088
|
renderRaciForExport(container, raciParsed, effectivePalette, ctx.isDark, {
|
|
@@ -3087,9 +3212,9 @@ async function exportVisualization(ctx) {
|
|
|
3087
3212
|
const effectivePalette = await resolveExportPalette(theme, palette);
|
|
3088
3213
|
const isDark = ctx.isDark;
|
|
3089
3214
|
const container = createExportContainer(ctx.width, ctx.height);
|
|
3090
|
-
const { parseSequenceDgmo } = await import("./parser-PVIWHVGY.js");
|
|
3091
|
-
const { renderSequenceDiagram } = await import("./renderer-
|
|
3092
|
-
const seqParsed =
|
|
3215
|
+
const { parseSequenceDgmo: parseSequenceDgmo2 } = await import("./parser-PVIWHVGY.js");
|
|
3216
|
+
const { renderSequenceDiagram } = await import("./renderer-2KVQGGTT.js");
|
|
3217
|
+
const seqParsed = parseSequenceDgmo2(content, effectivePalette);
|
|
3093
3218
|
if (seqParsed.error || seqParsed.participants.length === 0) return "";
|
|
3094
3219
|
const collapsedSections = viewState?.cs ? new Set(viewState.cs) : void 0;
|
|
3095
3220
|
const collapsedGroups = viewState?.cg ? new Set(viewState.cg.map(Number).filter((n) => Number.isFinite(n))) : void 0;
|
|
@@ -3145,6 +3270,14 @@ function legendRule(mark, attr, v, emphasis, dimOpacity) {
|
|
|
3145
3270
|
const trigger = `svg:has([data-legend-entry="${entryLit}"]:hover)`;
|
|
3146
3271
|
return emphasis === "lift" ? `${trigger} ${mark}[${attr}="${attrLit}"]{${LIFT_DECL}}` : `${trigger} ${mark}:not([${attr}="${attrLit}"]){opacity:${dimOpacity}}`;
|
|
3147
3272
|
}
|
|
3273
|
+
function legendReverseRule(mark, attr, v, emphasis, dimOpacity) {
|
|
3274
|
+
const entryLit = escCssString(v.toLowerCase());
|
|
3275
|
+
const attrLit = escCssString(v);
|
|
3276
|
+
const trigger = `svg:has(${mark}[${attr}="${attrLit}"]:hover)`;
|
|
3277
|
+
if (emphasis === "lift")
|
|
3278
|
+
return `${trigger} [data-legend-entry="${entryLit}"]{${LIFT_DECL}}`;
|
|
3279
|
+
return `${trigger}:has([data-legend-entry="${entryLit}"]) [data-legend-entry]:not([data-legend-entry="${entryLit}"]){opacity:${dimOpacity}}`;
|
|
3280
|
+
}
|
|
3148
3281
|
function connectionRule(spec, id, dimOpacity) {
|
|
3149
3282
|
const lit = escCssString(id);
|
|
3150
3283
|
const { hoverSelector, hoverAttr, edgeSelector, fromAttr, toAttr } = spec;
|
|
@@ -3197,6 +3330,13 @@ function buildHoverCss(spec, derived = {}, emphasisOverride) {
|
|
|
3197
3330
|
v,
|
|
3198
3331
|
emphasis,
|
|
3199
3332
|
dimOpacity
|
|
3333
|
+
),
|
|
3334
|
+
legendReverseRule(
|
|
3335
|
+
spec.markSelector,
|
|
3336
|
+
spec.groupAttr,
|
|
3337
|
+
v,
|
|
3338
|
+
emphasis,
|
|
3339
|
+
dimOpacity
|
|
3200
3340
|
)
|
|
3201
3341
|
);
|
|
3202
3342
|
}
|
|
@@ -3226,6 +3366,13 @@ function buildHoverCss(spec, derived = {}, emphasisOverride) {
|
|
|
3226
3366
|
v,
|
|
3227
3367
|
emphasis,
|
|
3228
3368
|
dimOpacity
|
|
3369
|
+
),
|
|
3370
|
+
legendReverseRule(
|
|
3371
|
+
spec.markSelector,
|
|
3372
|
+
derived.legendAttr,
|
|
3373
|
+
v,
|
|
3374
|
+
emphasis,
|
|
3375
|
+
dimOpacity
|
|
3229
3376
|
)
|
|
3230
3377
|
);
|
|
3231
3378
|
}
|
|
@@ -3675,10 +3822,729 @@ function applyRootA11y(svg, chartType) {
|
|
|
3675
3822
|
);
|
|
3676
3823
|
return svg.replace(rootTag, withA11y);
|
|
3677
3824
|
}
|
|
3825
|
+
function applyRootDesc(svg, summary) {
|
|
3826
|
+
if (!summary) return svg;
|
|
3827
|
+
const m = svg.match(/<svg\b[^>]*>/);
|
|
3828
|
+
if (!m) return svg;
|
|
3829
|
+
const rootTag = m[0];
|
|
3830
|
+
if (/\baria-describedby=/.test(rootTag)) return svg;
|
|
3831
|
+
const id = `dgmo-desc-${fnv1a(summary)}`;
|
|
3832
|
+
const withDesc = rootTag.replace(/^<svg\b/, `<svg aria-describedby="${id}"`) + `<desc id="${id}">${escapeAttr(summary)}</desc>`;
|
|
3833
|
+
return svg.replace(rootTag, () => withDesc);
|
|
3834
|
+
}
|
|
3835
|
+
function fnv1a(s) {
|
|
3836
|
+
let h = 2166136261;
|
|
3837
|
+
for (let i = 0; i < s.length; i++) {
|
|
3838
|
+
h ^= s.charCodeAt(i);
|
|
3839
|
+
h = Math.imul(h, 16777619);
|
|
3840
|
+
}
|
|
3841
|
+
return (h >>> 0).toString(16).padStart(8, "0");
|
|
3842
|
+
}
|
|
3678
3843
|
function escapeAttr(s) {
|
|
3679
3844
|
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
3680
3845
|
}
|
|
3681
3846
|
|
|
3847
|
+
// src/utils/diagram-summary.ts
|
|
3848
|
+
var MAX_NAMES = 5;
|
|
3849
|
+
function listNames(names) {
|
|
3850
|
+
const shown = names.length > MAX_NAMES + 1 ? names.slice(0, MAX_NAMES) : names.slice();
|
|
3851
|
+
const rest = names.length - shown.length;
|
|
3852
|
+
if (rest > 0) return `${shown.join(", ")} and ${rest} more`;
|
|
3853
|
+
if (shown.length <= 1) return shown.join("");
|
|
3854
|
+
return `${shown.slice(0, -1).join(", ")} and ${shown[shown.length - 1]}`;
|
|
3855
|
+
}
|
|
3856
|
+
function plural(n, one, many) {
|
|
3857
|
+
return `${n} ${n === 1 ? one : many}`;
|
|
3858
|
+
}
|
|
3859
|
+
function chartNoun(type) {
|
|
3860
|
+
const words = type.replace(/-/g, " ");
|
|
3861
|
+
return `${words.charAt(0).toUpperCase()}${words.slice(1)} chart`;
|
|
3862
|
+
}
|
|
3863
|
+
function allValues(parsed) {
|
|
3864
|
+
return parsed.data.flatMap((d) => [d.value, ...d.extraValues ?? []]);
|
|
3865
|
+
}
|
|
3866
|
+
function seriesNames(parsed) {
|
|
3867
|
+
if (parsed.seriesNames && parsed.seriesNames.length > 0) {
|
|
3868
|
+
return parsed.seriesNames;
|
|
3869
|
+
}
|
|
3870
|
+
return parsed.series ? [parsed.series] : [];
|
|
3871
|
+
}
|
|
3872
|
+
function seriesPhrase(parsed) {
|
|
3873
|
+
const names = seriesNames(parsed);
|
|
3874
|
+
if (names.length > 1) {
|
|
3875
|
+
return ` of ${plural(names.length, "series", "series")}, ${listNames(names)},`;
|
|
3876
|
+
}
|
|
3877
|
+
const one = names[0] ?? parsed.ylabel;
|
|
3878
|
+
return one ? ` of ${one}` : "";
|
|
3879
|
+
}
|
|
3880
|
+
function rangePhrase(values) {
|
|
3881
|
+
const lo = Math.min(...values);
|
|
3882
|
+
const hi = Math.max(...values);
|
|
3883
|
+
return lo === hi ? `every value is ${compactNumber(lo)}` : `values range from ${compactNumber(lo)} to ${compactNumber(hi)}`;
|
|
3884
|
+
}
|
|
3885
|
+
function summarizeChart(content) {
|
|
3886
|
+
const parsed = parseChart(content);
|
|
3887
|
+
if (parsed.error) return null;
|
|
3888
|
+
const noun = chartNoun(parsed.type);
|
|
3889
|
+
const points = parsed.data;
|
|
3890
|
+
if (points.length === 0) return `${noun} with no data.`;
|
|
3891
|
+
switch (parsed.type) {
|
|
3892
|
+
case "pie":
|
|
3893
|
+
case "polar-area": {
|
|
3894
|
+
const total = points.reduce((sum, d) => sum + d.value, 0);
|
|
3895
|
+
const parts = plural(
|
|
3896
|
+
points.length,
|
|
3897
|
+
parsed.type === "pie" ? "slice" : "wedge",
|
|
3898
|
+
parsed.type === "pie" ? "slices" : "wedges"
|
|
3899
|
+
);
|
|
3900
|
+
const largest = points.reduce((a, b) => b.value > a.value ? b : a);
|
|
3901
|
+
if (total <= 0) return `${noun} with ${parts}, all zero.`;
|
|
3902
|
+
const pct = Math.round(largest.value / total * 100);
|
|
3903
|
+
return `${noun} with ${parts} totalling ${compactNumber(total)}; the largest is ${largest.label} at ${pct}%.`;
|
|
3904
|
+
}
|
|
3905
|
+
case "radar":
|
|
3906
|
+
return `${noun}${seriesPhrase(parsed)} across ${plural(points.length, "axis", "axes")}; ${rangePhrase(allValues(parsed))}.`;
|
|
3907
|
+
case "line": {
|
|
3908
|
+
const first = points[0].label;
|
|
3909
|
+
const last = points[points.length - 1].label;
|
|
3910
|
+
const span = points.length === 1 ? `at ${first}` : `from ${first} to ${last}`;
|
|
3911
|
+
return `${noun}${seriesPhrase(parsed)} over ${plural(points.length, "point", "points")}, ${span}; ${rangePhrase(allValues(parsed))}.`;
|
|
3912
|
+
}
|
|
3913
|
+
case "bar": {
|
|
3914
|
+
const head = `${noun}${seriesPhrase(parsed)} for ${plural(points.length, "category", "categories")}`;
|
|
3915
|
+
if (seriesNames(parsed).length > 1 || points.length === 1) {
|
|
3916
|
+
return `${head}; ${rangePhrase(allValues(parsed))}.`;
|
|
3917
|
+
}
|
|
3918
|
+
const lo = points.reduce((a, b) => b.value < a.value ? b : a);
|
|
3919
|
+
const hi = points.reduce((a, b) => b.value > a.value ? b : a);
|
|
3920
|
+
return `${head}, from ${lo.label} at ${compactNumber(lo.value)} to ${hi.label} at ${compactNumber(hi.value)}.`;
|
|
3921
|
+
}
|
|
3922
|
+
}
|
|
3923
|
+
}
|
|
3924
|
+
function summarizeSequence(content) {
|
|
3925
|
+
const parsed = parseSequenceDgmo(content);
|
|
3926
|
+
if (parsed.error) return null;
|
|
3927
|
+
const names = parsed.participants.map((p) => p.label);
|
|
3928
|
+
if (names.length === 0) return "Sequence diagram with no participants.";
|
|
3929
|
+
const messages = parsed.messages.length;
|
|
3930
|
+
const exchange = messages === 0 ? "with no messages" : `exchanging ${plural(messages, "message", "messages")}`;
|
|
3931
|
+
return `Sequence diagram of ${plural(names.length, "participant", "participants")}, ${listNames(names)}, ${exchange}.`;
|
|
3932
|
+
}
|
|
3933
|
+
function countPeople(nodes) {
|
|
3934
|
+
return nodes.reduce(
|
|
3935
|
+
(n, node) => n + (node.isContainer ? 0 : 1) + countPeople(node.children),
|
|
3936
|
+
0
|
|
3937
|
+
);
|
|
3938
|
+
}
|
|
3939
|
+
function summarizeOrg(content) {
|
|
3940
|
+
const parsed = parseOrg(content);
|
|
3941
|
+
if (parsed.error) return null;
|
|
3942
|
+
const people = countPeople(parsed.roots);
|
|
3943
|
+
if (parsed.roots.length === 0) return "Org chart with no one in it.";
|
|
3944
|
+
const head = `Org chart of ${plural(people, "person", "people")}`;
|
|
3945
|
+
if (parsed.roots.length === 1) {
|
|
3946
|
+
const root = parsed.roots[0];
|
|
3947
|
+
const role = root.metadata["role"];
|
|
3948
|
+
return `${head}, headed by ${root.label}${role ? ` (${role})` : ""}.`;
|
|
3949
|
+
}
|
|
3950
|
+
const tops = parsed.roots.map((r) => r.label);
|
|
3951
|
+
return `${head} under ${plural(tops.length, "top-level entry", "top-level entries")}, ${listNames(tops)}.`;
|
|
3952
|
+
}
|
|
3953
|
+
function countTree(nodes) {
|
|
3954
|
+
return nodes.reduce(
|
|
3955
|
+
(n, node) => n + 1 + countTree(node.children),
|
|
3956
|
+
0
|
|
3957
|
+
);
|
|
3958
|
+
}
|
|
3959
|
+
function namedCount(names, one, many) {
|
|
3960
|
+
return names.length === 0 ? `no ${many}` : `${plural(names.length, one, many)}, ${listNames(names)}`;
|
|
3961
|
+
}
|
|
3962
|
+
function summarizeFlowchart(content) {
|
|
3963
|
+
const parsed = parseFlowchart(content);
|
|
3964
|
+
if (parsed.error) return null;
|
|
3965
|
+
if (parsed.nodes.length === 0) return "Flowchart with no steps.";
|
|
3966
|
+
const decisions = parsed.nodes.filter((n) => n.shape === "decision").length;
|
|
3967
|
+
const steps = `${plural(parsed.nodes.length, "step", "steps")}${decisions > 0 ? ` (${plural(decisions, "decision", "decisions")})` : ""}`;
|
|
3968
|
+
const entered = new Set(parsed.edges.map((e) => e.target));
|
|
3969
|
+
const starts = parsed.nodes.filter((n) => !entered.has(n.id)).map((n) => n.label);
|
|
3970
|
+
const start = starts.length > 0 ? `, starting at ${listNames(starts)}` : "";
|
|
3971
|
+
return `Flowchart of ${steps} and ${plural(parsed.edges.length, "connection", "connections")}${start}.`;
|
|
3972
|
+
}
|
|
3973
|
+
function summarizeState(content) {
|
|
3974
|
+
const parsed = parseState(content);
|
|
3975
|
+
if (parsed.error) return null;
|
|
3976
|
+
const states = parsed.nodes.filter((n) => n.shape !== "pseudostate").map((n) => n.label);
|
|
3977
|
+
return `State diagram of ${namedCount(states, "state", "states")}, with ${plural(parsed.edges.length, "transition", "transitions")}.`;
|
|
3978
|
+
}
|
|
3979
|
+
function summarizeClass(content) {
|
|
3980
|
+
const parsed = parseClassDiagram(content);
|
|
3981
|
+
if (parsed.error) return null;
|
|
3982
|
+
const names = parsed.classes.map((c) => c.name);
|
|
3983
|
+
return `Class diagram of ${namedCount(names, "class", "classes")}, with ${plural(parsed.relationships.length, "relationship", "relationships")}.`;
|
|
3984
|
+
}
|
|
3985
|
+
function summarizeEr(content) {
|
|
3986
|
+
const parsed = parseERDiagram(content);
|
|
3987
|
+
if (parsed.error) return null;
|
|
3988
|
+
const names = parsed.tables.map((t) => t.name);
|
|
3989
|
+
return `Entity-relationship diagram of ${namedCount(names, "table", "tables")}, with ${plural(parsed.relationships.length, "relationship", "relationships")}.`;
|
|
3990
|
+
}
|
|
3991
|
+
function summarizeKanban(content) {
|
|
3992
|
+
const parsed = parseKanban(content);
|
|
3993
|
+
if (parsed.error) return null;
|
|
3994
|
+
const cards = parsed.columns.reduce((n, c) => n + c.cards.length, 0);
|
|
3995
|
+
const columns = parsed.columns.map((c) => c.name);
|
|
3996
|
+
return `Kanban board with ${plural(cards, "card", "cards")} across ${namedCount(columns, "column", "columns")}.`;
|
|
3997
|
+
}
|
|
3998
|
+
function c4Counts(elements) {
|
|
3999
|
+
return elements.reduce(
|
|
4000
|
+
(acc, el) => {
|
|
4001
|
+
const below = c4Counts(el.children);
|
|
4002
|
+
return {
|
|
4003
|
+
elements: acc.elements + 1 + below.elements,
|
|
4004
|
+
relationships: acc.relationships + el.relationships.length + below.relationships
|
|
4005
|
+
};
|
|
4006
|
+
},
|
|
4007
|
+
{ elements: 0, relationships: 0 }
|
|
4008
|
+
);
|
|
4009
|
+
}
|
|
4010
|
+
function summarizeC4(content) {
|
|
4011
|
+
const parsed = parseC4(content);
|
|
4012
|
+
if (parsed.error) return null;
|
|
4013
|
+
const counts = c4Counts(parsed.elements);
|
|
4014
|
+
const relationships = counts.relationships + parsed.relationships.length;
|
|
4015
|
+
const top = parsed.elements.map((e) => e.name);
|
|
4016
|
+
const nested = counts.elements - top.length;
|
|
4017
|
+
return `C4 diagram of ${namedCount(top, "top-level element", "top-level elements")}${nested > 0 ? `, holding ${nested} more` : ""}, with ${plural(relationships, "relationship", "relationships")}.`;
|
|
4018
|
+
}
|
|
4019
|
+
function countPages(nodes) {
|
|
4020
|
+
return nodes.reduce(
|
|
4021
|
+
(n, node) => n + (node.isContainer ? 0 : 1) + countPages(node.children),
|
|
4022
|
+
0
|
|
4023
|
+
);
|
|
4024
|
+
}
|
|
4025
|
+
function summarizeSitemap(content) {
|
|
4026
|
+
const parsed = parseSitemap(content);
|
|
4027
|
+
if (parsed.error) return null;
|
|
4028
|
+
const tops = parsed.roots.map((r) => r.label);
|
|
4029
|
+
return `Sitemap of ${plural(countPages(parsed.roots), "page", "pages")} under ${namedCount(tops, "top-level entry", "top-level entries")}.`;
|
|
4030
|
+
}
|
|
4031
|
+
function summarizeInfra(content) {
|
|
4032
|
+
const parsed = parseInfra(content);
|
|
4033
|
+
if (parsed.error) return null;
|
|
4034
|
+
const names = parsed.nodes.map((n) => n.label);
|
|
4035
|
+
return `Infrastructure diagram of ${namedCount(names, "component", "components")}, with ${plural(parsed.edges.length, "connection", "connections")}.`;
|
|
4036
|
+
}
|
|
4037
|
+
function ganttTasks(nodes, acc) {
|
|
4038
|
+
for (const node of nodes) {
|
|
4039
|
+
if (node.kind === "task") acc.tasks.push(node.label);
|
|
4040
|
+
else {
|
|
4041
|
+
if (node.kind === "group") acc.groups += 1;
|
|
4042
|
+
ganttTasks(node.children, acc);
|
|
4043
|
+
}
|
|
4044
|
+
}
|
|
4045
|
+
return acc;
|
|
4046
|
+
}
|
|
4047
|
+
function summarizeGantt(content) {
|
|
4048
|
+
const parsed = parseGantt(content);
|
|
4049
|
+
if (parsed.error) return null;
|
|
4050
|
+
const { tasks, groups } = ganttTasks(parsed.nodes, { tasks: [], groups: 0 });
|
|
4051
|
+
return `Gantt chart of ${namedCount(tasks, "task", "tasks")}${groups > 0 ? `, in ${plural(groups, "group", "groups")}` : ""}.`;
|
|
4052
|
+
}
|
|
4053
|
+
function summarizePert(content) {
|
|
4054
|
+
const parsed = parsePert(content);
|
|
4055
|
+
if (parsed.error) return null;
|
|
4056
|
+
const names = parsed.activities.map((a) => a.name);
|
|
4057
|
+
return `PERT chart of ${namedCount(names, "activity", "activities")}, with ${plural(parsed.edges.length, "dependency", "dependencies")}.`;
|
|
4058
|
+
}
|
|
4059
|
+
function summarizeBoxesAndLines(content) {
|
|
4060
|
+
const parsed = parseBoxesAndLines(content);
|
|
4061
|
+
if (parsed.error) return null;
|
|
4062
|
+
const names = parsed.nodes.map((n) => n.label);
|
|
4063
|
+
return `Boxes and lines diagram of ${namedCount(names, "box", "boxes")}, with ${plural(parsed.edges.length, "line", "lines")}.`;
|
|
4064
|
+
}
|
|
4065
|
+
function summarizeSketch(content) {
|
|
4066
|
+
const parsed = parseSketch(content);
|
|
4067
|
+
if (parsed.error) return null;
|
|
4068
|
+
const names = parsed.nodes.map((n) => n.label);
|
|
4069
|
+
return `Sketch of ${namedCount(names, "shape", "shapes")}, with ${plural(parsed.edges.length, "connection", "connections")}.`;
|
|
4070
|
+
}
|
|
4071
|
+
function summarizeSwimlane(content) {
|
|
4072
|
+
const parsed = parseSwimlane(content);
|
|
4073
|
+
if (parsed.error) return null;
|
|
4074
|
+
const lanes = parsed.lanes.map((l) => l.label);
|
|
4075
|
+
return `Swimlane diagram of ${plural(parsed.nodes.length, "step", "steps")} across ${namedCount(lanes, "lane", "lanes")}, with ${plural(parsed.edges.length, "connection", "connections")}.`;
|
|
4076
|
+
}
|
|
4077
|
+
function summarizeFamily(content) {
|
|
4078
|
+
const parsed = parseFamily(content);
|
|
4079
|
+
if (parsed.error) return null;
|
|
4080
|
+
return `Family tree of ${plural(parsed.persons.size, "person", "people")} in ${plural(parsed.unions.length, "union", "unions")}.`;
|
|
4081
|
+
}
|
|
4082
|
+
function summarizeVersionControl(content) {
|
|
4083
|
+
const parsed = parseVersionControl(content);
|
|
4084
|
+
if (parsed.error) return null;
|
|
4085
|
+
const branches = parsed.branches.map((b) => b.name);
|
|
4086
|
+
return `Version control graph of ${plural(parsed.nodes.length, "commit", "commits")} on ${namedCount(branches, "branch", "branches")}.`;
|
|
4087
|
+
}
|
|
4088
|
+
function mindmapCounts(nodes) {
|
|
4089
|
+
return nodes.reduce(
|
|
4090
|
+
(acc, node) => {
|
|
4091
|
+
if (node.collapsed) {
|
|
4092
|
+
return {
|
|
4093
|
+
shown: acc.shown + 1,
|
|
4094
|
+
folded: acc.folded + countTree(node.children)
|
|
4095
|
+
};
|
|
4096
|
+
}
|
|
4097
|
+
const below = mindmapCounts(node.children);
|
|
4098
|
+
return {
|
|
4099
|
+
shown: acc.shown + 1 + below.shown,
|
|
4100
|
+
folded: acc.folded + below.folded
|
|
4101
|
+
};
|
|
4102
|
+
},
|
|
4103
|
+
{ shown: 0, folded: 0 }
|
|
4104
|
+
);
|
|
4105
|
+
}
|
|
4106
|
+
function summarizeMindmap(content) {
|
|
4107
|
+
const parsed = parseMindmap(content);
|
|
4108
|
+
if (parsed.error) return null;
|
|
4109
|
+
if (parsed.roots.length === 0) return "Mind map with no ideas.";
|
|
4110
|
+
const { shown, folded } = mindmapCounts(parsed.roots);
|
|
4111
|
+
const ideas = shown - parsed.roots.length;
|
|
4112
|
+
const centres = parsed.roots.map((r) => r.label);
|
|
4113
|
+
const hidden = folded > 0 ? `, with ${folded} more folded away` : "";
|
|
4114
|
+
return `Mind map of ${plural(ideas, "idea", "ideas")} around ${listNames(centres)}${hidden}.`;
|
|
4115
|
+
}
|
|
4116
|
+
function summarizeWireframe(content) {
|
|
4117
|
+
const parsed = parseWireframe(content);
|
|
4118
|
+
if (parsed.error) return null;
|
|
4119
|
+
const elements = countTree(parsed.roots);
|
|
4120
|
+
const tops = parsed.roots.map((r) => r.label).filter((l) => l.length > 0);
|
|
4121
|
+
const modals = parsed.modals.length > 0 ? `, plus ${plural(parsed.modals.length, "modal", "modals")}` : "";
|
|
4122
|
+
const noun = `${parsed.formFactor.charAt(0).toUpperCase()}${parsed.formFactor.slice(1)} wireframe`;
|
|
4123
|
+
return `${noun} of ${plural(elements, "element", "elements")}${tops.length > 0 ? `, in ${listNames(tops)}` : ""}${modals}.`;
|
|
4124
|
+
}
|
|
4125
|
+
function summarizeJourneyMap(content) {
|
|
4126
|
+
const parsed = parseJourneyMap(content);
|
|
4127
|
+
if (parsed.error) return null;
|
|
4128
|
+
const steps = parsed.steps.length + parsed.phases.reduce((n, p) => n + p.steps.length, 0);
|
|
4129
|
+
const phases = parsed.phases.map((p) => p.name);
|
|
4130
|
+
const who = parsed.persona ? ` for ${parsed.persona.name}` : "";
|
|
4131
|
+
return `Journey map${who} of ${plural(steps, "step", "steps")}${phases.length > 0 ? ` across ${namedCount(phases, "phase", "phases")}` : ""}.`;
|
|
4132
|
+
}
|
|
4133
|
+
function summarizeRaci(content) {
|
|
4134
|
+
const parsed = parseRaci(content);
|
|
4135
|
+
if (parsed.error) return null;
|
|
4136
|
+
const tasks = parsed.tasksWithoutPhase.length + parsed.phases.reduce((n, p) => n + p.tasks.length, 0);
|
|
4137
|
+
return `${parsed.variant.toUpperCase()} matrix of ${plural(tasks, "task", "tasks")} across ${namedCount(parsed.roleDisplayNames, "role", "roles")}.`;
|
|
4138
|
+
}
|
|
4139
|
+
function summarizeBody(content) {
|
|
4140
|
+
const parsed = parseBody(content);
|
|
4141
|
+
if (parsed.error) return null;
|
|
4142
|
+
const parts = parsed.parts.map((p) => p.name);
|
|
4143
|
+
return `Body diagram marking ${namedCount(parts, "part", "parts")}.`;
|
|
4144
|
+
}
|
|
4145
|
+
function summarizeBracket(content) {
|
|
4146
|
+
const parsed = parseBracket(content);
|
|
4147
|
+
if (parsed.error) return null;
|
|
4148
|
+
const layout = layoutBracket(parsed);
|
|
4149
|
+
const competitors = parsed.seeds.length > 0 ? parsed.seeds.length : new Set(
|
|
4150
|
+
layout.matches.flatMap(
|
|
4151
|
+
(m) => [m.top, m.bot].filter((n) => n !== null)
|
|
4152
|
+
)
|
|
4153
|
+
).size;
|
|
4154
|
+
const decided = layout.matches.filter((m) => m.winner !== null).length;
|
|
4155
|
+
const champion = layout.champion ? `; ${layout.champion} won` : "";
|
|
4156
|
+
return `Tournament bracket of ${plural(competitors, "competitor", "competitors")} in ${plural(layout.matches.length, "match", "matches")}, ${decided} decided${champion}.`;
|
|
4157
|
+
}
|
|
4158
|
+
function summarizeLiveLink(content) {
|
|
4159
|
+
const parsed = parseLiveLink(content);
|
|
4160
|
+
if (parsed.error || !parsed.id) return null;
|
|
4161
|
+
return `Card linking to the shared diagram ${parsed.title ?? parsed.id}.`;
|
|
4162
|
+
}
|
|
4163
|
+
function axisRange(name, values) {
|
|
4164
|
+
const lo = Math.min(...values);
|
|
4165
|
+
const hi = Math.max(...values);
|
|
4166
|
+
return lo === hi ? `${name} is ${compactNumber(lo)} throughout` : `${name} ranges from ${compactNumber(lo)} to ${compactNumber(hi)}`;
|
|
4167
|
+
}
|
|
4168
|
+
function summarizeScatter(content) {
|
|
4169
|
+
const parsed = parseScatter(content);
|
|
4170
|
+
if (parsed.error) return null;
|
|
4171
|
+
const points = parsed.scatterPoints ?? [];
|
|
4172
|
+
if (points.length === 0) return "Scatter chart with no points.";
|
|
4173
|
+
const categories = [
|
|
4174
|
+
...new Set(points.map((p) => p.category).filter((c) => !!c))
|
|
4175
|
+
];
|
|
4176
|
+
const groups = categories.length > 0 ? ` in ${namedCount(categories, "category", "categories")}` : "";
|
|
4177
|
+
const x = axisRange(
|
|
4178
|
+
parsed.xlabel ?? "x",
|
|
4179
|
+
points.map((p) => p.x)
|
|
4180
|
+
);
|
|
4181
|
+
const y = axisRange(
|
|
4182
|
+
parsed.ylabel ?? "y",
|
|
4183
|
+
points.map((p) => p.y)
|
|
4184
|
+
);
|
|
4185
|
+
return `Scatter chart of ${plural(points.length, "point", "points")}${groups}; ${x} and ${y}.`;
|
|
4186
|
+
}
|
|
4187
|
+
function summarizeSankey(content) {
|
|
4188
|
+
const parsed = parseSankey(content);
|
|
4189
|
+
if (parsed.error) return null;
|
|
4190
|
+
const links = parsed.links ?? [];
|
|
4191
|
+
if (links.length === 0) return "Sankey diagram with no flows.";
|
|
4192
|
+
const nodes = new Set(links.flatMap((l) => [l.source, l.target]));
|
|
4193
|
+
const entered = new Set(links.map((l) => l.target));
|
|
4194
|
+
const sources = [...nodes].filter((n) => !entered.has(n));
|
|
4195
|
+
const from = sources.length > 0 ? `, flowing from ${listNames(sources)}` : "";
|
|
4196
|
+
return `Sankey diagram of ${plural(links.length, "flow", "flows")} between ${plural(nodes.size, "node", "nodes")}${from}.`;
|
|
4197
|
+
}
|
|
4198
|
+
function summarizeHeatmap(content) {
|
|
4199
|
+
const parsed = parseHeatmap(content);
|
|
4200
|
+
if (parsed.error) return null;
|
|
4201
|
+
const rows = parsed.heatmapRows ?? [];
|
|
4202
|
+
const columns = parsed.columns ?? [];
|
|
4203
|
+
if (rows.length === 0) return "Heatmap with no rows.";
|
|
4204
|
+
let hot = { row: rows[0].label, col: 0, value: -Infinity };
|
|
4205
|
+
for (const row of rows) {
|
|
4206
|
+
row.values.forEach((value, col) => {
|
|
4207
|
+
if (value > hot.value) hot = { row: row.label, col, value };
|
|
4208
|
+
});
|
|
4209
|
+
}
|
|
4210
|
+
const head = `Heatmap of ${plural(rows.length, "row", "rows")} by ${plural(columns.length, "column", "columns")}`;
|
|
4211
|
+
if (hot.value === -Infinity) return `${head}, with no values.`;
|
|
4212
|
+
const where = columns[hot.col] ? `${hot.row}, ${columns[hot.col]}` : hot.row;
|
|
4213
|
+
return `${head}; ${rangePhrase(rows.flatMap((r) => r.values))}, highest at ${where}.`;
|
|
4214
|
+
}
|
|
4215
|
+
function summarizeFunnel(content) {
|
|
4216
|
+
const parsed = parseFunnel(content);
|
|
4217
|
+
if (parsed.error) return null;
|
|
4218
|
+
const stages = parsed.data;
|
|
4219
|
+
if (stages.length === 0) return "Funnel chart with no stages.";
|
|
4220
|
+
const first = stages[0];
|
|
4221
|
+
const last = stages[stages.length - 1];
|
|
4222
|
+
if (stages.length === 1) {
|
|
4223
|
+
return `Funnel chart of 1 stage, ${first.label} at ${compactNumber(first.value)}.`;
|
|
4224
|
+
}
|
|
4225
|
+
const kept = first.value > 0 ? ` (${Math.round(last.value / first.value * 100)}% of the first)` : "";
|
|
4226
|
+
return `Funnel chart of ${plural(stages.length, "stage", "stages")}, from ${first.label} at ${compactNumber(first.value)} to ${last.label} at ${compactNumber(last.value)}${kept}.`;
|
|
4227
|
+
}
|
|
4228
|
+
function summarizeFunction(content) {
|
|
4229
|
+
const parsed = parseFunctionChart(content);
|
|
4230
|
+
if (parsed.error) return null;
|
|
4231
|
+
const names = (parsed.functions ?? []).map((f) => f.name);
|
|
4232
|
+
const range = parsed.xRange ? ` for x from ${compactNumber(parsed.xRange.min)} to ${compactNumber(parsed.xRange.max)}` : "";
|
|
4233
|
+
return `Function plot of ${namedCount(names, "function", "functions")}${range && names.length > 0 ? `,${range}` : range}.`;
|
|
4234
|
+
}
|
|
4235
|
+
function dateSpan(dates, toValue) {
|
|
4236
|
+
const ranked = dates.map((d) => ({ d, t: toValue(d) })).filter(({ t }) => Number.isFinite(t)).sort((a, b) => a.t - b.t);
|
|
4237
|
+
if (ranked.length === 0) return "";
|
|
4238
|
+
const first = ranked[0];
|
|
4239
|
+
const last = ranked[ranked.length - 1];
|
|
4240
|
+
return first.t === last.t ? ` on ${first.d}` : ` from ${first.d} to ${last.d}`;
|
|
4241
|
+
}
|
|
4242
|
+
function summarizeTimeline(content) {
|
|
4243
|
+
const parsed = parseTimeline(content);
|
|
4244
|
+
if (parsed.error) return null;
|
|
4245
|
+
const events = parsed.timelineEvents;
|
|
4246
|
+
if (events.length === 0) return "Timeline with no events.";
|
|
4247
|
+
const dates = events.flatMap(
|
|
4248
|
+
(e) => e.endDate ? [e.date, e.endDate] : [e.date]
|
|
4249
|
+
);
|
|
4250
|
+
const groups = parsed.timelineGroups.map((g) => g.name);
|
|
4251
|
+
const span = dateSpan(dates, parseTimelineDate);
|
|
4252
|
+
const head = groups.length > 0 ? `Timeline of ${plural(events.length, "event", "events")} in ${namedCount(groups, "group", "groups")}${span ? `,${span}` : ""}` : `Timeline of ${plural(events.length, "event", "events")}${span}`;
|
|
4253
|
+
const marks = [
|
|
4254
|
+
parsed.timelineEras.length > 0 ? plural(parsed.timelineEras.length, "era", "eras") : null,
|
|
4255
|
+
parsed.timelineMarkers.length > 0 ? plural(parsed.timelineMarkers.length, "marker", "markers") : null
|
|
4256
|
+
].filter((x) => x !== null);
|
|
4257
|
+
return `${head}${marks.length > 0 ? `, marking ${marks.join(" and ")}` : ""}.`;
|
|
4258
|
+
}
|
|
4259
|
+
function summarizeEventLine(content) {
|
|
4260
|
+
const parsed = parseEventLine(content);
|
|
4261
|
+
if (parsed.error) return null;
|
|
4262
|
+
const events = parsed.events;
|
|
4263
|
+
if (events.length === 0) return "Event line with no events.";
|
|
4264
|
+
const folded = new Set(
|
|
4265
|
+
parsed.eras.filter((e) => e.collapsed).map((e) => e.name)
|
|
4266
|
+
);
|
|
4267
|
+
const hidden = events.filter((e) => e.era !== null && folded.has(e.era));
|
|
4268
|
+
const shown = events.length - hidden.length;
|
|
4269
|
+
const byValue = new Map(
|
|
4270
|
+
events.filter((e) => e.date !== null && !e.future && e.dateValue !== null).map((e) => [e.date, e.dateValue])
|
|
4271
|
+
);
|
|
4272
|
+
const span = dateSpan([...byValue.keys()], (d) => byValue.get(d));
|
|
4273
|
+
const eras = parsed.eras.length > 0 ? `, in ${plural(parsed.eras.length, "era", "eras")}` : "";
|
|
4274
|
+
const away = hidden.length > 0 ? `, with ${hidden.length} more folded away` : "";
|
|
4275
|
+
return `Event line of ${plural(shown, "event", "events")}${span}${eras}${away}.`;
|
|
4276
|
+
}
|
|
4277
|
+
function summarizeTechRadar(content) {
|
|
4278
|
+
const parsed = parseTechRadar(content);
|
|
4279
|
+
if (parsed.error) return null;
|
|
4280
|
+
const blips = parsed.quadrants.reduce((n, q) => n + q.blips.length, 0);
|
|
4281
|
+
const quadrants = parsed.quadrants.map((q) => q.name);
|
|
4282
|
+
const rings = parsed.rings.map((r) => r.name);
|
|
4283
|
+
return `Tech radar of ${plural(blips, "entry", "entries")} across ${namedCount(quadrants, "quadrant", "quadrants")}, in ${namedCount(rings, "ring", "rings")}.`;
|
|
4284
|
+
}
|
|
4285
|
+
function summarizeCycle(content) {
|
|
4286
|
+
const parsed = parseCycle(content);
|
|
4287
|
+
if (parsed.error) return null;
|
|
4288
|
+
const stages = parsed.nodes.map((n) => n.label);
|
|
4289
|
+
return `Cycle of ${namedCount(stages, "stage", "stages")}.`;
|
|
4290
|
+
}
|
|
4291
|
+
function summarizePyramid(content) {
|
|
4292
|
+
const parsed = parsePyramid(content);
|
|
4293
|
+
if (parsed.error) return null;
|
|
4294
|
+
const layers = parsed.layers.map((l) => l.label);
|
|
4295
|
+
const noun = parsed.inverted ? "Inverted pyramid" : "Pyramid";
|
|
4296
|
+
if (layers.length === 0) return `${noun} with no layers.`;
|
|
4297
|
+
return `${noun} of ${plural(layers.length, "layer", "layers")}, top to bottom: ${listNames(layers)}.`;
|
|
4298
|
+
}
|
|
4299
|
+
function summarizeRing(content) {
|
|
4300
|
+
const parsed = parseRing(content);
|
|
4301
|
+
if (parsed.error) return null;
|
|
4302
|
+
const layers = parsed.layers.map((l) => l.label);
|
|
4303
|
+
if (layers.length === 0) return "Ring diagram with no layers.";
|
|
4304
|
+
return `Ring diagram of ${plural(layers.length, "layer", "layers")}, centre outward: ${listNames(layers)}.`;
|
|
4305
|
+
}
|
|
4306
|
+
function treemapLeaves(nodes) {
|
|
4307
|
+
return nodes.flatMap(
|
|
4308
|
+
(n) => n.children.length > 0 ? treemapLeaves(n.children) : [n]
|
|
4309
|
+
);
|
|
4310
|
+
}
|
|
4311
|
+
function summarizeTreemap(content) {
|
|
4312
|
+
const parsed = parseTreemap(content);
|
|
4313
|
+
if (parsed.error) return null;
|
|
4314
|
+
const leaves = treemapLeaves(parsed.roots);
|
|
4315
|
+
if (leaves.length === 0) return "Treemap with no items.";
|
|
4316
|
+
const total = leaves.reduce((sum, n) => sum + (n.value ?? 0), 0);
|
|
4317
|
+
const largest = leaves.reduce(
|
|
4318
|
+
(a, b) => (b.value ?? 0) > (a.value ?? 0) ? b : a
|
|
4319
|
+
);
|
|
4320
|
+
const groups = parsed.roots.every((r) => r.children.length > 0) ? parsed.roots : [];
|
|
4321
|
+
const head = groups.length > 0 ? `Treemap of ${plural(leaves.length, "item", "items")} in ${namedCount(
|
|
4322
|
+
groups.map((g) => g.label),
|
|
4323
|
+
"group",
|
|
4324
|
+
"groups"
|
|
4325
|
+
)}, totalling ${compactNumber(total)}` : `Treemap of ${plural(leaves.length, "item", "items")} totalling ${compactNumber(total)}`;
|
|
4326
|
+
return `${head}; the largest is ${largest.label} at ${compactNumber(largest.value ?? 0)}.`;
|
|
4327
|
+
}
|
|
4328
|
+
function blockCounts(grid) {
|
|
4329
|
+
let shown = 0;
|
|
4330
|
+
let folded = 0;
|
|
4331
|
+
for (const cell of grid.rows.flat()) {
|
|
4332
|
+
if (!isBlockNode(cell)) continue;
|
|
4333
|
+
shown += 1;
|
|
4334
|
+
if (!cell.grid) continue;
|
|
4335
|
+
const inner = blockCounts(cell.grid);
|
|
4336
|
+
if (cell.collapsed) folded += inner.shown + inner.folded;
|
|
4337
|
+
else {
|
|
4338
|
+
shown += inner.shown;
|
|
4339
|
+
folded += inner.folded;
|
|
4340
|
+
}
|
|
4341
|
+
}
|
|
4342
|
+
return { shown, folded };
|
|
4343
|
+
}
|
|
4344
|
+
function summarizeBlock(content) {
|
|
4345
|
+
const parsed = parseBlock(content);
|
|
4346
|
+
if (parsed.error) return null;
|
|
4347
|
+
const { shown, folded } = blockCounts(parsed.top);
|
|
4348
|
+
if (shown === 0) return "Block diagram with no blocks.";
|
|
4349
|
+
const tops = parsed.top.rows.flat().filter(isBlockNode).map((b) => b.label);
|
|
4350
|
+
const away = folded > 0 ? `, with ${folded} more folded away` : "";
|
|
4351
|
+
return `Block diagram of ${plural(shown, "block", "blocks")}, in ${listNames(tops)}${away}.`;
|
|
4352
|
+
}
|
|
4353
|
+
function summarizeGoal(content) {
|
|
4354
|
+
const parsed = parseGoal(content);
|
|
4355
|
+
if (parsed.error) return null;
|
|
4356
|
+
const now = compactNumber(parsed.now);
|
|
4357
|
+
if (!parsed.hasTarget) return `Progress of ${now}, with no target set.`;
|
|
4358
|
+
const pct = Math.round(parsed.now / parsed.target * 100);
|
|
4359
|
+
return `Progress toward a target of ${compactNumber(parsed.target)}: ${now} so far, ${pct}%.`;
|
|
4360
|
+
}
|
|
4361
|
+
var MONTHS = [
|
|
4362
|
+
"January",
|
|
4363
|
+
"February",
|
|
4364
|
+
"March",
|
|
4365
|
+
"April",
|
|
4366
|
+
"May",
|
|
4367
|
+
"June",
|
|
4368
|
+
"July",
|
|
4369
|
+
"August",
|
|
4370
|
+
"September",
|
|
4371
|
+
"October",
|
|
4372
|
+
"November",
|
|
4373
|
+
"December"
|
|
4374
|
+
];
|
|
4375
|
+
var WEEKDAYS = [
|
|
4376
|
+
"Sunday",
|
|
4377
|
+
"Monday",
|
|
4378
|
+
"Tuesday",
|
|
4379
|
+
"Wednesday",
|
|
4380
|
+
"Thursday",
|
|
4381
|
+
"Friday",
|
|
4382
|
+
"Saturday"
|
|
4383
|
+
];
|
|
4384
|
+
var ORDINALS = ["first", "second", "third", "fourth", "fifth"];
|
|
4385
|
+
function cadencePhrase(rule) {
|
|
4386
|
+
const weekday = WEEKDAYS[rule.weekday ?? -1] ?? "the same day";
|
|
4387
|
+
switch (rule.kind) {
|
|
4388
|
+
case "month-day":
|
|
4389
|
+
return `every year on ${MONTHS[rule.month ?? -1] ?? "the same date"} ${rule.day ?? ""}`.trimEnd();
|
|
4390
|
+
case "nth-weekday":
|
|
4391
|
+
return `every month on the ${ORDINALS[(rule.nth ?? 0) - 1] ?? "same"} ${weekday}`;
|
|
4392
|
+
case "last-weekday":
|
|
4393
|
+
return `every month on the last ${weekday}`;
|
|
4394
|
+
case "weekly":
|
|
4395
|
+
return `every week on ${weekday}`;
|
|
4396
|
+
case "interval": {
|
|
4397
|
+
const n = rule.intervalN ?? 1;
|
|
4398
|
+
const unit = rule.intervalUnit ?? "day";
|
|
4399
|
+
return n === 1 ? `every ${unit}` : `every ${n} ${unit}s`;
|
|
4400
|
+
}
|
|
4401
|
+
}
|
|
4402
|
+
}
|
|
4403
|
+
function summarizeCountdown(content) {
|
|
4404
|
+
const parsed = parseCountdown(content);
|
|
4405
|
+
if (parsed.error) return null;
|
|
4406
|
+
if (parsed.rule)
|
|
4407
|
+
return `Countdown to an event that recurs ${cadencePhrase(parsed.rule)}.`;
|
|
4408
|
+
return parsed.target ? `Countdown to ${parsed.target}.` : "Countdown with no date set.";
|
|
4409
|
+
}
|
|
4410
|
+
function summarizeClock(content) {
|
|
4411
|
+
const parsed = parseClock(content);
|
|
4412
|
+
if (parsed.error) return null;
|
|
4413
|
+
const places = parsed.entries.map((e) => e.label);
|
|
4414
|
+
return `World clock of ${namedCount(places, "place", "places")}.`;
|
|
4415
|
+
}
|
|
4416
|
+
function poiName(pos) {
|
|
4417
|
+
return pos.kind === "name" ? pos.name : `${pos.lat}, ${pos.lon}`;
|
|
4418
|
+
}
|
|
4419
|
+
function summarizeMap(content) {
|
|
4420
|
+
const parsed = parseMap(content);
|
|
4421
|
+
if (parsed.error) return null;
|
|
4422
|
+
const parts = [];
|
|
4423
|
+
if (parsed.regions.length > 0) {
|
|
4424
|
+
parts.push(
|
|
4425
|
+
namedCount(
|
|
4426
|
+
parsed.regions.map((r) => r.name),
|
|
4427
|
+
"region",
|
|
4428
|
+
"regions"
|
|
4429
|
+
)
|
|
4430
|
+
);
|
|
4431
|
+
}
|
|
4432
|
+
if (parsed.pois.length > 0) {
|
|
4433
|
+
const names = parsed.pois.map((p) => p.label ?? poiName(p.pos));
|
|
4434
|
+
parts.push(namedCount(names, "marked place", "marked places"));
|
|
4435
|
+
}
|
|
4436
|
+
for (const route of parsed.routes) {
|
|
4437
|
+
const from = route.originLabel ?? poiName(route.origin);
|
|
4438
|
+
parts.push(
|
|
4439
|
+
`a route of ${plural(route.legs.length, "leg", "legs")} from ${from}`
|
|
4440
|
+
);
|
|
4441
|
+
}
|
|
4442
|
+
if (parsed.edges.length > 0) {
|
|
4443
|
+
parts.push(plural(parsed.edges.length, "connection", "connections"));
|
|
4444
|
+
}
|
|
4445
|
+
if (parts.length === 0) return "Map with nothing marked on it.";
|
|
4446
|
+
return `Map showing ${parts.length === 1 ? parts[0] : `${parts.slice(0, -1).join("; ")}; and ${parts[parts.length - 1]}`}.`;
|
|
4447
|
+
}
|
|
4448
|
+
function summarizeQuadrant(content) {
|
|
4449
|
+
const parsed = parseQuadrant(content);
|
|
4450
|
+
if (parsed.error) return null;
|
|
4451
|
+
const items = plural(parsed.quadrantPoints.length, "item", "items");
|
|
4452
|
+
const { topLeft, topRight, bottomLeft, bottomRight } = parsed.quadrantLabels;
|
|
4453
|
+
const names = [topLeft, topRight, bottomLeft, bottomRight].filter((q) => q !== null).map((q) => q.text);
|
|
4454
|
+
return names.length > 0 ? `Quadrant chart of ${items} across ${listNames(names)}.` : `Quadrant chart of ${items}.`;
|
|
4455
|
+
}
|
|
4456
|
+
function summarizeVenn(content) {
|
|
4457
|
+
const parsed = parseVenn(content);
|
|
4458
|
+
if (parsed.error) return null;
|
|
4459
|
+
const sets = parsed.vennSets.map((s) => s.name);
|
|
4460
|
+
const named = parsed.vennOverlaps.filter((o) => o.label).length;
|
|
4461
|
+
const overlaps = named > 0 ? `, with ${plural(named, "named overlap", "named overlaps")}` : "";
|
|
4462
|
+
return `Venn diagram of ${namedCount(sets, "set", "sets")}${overlaps}.`;
|
|
4463
|
+
}
|
|
4464
|
+
function summarizeSlope(content) {
|
|
4465
|
+
const parsed = parseSlope(content);
|
|
4466
|
+
if (parsed.error) return null;
|
|
4467
|
+
const periods = parsed.periods;
|
|
4468
|
+
const span = periods.length > 1 ? `, from ${periods[0]} to ${periods[periods.length - 1]}` : "";
|
|
4469
|
+
return `Slope chart of ${plural(parsed.data.length, "item", "items")} across ${plural(periods.length, "period", "periods")}${span}.`;
|
|
4470
|
+
}
|
|
4471
|
+
function summarizeArc(content) {
|
|
4472
|
+
const parsed = parseArc(content);
|
|
4473
|
+
if (parsed.error) return null;
|
|
4474
|
+
const nodes = new Set(parsed.links.flatMap((l) => [l.source, l.target]));
|
|
4475
|
+
const noun = parsed.layout === "chord" ? "Chord diagram" : "Arc diagram";
|
|
4476
|
+
const groups = parsed.arcNodeGroups.map((g) => g.name);
|
|
4477
|
+
const inGroups = groups.length > 0 ? ` in ${namedCount(groups, "group", "groups")}` : "";
|
|
4478
|
+
return `${noun} of ${plural(parsed.links.length, "link", "links")} between ${plural(nodes.size, "node", "nodes")}${inGroups}.`;
|
|
4479
|
+
}
|
|
4480
|
+
var TOP_WORDS = 3;
|
|
4481
|
+
function summarizeWordcloud(content) {
|
|
4482
|
+
const parsed = parseWordcloud(content);
|
|
4483
|
+
if (parsed.error) return null;
|
|
4484
|
+
const words = parsed.words;
|
|
4485
|
+
if (words.length === 0) return "Word cloud with no words.";
|
|
4486
|
+
const top = [...words].sort((a, b) => b.weight - a.weight).slice(0, TOP_WORDS).map((w) => w.text);
|
|
4487
|
+
return `Word cloud of ${plural(words.length, "word", "words")}; the largest ${top.length === 1 ? "is" : "are"} ${listNames(top)}.`;
|
|
4488
|
+
}
|
|
4489
|
+
var SUMMARIZERS = {
|
|
4490
|
+
sequence: summarizeSequence,
|
|
4491
|
+
org: summarizeOrg,
|
|
4492
|
+
flowchart: summarizeFlowchart,
|
|
4493
|
+
state: summarizeState,
|
|
4494
|
+
class: summarizeClass,
|
|
4495
|
+
er: summarizeEr,
|
|
4496
|
+
kanban: summarizeKanban,
|
|
4497
|
+
c4: summarizeC4,
|
|
4498
|
+
sitemap: summarizeSitemap,
|
|
4499
|
+
infra: summarizeInfra,
|
|
4500
|
+
gantt: summarizeGantt,
|
|
4501
|
+
pert: summarizePert,
|
|
4502
|
+
"boxes-and-lines": summarizeBoxesAndLines,
|
|
4503
|
+
sketch: summarizeSketch,
|
|
4504
|
+
swimlane: summarizeSwimlane,
|
|
4505
|
+
family: summarizeFamily,
|
|
4506
|
+
"version-control": summarizeVersionControl,
|
|
4507
|
+
mindmap: summarizeMindmap,
|
|
4508
|
+
wireframe: summarizeWireframe,
|
|
4509
|
+
"journey-map": summarizeJourneyMap,
|
|
4510
|
+
raci: summarizeRaci,
|
|
4511
|
+
body: summarizeBody,
|
|
4512
|
+
bracket: summarizeBracket,
|
|
4513
|
+
"live-link": summarizeLiveLink,
|
|
4514
|
+
bar: summarizeChart,
|
|
4515
|
+
line: summarizeChart,
|
|
4516
|
+
pie: summarizeChart,
|
|
4517
|
+
radar: summarizeChart,
|
|
4518
|
+
"polar-area": summarizeChart,
|
|
4519
|
+
scatter: summarizeScatter,
|
|
4520
|
+
sankey: summarizeSankey,
|
|
4521
|
+
heatmap: summarizeHeatmap,
|
|
4522
|
+
funnel: summarizeFunnel,
|
|
4523
|
+
function: summarizeFunction,
|
|
4524
|
+
timeline: summarizeTimeline,
|
|
4525
|
+
"event-line": summarizeEventLine,
|
|
4526
|
+
"tech-radar": summarizeTechRadar,
|
|
4527
|
+
cycle: summarizeCycle,
|
|
4528
|
+
pyramid: summarizePyramid,
|
|
4529
|
+
ring: summarizeRing,
|
|
4530
|
+
treemap: summarizeTreemap,
|
|
4531
|
+
block: summarizeBlock,
|
|
4532
|
+
goal: summarizeGoal,
|
|
4533
|
+
countdown: summarizeCountdown,
|
|
4534
|
+
clock: summarizeClock,
|
|
4535
|
+
map: summarizeMap,
|
|
4536
|
+
quadrant: summarizeQuadrant,
|
|
4537
|
+
venn: summarizeVenn,
|
|
4538
|
+
slope: summarizeSlope,
|
|
4539
|
+
arc: summarizeArc,
|
|
4540
|
+
wordcloud: summarizeWordcloud
|
|
4541
|
+
};
|
|
4542
|
+
function summarizeDiagram(content, chartType) {
|
|
4543
|
+
if (!chartType) return null;
|
|
4544
|
+
const summarize = SUMMARIZERS[chartType];
|
|
4545
|
+
return summarize ? summarize(content) : null;
|
|
4546
|
+
}
|
|
4547
|
+
|
|
3682
4548
|
// src/render.ts
|
|
3683
4549
|
var DOM_GLOBALS = [
|
|
3684
4550
|
"document",
|
|
@@ -3801,9 +4667,14 @@ async function render(content, options) {
|
|
|
3801
4667
|
...options?.width !== void 0 && { width: options.width },
|
|
3802
4668
|
...options?.height !== void 0 && { height: options.height }
|
|
3803
4669
|
});
|
|
3804
|
-
const svg2 =
|
|
3805
|
-
|
|
3806
|
-
|
|
4670
|
+
const svg2 = applyRootDesc(
|
|
4671
|
+
applyRootA11y(
|
|
4672
|
+
injectHoverStyles(raw, chartType, { bakeHover }),
|
|
4673
|
+
chartType
|
|
4674
|
+
),
|
|
4675
|
+
// The AUTHORED source and type: an arc `layout chord` is re-emitted
|
|
4676
|
+
// above as internal `chord` content, which no summarizer reads.
|
|
4677
|
+
summarizeDiagram(content, parsed.chartType)
|
|
3807
4678
|
);
|
|
3808
4679
|
return {
|
|
3809
4680
|
svg: svg2,
|
|
@@ -3841,9 +4712,12 @@ async function render(content, options) {
|
|
|
3841
4712
|
}
|
|
3842
4713
|
}
|
|
3843
4714
|
);
|
|
3844
|
-
svg =
|
|
3845
|
-
|
|
3846
|
-
|
|
4715
|
+
svg = applyRootDesc(
|
|
4716
|
+
applyRootA11y(
|
|
4717
|
+
injectHoverStyles(svg, chartType, { bakeHover }),
|
|
4718
|
+
chartType
|
|
4719
|
+
),
|
|
4720
|
+
summarizeDiagram(content, parsed.chartType)
|
|
3847
4721
|
);
|
|
3848
4722
|
} finally {
|
|
3849
4723
|
releaseDom();
|