@netless/appliance-plugin 1.1.2 → 1.1.3-4.beta.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.
Files changed (154) hide show
  1. package/READMA.zh-CN.md +993 -0
  2. package/README.md +963 -176
  3. package/cdn/cdn.js +1 -1
  4. package/cdn/fullWorker-Dwf7nY.js +486 -0
  5. package/cdn/subWorker-DXBnNm.js +486 -0
  6. package/dist/ObserverMap-BudneEfB.mjs +58 -0
  7. package/dist/ObserverMap-DTz9zucn.js +1 -0
  8. package/dist/appliance-plugin.js +1 -1
  9. package/dist/appliance-plugin.mjs +27 -18
  10. package/dist/cdn.d.ts +2 -2
  11. package/dist/collector/base.d.ts +3 -1
  12. package/dist/collector/collector.d.ts +57 -14
  13. package/dist/collector/index.d.ts +4 -4
  14. package/dist/collector/types.d.ts +49 -10
  15. package/dist/component/autoDraw/index.d.ts +0 -0
  16. package/dist/component/miniMap/index.d.ts +1 -0
  17. package/dist/component/miniMap/manager.d.ts +37 -0
  18. package/dist/component/miniMap/view.d.ts +14 -0
  19. package/dist/component/svg/base.d.ts +30 -0
  20. package/dist/component/svg/manager.d.ts +44 -0
  21. package/dist/component/svg/markmap.d.ts +41 -0
  22. package/dist/component/svg/mermaid-check.d.ts +18 -0
  23. package/dist/component/svg/mermaid-loader.d.ts +29 -0
  24. package/dist/component/svg/mermaid.d.ts +109 -0
  25. package/dist/component/svg/snapshot.d.ts +31 -0
  26. package/dist/component/svg/svgElemt.d.ts +43 -0
  27. package/dist/component/svg/svgToImageLoader.d.ts +25 -0
  28. package/dist/component/svg/types.d.ts +10 -0
  29. package/dist/component/svg/utils.d.ts +9 -0
  30. package/dist/component/svg/vNodeManager.d.ts +28 -0
  31. package/dist/component/textEditor/index.d.ts +2 -2
  32. package/dist/component/textEditor/manager.d.ts +22 -3
  33. package/dist/component/textEditor/types.d.ts +5 -4
  34. package/dist/component/textEditor/utils.d.ts +1 -0
  35. package/dist/component/textEditor/view.d.ts +28 -48
  36. package/dist/core/autoShape/index.d.ts +12 -0
  37. package/dist/core/autoShape/mapper.d.ts +3 -0
  38. package/dist/core/autoShape/recognizer.d.ts +8 -0
  39. package/dist/core/autoShape/registry.d.ts +2 -0
  40. package/dist/core/autoShape/templates.d.ts +2 -0
  41. package/dist/core/autoShape/types.d.ts +78 -0
  42. package/dist/core/backGroundThread/index.d.ts +35 -0
  43. package/dist/core/backGroundThread/types.d.ts +12 -0
  44. package/dist/core/enum.d.ts +74 -13
  45. package/dist/core/index.d.ts +3 -3
  46. package/dist/core/mainEngine.d.ts +101 -27
  47. package/dist/core/mainThread/base.d.ts +10 -6
  48. package/dist/core/mainThread/index.d.ts +2 -2
  49. package/dist/core/mainThread/snapshotThread.d.ts +8 -4
  50. package/dist/core/mainThread/subLocalThread.d.ts +21 -16
  51. package/dist/core/mainThread/subServiceThread.d.ts +2 -2
  52. package/dist/core/mainThread/subTopThread.d.ts +2 -2
  53. package/dist/core/msgEvent/base.d.ts +1 -0
  54. package/dist/core/msgEvent/baseForBackgroundThread.d.ts +9 -0
  55. package/dist/core/msgEvent/baseForWorker.d.ts +2 -1
  56. package/dist/core/msgEvent/copyNode/forBackgroundThread.d.ts +8 -0
  57. package/dist/core/msgEvent/copyNode/forMain.d.ts +2 -2
  58. package/dist/core/msgEvent/forBackgroundThread.d.ts +12 -0
  59. package/dist/core/msgEvent/forMainThread.d.ts +4 -4
  60. package/dist/core/msgEvent/forWorker.d.ts +4 -4
  61. package/dist/core/msgEvent/index.d.ts +4 -4
  62. package/dist/core/msgEvent/rotateNode/forMain.d.ts +2 -2
  63. package/dist/core/msgEvent/scaleNode/forMain.d.ts +2 -2
  64. package/dist/core/msgEvent/setColor/forMain.d.ts +2 -2
  65. package/dist/core/msgEvent/setPoint/forMain.d.ts +2 -2
  66. package/dist/core/msgEvent/setZIndex/forMain.d.ts +7 -0
  67. package/dist/core/msgEvent/translateNode/forMain.d.ts +2 -2
  68. package/dist/core/plugin.d.ts +49 -0
  69. package/dist/core/renderCotrol.d.ts +12 -11
  70. package/dist/core/tools/arrow.d.ts +10 -22
  71. package/dist/core/tools/base.d.ts +52 -9
  72. package/dist/core/tools/ellipse.d.ts +10 -22
  73. package/dist/core/tools/image.d.ts +9 -7
  74. package/dist/core/tools/index.d.ts +14 -13
  75. package/dist/core/tools/laserPen.d.ts +1 -1
  76. package/dist/core/tools/pencil.d.ts +18 -8
  77. package/dist/core/tools/pencilEraser.d.ts +36 -41
  78. package/dist/core/tools/pencilEraserBitMap.d.ts +20 -27
  79. package/dist/core/tools/polygon.d.ts +10 -22
  80. package/dist/core/tools/rectangle.d.ts +10 -22
  81. package/dist/core/tools/selector.d.ts +42 -24
  82. package/dist/core/tools/shadowSvg.d.ts +36 -0
  83. package/dist/core/tools/speechBalloon.d.ts +10 -22
  84. package/dist/core/tools/star.d.ts +10 -22
  85. package/dist/core/tools/straight.d.ts +10 -22
  86. package/dist/core/tools/text.d.ts +2 -1
  87. package/dist/core/tools/utils.d.ts +11 -12
  88. package/dist/core/types.d.ts +98 -18
  89. package/dist/core/utils/ObserverMap.d.ts +19 -0
  90. package/dist/core/utils/clipper.d.ts +8 -0
  91. package/dist/core/utils/getSvgPathFromPoints.d.ts +1 -1
  92. package/dist/core/utils/index.d.ts +6 -5
  93. package/dist/core/utils/indexDB.d.ts +17 -0
  94. package/dist/core/utils/math.d.ts +1 -0
  95. package/dist/core/utils/polygonUtils.d.ts +8 -0
  96. package/dist/core/utils/primitives/Box2d.d.ts +4 -4
  97. package/dist/core/utils/proxy.d.ts +3 -4
  98. package/dist/core/utils/spriteNode.d.ts +8 -1
  99. package/dist/core/vNodeManager.d.ts +13 -9
  100. package/dist/core/worker/base.d.ts +43 -21
  101. package/dist/core/worker/fullWorkerLocal.d.ts +29 -25
  102. package/dist/core/worker/fullWorkerService.d.ts +9 -9
  103. package/dist/core/worker/simpleWorker.d.ts +28 -0
  104. package/dist/core/worker/snapshotWork.d.ts +27 -0
  105. package/dist/core/worker/subWorkerLocal.d.ts +2 -3
  106. package/dist/core/worker/subWorkerTopLayer.d.ts +2 -2
  107. package/dist/core/worker/workerManager.d.ts +52 -36
  108. package/dist/cursors/index.d.ts +9 -11
  109. package/dist/displayer/const.d.ts +1 -0
  110. package/dist/displayer/cursor/index.d.ts +1 -0
  111. package/dist/displayer/floatBar/dragBox/index.d.ts +9 -3
  112. package/dist/displayer/floatBar/index.d.ts +2 -1
  113. package/dist/displayer/floatBtns/index.d.ts +2 -0
  114. package/dist/displayer/utils.d.ts +1 -0
  115. package/dist/extend.d.ts +1 -0
  116. package/dist/fullWorker.js +242 -195
  117. package/dist/index-BCI9ZJly.mjs +9884 -0
  118. package/dist/index-CRWsZj1z.mjs +16601 -0
  119. package/dist/index-D2XqHUO-.js +1 -0
  120. package/dist/index-Dfujq78k.js +3 -0
  121. package/dist/index-TQPJgovl.mjs +1263 -0
  122. package/dist/index-ZvQrVWzu.js +1 -0
  123. package/dist/index.d.ts +1 -0
  124. package/dist/plugin/applianceMultiPlugin.d.ts +2 -3
  125. package/dist/plugin/applianceSinglePlugin.d.ts +3 -4
  126. package/dist/plugin/baseApplianceManager.d.ts +58 -13
  127. package/dist/plugin/baseViewContainerManager.d.ts +72 -73
  128. package/dist/plugin/const.d.ts +2 -22
  129. package/dist/plugin/displayerView.d.ts +18 -4
  130. package/dist/plugin/index.d.ts +1 -0
  131. package/dist/plugin/multi/applianceMultiManager.d.ts +0 -1
  132. package/dist/plugin/multi/containerManager.d.ts +8 -1
  133. package/dist/plugin/multi/displayer/appViewDisplayerManager.d.ts +3 -2
  134. package/dist/plugin/multi/displayer/mainViewDisplayerManager.d.ts +4 -2
  135. package/dist/plugin/single/displayer/mainViewDisplayerManager.d.ts +4 -3
  136. package/dist/plugin/types.d.ts +393 -32
  137. package/dist/style.css +1 -1
  138. package/dist/subWorker.js +242 -195
  139. package/dist/svgToImageLoader-DPRAAhwW.js +1 -0
  140. package/dist/svgToImageLoader-mXH53h-l.mjs +18 -0
  141. package/dist/undo/index.d.ts +25 -31
  142. package/dist/undo/proxyArray.d.ts +37 -0
  143. package/package.json +31 -9
  144. package/cdn/fullWorker-DMz46H.js +0 -439
  145. package/cdn/subWorker-B_zAQR.js +0 -439
  146. package/dist/collector/eventCollector.d.ts +0 -31
  147. package/dist/collector/magixEventCollector.d.ts +0 -31
  148. package/dist/core/mainThread/workerMainThread.d.ts +0 -99
  149. package/dist/core/msgEvent/deleteNode/forMainThread.d.ts +0 -6
  150. package/dist/core/msgEvent/deleteNode/forWorker.d.ts +0 -6
  151. package/dist/index-B-Nowr4E.mjs +0 -14865
  152. package/dist/index-BDVvqw7g.js +0 -1
  153. package/dist/index-DwakKeHT.mjs +0 -2497
  154. package/dist/index-cRE5FY5s.js +0 -1
