@bireturn/word-editor 1.0.4 → 1.0.6

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