@bireturn/word-editor 1.0.2 → 1.0.4

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.
@@ -1,2787 +0,0 @@
1
- var rn = Object.defineProperty;
2
- var cn = (i, e, t) => e in i ? rn(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t;
3
- var j = (i, e, t) => cn(i, typeof e != "symbol" ? e + "" : e, t);
4
- import { computed as ke, ref as oe, onMounted as rt, onUnmounted as Ze, openBlock as h, createElementBlock as p, normalizeStyle as K, createElementVNode as re, Fragment as J, renderList as le, normalizeClass as Ie, createBlock as Fe, resolveDynamicComponent as Xe, toDisplayString as te, unref as Ae, createCommentVNode as ge, render as Ot, h as dn, defineComponent as un, getCurrentInstance as hn, watch as Be, nextTick as be, createVNode as G, createTextVNode as Re, isVNode as fn, renderSlot as gn, resolveComponent as pn, withCtx as nt, reactive as Bt, provide as vn, inject as mn } from "vue";
5
- import { DynamicScroller as yn, DynamicScrollerItem as _n } from "vue-virtual-scroller";
6
- import { ChevronRight as Ht, MoreHorizontal as yt, Download as it, Upload as bn, Save as xn, RotateCcw as kn, History as wn, Settings as Cn, Info as Mn, Globe as In, Lock as En, Share as Sn, ShieldCheck as Tn, Search as Fn, Filter as An, SortDesc as Pn, SortAsc as $n, Minus as Ln, Plus as _t, Eye as bt, FileText as at, Grid as Rn, Type as xt, FileDown as kt, Layers as wt, Edit as On, Move as Bn, Copy as Hn, Trash2 as Ct, Clipboard as Mt, PlusCircle as It, ArrowDown as Et, Navigation as St, ChevronDown as Dn, PanelLeftOpen as zn, ListTree as Nn, PanelLeftClose as Vn } from "lucide-vue-next";
7
- const jn = { class: "we-vt-context-menu--option-wrapper modern-menu-wrapper" }, Kn = ["onMouseenter", "onMouseleave"], qn = ["onClick"], Wn = { class: "we-vt-context-menu--link-content menu-label" }, Un = {
8
- key: 0,
9
- class: "we-vt-context-menu--submenu modern-submenu"
10
- }, Gn = ["onClick"], Jn = { class: "we-vt-context-menu--link-content submenu-label" }, Xn = {
11
- __name: "ContextMenu",
12
- props: {
13
- // 事件
14
- e: {
15
- type: Object,
16
- default: () => ({})
17
- },
18
- // 右键点击行数据
19
- row: {
20
- type: Object,
21
- default: () => ({})
22
- },
23
- // 右键菜单配置
24
- menuConfig: {
25
- type: Object,
26
- default: () => ({
27
- body: {}
28
- })
29
- }
30
- },
31
- emits: ["close", "menuClick"],
32
- setup(i, { emit: e }) {
33
- const t = e, l = i, o = ke(() => {
34
- var W, B;
35
- return {
36
- left: `${(W = l.e) == null ? void 0 : W.pageX}px`,
37
- top: `${(B = l.e) == null ? void 0 : B.pageY}px`
38
- };
39
- }), d = oe([]), A = oe(null);
40
- let E = null;
41
- const N = oe(), P = (W, B, b) => {
42
- if (W.children && W.children.length > 0) {
43
- B && B.preventDefault() && B.stopPropagation();
44
- return;
45
- }
46
- W.disabled || (b ? t("menuClick", { ...W, parent: b.code }, l.row) : t("menuClick", W, l.row)), B && B.preventDefault() && B.stopPropagation();
47
- }, X = (W) => {
48
- let B = W.target;
49
- for (; B && B != N.value; )
50
- B = B.parentNode;
51
- B != N.value && t("close");
52
- }, V = (W, B) => {
53
- W.currentTarget.classList.add("link--active"), E && (clearTimeout(E), E = null), B.children && B.children.length > 0 ? A.value = B.code : E = setTimeout(() => {
54
- A.value = null;
55
- }, 100);
56
- }, q = (W, B) => {
57
- W.currentTarget.classList.remove("link--active"), B.children && B.children.length > 0 && (E = setTimeout(() => {
58
- A.value === B.code && (A.value = null);
59
- }, 300));
60
- }, Y = (W) => {
61
- E && (clearTimeout(E), E = null), W.currentTarget.classList.add("link--active");
62
- }, Z = (W) => {
63
- W.currentTarget.classList.remove("link--active");
64
- }, ye = (W) => {
65
- const B = W.code || "", b = (W.name || "").toLowerCase(), m = {
66
- // 添加操作 - 根据具体类型使用不同图标
67
- "add-current": St,
68
- // 添加(当前位置)
69
- "add-next": Et,
70
- // 添加(下一行)
71
- "add-child": It,
72
- // 添加(子节点)
73
- // 基本操作
74
- paste: Mt,
75
- // 粘贴
76
- delete: Ct,
77
- // 删除
78
- copy: Hn,
79
- // 复制
80
- cut: Bn,
81
- // 剪切
82
- edit: On,
83
- // 编辑
84
- // 导出操作 - 根据范围使用不同图标
85
- export_part_section: wt,
86
- // 导出此节点所在节
87
- export_part_chapter: kt,
88
- // 导出此节点所在章
89
- export_full: it,
90
- // 完整导出
91
- // 文件格式
92
- pdf: at,
93
- // PDF格式
94
- word: xt,
95
- // WORD格式
96
- excel: Rn,
97
- // Excel格式
98
- txt: at,
99
- // 文本格式
100
- // 视图操作
101
- view: bt,
102
- // 查看
103
- preview: bt,
104
- // 预览
105
- expand: _t,
106
- // 展开
107
- collapse: Ln,
108
- // 折叠
109
- // 排序和过滤
110
- "sort-asc": $n,
111
- // 升序
112
- "sort-desc": Pn,
113
- // 降序
114
- filter: An,
115
- // 过滤
116
- search: Fn,
117
- // 搜索
118
- // 权限操作
119
- permission: Tn,
120
- // 权限设置
121
- share: Sn,
122
- // 分享
123
- lock: En,
124
- // 锁定
125
- unlock: In,
126
- // 解锁
127
- // 其他操作
128
- info: Mn,
129
- // 信息
130
- settings: Cn,
131
- // 设置
132
- history: wn,
133
- // 历史
134
- refresh: kn,
135
- // 刷新
136
- save: xn,
137
- // 保存
138
- upload: bn,
139
- // 上传
140
- download: it,
141
- // 下载
142
- more: yt
143
- // 更多
144
- };
145
- return m[B] ? m[B] : b.includes("添加") || b.includes("add") ? b.includes("当前") || b.includes("current") ? St : b.includes("下") || b.includes("next") ? Et : b.includes("子") || b.includes("child") ? It : _t : b.includes("导出") || b.includes("export") ? b.includes("节") || b.includes("section") ? wt : b.includes("章") || b.includes("chapter") ? kt : it : b.includes("粘贴") || b.includes("paste") ? Mt : b.includes("删除") || b.includes("delete") ? Ct : b.includes("pdf") ? at : b.includes("word") ? xt : yt;
146
- };
147
- return rt(() => {
148
- var W, B, b, m, x, r, L;
149
- (W = l.menuConfig) != null && W.visibleMethod && typeof ((B = l.menuConfig) == null ? void 0 : B.visibleMethod) == "function" && ((x = l.menuConfig) == null || x.visibleMethod({
150
- options: (m = (b = l.menuConfig) == null ? void 0 : b.body) == null ? void 0 : m.options,
151
- row: l.row
152
- })), d.value = (((L = (r = l.menuConfig) == null ? void 0 : r.body) == null ? void 0 : L.options) || []).flat(), document.addEventListener("click", X, !0);
153
- }), Ze(() => {
154
- document.removeEventListener("click", X, !0);
155
- }), (W, B) => (h(), p("div", {
156
- class: "we-vt-table--context-menu-wrapper virtual-table-menu modern-virtual-menu",
157
- ref_key: "contextMenuRef",
158
- ref: N,
159
- style: K([{ display: "inline-block" }, o.value])
160
- }, [
161
- re("ul", jn, [
162
- (h(!0), p(J, null, le(d.value, (b) => (h(), p("li", {
163
- class: Ie({
164
- "link--disabled": b.disabled,
165
- "has-children": b.children && b.children.length > 0,
166
- "modern-menu-item": !0
167
- }),
168
- key: b.code,
169
- onMouseenter: (m) => V(m, b),
170
- onMouseleave: (m) => q(m, b)
171
- }, [
172
- re("a", {
173
- class: "we-vt-context-menu--link modern-menu-link",
174
- onClick: (m) => P(b, m)
175
- }, [
176
- (h(), Fe(Xe(ye(b)), {
177
- size: 16,
178
- class: "menu-icon"
179
- })),
180
- re("span", Wn, te(b.name), 1),
181
- b.children && b.children.length > 0 ? (h(), Fe(Ae(Ht), {
182
- key: 0,
183
- size: 14,
184
- class: "submenu-arrow"
185
- })) : ge("", !0)
186
- ], 8, qn),
187
- b.children && b.children.length > 0 && A.value === b.code ? (h(), p("ul", Un, [
188
- (h(!0), p(J, null, le(b.children, (m) => (h(), p("li", {
189
- key: m.code,
190
- class: Ie({
191
- "link--disabled": m.disabled,
192
- "modern-submenu-item": !0
193
- }),
194
- onMouseenter: Y,
195
- onMouseleave: Z
196
- }, [
197
- re("a", {
198
- class: "we-vt-context-menu--link modern-submenu-link",
199
- onClick: (x) => P(m, x, b)
200
- }, [
201
- (h(), Fe(Xe(ye(m)), {
202
- size: 14,
203
- class: "submenu-icon"
204
- })),
205
- re("span", Jn, te(m.name), 1)
206
- ], 8, Gn)
207
- ], 34))), 128))
208
- ])) : ge("", !0)
209
- ], 42, Kn))), 128))
210
- ])
211
- ], 4));
212
- }
213
- }, Dt = Symbol("component_container");
214
- function Yn(i, e, t) {
215
- const l = dn(i, { ...e }, t), o = document.createElement("div");
216
- return document.body.appendChild(o), l[Dt] = o, Ot(l, o), l.component;
217
- }
218
- function Zn(i) {
219
- var t;
220
- const e = i.vnode[Dt];
221
- Ot(null, e), e != null && e.checkVisibility && (e != null && e.checkVisibility()) && ((t = document.body) == null || t.removeChild(e));
222
- }
223
- let zt;
224
- const Qn = (i) => {
225
- zt = Yn(Xn, i, null);
226
- }, ei = function(i) {
227
- const e = i.onClose;
228
- return i.onClose = () => {
229
- e && e.call(), Zn(zt);
230
- }, Qn(i), i;
231
- };
232
- function ti(i, e, t) {
233
- const l = (t == null ? void 0 : t.keyField) || (t == null ? void 0 : t.rowField) || "node_id", o = (t == null ? void 0 : t.parentField) || "parent_id", d = (t == null ? void 0 : t.parentField) || "order";
234
- if (!(i != null && i.length))
235
- return i;
236
- const A = {};
237
- i.forEach((X) => {
238
- const V = X[o];
239
- A[V] || (A[V] = []), A[V].push(X);
240
- });
241
- function E(X) {
242
- const V = A[X] || [];
243
- V.sort(
244
- (Y, Z) => Y[d] && Z[d] ? Y[d] - Z[d] : 0
245
- );
246
- const q = [];
247
- return V.forEach((Y) => {
248
- q.push(Y), q.push(...E(Y[l]));
249
- }), q;
250
- }
251
- let N = [];
252
- if (Array.isArray(e))
253
- N = e;
254
- else {
255
- const X = new Set(i.map((Y) => Y[l])), V = i.filter((Y) => !X.has(Y[o]));
256
- if (V.length === 0)
257
- throw new Error("无法确定根节点:可能存在循环引用或数据不完整");
258
- const q = {};
259
- V.forEach((Y) => {
260
- const Z = Y[o];
261
- q[Z] = (q[Z] || 0) + 1;
262
- }), N = Object.entries(q).map(([Y]) => Y);
263
- }
264
- let P = [];
265
- return N.forEach((X) => {
266
- P = P.concat(E(X));
267
- }), P;
268
- }
269
- function Tt(i, e, t) {
270
- let l;
271
- for (; i && i.nodeType && i !== document; ) {
272
- if (i.className && i.className.split && i.className.split(" ").indexOf(e) > -1)
273
- return l = i, l;
274
- if (i === t)
275
- return null;
276
- i = i.parentNode;
277
- }
278
- return l;
279
- }
280
- function ni(i) {
281
- return typeof i == "function" || Object.prototype.toString.call(i) === "[object Object]" && !fn(i);
282
- }
283
- const ii = /* @__PURE__ */ un({
284
- name: "VirtualTable",
285
- props: {
286
- data: {
287
- type: Array,
288
- required: !0,
289
- default: () => []
290
- },
291
- rowConfig: {
292
- type: Object,
293
- default: () => ({
294
- keyField: "node_id"
295
- })
296
- },
297
- // 配置editConfig后才可双击编辑
298
- editConfig: {
299
- type: Object,
300
- default: null
301
- },
302
- // 配置treeConfig后才可会做树排序
303
- treeConfig: {
304
- type: Object,
305
- default: null
306
- },
307
- menuConfig: {
308
- type: Object,
309
- default: () => ({
310
- body: {}
311
- })
312
- },
313
- showHeader: {
314
- type: Boolean,
315
- default: !0
316
- },
317
- rowClassName: {
318
- type: Function,
319
- default: null
320
- },
321
- // A4页面配置
322
- pageConfig: {
323
- type: Object,
324
- default: () => ({
325
- enabled: !1,
326
- // 是否启用A4页面模式
327
- pageHeight: 842,
328
- // A4页面高度 (297mm * 3.78px/mm)
329
- pageWidth: 595,
330
- // A4页面宽度 (210mm * 3.78px/mm)
331
- margin: 40,
332
- // 页面边距
333
- gap: 10,
334
- // 页面间隔
335
- showPageHeader: !0,
336
- // 是否显示页眉
337
- showPageBorder: !1,
338
- // 是否显示内容区边框
339
- pageBorderPadding: 5,
340
- // 内容区边框内边距(px)
341
- pageBorderStyle: "1px solid #000"
342
- // 内容区边框样式
343
- })
344
- },
345
- // 页面数据映射 - key是页码,value是node_id数组,用于和pdf分页对应
346
- pageData: {
347
- type: Object,
348
- default: null
349
- }
350
- },
351
- emits: ["current-change", "menu-click", "edit-activated", "edit-closed", "scroll-end", "selection-change"],
352
- setup(i, {
353
- emit: e,
354
- slots: t,
355
- expose: l
356
- }) {
357
- var vt;
358
- const o = hn(), d = oe(), A = oe(!1), E = oe(null), N = oe(null), P = oe([]);
359
- let X = /* @__PURE__ */ new Map();
360
- const V = /* @__PURE__ */ new Map();
361
- oe(0);
362
- const q = oe([]);
363
- oe([]);
364
- const Y = oe(/* @__PURE__ */ new Set()), Z = oe(/* @__PURE__ */ new Set()), ye = oe(null), W = 2, B = /* @__PURE__ */ new WeakMap(), b = oe(null), m = oe(""), x = /* @__PURE__ */ new Set(), r = ke(() => {
365
- try {
366
- return Array.isArray(P.value) ? P.value : [];
367
- } catch {
368
- return [];
369
- }
370
- }), L = (n) => {
371
- var f, c, u;
372
- if (!n) return 30;
373
- if (n.height) return n.height;
374
- const a = `${n.content_type}_${((f = n.content) == null ? void 0 : f.length) || 0}_${((c = n.title) == null ? void 0 : c.length) || 0}_${n._editing ? 1 : 0}`;
375
- if (B.has(n)) {
376
- const k = B.get(n);
377
- if (k.key === a)
378
- return k.height;
379
- }
380
- let s = 30;
381
- switch (n.content_type) {
382
- case "image":
383
- s = 150;
384
- break;
385
- case "table-row":
386
- s = n.rowHeight || 35;
387
- break;
388
- case "table":
389
- const C = ((n.content || "").match(/<tr/g) || []).length;
390
- s = Math.max(100, C * 35 + 30);
391
- break;
392
- case "flowchart":
393
- s = 200;
394
- break;
395
- default: {
396
- const y = (n.content || "").length, g = (n.title || "").length, w = y + g, R = ((u = (n.content || "").match(/[\u4e00-\u9fa5]/g)) == null ? void 0 : u.length) || 0, O = w - R, F = R * 12 + O * 6, H = Math.max(1, Math.ceil(F / 760));
397
- s = Math.max(20, H * 18), n._editing && (s += 20);
398
- break;
399
- }
400
- }
401
- return B.set(n, {
402
- key: a,
403
- height: s
404
- }), s;
405
- }, v = ke(() => {
406
- if (r.value.length === 0) return 30;
407
- const n = r.value.slice(0, Math.min(100, r.value.length));
408
- if (n.length === 0) return 30;
409
- const a = n.reduce((f, c) => f + L(c), 0) / n.length, s = Math.max(20, Math.floor(a * 0.6));
410
- return Math.min(s, 60);
411
- });
412
- let S;
413
- const $ = (n, a) => {
414
- e("menu-click", {
415
- menu: n,
416
- row: a
417
- }), S == null || S.onClose(), S = null;
418
- }, M = (n) => {
419
- var s, f, c, u, k;
420
- if (!((c = (f = (s = i.menuConfig) == null ? void 0 : s.body) == null ? void 0 : f.options) != null && c.length)) return;
421
- S == null || S.onClose(), S = null;
422
- let a = n.target;
423
- for (; a && (a != null && a.getAttribute) && !(a != null && a.getAttribute("data-id")) && a !== ((u = d.value) == null ? void 0 : u.$el); )
424
- a = a.parentNode;
425
- if ((k = a == null ? void 0 : a.getAttribute) != null && k.call(a, "data-id")) {
426
- const C = a.getAttribute("data-id"), y = we(C);
427
- y && (S = ei({
428
- e: n,
429
- row: y,
430
- menuConfig: i.menuConfig,
431
- onMenuClick: $
432
- }), n.preventDefault(), n.stopPropagation());
433
- }
434
- }, I = (n) => {
435
- var s, f, c;
436
- if (!E.value)
437
- return;
438
- let a = n.target;
439
- for (; a && (a != null && a.getAttribute) && !(a != null && a.getAttribute("data-id")) && a !== ((s = d.value) == null ? void 0 : s.$el); )
440
- if (a = a.parentNode, a != null && a.classList && ["el-popper", "ck-body-wrapper"].some((u) => a.classList.contains(u)))
441
- return;
442
- ((f = a == null ? void 0 : a.getAttribute) == null ? void 0 : f.call(a, "data-id")) != ((c = E.value) == null ? void 0 : c.node_id) && (E.value._editing = !1, e("edit-closed", {
443
- row: E.value,
444
- column: {},
445
- $table: o == null ? void 0 : o.exposed
446
- }), E.value = null);
447
- };
448
- ((vt = i.editConfig) == null ? void 0 : vt.trigger) === "dblclick" && Be(() => E.value, (n) => {
449
- document.removeEventListener("click", I, !0), n && setTimeout(() => {
450
- document.addEventListener("click", I, !0);
451
- }, 200);
452
- });
453
- const D = (n) => JSON.stringify(n.map((a) => {
454
- var s;
455
- return {
456
- id: a[i.rowConfig.keyField],
457
- content: ((s = a.content) == null ? void 0 : s.length) || 0,
458
- type: a.content_type,
459
- editing: a._editing
460
- };
461
- })), _ = () => {
462
- if (!i.pageConfig.enabled) {
463
- q.value = [{
464
- items: P.value,
465
- startIndex: 0,
466
- endIndex: P.value.length
467
- }];
468
- return;
469
- }
470
- if (i.pageData && Object.keys(i.pageData).length) {
471
- const n = [], a = i.rowConfig.keyField || "node_id", s = /* @__PURE__ */ new Map();
472
- P.value.forEach((c) => {
473
- s.set(String(c[a]), c);
474
- }), Object.keys(i.pageData).sort((c, u) => parseInt(c) - parseInt(u)).forEach((c) => {
475
- const u = i.pageData[c], k = [];
476
- u.forEach((C) => {
477
- const y = s.get(String(C));
478
- y && k.push(y);
479
- }), k.length > 0 && n.push({
480
- items: k,
481
- pageNumber: parseInt(c),
482
- height: k.reduce((C, y) => C + L(y), 0)
483
- });
484
- }), q.value = n;
485
- } else {
486
- const {
487
- pageHeight: n,
488
- margin: a
489
- } = i.pageConfig, s = n - a * 2, f = [];
490
- let c = [], u = 0, k = 0, C = 1;
491
- P.value.forEach((y, g) => {
492
- const w = L(y);
493
- (y.layer || 0) <= 2 && c.length > 0 ? (f.push({
494
- items: [...c],
495
- startIndex: k,
496
- endIndex: g,
497
- height: u,
498
- pageNumber: C++
499
- }), c = [y], u = w, k = g) : u + w > s && c.length > 0 ? (f.push({
500
- items: [...c],
501
- startIndex: k,
502
- endIndex: g,
503
- height: u,
504
- pageNumber: C++
505
- }), c = [y], u = Math.min(w, s), k = g) : (c.push(y), u += w);
506
- }), c.length > 0 && f.push({
507
- items: c,
508
- startIndex: k,
509
- endIndex: P.value.length,
510
- height: u,
511
- pageNumber: C
512
- }), q.value = f;
513
- }
514
- }, pe = () => {
515
- try {
516
- const n = Array.isArray(i.data) ? i.data : [], a = D(n);
517
- if (!(a !== m.value) && P.value.length > 0)
518
- return;
519
- m.value = a;
520
- const f = (i.treeConfig ? ti(n, void 0, i.treeConfig) : n).map((u, k) => {
521
- const C = u[i.rowConfig.keyField], y = V.get(C);
522
- if (!y || y.content !== u.content || y.content_type !== u.content_type) {
523
- x.add(C);
524
- const g = {
525
- ...u,
526
- index: k,
527
- _editing: u._editing || !1,
528
- _original: (y == null ? void 0 : y._original) || {
529
- ...u
530
- }
531
- // 保留原始数据,避免重复深拷贝
532
- };
533
- return V.set(C, g), g;
534
- }
535
- return y.index = k, y;
536
- });
537
- P.value = f, _();
538
- const c = new Set(f.map((u) => u[i.rowConfig.keyField]));
539
- for (const [u] of V)
540
- c.has(u) || (V.delete(u), x.delete(u));
541
- } catch {
542
- P.value = [], q.value = [], V.clear(), x.clear();
543
- }
544
- };
545
- Be(() => i.data, (n, a) => {
546
- try {
547
- if (!Array.isArray(n))
548
- return;
549
- be(() => {
550
- if (pe(), i.pageConfig.enabled) {
551
- Z.value.clear(), Y.value.clear();
552
- for (let s = 0; s < Math.min(3, q.value.length); s++)
553
- Z.value.add(s);
554
- be(() => {
555
- ie();
556
- });
557
- }
558
- });
559
- } catch {
560
- }
561
- }, {
562
- deep: !1,
563
- immediate: !1
564
- }), Be(() => i.pageData, () => {
565
- if (i.pageConfig.enabled) {
566
- _(), Z.value.clear(), Y.value.clear();
567
- for (let n = 0; n < Math.min(3, q.value.length); n++)
568
- Z.value.add(n);
569
- be(() => {
570
- ie();
571
- });
572
- }
573
- }, {
574
- deep: !0
575
- }), Be(() => i.pageConfig, () => {
576
- if (i.pageConfig.enabled) {
577
- _(), Z.value.clear(), Y.value.clear();
578
- for (let n = 0; n < Math.min(3, q.value.length); n++)
579
- Z.value.add(n);
580
- be(() => {
581
- ie();
582
- });
583
- }
584
- }, {
585
- deep: !0
586
- }), Be(N, () => e("current-change", {
587
- row: N.value
588
- }));
589
- let ve = null;
590
- const ne = () => {
591
- window.ResizeObserver && (ve = new ResizeObserver((n) => {
592
- var a, s;
593
- for (const f of n) {
594
- const c = (a = f.target.dataset) == null ? void 0 : a.id;
595
- if (!c) continue;
596
- const u = we(c);
597
- if (!u) continue;
598
- const k = f.contentRect.height, C = ((s = B.get(u)) == null ? void 0 : s.height) || 0;
599
- if (Math.abs(C - k) > 5) {
600
- const y = B.get(u) || {};
601
- B.set(u, {
602
- ...y,
603
- height: k
604
- }), requestAnimationFrame(() => {
605
- var w;
606
- const g = f.target.__vueParentComponent;
607
- (w = g == null ? void 0 : g.proxy) != null && w.updateSize && g.proxy.updateSize();
608
- });
609
- }
610
- }
611
- }), be(() => {
612
- var s;
613
- const n = (s = d.value) == null ? void 0 : s.$el;
614
- if (!n) return;
615
- n.querySelectorAll("[data-id]").forEach((f) => {
616
- f.dataset.id && ve.observe(f);
617
- });
618
- }));
619
- }, ce = () => {
620
- b.value && (b.value.disconnect(), b.value = null), ve && (ve.disconnect(), ve = null);
621
- }, ie = () => {
622
- i.pageConfig.enabled && (ye.value && ye.value.disconnect(), ye.value = new IntersectionObserver((n) => {
623
- n.forEach((a) => {
624
- const s = parseInt(a.target.dataset.pageIndex);
625
- if (a.isIntersecting) {
626
- Y.value.add(s);
627
- for (let f = Math.max(0, s - W); f <= Math.min(q.value.length - 1, s + W); f++)
628
- Z.value.add(f);
629
- } else
630
- Y.value.delete(s), setTimeout(() => {
631
- Y.value.has(s) || Array.from(Y.value).some((c) => Math.abs(c - s) <= W * 2) || Z.value.delete(s);
632
- }, 3e3);
633
- });
634
- }, {
635
- root: null,
636
- rootMargin: "100px",
637
- threshold: 0.01
638
- }), be(() => {
639
- const n = document.querySelector(".a4-pages-container");
640
- n && n.querySelectorAll(".a4-page-placeholder").forEach((s) => {
641
- ye.value.observe(s);
642
- });
643
- }));
644
- };
645
- rt(() => {
646
- pe(), be(() => {
647
- var n;
648
- if (ne(), he.setup(), ie(), ((n = i.editConfig) == null ? void 0 : n.trigger) === "contenteditable" && (document.addEventListener("selectionchange", dt), document.addEventListener("mouseup", ut)), i.pageConfig.enabled)
649
- for (let a = 0; a < Math.min(3, q.value.length); a++)
650
- Z.value.add(a);
651
- }), A.value = !0;
652
- }), Ze(() => {
653
- var n;
654
- ce(), he.cleanup(), ye.value && (ye.value.disconnect(), ye.value = null), ((n = i.editConfig) == null ? void 0 : n.trigger) === "contenteditable" && (document.removeEventListener("selectionchange", dt), document.removeEventListener("mouseup", ut)), Ee && clearTimeout(Ee), X = /* @__PURE__ */ new Map(), V.clear(), Z.value.clear(), Y.value.clear();
655
- });
656
- const he = {
657
- handlers: /* @__PURE__ */ new Map(),
658
- setup() {
659
- be(() => {
660
- var a;
661
- const n = (a = d.value) == null ? void 0 : a.$el;
662
- n && (n.addEventListener("click", this.handleClick.bind(this), {
663
- passive: !0
664
- }), n.addEventListener("dblclick", this.handleDblClick.bind(this), {
665
- passive: !0
666
- }));
667
- });
668
- },
669
- handleClick(n) {
670
- const a = n.target.closest("[data-id]");
671
- if (!a) return;
672
- const s = a.dataset.id, f = we(s);
673
- f && Ve(f);
674
- },
675
- handleDblClick(n) {
676
- var c;
677
- if (!((c = i.editConfig) != null && c.trigger) === "dblclick") return;
678
- const a = n.target.closest("[data-id]");
679
- if (!a) return;
680
- const s = a.dataset.id, f = we(s);
681
- f && Oe(f);
682
- },
683
- cleanup() {
684
- var a, s;
685
- const n = (s = (a = d.value) == null ? void 0 : a.$el) == null ? void 0 : s.querySelector(".virtual-table-wrapper");
686
- n && (n.removeEventListener("click", this.handleClick), n.removeEventListener("dblclick", this.handleDblClick));
687
- }
688
- }, se = (n) => {
689
- Ve(n);
690
- }, T = (n) => Oe(n);
691
- let Q = null, Pe;
692
- const _e = ({
693
- row: n,
694
- column: a
695
- }, s, f) => {
696
- var k, C;
697
- const c = f || s.target, u = Tt(c, "virtual-table-cell", (k = d.value) == null ? void 0 : k.$el);
698
- Q === u && Pe && (clearTimeout(Pe), Q = null), ((C = E.value) == null ? void 0 : C[i.rowConfig.keyField]) != (n == null ? void 0 : n[i.rowConfig.keyField]) && setTimeout(() => {
699
- var g, w;
700
- E.value = n;
701
- let y = (g = c == null ? void 0 : c.getAttribute) == null ? void 0 : g.call(c, "field");
702
- if (!y) {
703
- try {
704
- const R = document.getSelection();
705
- let O = R == null ? void 0 : R.anchorNode;
706
- O && O.nodeType === 3 && (O = O.parentElement);
707
- const F = (w = O == null ? void 0 : O.closest) == null ? void 0 : w.call(O, "[field]");
708
- F && (y = F.getAttribute("field"));
709
- } catch {
710
- }
711
- if (!y && (s != null && s.composedPath)) {
712
- for (const R of s.composedPath())
713
- if (R != null && R.getAttribute && R.getAttribute("field")) {
714
- y = R.getAttribute("field");
715
- break;
716
- }
717
- }
718
- }
719
- e("edit-activated", {
720
- row: n,
721
- column: {
722
- ...a,
723
- field: y
724
- },
725
- $table: o == null ? void 0 : o.exposed
726
- });
727
- }, 200);
728
- }, xe = ({
729
- row: n,
730
- column: a
731
- }, s, f) => {
732
- var u;
733
- const c = f || s.target;
734
- Q = Tt(c, "virtual-table-cell", (u = d.value) == null ? void 0 : u.$el), Pe && clearTimeout(Pe), Pe = setTimeout(() => {
735
- var y, g, w, R, O;
736
- const k = n.content_type;
737
- let C = (y = c == null ? void 0 : c.getAttribute) == null ? void 0 : y.call(c, "field");
738
- if (!C) {
739
- try {
740
- const F = document.getSelection();
741
- let H = F == null ? void 0 : F.anchorNode;
742
- H && H.nodeType === 3 && (H = H.parentElement);
743
- const ee = (g = H == null ? void 0 : H.closest) == null ? void 0 : g.call(H, "[field]");
744
- ee && (C = ee.getAttribute("field"));
745
- } catch {
746
- }
747
- if (!C && (s != null && s.composedPath)) {
748
- for (const F of s.composedPath())
749
- if (F != null && F.getAttribute && F.getAttribute("field")) {
750
- C = F.getAttribute("field");
751
- break;
752
- }
753
- }
754
- }
755
- if (k !== "table") {
756
- if (k === "text") {
757
- let F = null, H = null;
758
- if ((w = c == null ? void 0 : c.getAttribute) != null && w.call(c, "field") ? F = c : (R = c == null ? void 0 : c.closest) != null && R.call(c, "[field]") && (F = c.closest("[field]")), F && (H = F.textContent), C && H !== void 0 && H !== null) {
759
- H = H.trim();
760
- const ee = ((O = n[C]) == null ? void 0 : O.trim()) || "";
761
- H !== ee && (n[C] = H);
762
- }
763
- }
764
- }
765
- e("edit-closed", {
766
- row: n,
767
- column: {
768
- ...a,
769
- field: C
770
- },
771
- $table: o == null ? void 0 : o.exposed
772
- });
773
- }, 50);
774
- };
775
- let z = null, Ee = null;
776
- const $e = (n) => {
777
- var a;
778
- ((a = i.editConfig) == null ? void 0 : a.trigger) === "contenteditable" && ct("focusin", n);
779
- }, ze = (n) => {
780
- var a, s, f, c, u;
781
- if (((a = i.editConfig) == null ? void 0 : a.trigger) === "contenteditable")
782
- if (z != null && z.cellEl) {
783
- let k = z.fieldEl;
784
- !k && z.field && (k = (f = (s = z.cellEl) == null ? void 0 : s.querySelector) == null ? void 0 : f.call(s, `[field="${z.field}"]`)), k || (k = ((u = (c = z.cellEl).querySelector) == null ? void 0 : u.call(c, "[field]")) || z.cellEl), xe(z, {
785
- target: k
786
- }, k), z = null;
787
- } else
788
- ct("focusout", n);
789
- }, ct = (n, a) => {
790
- var s, f, c, u, k, C;
791
- try {
792
- const y = document.getSelection();
793
- let g = y == null ? void 0 : y.anchorNode;
794
- g && g.nodeType === 3 && (g = g.parentElement);
795
- const w = (s = g == null ? void 0 : g.closest) == null ? void 0 : s.call(g, ".virtual-table-cell"), R = (f = g == null ? void 0 : g.closest) == null ? void 0 : f.call(g, ".virtual-table-row");
796
- if (!w || !R) return;
797
- const O = R.getAttribute("data-id"), F = w.getAttribute("data-prop"), H = we(O), ee = Le.value.find((fe) => `${fe.prop}` == `${F}`) || {}, de = ((c = g == null ? void 0 : g.closest) == null ? void 0 : c.call(g, "[field]")) || null, U = ((u = de == null ? void 0 : de.getAttribute) == null ? void 0 : u.call(de, "field")) || void 0;
798
- n === "focusin" ? (z = {
799
- row: H,
800
- column: ee,
801
- cellEl: w,
802
- rowEl: R,
803
- fieldEl: de,
804
- field: U
805
- }, _e({
806
- row: H,
807
- column: ee
808
- }, a, de || ((k = g == null ? void 0 : g.closest) == null ? void 0 : k.call(g, "[field]")))) : xe({
809
- row: H,
810
- column: ee
811
- }, a, de || ((C = g == null ? void 0 : g.closest) == null ? void 0 : C.call(g, "[field]")));
812
- } catch {
813
- }
814
- }, dt = () => {
815
- var n;
816
- ((n = i.editConfig) == null ? void 0 : n.trigger) === "contenteditable" && (Ee && clearTimeout(Ee), Ee = setTimeout(() => {
817
- var a, s, f, c, u, k, C, y, g, w, R, O, F, H;
818
- try {
819
- const ee = document.getSelection();
820
- if (ee.rangeCount === 0) return;
821
- const de = ee.getRangeAt(0);
822
- let U = de.startContainer;
823
- U.nodeType === 3 && (U = U.parentElement);
824
- const fe = (a = U == null ? void 0 : U.closest) == null ? void 0 : a.call(U, ".virtual-table-cell"), Ce = (s = U == null ? void 0 : U.closest) == null ? void 0 : s.call(U, ".virtual-table-row");
825
- if (!fe || !Ce) return;
826
- const et = Ce.getAttribute("data-id"), tt = fe.getAttribute("data-prop"), Se = we(et), me = Le.value.find((ae) => `${ae.prop}` == `${tt}`) || {};
827
- if (!z || ((f = z.row) == null ? void 0 : f[i.rowConfig.keyField]) !== (Se == null ? void 0 : Se[i.rowConfig.keyField]) || ((c = z.column) == null ? void 0 : c.prop) !== (me == null ? void 0 : me.prop)) {
828
- if (z) {
829
- let ae = z.fieldEl;
830
- !ae && z.field && (ae = (k = (u = z.cellEl) == null ? void 0 : u.querySelector) == null ? void 0 : k.call(u, `[field="${z.field}"]`)), ae || (ae = ((y = (C = z.cellEl) == null ? void 0 : C.querySelector) == null ? void 0 : y.call(C, "[field]")) || z.cellEl), xe(z, {
831
- target: ae
832
- }, ae);
833
- }
834
- z = {
835
- row: Se,
836
- column: me,
837
- cellEl: fe,
838
- rowEl: Ce,
839
- fieldEl: ((g = U == null ? void 0 : U.closest) == null ? void 0 : g.call(U, "[field]")) || null,
840
- field: ((O = (R = ((w = U == null ? void 0 : U.closest) == null ? void 0 : w.call(U, "[field]")) || null) == null ? void 0 : R.getAttribute) == null ? void 0 : O.call(R, "field")) || void 0
841
- }, _e({
842
- row: Se,
843
- column: me
844
- }, {
845
- target: fe
846
- }, fe);
847
- }
848
- if (ee.toString()) {
849
- const ae = de.endContainer.nodeType === 3 ? de.endContainer.parentElement : de.endContainer, We = (F = ae == null ? void 0 : ae.closest) == null ? void 0 : F.call(ae, ".virtual-table-cell"), Ue = (H = ae == null ? void 0 : ae.closest) == null ? void 0 : H.call(ae, ".virtual-table-row");
850
- }
851
- } catch {
852
- }
853
- }, 50));
854
- }, ut = () => {
855
- var n;
856
- ((n = i.editConfig) == null ? void 0 : n.trigger) === "contenteditable" && setTimeout(() => {
857
- var f, c, u, k;
858
- const a = document.getSelection();
859
- if (!a) return;
860
- const s = a.toString();
861
- if (s) {
862
- const C = a.rangeCount > 0 ? a.getRangeAt(0) : null;
863
- let y = null, g = null;
864
- try {
865
- if (C) {
866
- let w = C.startContainer;
867
- (w == null ? void 0 : w.nodeType) === 3 && (w = w.parentElement);
868
- const R = (f = w == null ? void 0 : w.closest) == null ? void 0 : f.call(w, ".virtual-table-cell"), O = (c = w == null ? void 0 : w.closest) == null ? void 0 : c.call(w, ".virtual-table-row");
869
- y = R && O ? {
870
- rowId: O.getAttribute("data-id"),
871
- prop: R.getAttribute("data-prop")
872
- } : null;
873
- let F = C.endContainer;
874
- (F == null ? void 0 : F.nodeType) === 3 && (F = F.parentElement);
875
- const H = (u = F == null ? void 0 : F.closest) == null ? void 0 : u.call(F, ".virtual-table-cell"), ee = (k = F == null ? void 0 : F.closest) == null ? void 0 : k.call(F, ".virtual-table-row");
876
- g = H && ee ? {
877
- rowId: ee.getAttribute("data-id"),
878
- prop: H.getAttribute("data-prop")
879
- } : null;
880
- }
881
- } catch {
882
- }
883
- e("selection-change", {
884
- text: s,
885
- selection: a,
886
- range: C,
887
- start: y,
888
- end: g
889
- });
890
- }
891
- }, 10);
892
- }, Vt = (n) => (n == null ? void 0 : n._editing) === !0, jt = (n) => n != null && n.parent_id ? X.get(n.parent_id) : null, Kt = (n) => {
893
- var s;
894
- const a = P.value.findIndex((f) => f[i.rowConfig.keyField] == n[i.rowConfig.keyField]);
895
- return a < 1 ? null : ((s = P.value[a - 1]) == null ? void 0 : s.layer) === n.layer ? P.value[a - 1] : null;
896
- }, qt = (n) => {
897
- const a = P.value.findIndex((s) => s[i.rowConfig.keyField] == n[i.rowConfig.keyField]);
898
- return a >= P.value.length - 1 ? null : P.value[a + 1];
899
- }, we = (n) => {
900
- if (!n) return null;
901
- let a = V.get(n);
902
- return a || (typeof n == "number" ? V.get(`${n}`) : typeof n == "string" && /^\d+$/.test(n) ? V.get(Number(n)) : null);
903
- };
904
- let Ne = null;
905
- const Wt = (n) => {
906
- Ne && cancelAnimationFrame(Ne), Ne = requestAnimationFrame(() => {
907
- var f;
908
- const a = i.rowConfig.keyField, s = n[a];
909
- if (i.pageConfig.enabled) {
910
- let c = -1;
911
- for (let u = 0; u < q.value.length; u++)
912
- if (q.value[u].items.some((y) => y[a] === s)) {
913
- c = u;
914
- break;
915
- }
916
- if (c !== -1) {
917
- for (let u = Math.max(0, c - 1); u <= Math.min(q.value.length - 1, c + 1); u++)
918
- Z.value.has(u) || Z.value.add(u);
919
- be(() => {
920
- const u = document.querySelector(".a4-pages-container");
921
- if (!u) return;
922
- const k = (C = 0) => {
923
- const y = u.querySelector(`[data-id="${s}"]`);
924
- if (y) {
925
- let g = 0, w = y;
926
- for (; w && w !== u; )
927
- g += w.offsetTop, w = w.offsetParent;
928
- const R = u.clientHeight;
929
- let O = g - R * 0.3;
930
- O = Math.max(0, O);
931
- const F = u.scrollTop, H = Math.abs(O - F), ee = (de) => {
932
- const U = u.scrollTop, fe = de - U, Ce = Math.min(800, Math.max(300, H * 0.5)), et = performance.now(), tt = (me) => me < 0.5 ? 4 * me * me * me : 1 - Math.pow(-2 * me + 2, 3) / 2, Se = (me) => {
933
- const mt = me - et, ae = Math.min(mt / Ce, 1), We = tt(ae), Ue = U + fe * We;
934
- u.scrollTop = Ue, ae < 1 ? requestAnimationFrame(Se) : setTimeout(() => {
935
- u.scrollTop = de;
936
- }, 50);
937
- };
938
- requestAnimationFrame(Se);
939
- };
940
- H > 3e3 ? u.scrollTo({
941
- top: O,
942
- behavior: "instant"
943
- }) : ee(O), y.classList.add("row--highlight"), setTimeout(() => {
944
- y.classList.remove("row--highlight");
945
- }, 1500);
946
- } else C < 10 && setTimeout(() => k(C + 1), 150);
947
- };
948
- setTimeout(k, 200);
949
- });
950
- }
951
- } else {
952
- const c = P.value.findIndex((u) => u[a] === s);
953
- c !== -1 && ((f = d.value) != null && f.scrollToItem) && d.value.scrollToItem(c);
954
- }
955
- Ne = null;
956
- });
957
- }, Ve = (n) => {
958
- if (n) {
959
- if (!A.value) {
960
- setTimeout(() => Ve(n), 200);
961
- return;
962
- }
963
- N.value = n, N.value !== E.value && E.value && (E.value._editing = !1, setTimeout(() => {
964
- E.value = null;
965
- }, 200));
966
- }
967
- }, Oe = (n, a) => new Promise((s) => {
968
- var f, c;
969
- if (!((f = i == null ? void 0 : i.editConfig) != null && f.beforeEditMethod && typeof ((c = i == null ? void 0 : i.editConfig) == null ? void 0 : c.beforeEditMethod) == "function" && !i.editConfig.beforeEditMethod({
970
- row: n
971
- }))) {
972
- if (!n || !A.value) {
973
- setTimeout(() => Oe(n), 200);
974
- return;
975
- }
976
- n !== E.value && (P.value.forEach((u) => {
977
- u._editing && e("edit-closed", {
978
- row: u,
979
- column: {
980
- field: a
981
- },
982
- $table: o == null ? void 0 : o.exposed
983
- }), u._editing = !1;
984
- }), n._editing = !0, setTimeout(() => {
985
- E.value = n, e("edit-activated", {
986
- row: n,
987
- column: {
988
- field: a
989
- },
990
- $table: o == null ? void 0 : o.exposed
991
- }), s(!0);
992
- }));
993
- }
994
- }), Ut = (n) => Oe(n), Qe = () => {
995
- if (_(), i.pageConfig.enabled) {
996
- const n = Array.from(Y.value);
997
- if (n.length > 0) {
998
- const a = Math.min(...n);
999
- for (let s = Math.max(0, a - 1); s <= Math.min(q.value.length - 1, a + 2); s++)
1000
- Z.value.add(s);
1001
- } else
1002
- for (let a = 0; a < Math.min(3, q.value.length); a++)
1003
- Z.value.add(a);
1004
- be(() => {
1005
- ie();
1006
- });
1007
- }
1008
- be(() => {
1009
- !i.pageConfig.enabled && d.value && d.value.$forceUpdate && d.value.$forceUpdate();
1010
- });
1011
- }, Gt = (n, a) => new Promise((s) => {
1012
- let f = -1;
1013
- if (a == -1) {
1014
- const c = we(n.parent_id);
1015
- for (f = P.value.findIndex((u) => u[i.rowConfig.keyField] == c[i.rowConfig.keyField]) + 1; P.value[f].parent_id == c[i.rowConfig.keyField]; )
1016
- f += 1;
1017
- } else
1018
- f = P.value.findIndex((c) => c[i.rowConfig.keyField] == a[i.rowConfig.keyField]);
1019
- X.set(n.node_id, n), V.set(n[i.rowConfig.keyField], n), P.value.splice(f, 0, n), Qe(), s({
1020
- row: n
1021
- });
1022
- }), Jt = (n, a) => new Promise((s) => {
1023
- const f = P.value.findIndex((c) => c[i.rowConfig.keyField] == a[i.rowConfig.keyField]) + 1;
1024
- X.set(n.node_id, n), V.set(n[i.rowConfig.keyField], n), P.value.splice(f, 0, n), Qe(), s({
1025
- row: n
1026
- });
1027
- }), ht = (n) => {
1028
- const a = P.value.findIndex((s) => s[i.rowConfig.keyField] == n[i.rowConfig.keyField] || s === n);
1029
- if (a > -1) {
1030
- const s = n[i.rowConfig.keyField];
1031
- X.delete(n.node_id), V.delete(s), P.value.splice(a, 1), Qe();
1032
- }
1033
- }, Xt = (n, a) => {
1034
- if (!n || !n[i.rowConfig.keyField]) return !1;
1035
- const s = n._original;
1036
- return s ? a ? n[a] !== s[a] : Object.keys(s).some((f) => s[f] !== n[f]) : !1;
1037
- }, Yt = (n) => n && n[i.rowConfig.keyField] && !n._original, Zt = (n, a) => {
1038
- n && n[i.rowConfig.keyField] && (a && Object.assign(n, a), n._original = {
1039
- ...n,
1040
- _editing: void 0,
1041
- _X_ROW_CHILD: void 0,
1042
- _original: void 0
1043
- });
1044
- }, Qt = (n) => {
1045
- if (n && n[i.rowConfig.keyField]) {
1046
- const a = we(n[i.rowConfig.keyField]);
1047
- a._original ? Object.assign(a, a._original) : ht(a);
1048
- }
1049
- }, en = () => {
1050
- }, tn = () => {
1051
- N.value = {};
1052
- }, ft = (n) => {
1053
- var s, f, c;
1054
- let a = P.value.findIndex((u) => u[i.rowConfig.keyField] == n[i.rowConfig.keyField]);
1055
- if (a > -1 && i.treeConfig) {
1056
- const u = ((s = i.treeConfig) == null ? void 0 : s.keyField) || ((f = i.treeConfig) == null ? void 0 : f.rowField) || "node_id", k = ((c = i.treeConfig) == null ? void 0 : c.parentField) || "parent_id", C = [], y = /* @__PURE__ */ new Map();
1057
- y.set(n[u], !0);
1058
- for (let g = a + 1; g < P.value.length; g++) {
1059
- const w = P.value[g];
1060
- if (w && y.has(w[k]))
1061
- C.push(w), y.set(w[u]);
1062
- else
1063
- break;
1064
- }
1065
- return C;
1066
- }
1067
- return [];
1068
- };
1069
- l({
1070
- isEditByRow: Vt,
1071
- getParentRow: jt,
1072
- getSiblingRow: Kt,
1073
- getNextRow: qt,
1074
- getRowById: we,
1075
- scrollToRow: Wt,
1076
- setCurrentRow: Ve,
1077
- setEditRow: Oe,
1078
- setEditCell: Ut,
1079
- insertAt: Gt,
1080
- insertNextAt: Jt,
1081
- isUpdateByRow: Xt,
1082
- isInsertByRow: Yt,
1083
- reloadRow: Zt,
1084
- revertData: Qt,
1085
- remove: ht,
1086
- setAllTreeExpand: en,
1087
- clearCurrentRow: tn,
1088
- getAllChilds: ft
1089
- });
1090
- const Le = ke(() => t.default().filter((n) => {
1091
- var a;
1092
- return ((a = n.type) == null ? void 0 : a.name) === "VirtualTableColumn";
1093
- }).map((n) => {
1094
- var a, s, f;
1095
- return {
1096
- prop: (a = n.props) == null ? void 0 : a.prop,
1097
- title: (s = n.props) == null ? void 0 : s.title,
1098
- width: (f = n.props) == null ? void 0 : f.width,
1099
- slots: n.children
1100
- };
1101
- })), je = (n) => {
1102
- try {
1103
- return n === 0 ? {
1104
- width: "0px"
1105
- } : n ? {
1106
- flex: /^\d+$/.test(n) ? `0 0 ${n}px` : `0 0 ${n}`
1107
- } : {
1108
- flex: "1 1 100%"
1109
- };
1110
- } catch (a) {
1111
- return console.warn("[VirtualTable] computeColumnWidth error:", a), {
1112
- flex: "1 1 100%"
1113
- };
1114
- }
1115
- }, gt = ke(() => {
1116
- var n;
1117
- return (n = i.treeConfig) != null && n.childCurrent && N.value ? ft(N.value).map((a) => a[i.rowConfig.keyField]) : [];
1118
- }), pt = oe({
1119
- viewStartIndex: 0,
1120
- viewEndIndex: 0,
1121
- visibleStartIndex: 0,
1122
- visibleEndIndex: 0
1123
- });
1124
- let Ke = null, qe = null;
1125
- const nn = (n, a) => {
1126
- Ke && cancelAnimationFrame(Ke), Ke = requestAnimationFrame(() => {
1127
- e("scroll-end", {
1128
- ...pt.value
1129
- }), Ke = null;
1130
- });
1131
- }, an = (n, a, s, f) => {
1132
- qe && cancelAnimationFrame(qe), qe = requestAnimationFrame(() => {
1133
- pt.value = {
1134
- viewStartIndex: n,
1135
- viewEndIndex: a,
1136
- visibleStartIndex: s,
1137
- visibleEndIndex: f
1138
- }, qe = null;
1139
- });
1140
- }, ln = (n, a) => {
1141
- var C, y;
1142
- const {
1143
- pageHeight: s,
1144
- margin: f,
1145
- showPageBorder: c,
1146
- pageBorderPadding: u,
1147
- pageBorderStyle: k
1148
- } = i.pageConfig;
1149
- return Z.value.has(a) ? G(J, null, [i.pageConfig.showPageHeader && t["page-header"] ? (C = t["page-header"]) == null ? void 0 : C.call(t, {
1150
- pageNumber: n.pageNumber || a + 1,
1151
- pageIndex: a
1152
- }) : null, a === 0 && i.showHeader ? G("div", {
1153
- class: "a4-table-header"
1154
- }, [G("div", {
1155
- class: "virtual-table-header we-vt-table--header we-vt-table--header-wrapper"
1156
- }, [Le.value.map((g) => {
1157
- var w, R, O;
1158
- return G("div", {
1159
- class: "we-vt-header--column",
1160
- key: g.prop,
1161
- style: je(g.width)
1162
- }, [G("div", {
1163
- class: "we-vt-cell"
1164
- }, [(w = g.slots) != null && w.header ? (O = (R = g.slots) == null ? void 0 : R.header) == null ? void 0 : O.call(R, {
1165
- column: g
1166
- }) : g.title])]);
1167
- })])]) : null, G("div", {
1168
- class: "a4-page-content",
1169
- style: {
1170
- minHeight: `${s - f * 2}px`,
1171
- ...c ? {
1172
- border: k,
1173
- padding: `${u}px`
1174
- } : {}
1175
- }
1176
- }, [n.items.map((g) => {
1177
- var w, R;
1178
- return G("div", {
1179
- key: g[i.rowConfig.keyField],
1180
- "data-id": g[i.rowConfig.keyField],
1181
- class: {
1182
- "virtual-table-row": !0,
1183
- "we-vt-body--row": !0,
1184
- "row--current": g[i.rowConfig.keyField] === ((w = N.value) == null ? void 0 : w[i.rowConfig.keyField]) || ((R = i.treeConfig) == null ? void 0 : R.childCurrent) && gt.value.includes(g[i.rowConfig.keyField])
1185
- },
1186
- style: {
1187
- width: "100%"
1188
- },
1189
- onClick: () => se(g),
1190
- onDblclick: () => T(g)
1191
- }, [Le.value.map((O) => {
1192
- var F, H, ee, de, U, fe, Ce;
1193
- return G("div", {
1194
- key: O.prop,
1195
- class: "virtual-table-cell we-vt-cell",
1196
- style: je(O.width),
1197
- "data-prop": O.prop
1198
- }, [g._editing && ((F = i.editConfig) == null ? void 0 : F.trigger) === "dblclick" ? ((H = O.slots) == null ? void 0 : H.edit) && ((de = (ee = O.slots) == null ? void 0 : ee.edit) == null ? void 0 : de.call(ee, {
1199
- row: g,
1200
- column: O
1201
- })) : ((U = O.slots) == null ? void 0 : U.default) && ((Ce = (fe = O.slots) == null ? void 0 : fe.default) == null ? void 0 : Ce.call(fe, {
1202
- row: g,
1203
- column: O
1204
- }))]);
1205
- })]);
1206
- })]), t["page-footer"] ? (y = t["page-footer"]) == null ? void 0 : y.call(t, {
1207
- pageNumber: n.pageNumber || a + 1,
1208
- pageIndex: a
1209
- }) : G("div", {
1210
- class: "a4-page-footer",
1211
- contenteditable: "false"
1212
- }, [G("span", {
1213
- class: "page-number",
1214
- contenteditable: "false"
1215
- }, [n.pageNumber || a + 1, Re(" / "), q.value.length])])]) : G("div", {
1216
- class: "a4-page-loading"
1217
- }, [G("div", {
1218
- class: "loading-spinner"
1219
- }, null), G("div", {
1220
- class: "loading-text"
1221
- }, [Re("加载中...")])]);
1222
- }, on = () => {
1223
- var k;
1224
- const {
1225
- pageHeight: n,
1226
- pageWidth: a,
1227
- margin: s,
1228
- gap: f,
1229
- showPageBorder: c,
1230
- pageBorderPadding: u
1231
- } = i.pageConfig;
1232
- return G("div", {
1233
- class: "virtual-table we-vt-table we-vt-table--render-default border--none"
1234
- }, [G("div", {
1235
- class: "a4-pages-container",
1236
- contenteditable: ((k = i.editConfig) == null ? void 0 : k.trigger) === "contenteditable" ? "true" : void 0,
1237
- onContextmenu: M,
1238
- onFocusin: $e,
1239
- onFocusout: ze
1240
- }, [q.value.map((C, y) => {
1241
- const g = Z.value.has(y);
1242
- return G("div", {
1243
- key: `page-${y}`,
1244
- class: g ? "a4-page" : "a4-page-placeholder",
1245
- "data-page-index": y,
1246
- style: {
1247
- width: `${a}px`,
1248
- // 不设置minHeight,让内容自然决定高度
1249
- marginBottom: `${f}px`,
1250
- padding: g ? `${c ? s - u : s}px` : "0",
1251
- boxSizing: "border-box",
1252
- // 使用relative定位,确保内部元素定位正确
1253
- position: "relative",
1254
- // 确保内容能够正常撑开
1255
- overflow: "visible"
1256
- }
1257
- }, [G("div", {
1258
- style: {
1259
- position: "absolute",
1260
- top: 0,
1261
- left: 0,
1262
- width: "1px",
1263
- height: `${n}px`,
1264
- visibility: "hidden",
1265
- pointerEvents: "none"
1266
- }
1267
- }, null), ln(C, y)]);
1268
- })])]);
1269
- }, sn = () => {
1270
- var n;
1271
- return G("div", {
1272
- class: "virtual-table we-vt-table we-vt-table--render-default border--none"
1273
- }, [i.showHeader ? G("div", {
1274
- class: "virtual-table-header we-vt-table--header we-vt-table--header-wrapper"
1275
- }, [Le.value.map((a) => {
1276
- var s, f, c;
1277
- return G("div", {
1278
- class: "we-vt-header--column",
1279
- key: a.prop,
1280
- style: je(a.width)
1281
- }, [G("div", {
1282
- class: "we-vt-cell"
1283
- }, [(s = a.slots) != null && s.header ? (c = (f = a.slots) == null ? void 0 : f.header) == null ? void 0 : c.call(f, {
1284
- column: a
1285
- }) : a.title]), G("div", {
1286
- class: "we-vt-resizable is--line"
1287
- }, null)]);
1288
- })]) : void 0, G(yn, {
1289
- ref: d,
1290
- items: r.value,
1291
- minItemSize: v.value,
1292
- keyField: i.rowConfig.keyField,
1293
- emitUpdate: !1,
1294
- buffer: 300,
1295
- class: "virtual-table-wrapper",
1296
- contenteditable: ((n = i.editConfig) == null ? void 0 : n.trigger) === "contenteditable" ? "true" : void 0,
1297
- onContextmenu: M,
1298
- onScrollend: nn,
1299
- onUpdate: an,
1300
- onFocusin: $e,
1301
- onFocusout: ze
1302
- }, {
1303
- default: ({
1304
- item: a,
1305
- index: s,
1306
- active: f
1307
- }) => {
1308
- var u, k, C;
1309
- let c;
1310
- return G(_n, {
1311
- key: a[i.rowConfig.keyField],
1312
- item: a,
1313
- active: f,
1314
- sizeDependencies: [(u = a.content) == null ? void 0 : u.length, a._editing, a.content_type],
1315
- "data-id": a[i.rowConfig.keyField],
1316
- "data-index": s,
1317
- "data-active": f,
1318
- class: {
1319
- "virtual-table-row": !0,
1320
- "we-vt-body--row": !0,
1321
- "row--current": a[i.rowConfig.keyField] === ((k = N.value) == null ? void 0 : k[i.rowConfig.keyField]) || // 如果是树,并且配置了childCurrent高亮子节点
1322
- ((C = i.treeConfig) == null ? void 0 : C.childCurrent) && gt.value.includes(a[i.rowConfig.keyField])
1323
- }
1324
- }, ni(c = Le.value.map((y) => {
1325
- var g, w, R, O, F, H, ee;
1326
- return G("div", {
1327
- key: y.prop,
1328
- class: "virtual-table-cell we-vt-cell",
1329
- style: je(y.width),
1330
- "data-prop": y.prop
1331
- }, [a._editing && ((g = i.editConfig) == null ? void 0 : g.trigger) === "dblclick" ? ((w = y.slots) == null ? void 0 : w.edit) && ((O = (R = y.slots) == null ? void 0 : R.edit) == null ? void 0 : O.call(R, {
1332
- row: a,
1333
- column: y
1334
- })) : ((F = y.slots) == null ? void 0 : F.default) && ((ee = (H = y.slots) == null ? void 0 : H.default) == null ? void 0 : ee.call(H, {
1335
- row: a,
1336
- column: y
1337
- }))]);
1338
- })) ? c : {
1339
- default: () => [c]
1340
- });
1341
- }
1342
- })]);
1343
- };
1344
- return () => i.pageConfig.enabled ? on() : sn();
1345
- }
1346
- }), De = (i, e) => {
1347
- const t = i.__vccOpts || i;
1348
- for (const [l, o] of e)
1349
- t[l] = o;
1350
- return t;
1351
- }, ai = /* @__PURE__ */ De(ii, [["__scopeId", "data-v-274d8f6d"]]), li = {
1352
- name: "VirtualTableColumn",
1353
- props: {
1354
- prop: String,
1355
- label: String,
1356
- width: [String, Number]
1357
- }
1358
- };
1359
- function oi(i, e, t, l, o, d) {
1360
- return gn(i.$slots, "default");
1361
- }
1362
- const si = /* @__PURE__ */ De(li, [["render", oi]]), ri = { class: "catalog-node" }, ci = ["title"], di = { class: "catalog-node__text" }, ui = {
1363
- key: 0,
1364
- class: "catalog-node__children"
1365
- }, hi = {
1366
- __name: "CatalogNode",
1367
- props: {
1368
- item: { type: Object, required: !0 },
1369
- depth: { type: Number, default: 0 },
1370
- activeId: { type: String, default: "" }
1371
- },
1372
- emits: ["navigate"],
1373
- setup(i, { emit: e }) {
1374
- const t = i, l = e, o = oe(!0), d = ke(() => t.item.children && t.item.children.length > 0);
1375
- function A(E) {
1376
- E.stopPropagation(), o.value = !o.value;
1377
- }
1378
- return (E, N) => {
1379
- const P = pn("CatalogNode", !0);
1380
- return h(), p("div", ri, [
1381
- re("div", {
1382
- class: Ie(["catalog-node__label", { "is-active": i.activeId === i.item.nodeId }]),
1383
- style: K({ paddingLeft: 10 + i.depth * 14 + "px" }),
1384
- title: i.item.name,
1385
- onClick: N[0] || (N[0] = (X) => l("navigate", i.item))
1386
- }, [
1387
- re("span", {
1388
- class: "catalog-node__toggle",
1389
- onClick: A
1390
- }, [
1391
- d.value ? (h(), Fe(Xe(o.value ? Ae(Dn) : Ae(Ht)), {
1392
- key: 0,
1393
- size: 14
1394
- })) : ge("", !0)
1395
- ]),
1396
- re("span", di, te(i.item.name || "(无标题)"), 1)
1397
- ], 14, ci),
1398
- d.value && o.value ? (h(), p("div", ui, [
1399
- (h(!0), p(J, null, le(i.item.children, (X) => (h(), Fe(P, {
1400
- key: X.nodeId,
1401
- item: X,
1402
- depth: i.depth + 1,
1403
- "active-id": i.activeId,
1404
- onNavigate: N[1] || (N[1] = (V) => l("navigate", V))
1405
- }, null, 8, ["item", "depth", "active-id"]))), 128))
1406
- ])) : ge("", !0)
1407
- ]);
1408
- };
1409
- }
1410
- }, fi = /* @__PURE__ */ De(hi, [["__scopeId", "data-v-75ca10a3"]]), gi = {
1411
- key: 0,
1412
- class: "catalog catalog--collapsed"
1413
- }, pi = {
1414
- key: 1,
1415
- class: "catalog"
1416
- }, vi = { class: "catalog__header" }, mi = { class: "catalog__title" }, yi = { class: "catalog__body" }, _i = {
1417
- key: 0,
1418
- class: "catalog__empty"
1419
- }, bi = {
1420
- __name: "index",
1421
- props: {
1422
- items: { type: Array, default: () => [] }
1423
- },
1424
- emits: ["navigate"],
1425
- setup(i, { emit: e }) {
1426
- const t = e, l = oe(!1), o = oe("");
1427
- function d(A) {
1428
- o.value = A.nodeId, t("navigate", A);
1429
- }
1430
- return (A, E) => l.value ? (h(), p("div", gi, [
1431
- re("button", {
1432
- class: "catalog__icon-btn",
1433
- title: "展开目录",
1434
- onClick: E[0] || (E[0] = (N) => l.value = !1)
1435
- }, [
1436
- G(Ae(zn), { size: 18 })
1437
- ])
1438
- ])) : (h(), p("div", pi, [
1439
- re("div", vi, [
1440
- re("span", mi, [
1441
- G(Ae(Nn), { size: 16 }),
1442
- E[2] || (E[2] = Re(" 目录 ", -1))
1443
- ]),
1444
- re("button", {
1445
- class: "catalog__icon-btn",
1446
- title: "收起目录",
1447
- onClick: E[1] || (E[1] = (N) => l.value = !0)
1448
- }, [
1449
- G(Ae(Vn), { size: 18 })
1450
- ])
1451
- ]),
1452
- re("div", yi, [
1453
- (h(!0), p(J, null, le(i.items, (N) => (h(), Fe(fi, {
1454
- key: N.nodeId,
1455
- item: N,
1456
- "active-id": o.value,
1457
- onNavigate: d
1458
- }, null, 8, ["item", "active-id"]))), 128)),
1459
- i.items.length ? ge("", !0) : (h(), p("div", _i, " 暂无目录 "))
1460
- ])
1461
- ]));
1462
- }
1463
- }, xi = /* @__PURE__ */ De(bi, [["__scopeId", "data-v-c64a3b3a"]]), ki = {
1464
- first: 1,
1465
- second: 2,
1466
- third: 3,
1467
- fourth: 4,
1468
- fifth: 5,
1469
- sixth: 6
1470
- };
1471
- function wi(i) {
1472
- return i.blockType !== "title" || !i.level ? 0 : ki[i.level] || 1;
1473
- }
1474
- function Ci(i) {
1475
- const e = [];
1476
- for (const o of i || []) {
1477
- const d = wi(o);
1478
- d && e.push({
1479
- id: o.node_id,
1480
- nodeId: o.node_id,
1481
- name: (o.content || "").trim(),
1482
- level: d,
1483
- children: []
1484
- });
1485
- }
1486
- if (!e.length) return [];
1487
- const t = (o, d) => {
1488
- const A = d.children[d.children.length - 1];
1489
- A && o.level > A.level ? t(o, A) : d.children.push(o);
1490
- }, l = [];
1491
- for (const o of e) {
1492
- const d = l[l.length - 1];
1493
- d && o.level > d.level ? t(o, d) : l.push(o);
1494
- }
1495
- return l;
1496
- }
1497
- const Mi = {
1498
- first: 0,
1499
- second: 1,
1500
- third: 2,
1501
- fourth: 3,
1502
- fifth: 4,
1503
- sixth: 5,
1504
- seventh: 6,
1505
- eighth: 7
1506
- };
1507
- function Ge(i, e) {
1508
- let t = "", l = i;
1509
- const o = e ? 65 : 97;
1510
- for (; l > 0; ) {
1511
- const d = (l - 1) % 26;
1512
- t = String.fromCharCode(o + d) + t, l = Math.floor((l - 1) / 26);
1513
- }
1514
- return t;
1515
- }
1516
- const Ft = [
1517
- (i) => i.toString(),
1518
- // first:数字
1519
- (i) => Ge(i, !0),
1520
- // second:大写字母
1521
- (i) => `(${i})`,
1522
- // third:括号数字
1523
- (i) => `(${Ge(i, !1)})`,
1524
- // fourth:括号小写字母
1525
- (i) => `${i})`,
1526
- // fifth:数字+右括号
1527
- (i) => `${Ge(i, !1)})`,
1528
- // sixth:小写字母+右括号
1529
- (i) => `<${i}>`,
1530
- // seventh:数字+尖括号
1531
- (i) => `<${Ge(i, !1)}>`
1532
- // eighth:小写字母+尖括号
1533
- ];
1534
- function Ii() {
1535
- const i = new Array(8).fill(0);
1536
- return {
1537
- next(e, t) {
1538
- const l = Mi[e];
1539
- if (l == null) return "";
1540
- i[l]++;
1541
- for (let d = l + 1; d < i.length; d++) i[d] = 0;
1542
- if (t != null && t !== "")
1543
- return `${t} `;
1544
- const o = Ft[Math.min(l, Ft.length - 1)];
1545
- return `${o(i[l])}. `;
1546
- }
1547
- };
1548
- }
1549
- const Ei = { class: "editor-layout word-editor-scope" }, Si = { class: "editor-container" }, Ti = {
1550
- key: 0,
1551
- class: "editor-loading"
1552
- }, Fi = {
1553
- key: 0,
1554
- class: "empty-line"
1555
- }, Ai = ["href"], Pi = ["src"], $i = ["checked"], Li = ["checked"], Ri = {
1556
- key: 4,
1557
- class: "ctrl-input"
1558
- }, Oi = ["checked"], Bi = ["checked"], Hi = {
1559
- key: 8,
1560
- class: "doc-tab"
1561
- }, Di = { key: 0 }, zi = ["colspan", "rowspan"], Ni = { key: 0 }, Vi = ["src"], ji = ["href"], Ki = ["checked"], qi = ["checked"], Wi = ["checked"], lt = 14, Me = 1123, At = 760, Pt = 756, Ui = {
1562
- __name: "index",
1563
- props: {
1564
- // 文档结构数据(IElement[]),来源由使用方决定
1565
- data: {
1566
- type: Array,
1567
- default: () => []
1568
- },
1569
- // 外部数据加载态,用于展示加载占位
1570
- loading: {
1571
- type: Boolean,
1572
- default: !1
1573
- }
1574
- },
1575
- setup(i) {
1576
- const e = i, t = ke(() => e.data || []), l = oe(null), o = oe({});
1577
- let d = null;
1578
- rt(() => {
1579
- d = new ResizeObserver((m) => {
1580
- const x = {};
1581
- for (const r of m) {
1582
- const L = r.target._rowKey;
1583
- if (!L) continue;
1584
- const v = Math.round(r.contentRect.height);
1585
- v > (o.value[L] || 0) && (x[L] = v);
1586
- }
1587
- Object.keys(x).length && (o.value = { ...o.value, ...x });
1588
- });
1589
- }), Ze(() => {
1590
- d == null || d.disconnect(), d = null;
1591
- });
1592
- function A(m, x) {
1593
- !m || !d || (m._rowKey = x, d.observe(m));
1594
- }
1595
- const E = {
1596
- left: "left",
1597
- center: "center",
1598
- right: "right",
1599
- alignment: "justify",
1600
- justify: "justify"
1601
- };
1602
- function N(m) {
1603
- const x = [], r = (L) => {
1604
- x.push(L);
1605
- };
1606
- for (const L of m || [])
1607
- if (L && L.type === "area") {
1608
- const v = N(L.valueList || []);
1609
- for (const S of v) r(S);
1610
- } else
1611
- r(L);
1612
- return x;
1613
- }
1614
- function P(m) {
1615
- const x = N(m), r = [];
1616
- let L = [], v = 0, S = null;
1617
- const $ = (I) => {
1618
- L.length && (r.push({ type: "paragraph", elements: [...L], rowFlex: I }), L = []);
1619
- }, M = () => {
1620
- if (v === 0) return;
1621
- const I = S;
1622
- $(I);
1623
- for (let D = 1; D < v; D++)
1624
- r.push({ type: "paragraph", elements: [], rowFlex: I });
1625
- v = 0, S = null;
1626
- };
1627
- for (const I of x || [])
1628
- if (I.type === "table")
1629
- M(), $(), r.push({ type: "table", el: I });
1630
- else if (I.type === "title")
1631
- M(), $(), r.push({ type: "title", el: I });
1632
- else if (I.type === "list") {
1633
- M(), $();
1634
- const D = [];
1635
- let _ = [];
1636
- for (const pe of I.valueList || [])
1637
- pe.value === `
1638
- ` || pe.value === "​" ? (D.push([..._]), _ = []) : _.push(pe);
1639
- (_.length || D.length === 0) && D.push([..._]), r.push({ type: "list", listType: I.listType || "ul", listStyle: I.listStyle || "disc", items: D });
1640
- } else if (I.listId) {
1641
- M(), $();
1642
- const D = I.value === "​" || I.value === "" ? [] : [I];
1643
- r.push({ type: "list", listType: I.listType || "ul", listStyle: I.listStyle || "disc", items: [D] });
1644
- } else I.value != null && /^[\n\u200B]+$/.test(I.value) ? (v += I.value.length, I.rowFlex && (S = I.rowFlex)) : (M(), L.push(I));
1645
- return M(), $(), r;
1646
- }
1647
- function X(m) {
1648
- const x = (m == null ? void 0 : m.width) || 0;
1649
- return !x || x <= Pt ? 1 : Pt / x;
1650
- }
1651
- function V(m) {
1652
- const x = m.filter((D) => D.type === "image").reduce((D, _) => D + (_.height || _.width || 0), 0), r = m.filter((D) => D.type !== "image").map((D) => D.value || "").join("");
1653
- if (!r) return x || 20;
1654
- const L = m.reduce((D, _) => Math.max(D, _.size || 0), 0) || 14, v = L + 6, S = (r.match(/[一-龥]/g) || []).length, $ = r.length - S, M = S * L + $ * (L * 0.5), I = Math.max(1, Math.ceil(M / At));
1655
- return x + Math.max(v, I * v);
1656
- }
1657
- function q(m) {
1658
- if (!m || !m.length) return [[]];
1659
- const x = [];
1660
- let r = [];
1661
- for (const L of m)
1662
- L.type === "image" && (L.width || 0) >= At ? (r.length && (x.push(r), r = []), x.push([L])) : r.push(L);
1663
- return r.length && x.push(r), x.length ? x : [[]];
1664
- }
1665
- function Y(m) {
1666
- if (m.length === 0) return [];
1667
- const x = new Array(m.length).fill(0);
1668
- m.forEach((S, $) => {
1669
- (S.tdList || []).forEach((M) => {
1670
- const I = M.rowspan || 1;
1671
- if (I > 1) {
1672
- const D = Math.min($ + I - 1, m.length - 1);
1673
- x[$] = Math.max(x[$], D);
1674
- for (let _ = 1; _ < I && $ + _ < m.length; _++)
1675
- x[$ + _] = Math.max(x[$ + _], D);
1676
- }
1677
- });
1678
- });
1679
- const r = [];
1680
- let L = 0, v = 0;
1681
- for (let S = 0; S < m.length; S++)
1682
- v = Math.max(v, x[S]), v <= S && (r.push(m.slice(L, S + 1)), L = S + 1, v = 0);
1683
- return L < m.length && r.push(m.slice(L)), r;
1684
- }
1685
- const Z = ke(() => {
1686
- const m = P(t.value), x = [];
1687
- let r = 0;
1688
- const L = Ii(), v = { first: 0, second: 1, third: 2, fourth: 3, fifth: 4, sixth: 5, seventh: 6, eighth: 7 };
1689
- let S = -1;
1690
- const $ = (M) => {
1691
- var I, D, _;
1692
- return !!((I = M.el) != null && I._coverBreakBefore || (_ = (D = M.elements) == null ? void 0 : D[0]) != null && _._coverBreakBefore);
1693
- };
1694
- return m.forEach((M, I) => {
1695
- var _, pe, ve;
1696
- const D = $(M);
1697
- if (D && (r = 0), M.type === "title") {
1698
- const ue = M.el.valueList || [], ne = L.next(M.el.level, (_ = M.el.extension) == null ? void 0 : _.startIndex), ce = ue.some((T) => {
1699
- var Q;
1700
- return (Q = T.extension) == null ? void 0 : Q.isIndex;
1701
- });
1702
- let ie = ue;
1703
- if (!ce && ne) {
1704
- const T = ue[0] || {};
1705
- ie = [
1706
- {
1707
- value: ne,
1708
- size: T.size,
1709
- bold: T.bold,
1710
- italic: T.italic,
1711
- color: T.color,
1712
- font: T.font,
1713
- extension: { isIndex: !0 }
1714
- },
1715
- ...ue
1716
- ];
1717
- }
1718
- const he = ie.map((T) => T.value || "").join(""), se = V(ie);
1719
- r = r + se > Me && r > 0 ? se : r + se, S = v[M.el.level] ?? 0, x.push({
1720
- node_id: `blk_${I}_0`,
1721
- layer: D ? 1 : 100,
1722
- blockType: "title",
1723
- level: M.el.level,
1724
- titleEl: M.el,
1725
- titleValueList: ie,
1726
- content_type: "text",
1727
- content: he,
1728
- height: se,
1729
- indentPx: S * 20
1730
- });
1731
- } else if (M.type === "paragraph") {
1732
- const ue = q(M.elements), ne = S >= 0 ? (S + 1) * 20 : 0;
1733
- ue.forEach((ce, ie) => {
1734
- const he = ce.map((T) => T.value || "").join(""), se = V(ce);
1735
- r = r + se > Me && r > 0 ? se : r + se, x.push({
1736
- node_id: `blk_${I}_${ie}`,
1737
- layer: D && ie === 0 ? 1 : 100,
1738
- blockType: "paragraph",
1739
- elements: ce,
1740
- rowFlex: M.rowFlex,
1741
- content_type: "text",
1742
- content: he,
1743
- height: se,
1744
- indentPx: ne
1745
- });
1746
- });
1747
- } else if (M.type === "table") {
1748
- const ue = !!((pe = M.el.extension) != null && pe.isTitleTable), ne = ((ve = M.el.extension) == null ? void 0 : ve.elementType) === "signOff", ce = ue || ne ? 0 : S >= 0 ? (S + 1) * 20 : 0, ie = Y(M.el.trList || []), he = ie.length;
1749
- ie.forEach((se, T) => {
1750
- const Q = `blk_${I}_${T}`, Pe = se.reduce(
1751
- (xe, z) => xe + (z.height || z.minHeight || 35),
1752
- 0
1753
- ), _e = Math.max(Pe, o.value[Q] || 0);
1754
- if (_e > Me) {
1755
- const xe = Math.ceil(_e / Me);
1756
- for (let z = 0; z < xe; z++) {
1757
- const Ee = z * Me, $e = Math.min(Me, _e - Ee), ze = z > 0 || r > 0;
1758
- r = $e, x.push({
1759
- node_id: `blk_${I}_${T}_s${z}`,
1760
- layer: D && T === 0 && z === 0 ? 1 : 100,
1761
- blockType: "table-row-group",
1762
- content_type: "table-row",
1763
- rowHeight: _e,
1764
- trGroup: se,
1765
- tableEl: M.el,
1766
- tableRowFlex: M.el.rowFlex || null,
1767
- isFirst: T === 0 && z === 0,
1768
- isLast: T === he - 1 && z === xe - 1,
1769
- isPageBreak: ze,
1770
- sliceOffset: Ee,
1771
- sliceHeight: $e,
1772
- _baseKey: z === 0 ? Q : void 0,
1773
- height: $e,
1774
- indentPx: ce
1775
- });
1776
- }
1777
- } else {
1778
- const xe = T > 0 && r + _e > Me;
1779
- r = r + _e > Me ? _e : r + _e, x.push({
1780
- node_id: `blk_${I}_${T}`,
1781
- layer: D && T === 0 ? 1 : 100,
1782
- blockType: "table-row-group",
1783
- content_type: "table-row",
1784
- rowHeight: _e,
1785
- trGroup: se,
1786
- tableEl: M.el,
1787
- tableRowFlex: M.el.rowFlex || null,
1788
- isFirst: T === 0,
1789
- isLast: T === he - 1,
1790
- isPageBreak: xe,
1791
- indentPx: ce
1792
- });
1793
- }
1794
- });
1795
- } else if (M.type === "list") {
1796
- const ue = Math.round(18);
1797
- let ne = 0;
1798
- for (const ce of M.items)
1799
- ne += ce.length ? V(ce) : ue;
1800
- ne = Math.max(ne, ue), r = r + ne > Me && r > 0 ? ne : r + ne, x.push({
1801
- node_id: `blk_${I}_0`,
1802
- layer: D ? 1 : 100,
1803
- blockType: "list",
1804
- listType: M.listType,
1805
- listStyle: M.listStyle,
1806
- items: M.items,
1807
- height: ne,
1808
- indentPx: S >= 0 ? (S + 1) * 20 : 0
1809
- });
1810
- }
1811
- }), x;
1812
- }), ye = ke(() => Ci(Z.value));
1813
- function W(m) {
1814
- var x;
1815
- (x = l.value) == null || x.scrollToRow({ node_id: m.nodeId });
1816
- }
1817
- function B(m) {
1818
- var S, $;
1819
- const x = m.elements || [], r = ((S = x.find((M) => M.rowFlex)) == null ? void 0 : S.rowFlex) || m.rowFlex, L = { textAlign: E[r] || "left" }, v = ($ = x.find((M) => M.rowMargin)) == null ? void 0 : $.rowMargin;
1820
- return v && (L.lineHeight = v), L;
1821
- }
1822
- function b(m) {
1823
- const x = {};
1824
- m.font && (x.fontFamily = m.font), x.fontSize = (m.size || lt) + "px", m.bold != null && (x.fontWeight = m.bold ? "bold" : "normal"), m.italic != null && (x.fontStyle = m.italic ? "italic" : "normal"), m.color && (x.color = m.color), m.highlight && m.highlight !== "rgb(255, 255, 255)" && m.highlight !== "#ffffff" && (x.backgroundColor = m.highlight);
1825
- const r = [m.underline && "underline", m.strikeout && "line-through"].filter(Boolean).join(" ");
1826
- return r && (x.textDecoration = r), m.letterSpacing && (x.letterSpacing = m.letterSpacing + "px"), x;
1827
- }
1828
- return (m, x) => (h(), p("div", Ei, [
1829
- G(xi, {
1830
- items: ye.value,
1831
- onNavigate: W
1832
- }, null, 8, ["items"]),
1833
- re("div", Si, [
1834
- i.loading ? (h(), p("div", Ti, " 加载中… ")) : (h(), Fe(Ae(ai), {
1835
- key: 1,
1836
- ref_key: "virtualTableRef",
1837
- ref: l,
1838
- "show-header": !1,
1839
- "row-config": { keyField: "node_id" },
1840
- "page-config": {
1841
- enabled: !0,
1842
- pageHeight: 1123,
1843
- pageWidth: 860,
1844
- margin: 50,
1845
- gap: 16,
1846
- showPageHeader: !1,
1847
- showPageBorder: !0,
1848
- pageBorderPadding: 5,
1849
- pageBorderStyle: "1px solid #333"
1850
- },
1851
- data: Z.value
1852
- }, {
1853
- default: nt(() => [
1854
- G(Ae(si), null, {
1855
- default: nt(({ row: r }) => {
1856
- var L;
1857
- return [
1858
- r.blockType === "title" ? (h(), p("p", {
1859
- key: 0,
1860
- class: Ie(["doc-title", `doc-title--${r.level}`]),
1861
- style: K({ paddingLeft: r.indentPx ? r.indentPx + "px" : void 0 })
1862
- }, [
1863
- (h(!0), p(J, null, le(r.titleValueList || [], (v, S) => (h(), p("span", {
1864
- key: S,
1865
- style: K(b(v))
1866
- }, te(v.value), 5))), 128))
1867
- ], 6)) : r.blockType === "paragraph" ? (h(), p("p", {
1868
- key: 1,
1869
- class: "doc-para",
1870
- style: K({ ...B(r), paddingLeft: r.indentPx ? r.indentPx + "px" : void 0 })
1871
- }, [
1872
- r.elements.length ? ge("", !0) : (h(), p("span", Fi, " ")),
1873
- (h(!0), p(J, null, le(r.elements, (v, S) => {
1874
- var $, M, I, D, _, pe, ve, ue, ne, ce, ie, he, se;
1875
- return h(), p(J, { key: S }, [
1876
- !v.type || v.type === "text" ? (h(), p("span", {
1877
- key: 0,
1878
- style: K(b(v))
1879
- }, te(v.value), 5)) : v.type === "hyperlink" ? (h(), p("a", {
1880
- key: 1,
1881
- href: v.url,
1882
- class: "doc-link",
1883
- target: "_blank",
1884
- rel: "noopener"
1885
- }, [
1886
- (h(!0), p(J, null, le(v.valueList || [], (T, Q) => (h(), p("span", {
1887
- key: Q,
1888
- style: K(b(T))
1889
- }, te(T.value), 5))), 128))
1890
- ], 8, Ai)) : v.type === "image" ? (h(), p("img", {
1891
- key: 2,
1892
- src: v.value,
1893
- class: "doc-image",
1894
- style: K({
1895
- width: v.width ? v.width + "px" : "auto",
1896
- height: v.height ? v.height + "px" : "auto"
1897
- })
1898
- }, null, 12, Pi)) : v.type === "control" ? (h(), p(J, { key: 3 }, [
1899
- (($ = v.control) == null ? void 0 : $.type) === "text" ? (h(), p("span", {
1900
- key: 0,
1901
- style: K({ fontSize: (v.control.size || 12) + "px" })
1902
- }, [
1903
- (h(!0), p(J, null, le(v.control.value || [], (T, Q) => (h(), p("span", {
1904
- key: Q,
1905
- style: K(b(T))
1906
- }, te(T.value), 5))), 128))
1907
- ], 4)) : ((M = v.control) == null ? void 0 : M.type) === "input" ? (h(), p("span", {
1908
- key: 1,
1909
- class: "ctrl-input",
1910
- style: K({
1911
- minWidth: (v.control.minWidth || 60) + "px",
1912
- fontSize: (v.control.size || 12) + "px"
1913
- })
1914
- }, [
1915
- (h(!0), p(J, null, le(v.control.value || [], (T, Q) => (h(), p("span", { key: Q }, te(T.value), 1))), 128))
1916
- ], 4)) : ((I = v.control) == null ? void 0 : I.type) === "radio" ? (h(), p("span", {
1917
- key: 2,
1918
- class: Ie(["ctrl-options", { "ctrl-options--vertical": ((_ = (D = v.control.extension) == null ? void 0 : D.elementAttributes) == null ? void 0 : _.layout) === "vertical" }]),
1919
- style: K({ fontSize: (v.control.size || lt) + "px" })
1920
- }, [
1921
- (h(!0), p(J, null, le(v.control.valueSets || [], (T, Q) => (h(), p("label", {
1922
- key: Q,
1923
- class: "ctrl-option"
1924
- }, [
1925
- re("input", {
1926
- type: "radio",
1927
- disabled: "",
1928
- checked: v.control.code === T.code
1929
- }, null, 8, $i),
1930
- Re(" " + te(T.value), 1)
1931
- ]))), 128))
1932
- ], 6)) : ((pe = v.control) == null ? void 0 : pe.type) === "checkbox" ? (h(), p("span", {
1933
- key: 3,
1934
- class: Ie(["ctrl-options", { "ctrl-options--vertical": ((ue = (ve = v.control.extension) == null ? void 0 : ve.elementAttributes) == null ? void 0 : ue.layout) === "vertical" }]),
1935
- style: K({ fontSize: (v.control.size || lt) + "px" })
1936
- }, [
1937
- (h(!0), p(J, null, le(v.control.valueSets || [], (T, Q) => (h(), p("label", {
1938
- key: Q,
1939
- class: "ctrl-option"
1940
- }, [
1941
- re("input", {
1942
- type: "checkbox",
1943
- disabled: "",
1944
- checked: (v.control.code || "").split(",").includes(T.code)
1945
- }, null, 8, Li),
1946
- Re(" " + te(T.value), 1)
1947
- ]))), 128))
1948
- ], 6)) : ((ne = v.control) == null ? void 0 : ne.type) === "select" ? (h(), p("span", Ri, te(((ie = (ce = v.control.value) == null ? void 0 : ce[0]) == null ? void 0 : ie.value) || v.control.placeholder || ""), 1)) : ge("", !0)
1949
- ], 64)) : v.type === "checkbox" ? (h(), p("input", {
1950
- key: 4,
1951
- type: "checkbox",
1952
- checked: !!((he = v.checkbox) != null && he.value),
1953
- disabled: "",
1954
- class: "el-check"
1955
- }, null, 8, Oi)) : v.type === "radio" ? (h(), p("input", {
1956
- key: 5,
1957
- type: "radio",
1958
- checked: !!((se = v.radio) != null && se.value),
1959
- disabled: "",
1960
- class: "el-check"
1961
- }, null, 8, Bi)) : v.type === "superscript" ? (h(), p("sup", {
1962
- key: 6,
1963
- style: K(b(v))
1964
- }, te(v.value), 5)) : v.type === "subscript" ? (h(), p("sub", {
1965
- key: 7,
1966
- style: K(b(v))
1967
- }, te(v.value), 5)) : v.type === "tab" ? (h(), p("span", Hi)) : ge("", !0)
1968
- ], 64);
1969
- }), 128))
1970
- ], 4)) : r.blockType === "list" ? (h(), Fe(Xe(r.listType === "ol" ? "ol" : "ul"), {
1971
- key: 2,
1972
- class: "doc-list",
1973
- style: K({ listStyleType: r.listStyle === "decimal" ? "decimal" : r.listStyle === "lower-alpha" ? "lower-alpha" : "disc", paddingLeft: r.indentPx ? r.indentPx + 24 + "px" : void 0 })
1974
- }, {
1975
- default: nt(() => [
1976
- (h(!0), p(J, null, le(r.items, (v, S) => (h(), p("li", {
1977
- key: S,
1978
- class: "doc-list-item"
1979
- }, [
1980
- (h(!0), p(J, null, le(v, ($, M) => (h(), p(J, { key: M }, [
1981
- !$.type || $.type === "text" ? (h(), p("span", {
1982
- key: 0,
1983
- style: K(b($))
1984
- }, te($.value), 5)) : $.type === "superscript" ? (h(), p("sup", {
1985
- key: 1,
1986
- style: K(b($))
1987
- }, te($.value), 5)) : $.type === "subscript" ? (h(), p("sub", {
1988
- key: 2,
1989
- style: K(b($))
1990
- }, te($.value), 5)) : ge("", !0)
1991
- ], 64))), 128))
1992
- ]))), 128))
1993
- ]),
1994
- _: 2
1995
- }, 1032, ["style"])) : r.blockType === "table-row-group" ? (h(), p("div", {
1996
- key: 3,
1997
- class: Ie(["doc-table-row-wrap", { "is-first": r.isFirst, "is-last": r.isLast, "is-page-break": r.isPageBreak }]),
1998
- style: K({
1999
- display: r.tableRowFlex ? "flex" : void 0,
2000
- justifyContent: r.tableRowFlex === "right" ? "flex-end" : r.tableRowFlex === "center" ? "center" : r.tableRowFlex === "left" ? "flex-start" : void 0,
2001
- paddingLeft: r.indentPx ? r.indentPx + "px" : void 0
2002
- })
2003
- }, [
2004
- re("div", {
2005
- style: K({
2006
- overflow: r.sliceHeight != null ? "hidden" : void 0,
2007
- height: r.sliceHeight != null ? (r.isLast ? r.sliceHeight + 1 : r.sliceHeight) + "px" : void 0,
2008
- width: r.tableEl.width ? "max-content" : "100%"
2009
- })
2010
- }, [
2011
- re("table", {
2012
- ref: r._baseKey ? (v) => A(v, r._baseKey) : void 0,
2013
- class: Ie(["doc-table", { "doc-table--no-border": r.tableEl.borderType === "empty" }]),
2014
- style: K({
2015
- width: r.tableEl.width ? r.tableEl.width * X(r.tableEl) + "px" : "100%",
2016
- transform: r.sliceOffset ? `translateY(-${r.sliceOffset}px)` : void 0
2017
- })
2018
- }, [
2019
- (L = r.tableEl.colgroup) != null && L.length ? (h(), p("colgroup", Di, [
2020
- (h(!0), p(J, null, le(r.tableEl.colgroup, (v, S) => (h(), p("col", {
2021
- key: S,
2022
- style: K({ width: v.width * X(r.tableEl) + "px" })
2023
- }, null, 4))), 128))
2024
- ])) : ge("", !0),
2025
- re("tbody", null, [
2026
- (h(!0), p(J, null, le(r.trGroup, (v, S) => (h(), p("tr", {
2027
- key: S,
2028
- style: K({ height: (v.height || v.minHeight || 30) + "px" })
2029
- }, [
2030
- (h(!0), p(J, null, le(v.tdList || [], ($, M) => (h(), p("td", {
2031
- key: M,
2032
- colspan: $.colspan || 1,
2033
- rowspan: $.rowspan || 1,
2034
- style: K({
2035
- backgroundColor: $.backgroundColor || void 0,
2036
- verticalAlign: $.verticalAlign || "middle",
2037
- width: $.width ? $.width * X(r.tableEl) + "px" : void 0,
2038
- height: $.height ? $.height + "px" : void 0
2039
- })
2040
- }, [
2041
- (h(!0), p(J, null, le(P($.value), (I, D) => (h(), p(J, { key: D }, [
2042
- I.type === "paragraph" ? (h(), p("p", {
2043
- key: 0,
2044
- class: "cell-para",
2045
- style: K(B(I))
2046
- }, [
2047
- I.elements.length ? ge("", !0) : (h(), p("span", Ni, " ")),
2048
- (h(!0), p(J, null, le(I.elements, (_, pe) => {
2049
- var ve, ue, ne, ce, ie, he, se;
2050
- return h(), p(J, { key: pe }, [
2051
- !_.type || _.type === "text" ? (h(), p("span", {
2052
- key: 0,
2053
- style: K(b(_))
2054
- }, te(_.value), 5)) : _.type === "image" ? (h(), p("img", {
2055
- key: 1,
2056
- src: _.value,
2057
- class: "doc-image",
2058
- style: K({
2059
- width: _.width ? _.width + "px" : "auto",
2060
- height: _.height ? _.height + "px" : "auto"
2061
- })
2062
- }, null, 12, Vi)) : _.type === "hyperlink" ? (h(), p("a", {
2063
- key: 2,
2064
- href: _.url,
2065
- class: "doc-link",
2066
- target: "_blank"
2067
- }, [
2068
- (h(!0), p(J, null, le(_.valueList || [], (T, Q) => (h(), p("span", {
2069
- key: Q,
2070
- style: K(b(T))
2071
- }, te(T.value), 5))), 128))
2072
- ], 8, ji)) : _.type === "control" ? (h(), p(J, { key: 3 }, [
2073
- ((ve = _.control) == null ? void 0 : ve.type) === "text" ? (h(), p("span", {
2074
- key: 0,
2075
- style: K({ fontSize: (_.control.size || 12) + "px" })
2076
- }, [
2077
- (h(!0), p(J, null, le(_.control.value || [], (T, Q) => (h(), p("span", {
2078
- key: Q,
2079
- style: K(b(T))
2080
- }, te(T.value), 5))), 128))
2081
- ], 4)) : ((ue = _.control) == null ? void 0 : ue.type) === "input" ? (h(), p("span", {
2082
- key: 1,
2083
- class: "ctrl-input",
2084
- style: K({ fontSize: (_.control.size || 12) + "px" })
2085
- }, [
2086
- (h(!0), p(J, null, le(_.control.value || [], (T, Q) => (h(), p("span", { key: Q }, te(T.value), 1))), 128))
2087
- ], 4)) : ((ne = _.control) == null ? void 0 : ne.type) === "radio" ? (h(), p("span", {
2088
- key: 2,
2089
- class: Ie(["ctrl-options", { "ctrl-options--vertical": ((ie = (ce = _.control.extension) == null ? void 0 : ce.elementAttributes) == null ? void 0 : ie.layout) === "vertical" }])
2090
- }, [
2091
- (h(!0), p(J, null, le(_.control.valueSets || [], (T, Q) => (h(), p("label", {
2092
- key: Q,
2093
- class: "ctrl-option"
2094
- }, [
2095
- re("input", {
2096
- type: "radio",
2097
- disabled: "",
2098
- checked: _.control.code === T.code
2099
- }, null, 8, Ki),
2100
- Re(te(T.value), 1)
2101
- ]))), 128))
2102
- ], 2)) : ge("", !0)
2103
- ], 64)) : _.type === "checkbox" ? (h(), p("input", {
2104
- key: 4,
2105
- type: "checkbox",
2106
- checked: !!((he = _.checkbox) != null && he.value),
2107
- disabled: "",
2108
- class: "el-check"
2109
- }, null, 8, qi)) : _.type === "radio" ? (h(), p("input", {
2110
- key: 5,
2111
- type: "radio",
2112
- checked: !!((se = _.radio) != null && se.value),
2113
- disabled: "",
2114
- class: "el-check"
2115
- }, null, 8, Wi)) : _.type === "superscript" ? (h(), p("sup", {
2116
- key: 6,
2117
- style: K(b(_))
2118
- }, te(_.value), 5)) : _.type === "subscript" ? (h(), p("sub", {
2119
- key: 7,
2120
- style: K(b(_))
2121
- }, te(_.value), 5)) : ge("", !0)
2122
- ], 64);
2123
- }), 128))
2124
- ], 4)) : ge("", !0)
2125
- ], 64))), 128))
2126
- ], 12, zi))), 128))
2127
- ], 4))), 128))
2128
- ])
2129
- ], 6)
2130
- ], 4)
2131
- ], 6)) : ge("", !0)
2132
- ];
2133
- }),
2134
- _: 1
2135
- })
2136
- ]),
2137
- _: 1
2138
- }, 8, ["data"]))
2139
- ])
2140
- ]));
2141
- }
2142
- }, Gi = /* @__PURE__ */ De(Ui, [["__scopeId", "data-v-47bd659d"]]), $t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
2143
- function Je(i = 10) {
2144
- const e = crypto.getRandomValues(new Uint8Array(i));
2145
- return Array.from(e).map((t) => $t[t % $t.length]).join("");
2146
- }
2147
- class Ye {
2148
- constructor(e) {
2149
- j(this, "data");
2150
- this.data = Bt({
2151
- id: Je(),
2152
- version: 1,
2153
- sections: [this.createEmptySection()],
2154
- pageWidth: 595,
2155
- pageHeight: 842,
2156
- marginTop: 72,
2157
- marginBottom: 72,
2158
- marginLeft: 90,
2159
- marginRight: 90,
2160
- ...e
2161
- });
2162
- }
2163
- // ─── 工厂方法 ─────────────────────────────────────────────────────────────
2164
- createEmptySection() {
2165
- return {
2166
- id: Je(),
2167
- paragraphs: [this.createEmptyParagraph()]
2168
- };
2169
- }
2170
- createEmptyParagraph(e) {
2171
- return {
2172
- id: Je(),
2173
- type: "paragraph",
2174
- format: e ?? {},
2175
- children: []
2176
- };
2177
- }
2178
- createTextElement(e, t) {
2179
- return {
2180
- id: Je(),
2181
- type: "text",
2182
- value: e,
2183
- format: t ?? {}
2184
- };
2185
- }
2186
- // ─── 查询方法 ─────────────────────────────────────────────────────────────
2187
- getSectionCount() {
2188
- return this.data.sections.length;
2189
- }
2190
- getParagraphCount(e = 0) {
2191
- var t;
2192
- return ((t = this.data.sections[e]) == null ? void 0 : t.paragraphs.length) ?? 0;
2193
- }
2194
- /** 获取所有段落(展开所有 section) */
2195
- getAllParagraphs() {
2196
- const e = [];
2197
- return this.data.sections.forEach((t, l) => {
2198
- t.paragraphs.forEach((o, d) => {
2199
- e.push({ paragraph: o, sectionIndex: l, paragraphIndex: d });
2200
- });
2201
- }), e;
2202
- }
2203
- getParagraphAt(e, t) {
2204
- var l;
2205
- return ((l = this.data.sections[e]) == null ? void 0 : l.paragraphs[t]) ?? null;
2206
- }
2207
- getElementAt(e) {
2208
- const t = this.getParagraphAt(e.sectionIndex, e.paragraphIndex);
2209
- return (t == null ? void 0 : t.children[e.elementIndex]) ?? null;
2210
- }
2211
- // ─── 原子修改方法(由 Command 调用)─────────────────────────────────────
2212
- /** 在指定位置插入文本(拆分/合并 text element) */
2213
- insertText(e, t, l) {
2214
- const o = this.getParagraphAt(e.sectionIndex, e.paragraphIndex);
2215
- if (!o) return;
2216
- const d = o.children[e.elementIndex];
2217
- if (d && d.type === "text")
2218
- d.value = d.value.slice(0, e.offset) + t + d.value.slice(e.offset);
2219
- else {
2220
- const A = this.createTextElement(t, l);
2221
- o.children.splice(e.elementIndex, 0, A);
2222
- }
2223
- this.bumpVersion();
2224
- }
2225
- /** 删除指定范围内容 */
2226
- deleteAt(e, t) {
2227
- const l = this.getParagraphAt(e.sectionIndex, e.paragraphIndex);
2228
- if (!l) return;
2229
- const o = l.children[e.elementIndex];
2230
- !o || o.type !== "text" || (o.value = o.value.slice(0, e.offset) + o.value.slice(e.offset + t), o.value === "" && l.children.splice(e.elementIndex, 1), this.bumpVersion());
2231
- }
2232
- /** 在段落后插入新段落 */
2233
- insertParagraph(e, t, l) {
2234
- const o = this.data.sections[e];
2235
- if (!o) throw new Error(`Section ${e} not found`);
2236
- const d = this.createEmptyParagraph(l);
2237
- return o.paragraphs.splice(t + 1, 0, d), this.bumpVersion(), d;
2238
- }
2239
- /** 合并两个相邻段落 */
2240
- mergeParagraphs(e, t) {
2241
- const l = this.data.sections[e];
2242
- if (!l) return;
2243
- const o = l.paragraphs[t], d = l.paragraphs[t + 1];
2244
- !o || !d || (o.children.push(...d.children), l.paragraphs.splice(t + 1, 1), this.bumpVersion());
2245
- }
2246
- /** 更新段落格式 */
2247
- updateParagraphFormat(e, t, l) {
2248
- const o = this.getParagraphAt(e, t);
2249
- o && (o.format = { ...o.format, ...l }, this.bumpVersion());
2250
- }
2251
- /** 更新元素格式 */
2252
- updateElementFormat(e, t) {
2253
- const l = this.getElementAt(e);
2254
- l && (l.format = { ...l.format, ...t }, this.bumpVersion());
2255
- }
2256
- /** 批量更新选区内元素格式 */
2257
- updateRangeFormat(e, t, l) {
2258
- const o = this.getAllParagraphs();
2259
- let d = !1;
2260
- for (const { paragraph: A, sectionIndex: E, paragraphIndex: N } of o) {
2261
- const P = E === e.sectionIndex && N === e.paragraphIndex, X = E === t.sectionIndex && N === t.paragraphIndex;
2262
- if (P && (d = !0), d)
2263
- for (let V = 0; V < A.children.length; V++) {
2264
- const q = A.children[V];
2265
- if (!(P && V < e.elementIndex)) {
2266
- if (X && V > t.elementIndex) break;
2267
- q.format = { ...q.format, ...l };
2268
- }
2269
- }
2270
- if (X) break;
2271
- }
2272
- this.bumpVersion();
2273
- }
2274
- bumpVersion() {
2275
- this.data.version++;
2276
- }
2277
- /** 序列化为 JSON */
2278
- toJSON() {
2279
- return JSON.stringify(this.data, null, 2);
2280
- }
2281
- /** 从 JSON 恢复 */
2282
- static fromJSON(e) {
2283
- const t = JSON.parse(e), l = new Ye();
2284
- return Object.assign(l.data, t), l;
2285
- }
2286
- }
2287
- function Te(i = 0, e = 0, t = 0, l = 0) {
2288
- return { sectionIndex: i, paragraphIndex: e, elementIndex: t, offset: l };
2289
- }
2290
- function Lt(i, e) {
2291
- return i.sectionIndex === e.sectionIndex && i.paragraphIndex === e.paragraphIndex && i.elementIndex === e.elementIndex && i.offset === e.offset;
2292
- }
2293
- class st {
2294
- constructor(e) {
2295
- j(this, "_selection", Bt({
2296
- anchor: Te(),
2297
- focus: Te(),
2298
- isCollapsed: !0
2299
- }));
2300
- j(this, "_docModel");
2301
- /** 是否有选区(非光标) */
2302
- j(this, "hasSelection", ke(() => !this._selection.isCollapsed));
2303
- this._docModel = e;
2304
- }
2305
- get selection() {
2306
- return this._selection;
2307
- }
2308
- // ─── 设置选区 ─────────────────────────────────────────────────────────────
2309
- setCursor(e) {
2310
- this._selection.anchor = { ...e }, this._selection.focus = { ...e }, this._selection.isCollapsed = !0;
2311
- }
2312
- setSelection(e, t) {
2313
- this._selection.anchor = { ...e }, this._selection.focus = { ...t }, this._selection.isCollapsed = Lt(e, t);
2314
- }
2315
- collapse(e = !0) {
2316
- e ? this._selection.anchor = { ...this._selection.focus } : this._selection.focus = { ...this._selection.anchor }, this._selection.isCollapsed = !0;
2317
- }
2318
- selectAll() {
2319
- const e = this._docModel.data.sections, t = e[e.length - 1], l = t == null ? void 0 : t.paragraphs[t.paragraphs.length - 1], o = l == null ? void 0 : l.children[l.children.length - 1], d = (o == null ? void 0 : o.type) === "text" ? o.value.length : 0;
2320
- this._selection.anchor = Te(0, 0, 0, 0), this._selection.focus = Te(
2321
- e.length - 1,
2322
- ((t == null ? void 0 : t.paragraphs.length) ?? 1) - 1,
2323
- ((l == null ? void 0 : l.children.length) ?? 0) === 0 ? 0 : ((l == null ? void 0 : l.children.length) ?? 1) - 1,
2324
- d
2325
- ), this._selection.isCollapsed = !1;
2326
- }
2327
- // ─── 移动光标 ─────────────────────────────────────────────────────────────
2328
- /** 光标向前移动一个字符 */
2329
- moveForward(e = !1) {
2330
- const t = this._selection.focus, l = this._docModel.getParagraphAt(t.sectionIndex, t.paragraphIndex);
2331
- if (!l) return;
2332
- const o = l.children[t.elementIndex];
2333
- if ((o == null ? void 0 : o.type) === "text" && t.offset < o.value.length) {
2334
- const A = { ...t, offset: t.offset + 1 };
2335
- this._applyMove(A, e);
2336
- return;
2337
- }
2338
- if (t.elementIndex < l.children.length - 1) {
2339
- const A = { ...t, elementIndex: t.elementIndex + 1, offset: 0 };
2340
- this._applyMove(A, e);
2341
- return;
2342
- }
2343
- const d = this._getNextParagraphPoint(t);
2344
- d && this._applyMove(d, e);
2345
- }
2346
- /** 光标向后移动一个字符 */
2347
- moveBackward(e = !1) {
2348
- const t = this._selection.focus;
2349
- if (t.offset > 0) {
2350
- const o = { ...t, offset: t.offset - 1 };
2351
- this._applyMove(o, e);
2352
- return;
2353
- }
2354
- if (t.elementIndex > 0) {
2355
- const o = this._docModel.getParagraphAt(t.sectionIndex, t.paragraphIndex), d = o == null ? void 0 : o.children[t.elementIndex - 1], A = (d == null ? void 0 : d.type) === "text" ? d.value.length : 0, E = { ...t, elementIndex: t.elementIndex - 1, offset: A };
2356
- this._applyMove(E, e);
2357
- return;
2358
- }
2359
- const l = this._getPrevParagraphPoint(t);
2360
- l && this._applyMove(l, e);
2361
- }
2362
- _applyMove(e, t) {
2363
- t ? (this._selection.focus = e, this._selection.isCollapsed = Lt(this._selection.anchor, e)) : (this._selection.anchor = { ...e }, this._selection.focus = { ...e }, this._selection.isCollapsed = !0);
2364
- }
2365
- _getNextParagraphPoint(e) {
2366
- const t = this._docModel.data.sections[e.sectionIndex];
2367
- return t ? e.paragraphIndex < t.paragraphs.length - 1 ? Te(e.sectionIndex, e.paragraphIndex + 1, 0, 0) : e.sectionIndex < this._docModel.data.sections.length - 1 ? Te(e.sectionIndex + 1, 0, 0, 0) : null : null;
2368
- }
2369
- _getPrevParagraphPoint(e) {
2370
- if (e.paragraphIndex > 0) {
2371
- const t = this._docModel.getParagraphAt(e.sectionIndex, e.paragraphIndex - 1);
2372
- if (!t) return null;
2373
- const l = t.children.length - 1, o = t.children[l], d = (o == null ? void 0 : o.type) === "text" ? o.value.length : 0;
2374
- return Te(e.sectionIndex, e.paragraphIndex - 1, Math.max(l, 0), d);
2375
- }
2376
- if (e.sectionIndex > 0) {
2377
- const t = this._docModel.data.sections[e.sectionIndex - 1];
2378
- if (!t) return null;
2379
- const l = t.paragraphs.length - 1, o = t.paragraphs[l], d = ((o == null ? void 0 : o.children.length) ?? 0) - 1, A = o == null ? void 0 : o.children[d], E = (A == null ? void 0 : A.type) === "text" ? A.value.length : 0;
2380
- return Te(e.sectionIndex - 1, l, Math.max(d, 0), E);
2381
- }
2382
- return null;
2383
- }
2384
- // ─── DOM 坐标 <-> 模型坐标转换 ───────────────────────────────────────────
2385
- /**
2386
- * 从 DOM element 的 data-* 属性解析模型坐标
2387
- * 渲染时每个元素需附带 data-si/data-pi/data-ei 属性
2388
- */
2389
- static domToModelPoint(e, t) {
2390
- let l = e instanceof Element ? e : e.parentElement;
2391
- for (; l; ) {
2392
- const o = l.getAttribute("data-si"), d = l.getAttribute("data-pi"), A = l.getAttribute("data-ei");
2393
- if (o !== null && d !== null && A !== null)
2394
- return {
2395
- sectionIndex: parseInt(o),
2396
- paragraphIndex: parseInt(d),
2397
- elementIndex: parseInt(A),
2398
- offset: t
2399
- };
2400
- l = l.parentElement;
2401
- }
2402
- return null;
2403
- }
2404
- }
2405
- const Ji = 200;
2406
- class Xi {
2407
- constructor() {
2408
- j(this, "_undoStack", []);
2409
- j(this, "_redoStack", []);
2410
- }
2411
- get canUndo() {
2412
- return this._undoStack.length > 0;
2413
- }
2414
- get canRedo() {
2415
- return this._redoStack.length > 0;
2416
- }
2417
- /**
2418
- * 推入命令(执行后调用)
2419
- * 支持合并连续同类命令(如连续输入文字)
2420
- */
2421
- push(e) {
2422
- var l, o;
2423
- this._redoStack = [];
2424
- const t = this._undoStack[this._undoStack.length - 1];
2425
- if (t && ((l = e.canMergeWith) != null && l.call(e, t))) {
2426
- (o = t.merge) == null || o.call(t, e);
2427
- return;
2428
- }
2429
- this._undoStack.push(e), this._undoStack.length > Ji && this._undoStack.shift();
2430
- }
2431
- undo() {
2432
- const e = this._undoStack.pop();
2433
- return e ? (e.undo(), this._redoStack.push(e), !0) : !1;
2434
- }
2435
- redo() {
2436
- const e = this._redoStack.pop();
2437
- return e ? (e.execute(), this._undoStack.push(e), !0) : !1;
2438
- }
2439
- clear() {
2440
- this._undoStack = [], this._redoStack = [];
2441
- }
2442
- }
2443
- class Yi {
2444
- constructor(e, t, l, o, d) {
2445
- j(this, "name", "insertText");
2446
- j(this, "_point");
2447
- j(this, "_text");
2448
- j(this, "_format");
2449
- this.docModel = e, this.selectionManager = t, this._point = { ...l }, this._text = o, this._format = d;
2450
- }
2451
- execute() {
2452
- this.docModel.insertText(this._point, this._text, this._format), this.selectionManager.setCursor({
2453
- ...this._point,
2454
- offset: this._point.offset + this._text.length
2455
- });
2456
- }
2457
- undo() {
2458
- this.docModel.deleteAt(this._point, this._text.length), this.selectionManager.setCursor(this._point);
2459
- }
2460
- canMergeWith(e) {
2461
- if (e.name !== "insertText") return !1;
2462
- const t = e;
2463
- return t._point.sectionIndex === this._point.sectionIndex && t._point.paragraphIndex === this._point.paragraphIndex && t._point.elementIndex === this._point.elementIndex && t._point.offset === this._point.offset + this._text.length;
2464
- }
2465
- merge(e) {
2466
- const t = e;
2467
- this._text += t._text;
2468
- }
2469
- }
2470
- class Zi {
2471
- constructor(e, t) {
2472
- j(this, "name", "insertParagraph");
2473
- j(this, "_insertedParagraphId", null);
2474
- this.docModel = e, this.selectionManager = t;
2475
- }
2476
- execute() {
2477
- var N, P;
2478
- const { focus: e } = this.selectionManager.selection, { sectionIndex: t, paragraphIndex: l } = e, o = this.docModel.getParagraphAt(t, l);
2479
- if (!o) return;
2480
- const d = e.elementIndex, A = o.children.splice(d), E = this.docModel.createEmptyParagraph(o.format);
2481
- E.children.push(...A), this._insertedParagraphId = E.id, this.docModel.data.sections[t].paragraphs.splice(l + 1, 0, E), (P = (N = this.docModel).bumpVersion) == null || P.call(N), this.selectionManager.setCursor({
2482
- sectionIndex: t,
2483
- paragraphIndex: l + 1,
2484
- elementIndex: 0,
2485
- offset: 0
2486
- });
2487
- }
2488
- undo() {
2489
- const { focus: e } = this.selectionManager.selection, { sectionIndex: t, paragraphIndex: l } = e;
2490
- l !== 0 && (this.docModel.mergeParagraphs(t, l - 1), this.selectionManager.setCursor({
2491
- sectionIndex: t,
2492
- paragraphIndex: l - 1,
2493
- elementIndex: 0,
2494
- offset: 0
2495
- }));
2496
- }
2497
- }
2498
- class Rt {
2499
- constructor(e, t, l) {
2500
- j(this, "name");
2501
- j(this, "_deletedText", "");
2502
- this.docModel = e, this.selectionManager = t, this.name = l === "backward" ? "deleteBackward" : "deleteForward";
2503
- }
2504
- execute() {
2505
- const { focus: e, isCollapsed: t } = this.selectionManager.selection;
2506
- if (t)
2507
- if (this.name === "deleteBackward")
2508
- if (e.offset > 0) {
2509
- const l = { ...e, offset: e.offset - 1 }, o = this.docModel.getElementAt(e);
2510
- (o == null ? void 0 : o.type) === "text" && (this._deletedText = o.value[e.offset - 1] ?? ""), this.docModel.deleteAt(l, 1), this.selectionManager.setCursor(l);
2511
- } else (e.paragraphIndex > 0 || e.elementIndex > 0) && (this.docModel.mergeParagraphs(e.sectionIndex, e.paragraphIndex - 1), this.selectionManager.setCursor({
2512
- ...e,
2513
- paragraphIndex: e.paragraphIndex - 1
2514
- }));
2515
- else {
2516
- const l = this.docModel.getElementAt(e);
2517
- if ((l == null ? void 0 : l.type) === "text" && e.offset < l.value.length)
2518
- this._deletedText = l.value[e.offset], this.docModel.deleteAt(e, 1);
2519
- else {
2520
- const o = this.docModel.data.sections[e.sectionIndex];
2521
- o && e.paragraphIndex < o.paragraphs.length - 1 && this.docModel.mergeParagraphs(e.sectionIndex, e.paragraphIndex);
2522
- }
2523
- }
2524
- }
2525
- undo() {
2526
- if (this._deletedText) {
2527
- const { focus: e } = this.selectionManager.selection;
2528
- this.docModel.insertText(e, this._deletedText);
2529
- }
2530
- }
2531
- }
2532
- class He {
2533
- constructor(e, t, l, o) {
2534
- j(this, "name");
2535
- j(this, "_prevFormat", {});
2536
- this.docModel = e, this.selectionManager = t, this._value = o, this.name = l;
2537
- }
2538
- execute() {
2539
- const { anchor: e, focus: t } = this.selectionManager.selection, l = this._getFormatKey();
2540
- if (!l) return;
2541
- const o = {};
2542
- if (this._isToggle()) {
2543
- const d = this._getCurrentValue(l);
2544
- o[l] = !d;
2545
- } else
2546
- o[l] = this._value;
2547
- this.docModel.updateRangeFormat(e, t, o);
2548
- }
2549
- undo() {
2550
- const { anchor: e, focus: t } = this.selectionManager.selection;
2551
- this.docModel.updateRangeFormat(e, t, this._prevFormat);
2552
- }
2553
- _isToggle() {
2554
- return ["bold", "italic", "underline", "strikethrough", "superscript", "subscript"].includes(this.name);
2555
- }
2556
- _getFormatKey() {
2557
- return {
2558
- bold: "bold",
2559
- italic: "italic",
2560
- underline: "underline",
2561
- strikethrough: "strikethrough",
2562
- fontSize: "fontSize",
2563
- fontFamily: "fontFamily",
2564
- color: "color",
2565
- backgroundColor: "backgroundColor"
2566
- }[this.name] ?? null;
2567
- }
2568
- _getCurrentValue(e) {
2569
- var o;
2570
- const { focus: t } = this.selectionManager.selection, l = this.docModel.getElementAt(t);
2571
- return (o = l == null ? void 0 : l.format) == null ? void 0 : o[e];
2572
- }
2573
- }
2574
- class ot {
2575
- constructor(e, t, l, o) {
2576
- j(this, "name", "textAlign");
2577
- this.docModel = e, this.selectionManager = t, this._formatKey = l, this._value = o;
2578
- }
2579
- execute() {
2580
- const { focus: e } = this.selectionManager.selection, t = {};
2581
- t[this._formatKey] = this._value, this.docModel.updateParagraphFormat(e.sectionIndex, e.paragraphIndex, t);
2582
- }
2583
- undo() {
2584
- }
2585
- }
2586
- class Qi {
2587
- constructor(e, t, l) {
2588
- j(this, "_factories", /* @__PURE__ */ new Map());
2589
- this.docModel = e, this.selectionManager = t, this.historyManager = l, this._registerBuiltinCommands();
2590
- }
2591
- // ─── 注册内置命令 ─────────────────────────────────────────────────────────
2592
- _registerBuiltinCommands() {
2593
- this.register("insertText", (t) => {
2594
- const { focus: l } = this.selectionManager.selection;
2595
- return new Yi(this.docModel, this.selectionManager, l, t);
2596
- }), this.register("insertParagraph", () => new Zi(this.docModel, this.selectionManager)), this.register("deleteBackward", () => new Rt(this.docModel, this.selectionManager, "backward")), this.register("deleteForward", () => new Rt(this.docModel, this.selectionManager, "forward")), this.register("undo", () => null), this.register("redo", () => null), ["bold", "italic", "underline", "strikethrough", "superscript", "subscript"].forEach((t) => {
2597
- this.register(t, () => new He(this.docModel, this.selectionManager, t));
2598
- }), this.register("fontSize", (t) => new He(this.docModel, this.selectionManager, "fontSize", t)), this.register("fontFamily", (t) => new He(this.docModel, this.selectionManager, "fontFamily", t)), this.register("color", (t) => new He(this.docModel, this.selectionManager, "color", t)), this.register("backgroundColor", (t) => new He(this.docModel, this.selectionManager, "backgroundColor", t)), this.register("textAlign", (t) => new ot(this.docModel, this.selectionManager, "textAlign", t)), this.register("lineHeight", (t) => new ot(this.docModel, this.selectionManager, "lineHeight", t)), this.register("heading", (t) => new ot(this.docModel, this.selectionManager, "heading", t)), this.register("selectAll", () => (this.selectionManager.selectAll(), null)), this.register("setSelection", (t) => {
2599
- if (t) {
2600
- const l = t;
2601
- this.selectionManager.setSelection(l.anchor, l.focus);
2602
- }
2603
- return null;
2604
- });
2605
- }
2606
- // ─── 公共 API ─────────────────────────────────────────────────────────────
2607
- register(e, t) {
2608
- this._factories.set(e, t);
2609
- }
2610
- exec(e, t) {
2611
- if (e === "undo") {
2612
- this.historyManager.undo();
2613
- return;
2614
- }
2615
- if (e === "redo") {
2616
- this.historyManager.redo();
2617
- return;
2618
- }
2619
- const l = this._factories.get(e);
2620
- if (!l) {
2621
- console.warn(`[CommandManager] 未注册命令: ${e}`);
2622
- return;
2623
- }
2624
- const o = l(t);
2625
- o && (o.execute(), this.historyManager.push(o));
2626
- }
2627
- }
2628
- class ea {
2629
- constructor(e, t) {
2630
- j(this, "_el", null);
2631
- j(this, "_commandManager");
2632
- j(this, "_selectionManager");
2633
- j(this, "_composing", !1);
2634
- // 正在 IME 输入中
2635
- j(this, "_boundKeydown");
2636
- j(this, "_boundBeforeInput");
2637
- j(this, "_boundCompositionStart");
2638
- j(this, "_boundCompositionEnd");
2639
- j(this, "_boundSelectionChange");
2640
- this._commandManager = e, this._selectionManager = t, this._boundKeydown = this._onKeydown.bind(this), this._boundBeforeInput = this._onBeforeInput.bind(this), this._boundCompositionStart = () => {
2641
- this._composing = !0;
2642
- }, this._boundCompositionEnd = this._onCompositionEnd.bind(this), this._boundSelectionChange = this._onSelectionChange.bind(this);
2643
- }
2644
- attach(e) {
2645
- this._el = e, e.addEventListener("keydown", this._boundKeydown), e.addEventListener("beforeinput", this._boundBeforeInput), e.addEventListener("compositionstart", this._boundCompositionStart), e.addEventListener("compositionend", this._boundCompositionEnd), document.addEventListener("selectionchange", this._boundSelectionChange);
2646
- }
2647
- detach() {
2648
- this._el && (this._el.removeEventListener("keydown", this._boundKeydown), this._el.removeEventListener("beforeinput", this._boundBeforeInput), this._el.removeEventListener("compositionstart", this._boundCompositionStart), this._el.removeEventListener("compositionend", this._boundCompositionEnd), document.removeEventListener("selectionchange", this._boundSelectionChange), this._el = null);
2649
- }
2650
- // ─── 事件处理 ─────────────────────────────────────────────────────────────
2651
- _onKeydown(e) {
2652
- const t = e.key, l = e.ctrlKey || e.metaKey, o = e.shiftKey;
2653
- if (l)
2654
- switch (t) {
2655
- case "z":
2656
- e.preventDefault(), o ? this._commandManager.exec("redo") : this._commandManager.exec("undo");
2657
- return;
2658
- case "b":
2659
- e.preventDefault(), this._commandManager.exec("bold");
2660
- return;
2661
- case "i":
2662
- e.preventDefault(), this._commandManager.exec("italic");
2663
- return;
2664
- case "u":
2665
- e.preventDefault(), this._commandManager.exec("underline");
2666
- return;
2667
- case "a":
2668
- e.preventDefault(), this._commandManager.exec("selectAll");
2669
- return;
2670
- }
2671
- switch (t) {
2672
- case "Enter":
2673
- e.preventDefault(), this._composing || this._commandManager.exec("insertParagraph");
2674
- break;
2675
- case "Backspace":
2676
- e.preventDefault(), this._composing || this._commandManager.exec("deleteBackward");
2677
- break;
2678
- case "Delete":
2679
- e.preventDefault(), this._composing || this._commandManager.exec("deleteForward");
2680
- break;
2681
- case "ArrowLeft":
2682
- e.preventDefault(), this._selectionManager.moveBackward(o);
2683
- break;
2684
- case "ArrowRight":
2685
- e.preventDefault(), this._selectionManager.moveForward(o);
2686
- break;
2687
- case "Tab":
2688
- e.preventDefault(), this._commandManager.exec("insertText", " ");
2689
- break;
2690
- }
2691
- }
2692
- _onBeforeInput(e) {
2693
- e.preventDefault(), !this._composing && e.data && this._commandManager.exec("insertText", e.data);
2694
- }
2695
- _onCompositionEnd(e) {
2696
- this._composing = !1, e.data && this._commandManager.exec("insertText", e.data);
2697
- }
2698
- _onSelectionChange() {
2699
- const e = window.getSelection();
2700
- if (!e || !this._el) return;
2701
- const t = e.anchorNode, l = e.focusNode;
2702
- if (!t || !l || !this._el.contains(t) && !this._el.contains(l)) return;
2703
- const o = st.domToModelPoint(t, e.anchorOffset), d = st.domToModelPoint(l, e.focusOffset);
2704
- o && d && this._selectionManager.setSelection(o, d);
2705
- }
2706
- }
2707
- class ta {
2708
- constructor(e = {}) {
2709
- j(this, "docModel");
2710
- j(this, "selection");
2711
- j(this, "history");
2712
- j(this, "commands");
2713
- j(this, "input");
2714
- j(this, "_readonly");
2715
- j(this, "_plugins", []);
2716
- j(this, "_inputEl", null);
2717
- var t;
2718
- this._readonly = e.readonly ?? !1, this.docModel = new Ye(e.initialDocument), this.selection = new st(this.docModel), this.history = new Xi(), this.commands = new Qi(this.docModel, this.selection, this.history), this.input = new ea(this.commands, this.selection), (t = e.plugins) == null || t.forEach((l) => this.use(l));
2719
- }
2720
- // ─── 公共 API ─────────────────────────────────────────────────────────────
2721
- /**
2722
- * 执行命令(外部调用入口)
2723
- * @example editor.exec('bold')
2724
- * @example editor.exec('fontSize', 18)
2725
- * @example editor.exec('insertText', 'hello')
2726
- */
2727
- exec(e, t) {
2728
- if (this._readonly && !this._isReadCommand(e)) {
2729
- console.warn("[Editor] 只读模式,忽略写操作");
2730
- return;
2731
- }
2732
- this.commands.exec(e, t);
2733
- }
2734
- /** 挂载输入层到指定 DOM 元素 */
2735
- mount(e) {
2736
- this._inputEl = e, this._readonly || this.input.attach(e);
2737
- }
2738
- /** 卸载输入层 */
2739
- unmount() {
2740
- this.input.detach(), this._inputEl = null;
2741
- }
2742
- /** 安装插件 */
2743
- use(e) {
2744
- return this._plugins.find((t) => t.name === e.name) ? (console.warn(`[Editor] 插件 ${e.name} 已安装`), this) : (e.install(this), this._plugins.push(e), this);
2745
- }
2746
- /** 获取序列化后的文档 JSON */
2747
- getJSON() {
2748
- return this.docModel.toJSON();
2749
- }
2750
- /** 从 JSON 加载文档(清空历史) */
2751
- loadJSON(e) {
2752
- const t = Ye.fromJSON(e);
2753
- Object.assign(this.docModel.data, t.data), this.history.clear();
2754
- }
2755
- get isReadonly() {
2756
- return this._readonly;
2757
- }
2758
- _isReadCommand(e) {
2759
- return ["undo", "redo", "selectAll", "setSelection"].includes(e);
2760
- }
2761
- }
2762
- const Nt = Symbol("editor");
2763
- function sa(i) {
2764
- const e = new ta(i);
2765
- return vn(Nt, e), Ze(() => {
2766
- e.unmount();
2767
- }), e;
2768
- }
2769
- function ra() {
2770
- const i = mn(Nt);
2771
- if (!i)
2772
- throw new Error("[useEditor] 必须在 EditorContainer 组件内使用");
2773
- return i;
2774
- }
2775
- const na = Gi, ca = {
2776
- install(i) {
2777
- i.component("EditorContainer", na);
2778
- }
2779
- };
2780
- export {
2781
- ta as Editor,
2782
- na as EditorContainer,
2783
- Nt as EditorKey,
2784
- sa as createEditor,
2785
- ca as default,
2786
- ra as useEditor
2787
- };