@@ -0,0 +1,1263 @@
1
+ var K = Object.defineProperty;
2
+ var j = (o, e, t) => e in o ? K(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
3
+ var u = (o, e, t) => j(o, typeof e != "symbol" ? e + "" : e, t);
4
+ import { E as B, a as y, b as D, c as M, d as E, V as P, S as Z } from "./index-CRWsZj1z.mjs";
5
+ import { isEqual as W, isString as _, clone as J, throttle as Q } from "lodash";
6
+ import "white-web-sdk";
7
+ import "spritejs";
8
+ import "lz-string";
9
+ import "clipper-lib";
10
+ import "lineclip";
11
+ import "xss";
12
+ import "react-dom";
13
+ import "react";
14
+ import * as z from "markmap-view";
15
+ import { Transformer as ee } from "markmap-lib";
16
+ import { O as te } from "./ObserverMap-BudneEfB.mjs";
17
+ class re {
18
+ constructor() {
19
+ u(this, "threadEngine");
20
+ }
21
+ registerBackgroundThread(e) {
22
+ return this.threadEngine = e, this;
23
+ }
24
+ }
25
+ class ae extends re {
26
+ constructor() {
27
+ super(...arguments);
28
+ u(this, "emitEventType", B.CopyNode);
29
+ }
30
+ async consume(t) {
31
+ const { msgType: r, dataType: s, emitEventType: i } = t;
32
+ if (r === y.FullWork && s === D.Local && i === this.emitEventType)
33
+ return this.consumeForLocalWorker(t), !0;
34
+ }
35
+ async consumeForLocalWorker(t) {
36
+ var s;
37
+ const { workId: r } = t;
38
+ r && await ((s = this.threadEngine) == null ? void 0 : s.consumeFull(t));
39
+ }
40
+ }
41
+ class se {
42
+ constructor(e) {
43
+ u(this, "builders", /* @__PURE__ */ new Map());
44
+ this.builders = new Map(e.map((t) => [t, this.build(t)]));
45
+ }
46
+ build(e) {
47
+ switch (e) {
48
+ case B.CopyNode:
49
+ return new ae();
50
+ }
51
+ }
52
+ registerForBackgroundThread(e) {
53
+ return this.builders.forEach((t) => {
54
+ t && t.registerBackgroundThread(e);
55
+ }), this;
56
+ }
57
+ async consumeForBackgroundThread(e) {
58
+ for (const t of this.builders.values())
59
+ if (await (t == null ? void 0 : t.consume(e)))
60
+ return !0;
61
+ return !1;
62
+ }
63
+ }
64
+ let N = null, C = null, $ = !1;
65
+ function q(o) {
66
+ return !o || typeof o != "string" ? !1 : /```\s*mermaid[\s\S]*?```/i.test(o);
67
+ }
68
+ async function ie() {
69
+ return N || C || (C = import("mermaid").then((o) => (N = o, C = null, o)).catch((o) => {
70
+ throw C = null, o;
71
+ }), C);
72
+ }
73
+ async function ne() {
74
+ const o = await ie();
75
+ return $ || (o.default.initialize({
76
+ startOnLoad: !1,
77
+ theme: "default"
78
+ }), $ = !0), o;
79
+ }
80
+ function oe() {
81
+ return (N == null ? void 0 : N.default) || null;
82
+ }
83
+ const T = class T {
84
+ constructor() {
85
+ // 使用 workId 作为 key,存储每个实例的 mermaid 代码块
86
+ u(this, "mermaidCodeBlocksByWorkId", /* @__PURE__ */ new Map());
87
+ }
88
+ /**
89
+ * 获取 MermaidManager 单例实例
90
+ */
91
+ static getInstance() {
92
+ return T.instance || (T.instance = new T()), T.instance;
93
+ }
94
+ /**
95
+ * 生成唯一的 mermaid ID
96
+ */
97
+ generateId() {
98
+ return `mermaid-${Math.random().toString(36).substr(2, 9)}`;
99
+ }
100
+ /**
101
+ * 生成 mermaid HTML 容器
102
+ * @param id mermaid ID
103
+ * @param mermaidCode mermaid 代码(可选,如果提供则存储)
104
+ * @param workId 工作 ID(用于命名空间隔离)
105
+ * @returns HTML 字符串
106
+ */
107
+ createContainer(e, t, r) {
108
+ if (t && r) {
109
+ let s = this.mermaidCodeBlocksByWorkId.get(r);
110
+ s || (s = /* @__PURE__ */ new Map(), this.mermaidCodeBlocksByWorkId.set(r, s)), s.set(e, t);
111
+ }
112
+ return `<div class="mermaid-container" data-mermaid-id="${e}"><div class="mermaid-placeholder" id="${e}">正在渲染图表...</div></div>`;
113
+ }
114
+ /**
115
+ * 获取 mermaid 代码块
116
+ * @param id mermaid ID
117
+ * @param workId 工作 ID(用于命名空间隔离)
118
+ * @returns mermaid 代码或 undefined
119
+ */
120
+ getCode(e, t) {
121
+ const r = this.mermaidCodeBlocksByWorkId.get(t);
122
+ return r == null ? void 0 : r.get(e);
123
+ }
124
+ /**
125
+ * 清空指定 workId 的 mermaid 代码块
126
+ * @param workId 工作 ID(如果未提供,清空所有)
127
+ */
128
+ clear(e) {
129
+ e ? this.mermaidCodeBlocksByWorkId.delete(e) : this.mermaidCodeBlocksByWorkId.clear();
130
+ }
131
+ /**
132
+ * 扩展 markdown-it 的渲染规则,处理 mermaid 代码块
133
+ * @param transformer Transformer 实例
134
+ * @param workId 工作 ID(用于命名空间隔离)
135
+ */
136
+ extendMarkdown(e, t) {
137
+ const r = e.md.renderer, s = r.rules.fence, i = this;
138
+ r.rules.fence = (a, n, c, h, g) => {
139
+ const p = a[n];
140
+ if (p.info.trim() === "mermaid") {
141
+ const f = i.generateId();
142
+ return i.createContainer(f, p.content, t);
143
+ }
144
+ return s ? s(a, n, c, h, g) : "";
145
+ };
146
+ }
147
+ // 为了向后兼容,保留静态方法(内部使用单例)
148
+ static generateId() {
149
+ return T.getInstance().generateId();
150
+ }
151
+ static createContainer(e, t, r) {
152
+ return T.getInstance().createContainer(
153
+ e,
154
+ t,
155
+ r
156
+ );
157
+ }
158
+ static getCode(e, t) {
159
+ return T.getInstance().getCode(e, t);
160
+ }
161
+ static clear(e) {
162
+ T.getInstance().clear(e);
163
+ }
164
+ static extendMarkdown(e, t) {
165
+ T.getInstance().extendMarkdown(e, t);
166
+ }
167
+ };
168
+ u(T, "instance", null);
169
+ let O = T;
170
+ class b {
171
+ /**
172
+ * 检查 markmap 节点及其子节点是否包含 mermaid 代码块
173
+ * @param node markmap 节点数据
174
+ * @returns 如果节点或其子节点包含 mermaid 代码块,返回 true
175
+ */
176
+ static checkNodeHasMermaid(e) {
177
+ if (!e)
178
+ return !1;
179
+ if (e.content && typeof e.content == "string" && (e.content.includes('class="mermaid-container"') || e.content.includes("class='mermaid-container'") || e.content.includes("data-mermaid-id=") || e.content.includes("mermaid-placeholder")))
180
+ return !0;
181
+ if (e.children && Array.isArray(e.children)) {
182
+ for (const t of e.children)
183
+ if (b.checkNodeHasMermaid(t))
184
+ return !0;
185
+ }
186
+ return !1;
187
+ }
188
+ /**
189
+ * 等待 DOM 更新后渲染 Mermaid 图表
190
+ * @param svgElement SVG 元素
191
+ * @param workId 工作 ID
192
+ * @returns Promise<void>
193
+ */
194
+ static async renderMermaidAfterDOMUpdate(e, t) {
195
+ await b.renderMermaidBlocks(e, t);
196
+ }
197
+ /**
198
+ * 渲染所有 mermaid 容器中的图表
199
+ * @param svgElement SVG 元素
200
+ * @param workId 工作 ID
201
+ * @returns Promise<void>
202
+ */
203
+ static async renderMermaidBlocks(e, t) {
204
+ if (!e)
205
+ return;
206
+ try {
207
+ await ne();
208
+ } catch (n) {
209
+ console.error("[renderMermaidBlocks] error: ", n);
210
+ return;
211
+ }
212
+ const r = oe();
213
+ if (!r)
214
+ return;
215
+ let s = null, i = !1;
216
+ for (let n = 0; n < 30; n++) {
217
+ const c = e.querySelectorAll("foreignObject");
218
+ if (s = e.querySelectorAll(".mermaid-container"), s.length > 0 || (c.length > 0 && (i = !0), await new Promise((h) => setTimeout(h, 50)), i && n >= 20))
219
+ break;
220
+ }
221
+ if (!s || s.length === 0)
222
+ return;
223
+ const a = Array.from(s).map(
224
+ async (n, c) => {
225
+ const h = n, g = h.getAttribute("data-mermaid-id"), p = g ? O.getCode(g, t) : void 0, d = h.querySelector(
226
+ ".mermaid-placeholder"
227
+ );
228
+ if (!(!d || !p))
229
+ try {
230
+ const w = `mermaid-${t.replace(/[^a-zA-Z0-9_-]/g, "-")}-${Date.now()}-${c}`, { svg: v } = await r.render(w, p);
231
+ if (d && d.parentNode) {
232
+ const I = document.createElement("div");
233
+ I.innerHTML = v;
234
+ const l = I.querySelector("svg");
235
+ if (l) {
236
+ if (!l.getAttribute("viewBox") && l.getAttribute("width") && l.getAttribute("height")) {
237
+ const S = l.getAttribute("width"), k = l.getAttribute("height"), x = parseFloat((S == null ? void 0 : S.replace(/px|%/, "")) || "0"), A = parseFloat(
238
+ (k == null ? void 0 : k.replace(/px|%/, "")) || "0"
239
+ );
240
+ x > 0 && A > 0 && l.setAttribute(
241
+ "viewBox",
242
+ `0 0 ${x} ${A}`
243
+ );
244
+ }
245
+ l.style.display = "block", l.style.maxWidth = "100%", l.style.width = "auto", l.style.height = "auto", l.style.overflow = "visible", l.style.verticalAlign = "top", l.style.objectFit = "contain";
246
+ const m = document.createElement("div");
247
+ m.className = "mermaid-wrapper", m.style.width = "100%", m.style.height = "auto", m.style.overflow = "hidden", m.style.display = "inline-block", m.style.verticalAlign = "top", m.style.margin = "0", m.style.padding = "0", m.style.boxSizing = "border-box", m.style.position = "relative", this.isSafari() && (m.style.clipPath = "inset(100% 0 0 0)", m.style.pointerEvents = "none"), m.appendChild(l), l.style.width = "100%", l.style.height = "100%", l.style.maxWidth = "100%", l.style.maxHeight = "100%", l.style.objectFit = "contain", l.setAttribute("data-type", "mermaid"), this.isSafari() && (l.style.opacity = "0"), d.parentNode.replaceChild(m, d);
248
+ } else
249
+ d.outerHTML = v;
250
+ }
251
+ } catch (f) {
252
+ const w = f instanceof Error ? f.message : String(f);
253
+ d && (d.textContent = `Mermaid 渲染失败: ${w}`, d.style.color = "red", d.style.fontSize = "12px");
254
+ }
255
+ }
256
+ );
257
+ await Promise.all(a);
258
+ }
259
+ /**
260
+ * 检测是否是 Safari 浏览器
261
+ * @returns 如果是 Safari 返回 true,否则返回 false
262
+ */
263
+ static isSafari() {
264
+ const e = navigator.userAgent.toLowerCase(), t = e.indexOf("safari") !== -1 && e.indexOf("chrome") === -1 && e.indexOf("chromium") === -1, r = !!(navigator.vendor && navigator.vendor.indexOf("Apple") !== -1);
265
+ return t || r;
266
+ }
267
+ /**
268
+ * 将 mermaid SVG 从 foreignObject 移出,直接添加到 markmap SVG 中(Safari 兼容性处理)
269
+ * 克隆 mermaid SVG 元素,设置正确的尺寸和位置,然后将 foreignObject 中的 mermaid-container 透明度设为 0
270
+ * @param svgElement markmap SVG 元素
271
+ * @returns Promise<void>
272
+ */
273
+ static async transformMermaidSvgToMarkmapSvg(e) {
274
+ if (!e)
275
+ return;
276
+ await new Promise((a) => setTimeout(a, 200));
277
+ const t = e.querySelectorAll(
278
+ 'g[data-mermaid-wrapper][data-mermaid-clone="true"]'
279
+ ), r = e.querySelectorAll("foreignObject"), s = /* @__PURE__ */ new Set();
280
+ if (r.forEach((a) => {
281
+ const n = a.querySelector(
282
+ ".mermaid-container"
283
+ ), c = n == null ? void 0 : n.getAttribute("data-mermaid-id");
284
+ c && s.add(c);
285
+ }), t.forEach((a) => {
286
+ const n = a.getAttribute("data-mermaid-id");
287
+ n && !s.has(n) && a.remove();
288
+ }), r.length === 0)
289
+ return;
290
+ const i = Array.from(r).map(
291
+ async (a) => {
292
+ let n = a.querySelector(
293
+ 'svg[data-type="mermaid"]'
294
+ );
295
+ if (!n) {
296
+ const g = a.querySelector(".mermaid-wrapper");
297
+ g && (n = g.querySelector(
298
+ 'svg[data-type="mermaid"]'
299
+ ));
300
+ }
301
+ if (!n)
302
+ return;
303
+ const c = a.querySelector(
304
+ ".mermaid-container"
305
+ ), h = c == null ? void 0 : c.getAttribute("data-mermaid-id");
306
+ if (h)
307
+ try {
308
+ const g = parseFloat(a.getAttribute("x") || "0"), p = parseFloat(a.getAttribute("y") || "0"), d = parseFloat(
309
+ a.getAttribute("width") || "0"
310
+ ), f = parseFloat(
311
+ a.getAttribute("height") || "0"
312
+ );
313
+ if (d <= 0 || f <= 0)
314
+ return;
315
+ const w = a.parentElement;
316
+ if (!w || w.tagName !== "g")
317
+ return;
318
+ let v = w.getAttribute("transform");
319
+ if (!v)
320
+ v = `translate(${g}, ${p})`;
321
+ else {
322
+ const k = v.match(
323
+ /translate\(([^,]+),([^)]+)\)/
324
+ );
325
+ if (k) {
326
+ const x = parseFloat(k[1]), A = parseFloat(k[2]), F = x + g, R = A + p;
327
+ v = v.replace(
328
+ /translate\([^)]+\)/,
329
+ `translate(${F}, ${R})`
330
+ );
331
+ } else
332
+ v = `translate(${g}, ${p}) ${v}`;
333
+ }
334
+ const I = e.querySelector(
335
+ `g[data-mermaid-wrapper][data-mermaid-id="${h}"][data-mermaid-clone="true"]`
336
+ );
337
+ let l;
338
+ if (I) {
339
+ l = I;
340
+ const k = l.querySelector('svg[data-type="mermaid"]');
341
+ k && l.removeChild(k);
342
+ } else
343
+ l = document.createElementNS(
344
+ "http://www.w3.org/2000/svg",
345
+ "g"
346
+ ), l.setAttribute("data-mermaid-wrapper", "true"), l.setAttribute("data-mermaid-clone", "true"), l.setAttribute("data-mermaid-id", h);
347
+ l.setAttribute("transform", v);
348
+ const m = n.cloneNode(!0);
349
+ if (m.setAttribute("width", d.toString()), m.setAttribute("height", f.toString()), m.setAttribute("data-mermaid-transformed", "true"), m.style.width = "", m.style.height = "", m.style.maxWidth = "", m.style.maxHeight = "", m.style.transform = "", m.style.transformOrigin = "", m.style.display = "block", m.style.overflow = "visible", m.style.opacity = "1", !m.getAttribute("viewBox")) {
350
+ const k = m.getAttribute("width"), x = m.getAttribute("height");
351
+ if (k && x) {
352
+ const A = parseFloat(
353
+ k.replace(/px|%/, "") || "0"
354
+ ), F = parseFloat(
355
+ x.replace(/px|%/, "") || "0"
356
+ );
357
+ A > 0 && F > 0 && m.setAttribute(
358
+ "viewBox",
359
+ `0 0 ${A} ${F}`
360
+ );
361
+ }
362
+ }
363
+ l.appendChild(m), I || (w && w.parentNode ? w.parentNode.insertBefore(l, w.nextSibling) : e.appendChild(l)), c && (c.style.opacity = "0", c.style.pointerEvents = "none");
364
+ } catch (g) {
365
+ console.error("[transformMermaidSvgToMarkmapSvg] error: ", g);
366
+ }
367
+ }
368
+ );
369
+ await Promise.all(i);
370
+ }
371
+ /**
372
+ * 在 root 数据中注入 mermaid HTML
373
+ * 找到包含 mermaid 代码块的节点,将 HTML 添加到其 content 中
374
+ * @param root markmap root 数据
375
+ * @param markdown markdown 文本
376
+ * @param workId 工作 ID(用于命名空间隔离)
377
+ * @returns 修改后的 root 数据
378
+ */
379
+ static injectMermaidHtml(e, t, r) {
380
+ const s = [], i = t.split(`
381
+ `);
382
+ let a = "", n = !1, c = [], h = -1;
383
+ for (let p = 0; p < i.length; p++) {
384
+ const d = i[p], f = d.match(/^(#{1,6})\s+(.+)$/);
385
+ if (f && (a = f[2].trim()), d.trim().startsWith("```mermaid"))
386
+ n = !0, c = [], h = p;
387
+ else if (n && d.trim() === "```") {
388
+ n = !1;
389
+ const w = c.join(`
390
+ `);
391
+ w && a && s.push({
392
+ title: a,
393
+ content: w,
394
+ index: h
395
+ }), c = [];
396
+ } else n && c.push(d);
397
+ }
398
+ const g = (p) => {
399
+ if (!p) return;
400
+ const d = p.content || "", f = b.decodeHtmlEntities(d);
401
+ for (const w of s)
402
+ if (f.includes(w.title) || d.includes(w.title)) {
403
+ const v = O.generateId(), I = O.createContainer(
404
+ v,
405
+ w.content,
406
+ r
407
+ );
408
+ p.content ? p.content = p.content + I : p.content = I;
409
+ break;
410
+ }
411
+ p.children && p.children.length > 0 && p.children.forEach((w) => {
412
+ g(w);
413
+ });
414
+ };
415
+ return g(e), e;
416
+ }
417
+ /**
418
+ * 解码 HTML 实体
419
+ * @param str HTML 字符串
420
+ * @returns 解码后的字符串
421
+ */
422
+ static decodeHtmlEntities(e) {
423
+ const t = document.createElement("textarea");
424
+ return t.innerHTML = e, t.value;
425
+ }
426
+ /**
427
+ * 检查 divElement 中是否包含 mermaid SVG 元素
428
+ * @param divElement HTMLDivElement 或 SVGSVGElement 元素
429
+ * @returns 如果包含 mermaid SVG 元素,返回 true,否则返回 false
430
+ */
431
+ static hasMermaidSvg(e) {
432
+ return e.querySelectorAll("svg[data-type='mermaid']").length > 0;
433
+ }
434
+ }
435
+ class U extends ee {
436
+ constructor(t) {
437
+ super(t);
438
+ u(this, "currentWorkId", null);
439
+ }
440
+ /**
441
+ * 设置当前工作 ID(用于命名空间隔离)
442
+ * @param workId 工作 ID
443
+ */
444
+ setWorkId(t) {
445
+ this.currentWorkId = t, t && O.extendMarkdown(this, t);
446
+ }
447
+ transform(t, r) {
448
+ this.currentWorkId ? O.clear(this.currentWorkId) : O.clear();
449
+ const s = this.convertKatexToText(t), i = super.transform(s, r);
450
+ return i.root && this.processKatexInRoot(i.root), i;
451
+ }
452
+ /**
453
+ * 将 markdown 内容中的 katex 公式转换为普通文本
454
+ * 处理 $...$ 和 $$...$$ 格式的公式
455
+ * 由于 Safari 对 katex 的兼容性问题,将公式转换为普通文本显示
456
+ * @param content markdown 内容
457
+ * @returns 处理后的内容
458
+ */
459
+ convertKatexToText(t) {
460
+ if (!t)
461
+ return t;
462
+ let r = t.replace(
463
+ /\$\$([\s\S]*?)\$\$/g,
464
+ (s, i) => i.replace(/\\/g, "").replace(/\{/g, "").replace(/\}/g, "").replace(/\\over/g, "/").replace(/\\pm/g, "±").replace(/\\sqrt/g, "√").replace(/\\frac/g, "/").trim()
465
+ );
466
+ return r = r.replace(
467
+ /\$([^$\n]+?)\$/g,
468
+ (s, i) => i.replace(/\\/g, "").replace(/\{/g, "").replace(/\}/g, "").replace(/\\over/g, "/").replace(/\\pm/g, "±").replace(/\\sqrt/g, "√").replace(/\\frac/g, "/").trim()
469
+ ), r;
470
+ }
471
+ /**
472
+ * 处理转换结果中的 katex HTML,将其转换为普通文本
473
+ * 递归处理节点树,查找包含 katex 的内容并转换
474
+ * 由于 Safari 对 katex 的兼容性问题,将 katex HTML 转换为普通文本显示
475
+ * @param node markmap 节点
476
+ */
477
+ processKatexInRoot(t) {
478
+ if (t) {
479
+ if (t.content && typeof t.content == "string" && (t.content.includes("katex") || t.content.includes("katex-mathml"))) {
480
+ const r = t.content.match(
481
+ /<annotation[^>]*encoding="application\/x-tex">([^<]+)<\/annotation>/
482
+ );
483
+ if (r) {
484
+ const s = r[1].replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/\\/g, "").replace(/\{/g, "").replace(/\}/g, "").replace(/\\over/g, "/").replace(/\\pm/g, "±").replace(/\\sqrt/g, "√").replace(/\\frac/g, "/").trim();
485
+ t.content = t.content.replace(
486
+ /<div[^>]*xmlns="http:\/\/www\.w3\.org\/1999\/xhtml"[^>]*>Katex:\s*<span[^>]*class="katex"[^>]*>[\s\S]*?<\/span><\/div>/g,
487
+ s
488
+ );
489
+ } else {
490
+ const s = document.createElement("div");
491
+ s.innerHTML = t.content;
492
+ const i = s.querySelector(".katex");
493
+ if (i) {
494
+ let a = i.textContent || "";
495
+ a = a.replace(/^Katex:\s*/i, "").trim(), t.content = t.content.replace(
496
+ /<div[^>]*xmlns="http:\/\/www\.w3\.org\/1999\/xhtml"[^>]*>Katex:\s*<span[^>]*class="katex"[^>]*>[\s\S]*?<\/span><\/div>/g,
497
+ a || "公式"
498
+ );
499
+ } else {
500
+ const a = t.content.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").replace(/^Katex:\s*/i, "").trim();
501
+ t.content = a || "公式";
502
+ }
503
+ }
504
+ }
505
+ t.children && Array.isArray(t.children) && t.children.forEach((r) => {
506
+ this.processKatexInRoot(r);
507
+ });
508
+ }
509
+ }
510
+ /**
511
+ * 等待 markmap foreignObject 内所有图片加载完成
512
+ * 用于在调用 fit() 之前确保所有图片都已加载,以便正确计算尺寸
513
+ * @param svgElement SVG 元素
514
+ * @param timeout 超时时间(毫秒),默认 10 秒
515
+ * @returns Promise<void> 当所有图片加载完成时 resolve
516
+ */
517
+ static async waitForImagesInForeignObjects(t, r = 1e4) {
518
+ if (!t)
519
+ return;
520
+ const s = t.querySelectorAll(
521
+ "foreignObject.markmap-foreign img"
522
+ );
523
+ if (s.length === 0)
524
+ return;
525
+ const i = [], a = /* @__PURE__ */ new Set();
526
+ s.forEach((n) => {
527
+ const c = n.src || n.getAttribute("src");
528
+ if (!c || a.has(c) || (a.add(c), n.complete && n.naturalWidth > 0))
529
+ return;
530
+ const h = new Promise((g) => {
531
+ const p = setTimeout(() => {
532
+ g();
533
+ }, r);
534
+ if (n.complete && n.naturalWidth > 0) {
535
+ clearTimeout(p), g();
536
+ return;
537
+ }
538
+ const d = () => {
539
+ clearTimeout(p), n.removeEventListener("load", d), n.removeEventListener("error", f), g();
540
+ }, f = () => {
541
+ clearTimeout(p), n.removeEventListener("load", d), n.removeEventListener("error", f), g();
542
+ };
543
+ n.addEventListener("load", d), n.addEventListener("error", f), !n.src && c && (n.src = c);
544
+ });
545
+ i.push(h);
546
+ }), i.length > 0 && await Promise.all(i);
547
+ }
548
+ }
549
+ const L = new U(), { loadCSS: ce, loadJS: le, Markmap: he } = z, { scripts: H, styles: V } = L.getAssets();
550
+ V && ce(V);
551
+ H && le(H, {
552
+ getMarkmap: () => z
553
+ });
554
+ async function de(o) {
555
+ const e = o.querySelectorAll("img"), t = Array.from(e).map((i) => {
556
+ if (!i.crossOrigin && i.src && !i.src.startsWith("data:") && (i.crossOrigin = "anonymous", i.complete)) {
557
+ const a = i.src;
558
+ i.src = "", i.src = a;
559
+ }
560
+ return i.complete && i.crossOrigin ? Promise.resolve() : new Promise((a) => {
561
+ i.onload = () => {
562
+ a(void 0);
563
+ }, i.onerror = () => {
564
+ a(void 0);
565
+ };
566
+ });
567
+ });
568
+ return o.querySelectorAll("svg").forEach((i) => {
569
+ i.querySelectorAll("image").forEach((n) => {
570
+ n.href && !n.href.baseVal.startsWith("data:") && (n.getAttribute("crossorigin") || n.setAttribute("crossorigin", "anonymous"), t.push(
571
+ new Promise((c) => {
572
+ const h = new Image();
573
+ h.crossOrigin = "anonymous", h.onload = () => {
574
+ c(void 0);
575
+ }, h.onerror = () => {
576
+ c(void 0);
577
+ }, h.src = n.href.baseVal;
578
+ })
579
+ ));
580
+ });
581
+ }), await Promise.all(t);
582
+ }
583
+ async function me(o) {
584
+ const r = Date.now();
585
+ let s = !1;
586
+ for (; Date.now() - r < 5e3; ) {
587
+ const i = o.querySelectorAll("path");
588
+ if (i.length > 0 && (s = Array.from(i).some((a) => {
589
+ const n = a.getAttribute("d") || "";
590
+ return n !== "M0,0C0,0,0,0,0,0" && n.length > 10;
591
+ }), s))
592
+ break;
593
+ await new Promise((a) => setTimeout(a, 50));
594
+ }
595
+ }
596
+ async function pe(o) {
597
+ const e = o.querySelectorAll("svg");
598
+ if (!e.length)
599
+ return;
600
+ const t = [];
601
+ for (let r = 0; r < e.length; r++) {
602
+ const s = e[r];
603
+ t.push(me(s));
604
+ }
605
+ await Promise.all(t);
606
+ }
607
+ async function G(o) {
608
+ if (b.hasMermaidSvg(o)) {
609
+ const r = Date.now();
610
+ let s = !1;
611
+ for (; Date.now() - r < 5e3 && !s; ) {
612
+ const i = o.querySelectorAll("foreignObject");
613
+ if (i.length > 0) {
614
+ let a = !0;
615
+ for (const n of Array.from(i)) {
616
+ const c = parseFloat(n.getAttribute("width") || "0"), h = parseFloat(n.getAttribute("height") || "0");
617
+ if (n.querySelector(".mermaid-container") && (c < 50 || h < 50)) {
618
+ a = !1;
619
+ break;
620
+ }
621
+ }
622
+ if (a) {
623
+ s = !0;
624
+ break;
625
+ }
626
+ } else
627
+ s = !0;
628
+ await new Promise((a) => setTimeout(a, 50));
629
+ }
630
+ }
631
+ }
632
+ async function ue(o, e = {}) {
633
+ const { width: t = o.offsetWidth, height: r = o.offsetHeight } = e, s = o.offsetWidth || t, i = o.offsetHeight || r;
634
+ try {
635
+ const { loadSvgToImageLib: a, getSvgToImageLib: n } = await import("./svgToImageLoader-mXH53h-l.mjs");
636
+ let c = n();
637
+ if (!c)
638
+ try {
639
+ c = await a();
640
+ } catch (d) {
641
+ return console.error("[loadSvgToImageLib] error: ", d), null;
642
+ }
643
+ const h = o.style.width, g = o.style.height, p = o.style.display;
644
+ o.style.width || (o.style.width = `${s}px`), o.style.height || (o.style.height = `${i}px`), (!o.style.display || o.style.display === "none") && (o.style.display = "block");
645
+ try {
646
+ await new Promise((f) => {
647
+ requestAnimationFrame(() => {
648
+ requestAnimationFrame(() => {
649
+ f();
650
+ });
651
+ });
652
+ });
653
+ const d = await c.toPng(o, {
654
+ width: s,
655
+ height: i,
656
+ quality: 1
657
+ });
658
+ return o.style.width = h, o.style.height = g, o.style.display = p, new Promise((f) => {
659
+ const w = new Image();
660
+ w.crossOrigin = "anonymous", w.onload = () => {
661
+ f(w);
662
+ }, w.onerror = () => {
663
+ f(null);
664
+ }, w.src = d;
665
+ });
666
+ } catch (d) {
667
+ return o.style.width = h, o.style.height = g, o.style.display = p, console.error("[divToImageElement] error: ", d), null;
668
+ }
669
+ } catch (a) {
670
+ return console.error("[divToImageElement] error: ", a), null;
671
+ }
672
+ }
673
+ class ge {
674
+ constructor(e) {
675
+ u(this, "toolsType", M.BackgroundSVG);
676
+ u(this, "vNodes");
677
+ u(this, "workOptions");
678
+ u(this, "workId");
679
+ u(this, "markmapInstance", null);
680
+ u(this, "isDestroyed", !1);
681
+ u(this, "element");
682
+ u(this, "manager");
683
+ const { vNodes: t, workId: r, toolsOpt: s, manager: i } = e;
684
+ this.workId = r, this.vNodes = t, this.workOptions = s, this.manager = i, this.element = this.createElement(), this.manager.fullLayer.appendChild(this.element), this.vNodes.setInfo(this.workId, {
685
+ workShape: this
686
+ });
687
+ }
688
+ get fullLayer() {
689
+ return this.manager.fullLayer;
690
+ }
691
+ get collector() {
692
+ return this.manager.master.control.collector;
693
+ }
694
+ get scenePath() {
695
+ return this.manager.master.control.viewContainerManager.getCurScenePath(
696
+ this.manager.viewId
697
+ );
698
+ }
699
+ async init() {
700
+ await this.render();
701
+ }
702
+ createElement() {
703
+ const { type: e } = this.workOptions;
704
+ let t;
705
+ return e === E.markmap ? (t = document.createElementNS("http://www.w3.org/2000/svg", "svg"), t.classList.add("svg")) : (t = document.createElement("img"), t.classList.add("img")), t.id = this.workId, t.setAttribute("data-id", this.workId), t;
706
+ }
707
+ async render(e) {
708
+ this.isDestroyed || !this.element || !this.element.parentNode || (this.updateElementPosition(e), await this.updateSvg(e));
709
+ }
710
+ isSameSize(e) {
711
+ const { width: t, height: r } = e, { width: s, height: i } = this.workOptions, a = t * this.manager.camera.scale, n = r * this.manager.camera.scale, c = s * this.manager.camera.scale, h = i * this.manager.camera.scale;
712
+ return a === c && n === h;
713
+ }
714
+ isSamePosition(e) {
715
+ const { centerX: t, centerY: r } = e, { centerX: s, centerY: i } = this.workOptions, a = this.manager.getPagePoint(s, i), n = this.manager.getPagePoint(t, r);
716
+ return W(n, a);
717
+ }
718
+ isSameZIndex(e) {
719
+ const { zIndex: t } = e, { zIndex: r } = this.workOptions;
720
+ return t === r;
721
+ }
722
+ isSameState(e) {
723
+ const { state: t } = e, { state: r } = this.workOptions;
724
+ return W(t, r);
725
+ }
726
+ isSameData(e) {
727
+ const { data: t } = e, { data: r } = this.workOptions;
728
+ return W(t, r);
729
+ }
730
+ updateElementPosition(e) {
731
+ if (this.isDestroyed || !this.element || !this.fullLayer)
732
+ return;
733
+ const { centerX: t, centerY: r, width: s, height: i, zIndex: a } = this.workOptions, n = this.manager.getPagePoint(t, r), c = s * this.manager.camera.scale, h = i * this.manager.camera.scale;
734
+ (!e || e && !this.isSameSize(e)) && (this.element.setAttribute("width", `${c}`), this.element.setAttribute("height", `${h}`), this.element.style.width = `${c}px`, this.element.style.height = `${h}px`), (!e || e && !this.isSamePosition(e)) && (this.element.style.left = `${n.x}px`, this.element.style.top = `${n.y}px`), (!e || e && !this.isSameZIndex(e)) && (this.element.style.zIndex = (a || 0).toString());
735
+ }
736
+ async updateSvg(e) {
737
+ const { type: t, state: r } = this.workOptions;
738
+ if (t === E.markmap) {
739
+ const { data: s } = this.workOptions;
740
+ if (this.markmapInstance || (this.markmapInstance = he.create(
741
+ this.element,
742
+ this.manager.markmapOptions
743
+ ), this.markmapInstance.handleClick = async (n, c) => {
744
+ var p, d, f;
745
+ (p = this.markmapInstance) == null || p.toggleNode(c);
746
+ const h = this.serializeData((d = this.markmapInstance) == null ? void 0 : d.state.data);
747
+ this.setWorkOptions(
748
+ {
749
+ ...this.workOptions,
750
+ state: h
751
+ },
752
+ !1
753
+ ), b.checkNodeHasMermaid(c) && await b.renderMermaidAfterDOMUpdate(
754
+ this.element,
755
+ this.workId
756
+ ), this.scenePath && this.collector && ((f = this.collector) == null || f.dispatch({
757
+ type: y.UpdateNode,
758
+ workId: this.workId,
759
+ opt: this.workOptions,
760
+ isSync: !0,
761
+ viewId: this.manager.viewId,
762
+ scenePath: this.scenePath
763
+ }));
764
+ }), e && this.isSameState(e) && this.isSameSize(e) && this.isSameData(e))
765
+ return;
766
+ L.setWorkId(this.workId);
767
+ const i = L.transform(s);
768
+ let { root: a } = i;
769
+ s && q(s) && (a = b.injectMermaidHtml(a, s, this.workId));
770
+ try {
771
+ r && Array.isArray(r) && this.transformState(
772
+ r,
773
+ a
774
+ ), await this.markmapInstance.setData(a), !this.isDestroyed && this.element && this.fullLayer && this.markmapInstance && (window.markmapInstance = this.markmapInstance, s && q(s) && await b.renderMermaidAfterDOMUpdate(
775
+ this.element,
776
+ this.workId
777
+ ), await this.fit(
778
+ !e || e && !this.isSameData(e)
779
+ ));
780
+ } catch (n) {
781
+ console.error("[updateSvg] error: ", n);
782
+ }
783
+ } else {
784
+ const { src: s, crossOrigin: i } = this.workOptions;
785
+ this.element.src = s, this.element.crossOrigin = _(i) ? i : "anonymous";
786
+ try {
787
+ await new Promise((a, n) => {
788
+ this.element.onload = () => {
789
+ a();
790
+ }, this.element.onerror = function() {
791
+ n();
792
+ };
793
+ });
794
+ } catch (a) {
795
+ console.error("[updateSvg] error: ", a);
796
+ }
797
+ }
798
+ }
799
+ async fit(e = !0) {
800
+ var t;
801
+ !this.isDestroyed && this.element && this.fullLayer && this.markmapInstance && (e && this.element && await U.waitForImagesInForeignObjects(
802
+ this.element
803
+ ), await ((t = this.markmapInstance) == null ? void 0 : t.fit()), this.element && b.isSafari() && b.hasMermaidSvg(this.element) && (await G(this.element), await b.transformMermaidSvgToMarkmapSvg(
804
+ this.element
805
+ )));
806
+ }
807
+ serializeData(e) {
808
+ var s;
809
+ const t = [e], r = [];
810
+ for (; t.length > 0; ) {
811
+ const i = t.pop();
812
+ i && (i != null && i.children && t.push(...i.children), r.push(((s = i == null ? void 0 : i.payload) == null ? void 0 : s.fold) || 0));
813
+ }
814
+ return r;
815
+ }
816
+ transformState(e, t) {
817
+ const r = [t];
818
+ for (; r.length > 0; ) {
819
+ const s = r.pop();
820
+ s && (s != null && s.children && r.push(...s.children), s.payload ? s.payload.fold = e.shift() : e.shift());
821
+ }
822
+ }
823
+ async updateCamera() {
824
+ this.updateElementPosition(), await this.fit(!1);
825
+ }
826
+ async setWorkOptions(e, t = !0) {
827
+ if (!W(this.workOptions, e)) {
828
+ const r = J(this.workOptions);
829
+ this.workOptions = e, t && await this.render(r);
830
+ }
831
+ }
832
+ destroy() {
833
+ this.isDestroyed = !0, this.element.remove();
834
+ }
835
+ getRectFromLayer() {
836
+ const e = this.element.getBoundingClientRect();
837
+ return {
838
+ x: e.x,
839
+ y: e.y,
840
+ w: e.width,
841
+ h: e.height
842
+ };
843
+ }
844
+ }
845
+ function X(o) {
846
+ const { toolsType: e, ...t } = o;
847
+ switch (e) {
848
+ case M.BackgroundSVG:
849
+ return new ge(t);
850
+ default:
851
+ return;
852
+ }
853
+ }
854
+ class Y {
855
+ constructor(e) {
856
+ u(this, "viewId");
857
+ u(this, "fullLayer");
858
+ u(this, "curNodeMap");
859
+ this.viewId = e, this.curNodeMap = new te();
860
+ }
861
+ init(e) {
862
+ this.fullLayer = e;
863
+ }
864
+ get(e) {
865
+ return this.curNodeMap.get(e);
866
+ }
867
+ setInfo(e, t) {
868
+ const r = this.curNodeMap.get(
869
+ e
870
+ ) || {
871
+ name: e,
872
+ workShape: t.workShape
873
+ };
874
+ t.workShape && (r.workShape = t.workShape), this.curNodeMap.set(e, r);
875
+ }
876
+ getNodeRectFormShape(e) {
877
+ const t = this.curNodeMap.get(e);
878
+ if (t && t.workShape)
879
+ return t.workShape.getRectFromLayer();
880
+ }
881
+ delete(e) {
882
+ const t = this.curNodeMap.get(e);
883
+ t && t.workShape.destroy(), this.curNodeMap.delete(e);
884
+ }
885
+ clear() {
886
+ for (const e of this.curNodeMap.values())
887
+ e.workShape.destroy();
888
+ this.curNodeMap.clear();
889
+ }
890
+ }
891
+ class fe {
892
+ constructor(e, t) {
893
+ u(this, "opt");
894
+ u(this, "viewId");
895
+ u(this, "fullLayer");
896
+ u(this, "vNodes");
897
+ u(this, "master");
898
+ u(this, "cameraOpt");
899
+ u(this, "methodBuilder");
900
+ u(this, "updateCamera", Q(async (e) => {
901
+ const { cameraOpt: t } = e;
902
+ t && !W(this.cameraOpt, t) && await this.setCameraOpt(t);
903
+ }, 100));
904
+ this.viewId = e, this.opt = t, this.master = t.master, this.fullLayer = t.container, this.methodBuilder = new se([
905
+ B.CopyNode
906
+ ]).registerForBackgroundThread(this), this.vNodes = new Y(e), this.vNodes.init(this.fullLayer);
907
+ }
908
+ get camera() {
909
+ return this.cameraOpt || {
910
+ scale: 1,
911
+ centerX: 0,
912
+ centerY: 0,
913
+ width: 0,
914
+ height: 0
915
+ };
916
+ }
917
+ get view() {
918
+ var e;
919
+ return (e = this.master.control.viewContainerManager.getView(this.viewId)) == null ? void 0 : e.viewData;
920
+ }
921
+ get markmapOptions() {
922
+ return this.master.control.pluginOptions.extras.markmap.options;
923
+ }
924
+ getPagePoint(e, t) {
925
+ const { scale: r, centerX: s, centerY: i, width: a, height: n } = this.camera;
926
+ return {
927
+ x: (e - s) * r + a / 2,
928
+ y: (t - i) * r + n / 2
929
+ };
930
+ }
931
+ async setCameraOpt(e) {
932
+ this.cameraOpt = e;
933
+ for (const t of this.vNodes.curNodeMap.values()) {
934
+ const { workShape: r } = t;
935
+ r && await r.updateCamera();
936
+ }
937
+ }
938
+ clearAll() {
939
+ this.vNodes.clear();
940
+ }
941
+ canUseFullLayer(e) {
942
+ return e === M.BackgroundSVG;
943
+ }
944
+ async consumeFull(e) {
945
+ const { toolsType: t, opt: r, workId: s } = e;
946
+ if (s != null && s.toString() && t && this.canUseFullLayer(t))
947
+ switch (t) {
948
+ case M.BackgroundSVG:
949
+ await this.setFullWork({
950
+ toolsType: t,
951
+ opt: r,
952
+ workId: s
953
+ });
954
+ break;
955
+ }
956
+ }
957
+ async setFullWork(e) {
958
+ const { workId: t, opt: r, toolsType: s } = e;
959
+ if (t && r && s) {
960
+ const i = t.toString();
961
+ let a;
962
+ const n = this.vNodes.get(i);
963
+ return !n || !n.workShape ? (a = this.createWorkShapeNode({
964
+ toolsOpt: r,
965
+ toolsType: M.BackgroundSVG,
966
+ workId: i
967
+ }), a && await a.init()) : (a = n.workShape, await a.setWorkOptions(r)), a;
968
+ }
969
+ }
970
+ createWorkShapeNode(e) {
971
+ return X({
972
+ ...e,
973
+ vNodes: this.vNodes,
974
+ manager: this
975
+ });
976
+ }
977
+ removeWork(e) {
978
+ const { workId: t } = e, r = t == null ? void 0 : t.toString();
979
+ r && this.removeNode(r);
980
+ }
981
+ removeNode(e) {
982
+ this.vNodes.delete(e);
983
+ }
984
+ async on(e) {
985
+ if (!await this.methodBuilder.consumeForBackgroundThread(e)) {
986
+ const { msgType: t, toolsType: r } = e;
987
+ switch (t) {
988
+ case y.Destroy: {
989
+ this.destroy();
990
+ break;
991
+ }
992
+ case y.Clear: {
993
+ this.clearAll();
994
+ break;
995
+ }
996
+ case y.UpdateCamera: {
997
+ this.updateCamera(e);
998
+ break;
999
+ }
1000
+ case y.UpdateTools: {
1001
+ this.toggleFullLayer(r === M.Clicker);
1002
+ break;
1003
+ }
1004
+ case y.BackgroundSVGUpdate:
1005
+ case y.UpdateNode:
1006
+ case y.FullWork: {
1007
+ r && this.canUseFullLayer(r) && await this.consumeFull(e);
1008
+ break;
1009
+ }
1010
+ case y.BackgroundSVGDelete: {
1011
+ this.removeWork(e);
1012
+ break;
1013
+ }
1014
+ }
1015
+ }
1016
+ }
1017
+ toggleFullLayer(e) {
1018
+ this.fullLayer.classList.toggle(
1019
+ "appliance-plugin-background-svg-active",
1020
+ e
1021
+ );
1022
+ }
1023
+ destroy() {
1024
+ this.vNodes.clear();
1025
+ }
1026
+ }
1027
+ class we {
1028
+ constructor(e, t) {
1029
+ u(this, "viewId");
1030
+ u(this, "fullLayer");
1031
+ u(this, "master");
1032
+ u(this, "vNodes");
1033
+ u(this, "cameraOpt");
1034
+ u(this, "opt");
1035
+ u(this, "workShapes", /* @__PURE__ */ new Map());
1036
+ this.viewId = e, this.opt = t, this.master = t.master, this.fullLayer = t.container, this.vNodes = new Y(e), this.vNodes.init(this.fullLayer);
1037
+ }
1038
+ get camera() {
1039
+ return this.cameraOpt || {
1040
+ scale: 1,
1041
+ centerX: 0,
1042
+ centerY: 0,
1043
+ width: 0,
1044
+ height: 0
1045
+ };
1046
+ }
1047
+ get view() {
1048
+ var e;
1049
+ return (e = this.master.control.viewContainerManager.getView(this.viewId)) == null ? void 0 : e.viewData;
1050
+ }
1051
+ get markmapOptions() {
1052
+ return this.master.control.pluginOptions.extras.markmap.options;
1053
+ }
1054
+ createOffscreenCanvas(e) {
1055
+ const { width: t, height: r } = e.canvasOpt, s = new OffscreenCanvas(
1056
+ e.canvasOpt.width,
1057
+ e.canvasOpt.height
1058
+ );
1059
+ s.width = t, s.height = r;
1060
+ }
1061
+ async setCameraOpt(e) {
1062
+ this.cameraOpt = e;
1063
+ for (const t of this.vNodes.curNodeMap.values()) {
1064
+ const { workShape: r } = t;
1065
+ r && await r.updateCamera();
1066
+ }
1067
+ }
1068
+ getPagePoint(e, t) {
1069
+ const { scale: r, centerX: s, centerY: i, width: a, height: n } = this.camera;
1070
+ return {
1071
+ x: (e - s) * r + a / 2,
1072
+ y: (t - i) * r + n / 2
1073
+ };
1074
+ }
1075
+ async getSnapshot(e) {
1076
+ const { scenePath: t, scenes: r, cameraOpt: s } = e;
1077
+ if (t && r && s) {
1078
+ await this.setCameraOpt(s);
1079
+ for (const [i, a] of Object.entries(r))
1080
+ if (a != null && a.type && (a == null ? void 0 : a.toolsType) === M.BackgroundSVG)
1081
+ switch (a == null ? void 0 : a.type) {
1082
+ case y.UpdateNode:
1083
+ case y.FullWork: {
1084
+ const { opt: n } = a, c = {
1085
+ ...a,
1086
+ opt: n,
1087
+ workId: i,
1088
+ msgType: y.FullWork,
1089
+ dataType: D.Service,
1090
+ viewId: this.viewId
1091
+ };
1092
+ await this.runFullWork(c);
1093
+ break;
1094
+ }
1095
+ }
1096
+ try {
1097
+ if (t) {
1098
+ await G(this.fullLayer), await de(this.fullLayer), await pe(this.fullLayer);
1099
+ const i = await ue(this.fullLayer);
1100
+ i && this.opt.post({
1101
+ sp: [
1102
+ {
1103
+ type: y.Snapshot,
1104
+ scenePath: t,
1105
+ imageElement: i,
1106
+ viewId: this.viewId,
1107
+ index: 1
1108
+ }
1109
+ ]
1110
+ });
1111
+ }
1112
+ } catch (i) {
1113
+ const a = i && i instanceof Error ? i.message : i == null ? void 0 : i.toString();
1114
+ this.opt.post({
1115
+ sp: [
1116
+ {
1117
+ type: y.ReportError,
1118
+ reportString: `[SnapshotThreadImpl] getSnapshotRender error: ${a}`
1119
+ }
1120
+ ]
1121
+ });
1122
+ }
1123
+ }
1124
+ }
1125
+ createWorkShapeNode(e) {
1126
+ return X({
1127
+ ...e,
1128
+ vNodes: this.vNodes,
1129
+ manager: this
1130
+ });
1131
+ }
1132
+ async setFullWork(e) {
1133
+ const { workId: t, opt: r, toolsType: s } = e;
1134
+ if (t && r && s) {
1135
+ const i = t.toString();
1136
+ let a;
1137
+ const n = this.vNodes.get(i);
1138
+ return !n || !n.workShape ? (a = this.createWorkShapeNode({
1139
+ toolsOpt: r,
1140
+ toolsType: M.BackgroundSVG,
1141
+ workId: i
1142
+ }), a && await a.init()) : (a = n.workShape, await a.setWorkOptions(r)), a;
1143
+ }
1144
+ }
1145
+ async runFullWork(e) {
1146
+ const { toolsType: t, opt: r, workId: s } = e;
1147
+ await this.setFullWork({
1148
+ toolsType: t,
1149
+ opt: r,
1150
+ workId: s
1151
+ });
1152
+ }
1153
+ destroy() {
1154
+ this.fullLayer.innerHTML = "", this.fullLayer.style.width = "", this.fullLayer.style.height = "";
1155
+ }
1156
+ }
1157
+ class We {
1158
+ constructor(e) {
1159
+ u(this, "backgroundThreadMap", /* @__PURE__ */ new Map());
1160
+ u(this, "snapshotThread");
1161
+ u(this, "master");
1162
+ u(this, "post", (e) => {
1163
+ const { sp: t } = e;
1164
+ t && this.master.collectorSyncData(t);
1165
+ });
1166
+ this.master = e, this.backgroundThreadMap = /* @__PURE__ */ new Map();
1167
+ }
1168
+ createBackgroundThread(e, t) {
1169
+ return new fe(e, t);
1170
+ }
1171
+ createSnapshotThread(e, t) {
1172
+ return new we(e, t);
1173
+ }
1174
+ async consume(e) {
1175
+ var t, r, s, i, a, n;
1176
+ for (const c of e.values()) {
1177
+ const {
1178
+ msgType: h,
1179
+ viewId: g,
1180
+ layerOpt: p,
1181
+ offscreenCanvasOpt: d,
1182
+ cameraOpt: f,
1183
+ tasksqueue: w,
1184
+ mainTasksqueueCount: v
1185
+ } = c;
1186
+ if (h === y.Console) {
1187
+ console.log(this);
1188
+ continue;
1189
+ }
1190
+ if (h === y.Init) {
1191
+ const l = (t = this.master.control.viewContainerManager.getView(g)) == null ? void 0 : t.displayer, m = (r = l == null ? void 0 : l.backgroundContainerRef) == null ? void 0 : r.current;
1192
+ if (l && m && p && d) {
1193
+ const S = this.backgroundThreadMap.get(g);
1194
+ S == null || S.destroy();
1195
+ const k = this.createBackgroundThread(g, {
1196
+ displayer: l,
1197
+ container: m,
1198
+ layerOpt: p,
1199
+ master: this.master,
1200
+ canvasOpt: d,
1201
+ post: this.post
1202
+ });
1203
+ this.backgroundThreadMap.set(g, k), k && f && await k.setCameraOpt(f);
1204
+ }
1205
+ continue;
1206
+ }
1207
+ if (h === y.Snapshot) {
1208
+ const l = (s = this.master.control.viewContainerManager.getView(g)) == null ? void 0 : s.displayer, S = (a = ((i = this.master.control.viewContainerManager.mainView) == null ? void 0 : i.displayer).backgroundSnapshotContainerRef) == null ? void 0 : a.current;
1209
+ if (l && S && f) {
1210
+ (n = this.snapshotThread) == null || n.destroy(), S.style.width = `${f.width}px`, S.style.height = `${f.height}px`;
1211
+ const k = {
1212
+ ...P.defaultLayerOpt,
1213
+ offscreen: !1,
1214
+ width: f.width,
1215
+ height: f.height
1216
+ }, x = {
1217
+ ...P.defaultScreenCanvasOpt,
1218
+ width: f.width,
1219
+ height: f.height
1220
+ };
1221
+ this.snapshotThread = this.createSnapshotThread(g, {
1222
+ displayer: l,
1223
+ container: S,
1224
+ layerOpt: k,
1225
+ master: this.master,
1226
+ canvasOpt: x,
1227
+ post: this.post
1228
+ }), await this.snapshotThread.getSnapshot(c), this.snapshotThread.destroy(), this.snapshotThread = void 0;
1229
+ continue;
1230
+ }
1231
+ }
1232
+ if (h === y.TasksQueue && (w != null && w.size)) {
1233
+ for (const [l, m] of this.backgroundThreadMap.entries()) {
1234
+ const S = w.get(l);
1235
+ S && (await m.on(S), v && this.post({ workerTasksqueueCount: v }));
1236
+ }
1237
+ continue;
1238
+ }
1239
+ if (g === Z) {
1240
+ for (const l of this.backgroundThreadMap.values())
1241
+ await l.on(c);
1242
+ h === y.Destroy && this.backgroundThreadMap.clear();
1243
+ continue;
1244
+ }
1245
+ const I = this.backgroundThreadMap.get(g);
1246
+ I && (await I.on(c), h === y.Destroy && this.backgroundThreadMap.delete(g));
1247
+ }
1248
+ }
1249
+ async consumeTargetOne(e, t) {
1250
+ const r = this.backgroundThreadMap.get(e);
1251
+ r && await r.on(t);
1252
+ }
1253
+ destroy() {
1254
+ var e;
1255
+ (e = this.snapshotThread) == null || e.destroy(), this.snapshotThread = void 0;
1256
+ for (const t of this.backgroundThreadMap.values())
1257
+ t.destroy();
1258
+ this.backgroundThreadMap.clear();
1259
+ }
1260
+ }
1261
+ export {
1262
+ We as BackgroundThreadManagerImpl
1263
+ };