@bireturn/word-editor 1.0.3 → 1.0.4

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