@netless/appliance-plugin 1.1.29 → 1.1.30-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 (68) hide show
  1. package/cdn/cdn.js +1 -1
  2. package/cdn/fullWorker-CWzLC1.js +486 -0
  3. package/cdn/subWorker-Bb5WAj.js +486 -0
  4. package/dist/ObserverMap-BudneEfB.mjs +58 -0
  5. package/dist/ObserverMap-DTz9zucn.js +1 -0
  6. package/dist/appliance-plugin.js +1 -1
  7. package/dist/appliance-plugin.mjs +19 -18
  8. package/dist/collector/collector.d.ts +6 -0
  9. package/dist/component/svg/base.d.ts +30 -0
  10. package/dist/component/svg/manager.d.ts +44 -0
  11. package/dist/component/svg/markmap.d.ts +41 -0
  12. package/dist/component/svg/mermaid-check.d.ts +18 -0
  13. package/dist/component/svg/mermaid-loader.d.ts +29 -0
  14. package/dist/component/svg/mermaid.d.ts +109 -0
  15. package/dist/component/svg/snapshot.d.ts +31 -0
  16. package/dist/component/svg/svgElemt.d.ts +43 -0
  17. package/dist/component/svg/svgToImageLoader.d.ts +25 -0
  18. package/dist/component/svg/types.d.ts +10 -0
  19. package/dist/component/svg/utils.d.ts +9 -0
  20. package/dist/component/svg/vNodeManager.d.ts +28 -0
  21. package/dist/core/backGroundThread/index.d.ts +35 -0
  22. package/dist/core/backGroundThread/types.d.ts +12 -0
  23. package/dist/core/enum.d.ts +12 -2
  24. package/dist/core/mainEngine.d.ts +11 -3
  25. package/dist/core/mainThread/snapshotThread.d.ts +2 -1
  26. package/dist/core/mainThread/subLocalThread.d.ts +1 -2
  27. package/dist/core/mainThread/subTopThread.d.ts +2 -2
  28. package/dist/core/msgEvent/baseForBackgroundThread.d.ts +9 -0
  29. package/dist/core/msgEvent/copyNode/forBackgroundThread.d.ts +8 -0
  30. package/dist/core/msgEvent/forBackgroundThread.d.ts +12 -0
  31. package/dist/core/msgEvent/setZIndex/forMain.d.ts +7 -0
  32. package/dist/core/tools/base.d.ts +5 -1
  33. package/dist/core/tools/shadowSvg.d.ts +36 -0
  34. package/dist/core/tools/svg.d.ts +0 -0
  35. package/dist/core/tools/utils.d.ts +9 -8
  36. package/dist/core/types.d.ts +36 -1
  37. package/dist/core/utils/ObserverMap.d.ts +19 -0
  38. package/dist/core/utils/index.d.ts +1 -0
  39. package/dist/core/vNodeManager.d.ts +6 -5
  40. package/dist/core/worker/base.d.ts +1 -1
  41. package/dist/core/worker/fullWorkerLocal.d.ts +1 -7
  42. package/dist/core/worker/simpleWorker.d.ts +2 -1
  43. package/dist/core/worker/subWorkerTopLayer.d.ts +2 -2
  44. package/dist/fullWorker.js +127 -158
  45. package/dist/index-CaGxVP6U.mjs +1256 -0
  46. package/dist/{index-R6pW4VdG.mjs → index-Cp4iDsa1.mjs} +1253 -1097
  47. package/dist/index-DIJe5ta7.js +1 -0
  48. package/dist/index-ELCL_4SK.js +3 -0
  49. package/dist/index-GdF83s93.js +1 -0
  50. package/dist/{index-DELSIerV.mjs → index-OkrVupZ5.mjs} +6540 -6088
  51. package/dist/plugin/baseApplianceManager.d.ts +7 -2
  52. package/dist/plugin/baseViewContainerManager.d.ts +2 -0
  53. package/dist/plugin/displayerView.d.ts +2 -0
  54. package/dist/plugin/multi/displayer/appViewDisplayerManager.d.ts +1 -0
  55. package/dist/plugin/multi/displayer/mainViewDisplayerManager.d.ts +2 -0
  56. package/dist/plugin/single/displayer/mainViewDisplayerManager.d.ts +2 -0
  57. package/dist/plugin/types.d.ts +70 -2
  58. package/dist/style.css +1 -1
  59. package/dist/subWorker.js +127 -158
  60. package/dist/svgToImageLoader-DPRAAhwW.js +1 -0
  61. package/dist/svgToImageLoader-mXH53h-l.mjs +18 -0
  62. package/package.json +6 -1
  63. package/cdn/fullWorker-DutDhB.js +0 -517
  64. package/cdn/subWorker-D52EcC.js +0 -517
  65. package/dist/core/msgEvent/deleteNode/forMainThread.d.ts +0 -6
  66. package/dist/core/msgEvent/deleteNode/forWorker.d.ts +0 -6
  67. package/dist/index-BVAZlFjO.js +0 -1
  68. package/dist/index-CcD-F3bG.js +0 -1
@@ -0,0 +1,1256 @@
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 p = (o, e, t) => j(o, typeof e != "symbol" ? e + "" : e, t);
4
+ import { E as B, a as k, b as D, c as x, d as E, V as P, S as Z } from "./index-OkrVupZ5.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
+ p(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
+ p(this, "emitEventType", B.CopyNode);
29
+ }
30
+ async consume(t) {
31
+ const { msgType: r, dataType: s, emitEventType: i } = t;
32
+ if (r === k.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
+ p(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 I = class I {
84
+ constructor() {
85
+ // 使用 workId 作为 key,存储每个实例的 mermaid 代码块
86
+ p(this, "mermaidCodeBlocksByWorkId", /* @__PURE__ */ new Map());
87
+ }
88
+ /**
89
+ * 获取 MermaidManager 单例实例
90
+ */
91
+ static getInstance() {
92
+ return I.instance || (I.instance = new I()), I.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, d, w) => {
139
+ const u = a[n];
140
+ if (u.info.trim() === "mermaid") {
141
+ const g = i.generateId();
142
+ return i.createContainer(g, u.content, t);
143
+ }
144
+ return s ? s(a, n, c, d, w) : "";
145
+ };
146
+ }
147
+ // 为了向后兼容,保留静态方法(内部使用单例)
148
+ static generateId() {
149
+ return I.getInstance().generateId();
150
+ }
151
+ static createContainer(e, t, r) {
152
+ return I.getInstance().createContainer(
153
+ e,
154
+ t,
155
+ r
156
+ );
157
+ }
158
+ static getCode(e, t) {
159
+ return I.getInstance().getCode(e, t);
160
+ }
161
+ static clear(e) {
162
+ I.getInstance().clear(e);
163
+ }
164
+ static extendMarkdown(e, t) {
165
+ I.getInstance().extendMarkdown(e, t);
166
+ }
167
+ };
168
+ p(I, "instance", null);
169
+ let b = I;
170
+ class T {
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 (T.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 T.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((d) => setTimeout(d, 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 d = n, w = d.getAttribute("data-mermaid-id"), u = w ? b.getCode(w, t) : void 0, l = d.querySelector(
226
+ ".mermaid-placeholder"
227
+ );
228
+ if (!(!l || !u))
229
+ try {
230
+ const f = `mermaid-${t.replace(/[^a-zA-Z0-9_-]/g, "-")}-${Date.now()}-${c}`, { svg: v } = await r.render(f, u);
231
+ if (l && l.parentNode) {
232
+ const y = document.createElement("div");
233
+ y.innerHTML = v;
234
+ const h = y.querySelector("svg");
235
+ if (h) {
236
+ if (!h.getAttribute("viewBox") && h.getAttribute("width") && h.getAttribute("height")) {
237
+ const A = h.getAttribute("width"), S = h.getAttribute("height"), M = parseFloat((A == null ? void 0 : A.replace(/px|%/, "")) || "0"), O = parseFloat(
238
+ (S == null ? void 0 : S.replace(/px|%/, "")) || "0"
239
+ );
240
+ M > 0 && O > 0 && h.setAttribute(
241
+ "viewBox",
242
+ `0 0 ${M} ${O}`
243
+ );
244
+ }
245
+ h.style.display = "block", h.style.maxWidth = "100%", h.style.width = "auto", h.style.height = "auto", h.style.overflow = "visible", h.style.verticalAlign = "top", h.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(h), h.style.width = "100%", h.style.height = "100%", h.style.maxWidth = "100%", h.style.maxHeight = "100%", h.style.objectFit = "contain", h.setAttribute("data-type", "mermaid"), this.isSafari() && (h.style.opacity = "0"), l.parentNode.replaceChild(m, l);
248
+ } else
249
+ l.outerHTML = v;
250
+ }
251
+ } catch (g) {
252
+ const f = g instanceof Error ? g.message : String(g);
253
+ l && (l.textContent = `Mermaid 渲染失败: ${f}`, l.style.color = "red", l.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 w = a.querySelector(".mermaid-wrapper");
297
+ w && (n = w.querySelector(
298
+ 'svg[data-type="mermaid"]'
299
+ ));
300
+ }
301
+ if (!n)
302
+ return;
303
+ const c = a.querySelector(
304
+ ".mermaid-container"
305
+ ), d = c == null ? void 0 : c.getAttribute("data-mermaid-id");
306
+ if (d)
307
+ try {
308
+ const w = parseFloat(a.getAttribute("x") || "0"), u = parseFloat(a.getAttribute("y") || "0"), l = parseFloat(
309
+ a.getAttribute("width") || "0"
310
+ ), g = parseFloat(
311
+ a.getAttribute("height") || "0"
312
+ );
313
+ if (l <= 0 || g <= 0)
314
+ return;
315
+ const f = a.parentElement;
316
+ if (!f || f.tagName !== "g")
317
+ return;
318
+ let v = f.getAttribute("transform");
319
+ if (!v)
320
+ v = `translate(${w}, ${u})`;
321
+ else {
322
+ const S = v.match(
323
+ /translate\(([^,]+),([^)]+)\)/
324
+ );
325
+ if (S) {
326
+ const M = parseFloat(S[1]), O = parseFloat(S[2]), F = M + w, R = O + u;
327
+ v = v.replace(
328
+ /translate\([^)]+\)/,
329
+ `translate(${F}, ${R})`
330
+ );
331
+ } else
332
+ v = `translate(${w}, ${u}) ${v}`;
333
+ }
334
+ const y = e.querySelector(
335
+ `g[data-mermaid-wrapper][data-mermaid-id="${d}"][data-mermaid-clone="true"]`
336
+ );
337
+ let h;
338
+ if (y) {
339
+ h = y;
340
+ const S = h.querySelector('svg[data-type="mermaid"]');
341
+ S && h.removeChild(S);
342
+ } else
343
+ h = document.createElementNS(
344
+ "http://www.w3.org/2000/svg",
345
+ "g"
346
+ ), h.setAttribute("data-mermaid-wrapper", "true"), h.setAttribute("data-mermaid-clone", "true"), h.setAttribute("data-mermaid-id", d);
347
+ h.setAttribute("transform", v);
348
+ const m = n.cloneNode(!0);
349
+ if (m.setAttribute("width", l.toString()), m.setAttribute("height", g.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 S = m.getAttribute("width"), M = m.getAttribute("height");
351
+ if (S && M) {
352
+ const O = parseFloat(
353
+ S.replace(/px|%/, "") || "0"
354
+ ), F = parseFloat(
355
+ M.replace(/px|%/, "") || "0"
356
+ );
357
+ O > 0 && F > 0 && m.setAttribute(
358
+ "viewBox",
359
+ `0 0 ${O} ${F}`
360
+ );
361
+ }
362
+ }
363
+ h.appendChild(m), y || (f && f.parentNode ? f.parentNode.insertBefore(h, f.nextSibling) : e.appendChild(h)), c && (c.style.opacity = "0", c.style.pointerEvents = "none");
364
+ } catch (w) {
365
+ console.error("[transformMermaidSvgToMarkmapSvg] error: ", w);
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 = [], d = -1;
383
+ for (let u = 0; u < i.length; u++) {
384
+ const l = i[u], g = l.match(/^(#{1,6})\s+(.+)$/);
385
+ if (g && (a = g[2].trim()), l.trim().startsWith("```mermaid"))
386
+ n = !0, c = [], d = u;
387
+ else if (n && l.trim() === "```") {
388
+ n = !1;
389
+ const f = c.join(`
390
+ `);
391
+ f && a && s.push({
392
+ title: a,
393
+ content: f,
394
+ index: d
395
+ }), c = [];
396
+ } else n && c.push(l);
397
+ }
398
+ const w = (u) => {
399
+ if (!u) return;
400
+ const l = u.content || "", g = T.decodeHtmlEntities(l);
401
+ for (const f of s)
402
+ if (g.includes(f.title) || l.includes(f.title)) {
403
+ const v = b.generateId(), y = b.createContainer(
404
+ v,
405
+ f.content,
406
+ r
407
+ );
408
+ u.content ? u.content = u.content + y : u.content = y;
409
+ break;
410
+ }
411
+ u.children && u.children.length > 0 && u.children.forEach((f) => {
412
+ w(f);
413
+ });
414
+ };
415
+ return w(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
+ p(this, "currentWorkId", null);
439
+ }
440
+ /**
441
+ * 设置当前工作 ID(用于命名空间隔离)
442
+ * @param workId 工作 ID
443
+ */
444
+ setWorkId(t) {
445
+ this.currentWorkId = t, t && b.extendMarkdown(this, t);
446
+ }
447
+ transform(t, r) {
448
+ this.currentWorkId ? b.clear(this.currentWorkId) : b.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 d = new Promise((w) => {
531
+ const u = setTimeout(() => {
532
+ w();
533
+ }, r);
534
+ if (n.complete && n.naturalWidth > 0) {
535
+ clearTimeout(u), w();
536
+ return;
537
+ }
538
+ const l = () => {
539
+ clearTimeout(u), n.removeEventListener("load", l), n.removeEventListener("error", g), w();
540
+ }, g = () => {
541
+ clearTimeout(u), n.removeEventListener("load", l), n.removeEventListener("error", g), w();
542
+ };
543
+ n.addEventListener("load", l), n.addEventListener("error", g), !n.src && c && (n.src = c);
544
+ });
545
+ i.push(d);
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 d = new Image();
573
+ d.crossOrigin = "anonymous", d.onload = () => {
574
+ c(void 0);
575
+ }, d.onerror = () => {
576
+ c(void 0);
577
+ }, d.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 ue(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 (T.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"), d = parseFloat(n.getAttribute("height") || "0");
617
+ if (n.querySelector(".mermaid-container") && (c < 50 || d < 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 pe(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 (l) {
641
+ return console.error("[loadSvgToImageLib] error: ", l), null;
642
+ }
643
+ const d = o.style.width, w = o.style.height, u = 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((g) => {
647
+ requestAnimationFrame(() => {
648
+ requestAnimationFrame(() => {
649
+ g();
650
+ });
651
+ });
652
+ });
653
+ const l = await c.toPng(o, {
654
+ width: s,
655
+ height: i,
656
+ quality: 1
657
+ });
658
+ return o.style.width = d, o.style.height = w, o.style.display = u, new Promise((g) => {
659
+ const f = new Image();
660
+ f.crossOrigin = "anonymous", f.onload = () => {
661
+ g(f);
662
+ }, f.onerror = () => {
663
+ g(null);
664
+ }, f.src = l;
665
+ });
666
+ } catch (l) {
667
+ return o.style.width = d, o.style.height = w, o.style.display = u, console.error("[divToImageElement] error: ", l), null;
668
+ }
669
+ } catch (a) {
670
+ return console.error("[divToImageElement] error: ", a), null;
671
+ }
672
+ }
673
+ class ge {
674
+ constructor(e) {
675
+ p(this, "toolsType", x.BackgroundSVG);
676
+ p(this, "vNodes");
677
+ p(this, "workOptions");
678
+ p(this, "workId");
679
+ p(this, "markmapInstance", null);
680
+ p(this, "isDestroyed", !1);
681
+ p(this, "element");
682
+ p(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, d = i * this.manager.camera.scale;
712
+ return a === c && n === d;
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, d = i * this.manager.camera.scale;
734
+ (!e || e && !this.isSameSize(e)) && (this.element.setAttribute("width", `${c}`), this.element.setAttribute("height", `${d}`), this.element.style.width = `${c}px`, this.element.style.height = `${d}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 u, l, g;
745
+ (u = this.markmapInstance) == null || u.toggleNode(c);
746
+ const d = this.serializeData((l = this.markmapInstance) == null ? void 0 : l.state.data);
747
+ this.setWorkOptions(
748
+ {
749
+ ...this.workOptions,
750
+ state: d
751
+ },
752
+ !1
753
+ ), T.checkNodeHasMermaid(c) && await T.renderMermaidAfterDOMUpdate(
754
+ this.element,
755
+ this.workId
756
+ ), this.scenePath && this.collector && ((g = this.collector) == null || g.dispatch({
757
+ type: k.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 = T.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 T.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 && T.isSafari() && T.hasMermaidSvg(this.element) && (await G(this.element), await T.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 x.BackgroundSVG:
849
+ return new ge(t);
850
+ default:
851
+ return;
852
+ }
853
+ }
854
+ class Y {
855
+ constructor(e) {
856
+ p(this, "viewId");
857
+ p(this, "fullLayer");
858
+ p(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
+ p(this, "opt");
894
+ p(this, "viewId");
895
+ p(this, "fullLayer");
896
+ p(this, "vNodes");
897
+ p(this, "master");
898
+ p(this, "cameraOpt");
899
+ p(this, "methodBuilder");
900
+ p(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 === x.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 x.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: x.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 k.Destroy: {
989
+ this.destroy();
990
+ break;
991
+ }
992
+ case k.Clear: {
993
+ this.clearAll();
994
+ break;
995
+ }
996
+ case k.UpdateCamera: {
997
+ this.updateCamera(e);
998
+ break;
999
+ }
1000
+ case k.UpdateTools: {
1001
+ this.toggleFullLayer(r === x.Clicker);
1002
+ break;
1003
+ }
1004
+ case k.BackgroundSVGUpdate:
1005
+ case k.UpdateNode:
1006
+ case k.FullWork: {
1007
+ r && this.canUseFullLayer(r) && await this.consumeFull(e);
1008
+ break;
1009
+ }
1010
+ case k.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
+ p(this, "viewId");
1030
+ p(this, "fullLayer");
1031
+ p(this, "master");
1032
+ p(this, "vNodes");
1033
+ p(this, "cameraOpt");
1034
+ p(this, "opt");
1035
+ p(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) === x.BackgroundSVG)
1081
+ switch (a == null ? void 0 : a.type) {
1082
+ case k.UpdateNode:
1083
+ case k.FullWork: {
1084
+ const { opt: n } = a, c = {
1085
+ ...a,
1086
+ opt: n,
1087
+ workId: i,
1088
+ msgType: k.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 ue(this.fullLayer);
1099
+ const i = await pe(this.fullLayer);
1100
+ i && this.opt.post({
1101
+ sp: [
1102
+ {
1103
+ type: k.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: k.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: x.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
+ p(this, "backgroundThreadMap", /* @__PURE__ */ new Map());
1160
+ p(this, "snapshotThread");
1161
+ p(this, "master");
1162
+ p(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;
1176
+ for (const n of e.values()) {
1177
+ const {
1178
+ msgType: c,
1179
+ viewId: d,
1180
+ layerOpt: w,
1181
+ offscreenCanvasOpt: u,
1182
+ cameraOpt: l,
1183
+ tasksqueue: g,
1184
+ mainTasksqueueCount: f
1185
+ } = n;
1186
+ if (c === k.Console) {
1187
+ console.log(this);
1188
+ continue;
1189
+ }
1190
+ if (c === k.Init) {
1191
+ const y = (t = this.master.control.viewContainerManager.getView(d)) == null ? void 0 : t.displayer, h = (r = y == null ? void 0 : y.backgroundContainerRef) == null ? void 0 : r.current;
1192
+ if (y && h && w && u) {
1193
+ const m = this.createBackgroundThread(d, {
1194
+ displayer: y,
1195
+ container: h,
1196
+ layerOpt: w,
1197
+ master: this.master,
1198
+ canvasOpt: u,
1199
+ post: this.post
1200
+ });
1201
+ this.backgroundThreadMap.set(d, m), m && l && await m.setCameraOpt(l);
1202
+ }
1203
+ continue;
1204
+ }
1205
+ if (c === k.Snapshot && d === ((s = this.master.control.viewContainerManager.mainView) == null ? void 0 : s.id)) {
1206
+ const y = (i = this.master.control.viewContainerManager.getView(d)) == null ? void 0 : i.displayer, h = (a = y.backgroundSnapshotContainerRef) == null ? void 0 : a.current;
1207
+ if (y && h && l) {
1208
+ h.style.width = `${l.width}px`, h.style.height = `${l.height}px`;
1209
+ const m = {
1210
+ ...P.defaultLayerOpt,
1211
+ offscreen: !1,
1212
+ width: l.width,
1213
+ height: l.height
1214
+ }, A = {
1215
+ ...P.defaultScreenCanvasOpt,
1216
+ width: l.width,
1217
+ height: l.height
1218
+ };
1219
+ this.snapshotThread = this.createSnapshotThread(d, {
1220
+ displayer: y,
1221
+ container: h,
1222
+ layerOpt: m,
1223
+ master: this.master,
1224
+ canvasOpt: A,
1225
+ post: this.post
1226
+ }), await this.snapshotThread.getSnapshot(n), this.snapshotThread.destroy(), this.snapshotThread = void 0;
1227
+ continue;
1228
+ }
1229
+ }
1230
+ if (c === k.TasksQueue && (g != null && g.size)) {
1231
+ for (const [y, h] of this.backgroundThreadMap.entries()) {
1232
+ const m = g.get(y);
1233
+ m && (await h.on(m), f && this.post({ workerTasksqueueCount: f }));
1234
+ }
1235
+ continue;
1236
+ }
1237
+ if (d === Z) {
1238
+ for (const y of this.backgroundThreadMap.values())
1239
+ y.on(n), c === k.Destroy && this.backgroundThreadMap.delete(d);
1240
+ continue;
1241
+ }
1242
+ const v = this.backgroundThreadMap.get(d);
1243
+ v && (v.on(n), c === k.Destroy && this.backgroundThreadMap.delete(d));
1244
+ }
1245
+ }
1246
+ async consumeTargetOne(e, t) {
1247
+ const r = this.backgroundThreadMap.get(e);
1248
+ r && await r.on(t);
1249
+ }
1250
+ destroy() {
1251
+ this.backgroundThreadMap.clear();
1252
+ }
1253
+ }
1254
+ export {
1255
+ We as BackgroundThreadManagerImpl
1256
+ };