@hyebook/vue3-adapter 2.3.9 → 2.3.10
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.
- package/dist/core/src/player/ebook-player.d.ts +16 -0
- package/dist/core/src/player/ebook-player.d.ts.map +1 -1
- package/dist/core/src/player/ebook-player.js +225 -22
- package/dist/core/src/player/engine.d.ts +2 -1
- package/dist/core/src/player/engine.d.ts.map +1 -1
- package/dist/core/src/player/engine.js +29 -0
- package/dist/core/src/types/player.d.ts +5 -0
- package/dist/core/src/types/player.d.ts.map +1 -1
- package/dist/core/src/workbench/editor-workbench.d.ts +4 -0
- package/dist/core/src/workbench/editor-workbench.d.ts.map +1 -1
- package/dist/core/src/workbench/editor-workbench.js +311 -84
- package/package.json +1 -1
|
@@ -8,6 +8,10 @@ export declare class EBookPlayer implements EBookPlayerHandle {
|
|
|
8
8
|
private root;
|
|
9
9
|
private content;
|
|
10
10
|
private selectionToolbar;
|
|
11
|
+
private loadWarning;
|
|
12
|
+
private loadWarningToggleBtn;
|
|
13
|
+
private loadWarningCloseBtn;
|
|
14
|
+
private loadWarningMessage;
|
|
11
15
|
private highlightBtn;
|
|
12
16
|
private toolbarDivider;
|
|
13
17
|
private noteBtn;
|
|
@@ -22,6 +26,8 @@ export declare class EBookPlayer implements EBookPlayerHandle {
|
|
|
22
26
|
private readonly preserveSelectionOnToolbarMouseDownBound;
|
|
23
27
|
private readonly handleHighlightClickBound;
|
|
24
28
|
private readonly handleNoteClickBound;
|
|
29
|
+
private readonly handleLoadWarningToggleBound;
|
|
30
|
+
private readonly handleLoadWarningCloseBound;
|
|
25
31
|
constructor(container: HTMLElement, options: EBookPlayerOptions);
|
|
26
32
|
load(doc?: EbookDoc): Promise<EbookDoc>;
|
|
27
33
|
destroy(): void;
|
|
@@ -39,6 +45,7 @@ export declare class EBookPlayer implements EBookPlayerHandle {
|
|
|
39
45
|
updateNote(noteId: string, patch: Partial<Omit<ReaderNote, "id" | "bookId" | "createdAt">>, source?: "api" | "user"): Promise<ReaderNote | null>;
|
|
40
46
|
deleteNote(noteId: string, source?: "api" | "user"): Promise<boolean>;
|
|
41
47
|
setBookmark(options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user"): Promise<ReaderBookmark | null>;
|
|
48
|
+
updateBookmark(bookmarkId: string, options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user"): Promise<ReaderBookmark | null>;
|
|
42
49
|
deleteBookmark(bookmarkId: string, source?: "api" | "user"): Promise<boolean>;
|
|
43
50
|
goToHighlight(highlightId: string): number | null;
|
|
44
51
|
goToNote(noteId: string): number | null;
|
|
@@ -80,6 +87,10 @@ export declare class EBookPlayer implements EBookPlayerHandle {
|
|
|
80
87
|
private getBoundaryOffsetInContainer;
|
|
81
88
|
private getRangeTextByOffsets;
|
|
82
89
|
private hideSelectionToolbar;
|
|
90
|
+
private showLoadWarning;
|
|
91
|
+
private hideLoadWarning;
|
|
92
|
+
private toggleLoadWarning;
|
|
93
|
+
private setLoadWarningExpanded;
|
|
83
94
|
private clearSelection;
|
|
84
95
|
private handleDocumentPointerDown;
|
|
85
96
|
private preserveSelectionOnToolbarMouseDown;
|
|
@@ -93,9 +104,14 @@ export declare class EBookPlayer implements EBookPlayerHandle {
|
|
|
93
104
|
private normalizeBookmarkContent;
|
|
94
105
|
private resolveCurrentBlockFromScroll;
|
|
95
106
|
private extractBlockDataset;
|
|
107
|
+
private findBlockNode;
|
|
96
108
|
private scrollToBlock;
|
|
97
109
|
private getCurrentScrollTop;
|
|
98
110
|
private scrollToStoredPosition;
|
|
111
|
+
private scrollToNodeWithTopOffset;
|
|
112
|
+
private focusAfterJump;
|
|
113
|
+
private deferFocus;
|
|
114
|
+
private playFocusAnimation;
|
|
99
115
|
private resolveScrollHost;
|
|
100
116
|
private isWindowScrollHost;
|
|
101
117
|
private escapeSelectorValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ebook-player.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/ebook-player.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,QAAQ,EAST,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,iBAAiB,EAEjB,kBAAkB,EAClB,6BAA6B,EAI7B,2BAA2B,EAC3B,2BAA2B,EAC3B,iBAAiB,EACjB,4BAA4B,EAC5B,2BAA2B,EAC3B,cAAc,EACd,eAAe,EACf,UAAU,EAGX,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ebook-player.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/ebook-player.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { PlayerEngine } from "./engine";
|
|
2
2
|
const EBOOK_PLAYER_STYLE_ID = "hy-ebook-lite-player-style";
|
|
3
|
-
const EBOOK_PLAYER_STYLE_VERSION = "0.2.
|
|
3
|
+
const EBOOK_PLAYER_STYLE_VERSION = "0.2.1";
|
|
4
|
+
const JUMP_SCROLL_FOCUS_DELAY_MS = 360;
|
|
5
|
+
const JUMP_FOCUS_ANIMATION_MS = 560;
|
|
6
|
+
const BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX = 28;
|
|
4
7
|
const HIGHLIGHT_ICON_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3 22V12.5H6V8.5H18V12.5H21V22H3Z" stroke="#333333" stroke-width="2" stroke-linejoin="round"/><path d="M8.5 8.5V4L15.5 2V8.5" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
|
|
5
8
|
const NOTE_ICON_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.4998 4.49951L19.4998 8.4995" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M3.99977 15.9995L17.9997 2L21.9998 5.9995L7.99975 19.9995L2.99976 20.9995L3.99977 15.9995Z" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M4.49976 15.9995L7.99975 19.4995" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.49976 17.4995L17.4998 6.4995" stroke="#333333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
|
|
6
9
|
const BOOKMARK_ICON_SVG = `<svg width="30" height="40" viewBox="0 0 30 40" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0 3C0 1.34315 1.34315 0 3 0H27C28.6569 0 30 1.34315 30 3V38.1989C30 38.9837 29.1374 39.4627 28.4713 39.0477L15 30.6562L1.52873 39.0477C0.862627 39.4627 0 38.9837 0 38.1989L0 3Z" fill="#4FCEBB"/></svg>`;
|
|
@@ -8,6 +11,15 @@ const EBOOK_PLAYER_CSS = `
|
|
|
8
11
|
.hyepl-root{position:relative;max-width:100%;margin:0 auto;color:#0f172a;font-size:14px;line-height:1.7}
|
|
9
12
|
.hyepl-root ::selection{background:#7DE2D3}
|
|
10
13
|
.hyepl-root ::-moz-selection{background:#7DE2D3}
|
|
14
|
+
.hyepl-load-warning{position:absolute;top:12px;right:12px;z-index:10080;max-width:min(420px,calc(100% - 24px));display:none;border:1px solid #f5c2c7;background:#fff5f5;color:#7f1d1d;border-radius:10px;box-shadow:0 10px 24px rgba(15,23,42,.12);padding:8px 10px}
|
|
15
|
+
.hyepl-load-warning.show{display:block}
|
|
16
|
+
.hyepl-load-warning-header{display:flex;align-items:center;gap:8px}
|
|
17
|
+
.hyepl-load-warning-title{font-size:12px;font-weight:600;line-height:1.4}
|
|
18
|
+
.hyepl-load-warning-actions{margin-left:auto;display:inline-flex;align-items:center;gap:6px}
|
|
19
|
+
.hyepl-load-warning-btn{border:1px solid #f1b3b3;background:#fff;color:#7f1d1d;border-radius:6px;height:24px;padding:0 8px;font-size:12px;line-height:1;cursor:pointer}
|
|
20
|
+
.hyepl-load-warning-close{width:24px;padding:0}
|
|
21
|
+
.hyepl-load-warning-message{margin:8px 0 0;font-size:12px;line-height:1.5;color:#7f1d1d;white-space:pre-wrap;word-break:break-word;display:none;max-height:180px;overflow:auto}
|
|
22
|
+
.hyepl-load-warning.expanded .hyepl-load-warning-message{display:block}
|
|
11
23
|
.hyepl-content{position:relative}
|
|
12
24
|
.hyepl-page{margin:0 0 16px}
|
|
13
25
|
.hyepl-page:last-child{margin-bottom:0}
|
|
@@ -48,6 +60,25 @@ const EBOOK_PLAYER_CSS = `
|
|
|
48
60
|
.hyepl-toolbar-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px}
|
|
49
61
|
.hyepl-toolbar-icon svg{display:block;width:24px;height:24px}
|
|
50
62
|
.hyepl-toolbar-text{font-size:14px;font-weight:700;color:#111827}
|
|
63
|
+
|
|
64
|
+
.hyepl-jump-focus{animation:hyepl-jump-focus 560ms ease-out}
|
|
65
|
+
.hyepl-jump-focus-mark{animation:hyepl-jump-focus-mark 560ms ease-out}
|
|
66
|
+
|
|
67
|
+
@keyframes hyepl-jump-focus{
|
|
68
|
+
0%{filter:none;box-shadow:0 0 0 0 rgba(125,226,211,0)}
|
|
69
|
+
35%{filter:brightness(1.08);box-shadow:0 0 0 4px rgba(125,226,211,.24)}
|
|
70
|
+
100%{filter:none;box-shadow:0 0 0 0 rgba(125,226,211,0)}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@keyframes hyepl-jump-focus-mark{
|
|
74
|
+
0%{opacity:1;filter:none}
|
|
75
|
+
35%{opacity:.72;filter:brightness(1.2)}
|
|
76
|
+
100%{opacity:1;filter:none}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@media (prefers-reduced-motion:reduce){
|
|
80
|
+
.hyepl-jump-focus,.hyepl-jump-focus-mark{animation:none}
|
|
81
|
+
}
|
|
51
82
|
`;
|
|
52
83
|
export class EBookPlayer {
|
|
53
84
|
constructor(container, options) {
|
|
@@ -73,6 +104,12 @@ export class EBookPlayer {
|
|
|
73
104
|
this.handleNoteClickBound = () => {
|
|
74
105
|
void this.handleNoteClick();
|
|
75
106
|
};
|
|
107
|
+
this.handleLoadWarningToggleBound = () => {
|
|
108
|
+
this.toggleLoadWarning();
|
|
109
|
+
};
|
|
110
|
+
this.handleLoadWarningCloseBound = () => {
|
|
111
|
+
this.hideLoadWarning();
|
|
112
|
+
};
|
|
76
113
|
this.container = container;
|
|
77
114
|
this.options = options;
|
|
78
115
|
const runtimeProvider = createRuntimeProvider(options.provider, () => this.runtimeDocument);
|
|
@@ -87,6 +124,31 @@ export class EBookPlayer {
|
|
|
87
124
|
this.content.className = "hyepl-content";
|
|
88
125
|
this.selectionToolbar = document.createElement("div");
|
|
89
126
|
this.selectionToolbar.className = "hyepl-selection-toolbar";
|
|
127
|
+
this.loadWarning = document.createElement("div");
|
|
128
|
+
this.loadWarning.className = "hyepl-load-warning";
|
|
129
|
+
const loadWarningHeader = document.createElement("div");
|
|
130
|
+
loadWarningHeader.className = "hyepl-load-warning-header";
|
|
131
|
+
const loadWarningTitle = document.createElement("span");
|
|
132
|
+
loadWarningTitle.className = "hyepl-load-warning-title";
|
|
133
|
+
loadWarningTitle.textContent = "加载数据异常";
|
|
134
|
+
const loadWarningActions = document.createElement("div");
|
|
135
|
+
loadWarningActions.className = "hyepl-load-warning-actions";
|
|
136
|
+
this.loadWarningToggleBtn = document.createElement("button");
|
|
137
|
+
this.loadWarningToggleBtn.type = "button";
|
|
138
|
+
this.loadWarningToggleBtn.className = "hyepl-load-warning-btn";
|
|
139
|
+
this.loadWarningCloseBtn = document.createElement("button");
|
|
140
|
+
this.loadWarningCloseBtn.type = "button";
|
|
141
|
+
this.loadWarningCloseBtn.className =
|
|
142
|
+
"hyepl-load-warning-btn hyepl-load-warning-close";
|
|
143
|
+
this.loadWarningCloseBtn.textContent = "×";
|
|
144
|
+
this.loadWarningCloseBtn.title = "关闭";
|
|
145
|
+
this.loadWarningCloseBtn.setAttribute("aria-label", "关闭加载异常提示");
|
|
146
|
+
this.loadWarningMessage = document.createElement("pre");
|
|
147
|
+
this.loadWarningMessage.className = "hyepl-load-warning-message";
|
|
148
|
+
loadWarningActions.append(this.loadWarningToggleBtn, this.loadWarningCloseBtn);
|
|
149
|
+
loadWarningHeader.append(loadWarningTitle, loadWarningActions);
|
|
150
|
+
this.loadWarning.append(loadWarningHeader, this.loadWarningMessage);
|
|
151
|
+
this.setLoadWarningExpanded(false);
|
|
90
152
|
this.highlightBtn = document.createElement("button");
|
|
91
153
|
this.highlightBtn.type = "button";
|
|
92
154
|
this.highlightBtn.className = "hyepl-toolbar-btn";
|
|
@@ -101,13 +163,15 @@ export class EBookPlayer {
|
|
|
101
163
|
this.setToolbarButtonContent(this.noteBtn, NOTE_ICON_SVG, this.selectionOptions.noteButtonText);
|
|
102
164
|
this.noteBtn.setAttribute("aria-label", this.selectionOptions.noteButtonText);
|
|
103
165
|
this.selectionToolbar.append(this.highlightBtn, this.toolbarDivider, this.noteBtn);
|
|
104
|
-
this.root.append(this.content, this.selectionToolbar);
|
|
166
|
+
this.root.append(this.content, this.selectionToolbar, this.loadWarning);
|
|
105
167
|
this.container.innerHTML = "";
|
|
106
168
|
this.container.append(this.root);
|
|
107
169
|
this.highlightBtn.addEventListener("mousedown", this.preserveSelectionOnToolbarMouseDownBound);
|
|
108
170
|
this.noteBtn.addEventListener("mousedown", this.preserveSelectionOnToolbarMouseDownBound);
|
|
109
171
|
this.highlightBtn.addEventListener("click", this.handleHighlightClickBound);
|
|
110
172
|
this.noteBtn.addEventListener("click", this.handleNoteClickBound);
|
|
173
|
+
this.loadWarningToggleBtn.addEventListener("click", this.handleLoadWarningToggleBound);
|
|
174
|
+
this.loadWarningCloseBtn.addEventListener("click", this.handleLoadWarningCloseBound);
|
|
111
175
|
document.addEventListener("selectionchange", this.handleSelectionChangeBound);
|
|
112
176
|
document.addEventListener("pointerdown", this.handleDocumentPointerDownBound);
|
|
113
177
|
window.addEventListener("scroll", this.handleSelectionRepositionBound, true);
|
|
@@ -117,16 +181,23 @@ export class EBookPlayer {
|
|
|
117
181
|
if (doc) {
|
|
118
182
|
this.runtimeDocument = cloneEbookDoc(doc);
|
|
119
183
|
}
|
|
120
|
-
|
|
121
|
-
|
|
184
|
+
try {
|
|
185
|
+
if (!this.options.provider && !this.runtimeDocument) {
|
|
186
|
+
throw new Error("Provider is not configured. Call load(doc) when using EBookPlayer without provider.");
|
|
187
|
+
}
|
|
188
|
+
const loadedDoc = await this.engine.load();
|
|
189
|
+
this.loaded = true;
|
|
190
|
+
if (this.options.initialAnnotations) {
|
|
191
|
+
await this.engine.setAnnotations(this.options.initialAnnotations, "api");
|
|
192
|
+
}
|
|
193
|
+
this.renderDocument();
|
|
194
|
+
this.hideLoadWarning();
|
|
195
|
+
return loadedDoc;
|
|
122
196
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
await this.engine.setAnnotations(this.options.initialAnnotations, "api");
|
|
197
|
+
catch (error) {
|
|
198
|
+
this.showLoadWarning(error);
|
|
199
|
+
throw error;
|
|
127
200
|
}
|
|
128
|
-
this.renderDocument();
|
|
129
|
-
return loadedDoc;
|
|
130
201
|
}
|
|
131
202
|
destroy() {
|
|
132
203
|
if (this.destroyed) {
|
|
@@ -142,6 +213,8 @@ export class EBookPlayer {
|
|
|
142
213
|
this.noteBtn.removeEventListener("mousedown", this.preserveSelectionOnToolbarMouseDownBound);
|
|
143
214
|
this.highlightBtn.removeEventListener("click", this.handleHighlightClickBound);
|
|
144
215
|
this.noteBtn.removeEventListener("click", this.handleNoteClickBound);
|
|
216
|
+
this.loadWarningToggleBtn.removeEventListener("click", this.handleLoadWarningToggleBound);
|
|
217
|
+
this.loadWarningCloseBtn.removeEventListener("click", this.handleLoadWarningCloseBound);
|
|
145
218
|
if (this.root.parentNode === this.container) {
|
|
146
219
|
this.container.removeChild(this.root);
|
|
147
220
|
}
|
|
@@ -236,6 +309,31 @@ export class EBookPlayer {
|
|
|
236
309
|
this.renderDocument();
|
|
237
310
|
return bookmark;
|
|
238
311
|
}
|
|
312
|
+
async updateBookmark(bookmarkId, options = {}, source = "api") {
|
|
313
|
+
this.ensureLoaded();
|
|
314
|
+
const current = this.engine
|
|
315
|
+
.getBookmarks()
|
|
316
|
+
.find((item) => item.id === bookmarkId);
|
|
317
|
+
if (!current) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
let content = null;
|
|
321
|
+
if (typeof options.content === "string" && options.content.trim()) {
|
|
322
|
+
content = this.normalizeBookmarkContent(options.content);
|
|
323
|
+
}
|
|
324
|
+
else if (options.prompt === false) {
|
|
325
|
+
throw new Error("Bookmark content is required when prompt is disabled.");
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
content = this.promptTextWithLimit("请输入书签内容", current.content || "", this.inputLimits.bookmarkMaxLength);
|
|
329
|
+
}
|
|
330
|
+
if (content === null) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
const updated = await this.engine.updateBookmark(bookmarkId, { content }, source);
|
|
334
|
+
this.renderDocument();
|
|
335
|
+
return updated;
|
|
336
|
+
}
|
|
239
337
|
async deleteBookmark(bookmarkId, source = "api") {
|
|
240
338
|
this.ensureLoaded();
|
|
241
339
|
const deleted = await this.engine.deleteBookmark(bookmarkId, source);
|
|
@@ -254,7 +352,13 @@ export class EBookPlayer {
|
|
|
254
352
|
if (pageIndex === null) {
|
|
255
353
|
return null;
|
|
256
354
|
}
|
|
257
|
-
this.scrollToBlock(target.pageId, target.blockId);
|
|
355
|
+
const blockNode = this.scrollToBlock(target.pageId, target.blockId);
|
|
356
|
+
const selector = `mark.hyepl-highlight[data-highlight-id="${this.escapeSelectorValue(highlightId)}"]`;
|
|
357
|
+
this.focusAfterJump({
|
|
358
|
+
selector,
|
|
359
|
+
focusClass: "hyepl-jump-focus-mark",
|
|
360
|
+
fallbackNode: blockNode,
|
|
361
|
+
});
|
|
258
362
|
return pageIndex;
|
|
259
363
|
}
|
|
260
364
|
goToNote(noteId) {
|
|
@@ -267,7 +371,13 @@ export class EBookPlayer {
|
|
|
267
371
|
if (pageIndex === null) {
|
|
268
372
|
return null;
|
|
269
373
|
}
|
|
270
|
-
this.scrollToBlock(target.pageId, target.blockId);
|
|
374
|
+
const blockNode = this.scrollToBlock(target.pageId, target.blockId);
|
|
375
|
+
const selector = `mark.hyepl-note[data-note-id="${this.escapeSelectorValue(noteId)}"]`;
|
|
376
|
+
this.focusAfterJump({
|
|
377
|
+
selector,
|
|
378
|
+
focusClass: "hyepl-jump-focus-mark",
|
|
379
|
+
fallbackNode: blockNode,
|
|
380
|
+
});
|
|
271
381
|
return pageIndex;
|
|
272
382
|
}
|
|
273
383
|
goToBookmark(bookmarkId) {
|
|
@@ -282,11 +392,30 @@ export class EBookPlayer {
|
|
|
282
392
|
if (pageIndex === null) {
|
|
283
393
|
return null;
|
|
284
394
|
}
|
|
395
|
+
const bookmarkSelector = `.hyepl-bookmark-flag[data-bookmark-id="${this.escapeSelectorValue(bookmarkId)}"]`;
|
|
396
|
+
const bookmarkNode = this.content.querySelector(bookmarkSelector);
|
|
397
|
+
const fallbackNode = this.findBlockNode(target.pageId, target.blockId);
|
|
285
398
|
if (Number.isFinite(target.scrollTop)) {
|
|
286
|
-
this.scrollToStoredPosition(target.scrollTop);
|
|
399
|
+
this.scrollToStoredPosition(target.scrollTop - BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX);
|
|
400
|
+
this.focusAfterJump({
|
|
401
|
+
selector: bookmarkSelector,
|
|
402
|
+
fallbackNode,
|
|
403
|
+
});
|
|
287
404
|
return pageIndex;
|
|
288
405
|
}
|
|
289
|
-
|
|
406
|
+
if (bookmarkNode) {
|
|
407
|
+
this.scrollToNodeWithTopOffset(bookmarkNode, BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX);
|
|
408
|
+
}
|
|
409
|
+
else if (fallbackNode) {
|
|
410
|
+
this.scrollToNodeWithTopOffset(fallbackNode, BOOKMARK_JUMP_REVEAL_TOP_OFFSET_PX);
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
this.scrollToBlock(target.pageId, target.blockId);
|
|
414
|
+
}
|
|
415
|
+
this.focusAfterJump({
|
|
416
|
+
selector: bookmarkSelector,
|
|
417
|
+
fallbackNode,
|
|
418
|
+
});
|
|
290
419
|
return pageIndex;
|
|
291
420
|
}
|
|
292
421
|
onAnnotationCreate(listener) {
|
|
@@ -681,6 +810,7 @@ export class EBookPlayer {
|
|
|
681
810
|
}
|
|
682
811
|
const mark = document.createElement("mark");
|
|
683
812
|
mark.className = "hyepl-highlight";
|
|
813
|
+
mark.dataset.highlightId = item.id;
|
|
684
814
|
if (item.color) {
|
|
685
815
|
mark.style.setProperty("--hyepl-highlight-color", item.color);
|
|
686
816
|
}
|
|
@@ -995,6 +1125,22 @@ export class EBookPlayer {
|
|
|
995
1125
|
this.selectionToolbar.classList.remove("show");
|
|
996
1126
|
this.selectionDraft = null;
|
|
997
1127
|
}
|
|
1128
|
+
showLoadWarning(error) {
|
|
1129
|
+
this.loadWarningMessage.textContent = resolveErrorMessage(error, "未知加载错误");
|
|
1130
|
+
this.loadWarning.classList.add("show");
|
|
1131
|
+
this.setLoadWarningExpanded(false);
|
|
1132
|
+
}
|
|
1133
|
+
hideLoadWarning() {
|
|
1134
|
+
this.loadWarning.classList.remove("show");
|
|
1135
|
+
this.setLoadWarningExpanded(false);
|
|
1136
|
+
}
|
|
1137
|
+
toggleLoadWarning() {
|
|
1138
|
+
this.setLoadWarningExpanded(!this.loadWarning.classList.contains("expanded"));
|
|
1139
|
+
}
|
|
1140
|
+
setLoadWarningExpanded(expanded) {
|
|
1141
|
+
this.loadWarning.classList.toggle("expanded", expanded);
|
|
1142
|
+
this.loadWarningToggleBtn.textContent = expanded ? "收起" : "详情";
|
|
1143
|
+
}
|
|
998
1144
|
clearSelection() {
|
|
999
1145
|
window.getSelection()?.removeAllRanges();
|
|
1000
1146
|
}
|
|
@@ -1220,15 +1366,18 @@ export class EBookPlayer {
|
|
|
1220
1366
|
}
|
|
1221
1367
|
return { pageId, blockId };
|
|
1222
1368
|
}
|
|
1223
|
-
|
|
1369
|
+
findBlockNode(pageId, blockId) {
|
|
1224
1370
|
const page = this.escapeSelectorValue(pageId);
|
|
1225
1371
|
const block = this.escapeSelectorValue(blockId);
|
|
1226
|
-
|
|
1372
|
+
return this.content.querySelector(`[data-page-id="${page}"][data-block-id="${block}"]`);
|
|
1373
|
+
}
|
|
1374
|
+
scrollToBlock(pageId, blockId, behavior = "smooth") {
|
|
1375
|
+
const node = this.findBlockNode(pageId, blockId);
|
|
1227
1376
|
if (!node) {
|
|
1228
|
-
return
|
|
1377
|
+
return null;
|
|
1229
1378
|
}
|
|
1230
|
-
node.scrollIntoView({ block: "start" });
|
|
1231
|
-
return
|
|
1379
|
+
node.scrollIntoView({ block: "start", behavior });
|
|
1380
|
+
return node;
|
|
1232
1381
|
}
|
|
1233
1382
|
getCurrentScrollTop() {
|
|
1234
1383
|
const scrollHost = this.resolveScrollHost();
|
|
@@ -1237,14 +1386,59 @@ export class EBookPlayer {
|
|
|
1237
1386
|
}
|
|
1238
1387
|
return Math.max(0, Math.floor(scrollHost.scrollTop || 0));
|
|
1239
1388
|
}
|
|
1240
|
-
scrollToStoredPosition(scrollTop) {
|
|
1389
|
+
scrollToStoredPosition(scrollTop, behavior = "smooth") {
|
|
1241
1390
|
const safeTop = Math.max(0, Math.floor(scrollTop || 0));
|
|
1242
1391
|
const scrollHost = this.resolveScrollHost();
|
|
1243
1392
|
if (this.isWindowScrollHost(scrollHost)) {
|
|
1244
|
-
window.scrollTo({ top: safeTop, behavior
|
|
1393
|
+
window.scrollTo({ top: safeTop, behavior });
|
|
1245
1394
|
return;
|
|
1246
1395
|
}
|
|
1247
|
-
scrollHost.scrollTo({ top: safeTop, behavior
|
|
1396
|
+
scrollHost.scrollTo({ top: safeTop, behavior });
|
|
1397
|
+
}
|
|
1398
|
+
scrollToNodeWithTopOffset(node, topOffset, behavior = "smooth") {
|
|
1399
|
+
const safeOffset = Math.max(0, Math.floor(topOffset || 0));
|
|
1400
|
+
const scrollHost = this.resolveScrollHost();
|
|
1401
|
+
if (this.isWindowScrollHost(scrollHost)) {
|
|
1402
|
+
const absoluteTop = node.getBoundingClientRect().top + window.scrollY;
|
|
1403
|
+
const targetTop = Math.max(0, Math.floor(absoluteTop - safeOffset));
|
|
1404
|
+
window.scrollTo({ top: targetTop, behavior });
|
|
1405
|
+
return;
|
|
1406
|
+
}
|
|
1407
|
+
const hostRect = scrollHost.getBoundingClientRect();
|
|
1408
|
+
const relativeTop = node.getBoundingClientRect().top - hostRect.top + scrollHost.scrollTop;
|
|
1409
|
+
const targetTop = Math.max(0, Math.floor(relativeTop - safeOffset));
|
|
1410
|
+
scrollHost.scrollTo({ top: targetTop, behavior });
|
|
1411
|
+
}
|
|
1412
|
+
focusAfterJump(options) {
|
|
1413
|
+
const { selector, focusClass = "hyepl-jump-focus", fallbackNode = null, } = options;
|
|
1414
|
+
this.deferFocus(() => {
|
|
1415
|
+
const matched = Array.from(this.content.querySelectorAll(selector));
|
|
1416
|
+
if (matched.length) {
|
|
1417
|
+
this.playFocusAnimation(matched, focusClass);
|
|
1418
|
+
return;
|
|
1419
|
+
}
|
|
1420
|
+
if (fallbackNode) {
|
|
1421
|
+
this.playFocusAnimation([fallbackNode], "hyepl-jump-focus");
|
|
1422
|
+
}
|
|
1423
|
+
});
|
|
1424
|
+
}
|
|
1425
|
+
deferFocus(task) {
|
|
1426
|
+
window.setTimeout(task, JUMP_SCROLL_FOCUS_DELAY_MS);
|
|
1427
|
+
}
|
|
1428
|
+
playFocusAnimation(nodes, className = "hyepl-jump-focus") {
|
|
1429
|
+
const seen = new Set();
|
|
1430
|
+
for (const node of nodes) {
|
|
1431
|
+
if (!node || !this.content.contains(node) || seen.has(node)) {
|
|
1432
|
+
continue;
|
|
1433
|
+
}
|
|
1434
|
+
seen.add(node);
|
|
1435
|
+
node.classList.remove(className);
|
|
1436
|
+
void node.offsetWidth;
|
|
1437
|
+
node.classList.add(className);
|
|
1438
|
+
window.setTimeout(() => {
|
|
1439
|
+
node.classList.remove(className);
|
|
1440
|
+
}, JUMP_FOCUS_ANIMATION_MS + 40);
|
|
1441
|
+
}
|
|
1248
1442
|
}
|
|
1249
1443
|
resolveScrollHost() {
|
|
1250
1444
|
let current = this.container;
|
|
@@ -1397,3 +1591,12 @@ function escapeHtml(value) {
|
|
|
1397
1591
|
function escapeAttribute(value) {
|
|
1398
1592
|
return escapeHtml(value);
|
|
1399
1593
|
}
|
|
1594
|
+
function resolveErrorMessage(error, fallback = "未知错误") {
|
|
1595
|
+
if (error instanceof Error && error.message) {
|
|
1596
|
+
return error.message;
|
|
1597
|
+
}
|
|
1598
|
+
if (typeof error === "string" && error.trim()) {
|
|
1599
|
+
return error.trim();
|
|
1600
|
+
}
|
|
1601
|
+
return fallback;
|
|
1602
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EbookDoc } from "../types/ebook";
|
|
2
|
-
import type { ReaderAnnotationCreateEvent, ReaderAnnotationDeleteEvent, ReaderAnnotations, ReaderAnnotationsChangeEvent, ReaderAnnotationUpdateEvent, ReaderBookmark, ReaderHighlight, PlayerDataProvider, PlayerEngineOptions, PlayerFeatures, ReaderNote, ReaderProgress } from "../types/player";
|
|
2
|
+
import type { ReaderAnnotationCreateEvent, ReaderAnnotationDeleteEvent, ReaderAnnotations, ReaderAnnotationsChangeEvent, ReaderAnnotationUpdateEvent, ReaderBookmark, ReaderBookmarkPatch, ReaderHighlight, PlayerDataProvider, PlayerEngineOptions, PlayerFeatures, ReaderNote, ReaderProgress } from "../types/player";
|
|
3
3
|
export interface PlayerState {
|
|
4
4
|
currentPage: number;
|
|
5
5
|
zoom: number;
|
|
@@ -49,6 +49,7 @@ export declare class PlayerEngine {
|
|
|
49
49
|
updateNote(noteId: string, patch: Partial<Omit<ReaderNote, "id" | "bookId" | "createdAt">>, source?: "api" | "user"): Promise<ReaderNote | null>;
|
|
50
50
|
deleteNote(noteId: string, source?: "api" | "user"): Promise<boolean>;
|
|
51
51
|
setBookmark(pageId: string, blockId: string, content: string, source?: "api" | "user", scrollTop?: number): Promise<ReaderBookmark>;
|
|
52
|
+
updateBookmark(bookmarkId: string, patch: ReaderBookmarkPatch, source?: "api" | "user"): Promise<ReaderBookmark | null>;
|
|
52
53
|
deleteBookmark(bookmarkId: string, source?: "api" | "user"): Promise<boolean>;
|
|
53
54
|
onAnnotationCreate(listener: AnnotationCreateListener): () => void;
|
|
54
55
|
onAnnotationUpdate(listener: AnnotationUpdateListener): () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../../core/src/player/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -308,6 +308,35 @@ export class PlayerEngine {
|
|
|
308
308
|
this.emitAnnotationCreate("bookmark", nextBookmark, source);
|
|
309
309
|
return clone(nextBookmark);
|
|
310
310
|
}
|
|
311
|
+
async updateBookmark(bookmarkId, patch, source = "api") {
|
|
312
|
+
const index = this.state.bookmarks.findIndex((item) => item.id === bookmarkId);
|
|
313
|
+
if (index < 0) {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
const current = this.state.bookmarks[index];
|
|
317
|
+
if (!current) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const rawContent = patch.content;
|
|
321
|
+
const hasContent = typeof rawContent === "string";
|
|
322
|
+
const nextContent = hasContent ? rawContent.trim() : current.content;
|
|
323
|
+
if (!nextContent) {
|
|
324
|
+
throw new Error("Bookmark content cannot be empty.");
|
|
325
|
+
}
|
|
326
|
+
const nextScrollTop = Number.isFinite(patch.scrollTop)
|
|
327
|
+
? Math.max(0, Math.floor(patch.scrollTop))
|
|
328
|
+
: current.scrollTop;
|
|
329
|
+
const nextBookmark = {
|
|
330
|
+
...current,
|
|
331
|
+
...(hasContent ? { content: nextContent } : {}),
|
|
332
|
+
...(nextScrollTop !== undefined ? { scrollTop: nextScrollTop } : {}),
|
|
333
|
+
updatedAt: Date.now(),
|
|
334
|
+
};
|
|
335
|
+
this.state.bookmarks[index] = nextBookmark;
|
|
336
|
+
await this.persistAnnotations();
|
|
337
|
+
this.emitAnnotationUpdate("bookmark", current, nextBookmark, source);
|
|
338
|
+
return clone(nextBookmark);
|
|
339
|
+
}
|
|
311
340
|
async deleteBookmark(bookmarkId, source = "api") {
|
|
312
341
|
const index = this.state.bookmarks.findIndex((item) => item.id === bookmarkId);
|
|
313
342
|
if (index < 0) {
|
|
@@ -50,6 +50,10 @@ export interface ReaderBookmark {
|
|
|
50
50
|
createdAt: number;
|
|
51
51
|
updatedAt: number;
|
|
52
52
|
}
|
|
53
|
+
export interface ReaderBookmarkPatch {
|
|
54
|
+
content?: string;
|
|
55
|
+
scrollTop?: number;
|
|
56
|
+
}
|
|
53
57
|
export interface ReaderAnnotations {
|
|
54
58
|
highlights: ReaderHighlight[];
|
|
55
59
|
notes: ReaderNote[];
|
|
@@ -143,6 +147,7 @@ export interface EBookPlayerHandle {
|
|
|
143
147
|
updateNote: (noteId: string, patch: Partial<Omit<ReaderNote, "id" | "bookId" | "createdAt">>, source?: "api" | "user") => Promise<ReaderNote | null>;
|
|
144
148
|
deleteNote: (noteId: string, source?: "api" | "user") => Promise<boolean>;
|
|
145
149
|
setBookmark: (options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user") => Promise<ReaderBookmark | null>;
|
|
150
|
+
updateBookmark: (bookmarkId: string, options?: EBookPlayerSetBookmarkOptions, source?: "api" | "user") => Promise<ReaderBookmark | null>;
|
|
146
151
|
deleteBookmark: (bookmarkId: string, source?: "api" | "user") => Promise<boolean>;
|
|
147
152
|
goToHighlight: (highlightId: string) => number | null;
|
|
148
153
|
goToNote: (noteId: string) => number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../../../../core/src/types/player.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../../../../core/src/types/player.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,8 @@ export interface EditorWorkbenchOptions {
|
|
|
23
23
|
export interface EditorWorkbenchFullscreenOptions {
|
|
24
24
|
exitButtonText?: string;
|
|
25
25
|
}
|
|
26
|
+
export type EditorWorkbenchExtensionActionPlacement = "header" | "toolbar";
|
|
27
|
+
export type EditorWorkbenchExtensionActionVisibility = "editor" | "fullscreen" | "always";
|
|
26
28
|
export interface EditorWorkbenchExtensionActionContext {
|
|
27
29
|
getDocument: () => EbookDoc;
|
|
28
30
|
isFullscreen: () => boolean;
|
|
@@ -36,6 +38,8 @@ export interface EditorWorkbenchExtensionActionButton {
|
|
|
36
38
|
color?: string;
|
|
37
39
|
textColor?: string;
|
|
38
40
|
borderColor?: string;
|
|
41
|
+
placement?: EditorWorkbenchExtensionActionPlacement;
|
|
42
|
+
visibility?: EditorWorkbenchExtensionActionVisibility;
|
|
39
43
|
onClick?: (context: EditorWorkbenchExtensionActionContext, event: MouseEvent) => void | Promise<void>;
|
|
40
44
|
}
|
|
41
45
|
export interface EditorWorkbenchExtensionOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-workbench.d.ts","sourceRoot":"","sources":["../../../../../core/src/workbench/editor-workbench.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,QAAQ,EAKR,kBAAkB,EAWnB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"editor-workbench.d.ts","sourceRoot":"","sources":["../../../../../core/src/workbench/editor-workbench.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { addPageCommand } from "../editor/commands";
|
|
2
2
|
import { EditorEngine } from "../editor/engine";
|
|
3
3
|
const WORKBENCH_STYLE_ID = "hy-ebook-workbench-style";
|
|
4
|
-
const WORKBENCH_STYLE_VERSION = "0.3.
|
|
4
|
+
const WORKBENCH_STYLE_VERSION = "0.3.1";
|
|
5
5
|
const WORKBENCH_CSS = `
|
|
6
6
|
.hyewb-root{font-family:"Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;color:#0f172a;background:#f8fbff;border:1px solid #d8e0ea;border-radius:12px;padding:12px;display:grid;gap:10px;position:relative;--hyewb-top-shield-height:0px}
|
|
7
7
|
.hyewb-root::before{content:"";position:absolute;left:0;right:0;top:0;height:var(--hyewb-top-shield-height);background:#f8fbff;z-index:10030;pointer-events:none}
|
|
@@ -138,6 +138,15 @@ const WORKBENCH_CSS = `
|
|
|
138
138
|
.hyewb-media-handle[data-handle="w"]{left:-6px;top:calc(50% - 5px);cursor:ew-resize}
|
|
139
139
|
.hyewb-media-list{margin:0;padding-left:18px;color:#334155;font-size:13px;display:grid;gap:4px}
|
|
140
140
|
.hyewb-status{font-size:12px;color:#475569}
|
|
141
|
+
.hyewb-load-warning{position:absolute;top:12px;right:12px;z-index:10090;max-width:min(420px,calc(100% - 24px));display:none;border:1px solid #f5c2c7;background:#fff5f5;color:#7f1d1d;border-radius:10px;box-shadow:0 10px 24px rgba(15,23,42,.12);padding:8px 10px}
|
|
142
|
+
.hyewb-load-warning.show{display:block}
|
|
143
|
+
.hyewb-load-warning-header{display:flex;align-items:center;gap:8px}
|
|
144
|
+
.hyewb-load-warning-title{font-size:12px;font-weight:600;line-height:1.4}
|
|
145
|
+
.hyewb-load-warning-actions{margin-left:auto;display:inline-flex;align-items:center;gap:6px}
|
|
146
|
+
.hyewb-load-warning-btn{border:1px solid #f1b3b3;background:#fff;color:#7f1d1d;border-radius:6px;height:24px;padding:0 8px;font-size:12px;line-height:1;cursor:pointer}
|
|
147
|
+
.hyewb-load-warning-close{width:24px;padding:0}
|
|
148
|
+
.hyewb-load-warning-message{margin:8px 0 0;font-size:12px;line-height:1.5;color:#7f1d1d;white-space:pre-wrap;word-break:break-word;display:none;max-height:180px;overflow:auto}
|
|
149
|
+
.hyewb-load-warning.expanded .hyewb-load-warning-message{display:block}
|
|
141
150
|
.hyewb-upload-backdrop{position:fixed;inset:0;display:none;align-items:center;justify-content:center;background:rgba(15,23,42,.45);z-index:10100;padding:16px}
|
|
142
151
|
.hyewb-upload-backdrop.show{display:flex}
|
|
143
152
|
.hyewb-upload-dialog{position:relative;width:min(520px,100%);background:#fff;border:1px solid #cbd5e1;border-radius:12px;padding:14px;display:grid;gap:10px;box-shadow:0 16px 34px rgba(15,23,42,.28)}
|
|
@@ -332,6 +341,15 @@ function resolvePreviewAnnotationOptions(options) {
|
|
|
332
341
|
},
|
|
333
342
|
};
|
|
334
343
|
}
|
|
344
|
+
function resolveExtensionActionPlacement(placement) {
|
|
345
|
+
return placement === "toolbar" ? "toolbar" : "header";
|
|
346
|
+
}
|
|
347
|
+
function resolveExtensionActionVisibility(visibility) {
|
|
348
|
+
if (visibility === "always" || visibility === "fullscreen") {
|
|
349
|
+
return visibility;
|
|
350
|
+
}
|
|
351
|
+
return "editor";
|
|
352
|
+
}
|
|
335
353
|
export function createDefaultWorkbenchDocument() {
|
|
336
354
|
const now = new Date().toISOString();
|
|
337
355
|
return {
|
|
@@ -369,54 +387,19 @@ export function createDefaultWorkbenchDocument() {
|
|
|
369
387
|
{
|
|
370
388
|
id: "text-1",
|
|
371
389
|
type: "text",
|
|
372
|
-
rect: { x: 80, y: 80, width: 620, height:
|
|
390
|
+
rect: { x: 80, y: 80, width: 620, height: 120 },
|
|
373
391
|
zIndex: 1,
|
|
374
392
|
content: {
|
|
375
393
|
paragraphs: [
|
|
376
394
|
{
|
|
377
395
|
id: "p-1",
|
|
378
|
-
type: "h1",
|
|
379
|
-
align: "left",
|
|
380
|
-
spacingBefore: 12,
|
|
381
|
-
spacingAfter: 12,
|
|
382
|
-
runs: [
|
|
383
|
-
{
|
|
384
|
-
text: "欢迎使用业务系统编辑器",
|
|
385
|
-
marks: { bold: true, fontSize: 30 },
|
|
386
|
-
},
|
|
387
|
-
],
|
|
388
|
-
},
|
|
389
|
-
{
|
|
390
|
-
id: "p-2",
|
|
391
396
|
type: "p",
|
|
392
397
|
align: "left",
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
spacingAfter: 12,
|
|
396
|
-
indent: 2,
|
|
397
|
-
inlineElements: [
|
|
398
|
-
{
|
|
399
|
-
id: "inline-image-1",
|
|
400
|
-
type: "image",
|
|
401
|
-
src: "https://picsum.photos/id/1025/1200/800",
|
|
402
|
-
alt: "Classroom",
|
|
403
|
-
width: 320,
|
|
404
|
-
},
|
|
405
|
-
],
|
|
398
|
+
spacingBefore: 0,
|
|
399
|
+
spacingAfter: 0,
|
|
406
400
|
runs: [
|
|
407
|
-
{
|
|
408
|
-
text: "该页面默认包含样式和基础编辑能力。你可以在初始化阶段通过 features 开关关闭不需要的模块。\n",
|
|
409
|
-
},
|
|
410
401
|
{
|
|
411
402
|
text: "",
|
|
412
|
-
inlineRef: "inline-image-1",
|
|
413
|
-
},
|
|
414
|
-
{
|
|
415
|
-
text: "\n图片后依然可以继续输入文字。",
|
|
416
|
-
marks: {
|
|
417
|
-
color: "#0f766e",
|
|
418
|
-
backgroundColor: "#ecfeff",
|
|
419
|
-
},
|
|
420
403
|
},
|
|
421
404
|
],
|
|
422
405
|
},
|
|
@@ -430,8 +413,16 @@ export function createDefaultWorkbenchDocument() {
|
|
|
430
413
|
}
|
|
431
414
|
export function mountEditorWorkbench(container, options = {}) {
|
|
432
415
|
ensureWorkbenchStyles();
|
|
433
|
-
|
|
434
|
-
|
|
416
|
+
let initialLoadErrorMessage = null;
|
|
417
|
+
let editor;
|
|
418
|
+
try {
|
|
419
|
+
const initialDoc = clone(options.initialDoc ?? createDefaultWorkbenchDocument());
|
|
420
|
+
editor = new EditorEngine(initialDoc);
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
initialLoadErrorMessage = resolveErrorMessage(error, "initialDoc 校验失败");
|
|
424
|
+
editor = new EditorEngine(clone(createDefaultWorkbenchDocument()));
|
|
425
|
+
}
|
|
435
426
|
const state = {
|
|
436
427
|
mode: "editor",
|
|
437
428
|
pageIndex: 0,
|
|
@@ -443,13 +434,19 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
443
434
|
const root = document.createElement("section");
|
|
444
435
|
root.className = "hyewb-root";
|
|
445
436
|
const extensionActionConfigs = Array.isArray(options.extension?.actions)
|
|
446
|
-
? options.extension.actions
|
|
437
|
+
? options.extension.actions
|
|
438
|
+
.filter((action) => {
|
|
447
439
|
return (!!action &&
|
|
448
440
|
typeof action.id === "string" &&
|
|
449
441
|
action.id.trim().length > 0 &&
|
|
450
442
|
typeof action.text === "string" &&
|
|
451
443
|
action.text.trim().length > 0);
|
|
452
444
|
})
|
|
445
|
+
.map((action) => ({
|
|
446
|
+
...action,
|
|
447
|
+
placement: resolveExtensionActionPlacement(action.placement),
|
|
448
|
+
visibility: resolveExtensionActionVisibility(action.visibility),
|
|
449
|
+
}))
|
|
453
450
|
: [];
|
|
454
451
|
const header = document.createElement("header");
|
|
455
452
|
header.className = "hyewb-header hyewb-top-control";
|
|
@@ -459,32 +456,6 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
459
456
|
const headerActions = document.createElement("div");
|
|
460
457
|
headerActions.className = "hyewb-header-actions";
|
|
461
458
|
const fullscreenBtn = createButton("fullscreen");
|
|
462
|
-
const extensionActionButtons = extensionActionConfigs.map((action) => {
|
|
463
|
-
const button = document.createElement("button");
|
|
464
|
-
button.type = "button";
|
|
465
|
-
button.className = "hyewb-btn hyewb-btn-text hyewb-header-action-btn";
|
|
466
|
-
const text = action.text.trim();
|
|
467
|
-
button.textContent = text;
|
|
468
|
-
button.title = text;
|
|
469
|
-
button.setAttribute("aria-label", text);
|
|
470
|
-
button.style.display = "none";
|
|
471
|
-
const color = typeof action.color === "string" ? action.color.trim() : "";
|
|
472
|
-
if (color) {
|
|
473
|
-
button.style.backgroundColor = color;
|
|
474
|
-
button.style.borderColor = color;
|
|
475
|
-
}
|
|
476
|
-
const textColor = typeof action.textColor === "string" ? action.textColor.trim() : "";
|
|
477
|
-
if (textColor) {
|
|
478
|
-
button.style.color = textColor;
|
|
479
|
-
}
|
|
480
|
-
const borderColor = typeof action.borderColor === "string" ? action.borderColor.trim() : "";
|
|
481
|
-
if (borderColor) {
|
|
482
|
-
button.style.borderColor = borderColor;
|
|
483
|
-
}
|
|
484
|
-
headerActions.append(button);
|
|
485
|
-
return { action, button };
|
|
486
|
-
});
|
|
487
|
-
headerActions.append(fullscreenBtn);
|
|
488
459
|
header.append(title, headerActions);
|
|
489
460
|
const toolbar = document.createElement("div");
|
|
490
461
|
toolbar.className = "hyewb-row hyewb-top-control";
|
|
@@ -607,6 +578,40 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
607
578
|
const tableAddBtn = createButton("insertTable");
|
|
608
579
|
const importDocxBtn = createButton("importDocx");
|
|
609
580
|
toolbar.append(boldBtn, italicBtn, underlineBtn, strikeBtn, superscriptBtn, subscriptBtn, headingSelect, fontSizeSelect, fontFamilySelect, textColorInput, bgColorInput, alignGroup, lineHeightField, spacingField, indentField, tableAddBtn, importDocxBtn, videoAddBtn, imageUploadBtn);
|
|
581
|
+
const extensionActionButtons = extensionActionConfigs.map((action) => {
|
|
582
|
+
const button = document.createElement("button");
|
|
583
|
+
button.type = "button";
|
|
584
|
+
button.className = "hyewb-btn hyewb-btn-text";
|
|
585
|
+
if (action.placement === "header") {
|
|
586
|
+
button.classList.add("hyewb-header-action-btn");
|
|
587
|
+
}
|
|
588
|
+
const text = action.text.trim();
|
|
589
|
+
button.textContent = text;
|
|
590
|
+
button.title = text;
|
|
591
|
+
button.setAttribute("aria-label", text);
|
|
592
|
+
button.style.display = "none";
|
|
593
|
+
const color = typeof action.color === "string" ? action.color.trim() : "";
|
|
594
|
+
if (color) {
|
|
595
|
+
button.style.backgroundColor = color;
|
|
596
|
+
button.style.borderColor = color;
|
|
597
|
+
}
|
|
598
|
+
const textColor = typeof action.textColor === "string" ? action.textColor.trim() : "";
|
|
599
|
+
if (textColor) {
|
|
600
|
+
button.style.color = textColor;
|
|
601
|
+
}
|
|
602
|
+
const borderColor = typeof action.borderColor === "string" ? action.borderColor.trim() : "";
|
|
603
|
+
if (borderColor) {
|
|
604
|
+
button.style.borderColor = borderColor;
|
|
605
|
+
}
|
|
606
|
+
if (action.placement === "toolbar") {
|
|
607
|
+
toolbar.append(button);
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
headerActions.append(button);
|
|
611
|
+
}
|
|
612
|
+
return { action, button };
|
|
613
|
+
});
|
|
614
|
+
headerActions.append(fullscreenBtn);
|
|
610
615
|
const tablePicker = document.createElement("div");
|
|
611
616
|
tablePicker.className = "hyewb-table-picker";
|
|
612
617
|
const tablePickerHint = document.createElement("div");
|
|
@@ -883,6 +888,51 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
883
888
|
const status = document.createElement("p");
|
|
884
889
|
status.className = "hyewb-status";
|
|
885
890
|
status.textContent = "已加载默认编辑器能力";
|
|
891
|
+
const loadWarning = document.createElement("div");
|
|
892
|
+
loadWarning.className = "hyewb-load-warning";
|
|
893
|
+
const loadWarningHeader = document.createElement("div");
|
|
894
|
+
loadWarningHeader.className = "hyewb-load-warning-header";
|
|
895
|
+
const loadWarningTitle = document.createElement("span");
|
|
896
|
+
loadWarningTitle.className = "hyewb-load-warning-title";
|
|
897
|
+
loadWarningTitle.textContent = "加载数据异常";
|
|
898
|
+
const loadWarningActions = document.createElement("div");
|
|
899
|
+
loadWarningActions.className = "hyewb-load-warning-actions";
|
|
900
|
+
const loadWarningToggleBtn = document.createElement("button");
|
|
901
|
+
loadWarningToggleBtn.type = "button";
|
|
902
|
+
loadWarningToggleBtn.className = "hyewb-load-warning-btn";
|
|
903
|
+
const loadWarningCloseBtn = document.createElement("button");
|
|
904
|
+
loadWarningCloseBtn.type = "button";
|
|
905
|
+
loadWarningCloseBtn.className = "hyewb-load-warning-btn hyewb-load-warning-close";
|
|
906
|
+
loadWarningCloseBtn.textContent = "×";
|
|
907
|
+
loadWarningCloseBtn.title = "关闭";
|
|
908
|
+
loadWarningCloseBtn.setAttribute("aria-label", "关闭加载异常提示");
|
|
909
|
+
const loadWarningMessage = document.createElement("pre");
|
|
910
|
+
loadWarningMessage.className = "hyewb-load-warning-message";
|
|
911
|
+
const setLoadWarningExpanded = (expanded) => {
|
|
912
|
+
loadWarning.classList.toggle("expanded", expanded);
|
|
913
|
+
loadWarningToggleBtn.textContent = expanded ? "收起" : "详情";
|
|
914
|
+
};
|
|
915
|
+
const hideLoadWarning = () => {
|
|
916
|
+
loadWarning.classList.remove("show");
|
|
917
|
+
setLoadWarningExpanded(false);
|
|
918
|
+
};
|
|
919
|
+
const showLoadWarning = (message) => {
|
|
920
|
+
loadWarningMessage.textContent = message;
|
|
921
|
+
loadWarning.classList.add("show");
|
|
922
|
+
setLoadWarningExpanded(false);
|
|
923
|
+
};
|
|
924
|
+
const handleLoadWarningToggle = () => {
|
|
925
|
+
setLoadWarningExpanded(!loadWarning.classList.contains("expanded"));
|
|
926
|
+
};
|
|
927
|
+
const handleLoadWarningClose = () => {
|
|
928
|
+
hideLoadWarning();
|
|
929
|
+
};
|
|
930
|
+
setLoadWarningExpanded(false);
|
|
931
|
+
loadWarningToggleBtn.addEventListener("click", handleLoadWarningToggle);
|
|
932
|
+
loadWarningCloseBtn.addEventListener("click", handleLoadWarningClose);
|
|
933
|
+
loadWarningActions.append(loadWarningToggleBtn, loadWarningCloseBtn);
|
|
934
|
+
loadWarningHeader.append(loadWarningTitle, loadWarningActions);
|
|
935
|
+
loadWarning.append(loadWarningHeader, loadWarningMessage);
|
|
886
936
|
const debugConfig = typeof options.debug === "object" && options.debug !== null
|
|
887
937
|
? options.debug
|
|
888
938
|
: undefined;
|
|
@@ -1002,10 +1052,14 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
1002
1052
|
const colorGrid = document.createElement("div");
|
|
1003
1053
|
colorGrid.className = "hyewb-color-grid";
|
|
1004
1054
|
colorPalette.append(colorGrid);
|
|
1005
|
-
root.append(header, toolbar, pageRow, previewLayout, colorPalette, tablePicker, tableTools, tableRowDeleteBtn, tableMoveHandle, tableScaleHandle, tableColEdgeLayer, tableRowEdgeLayer, tableRowGapInsertBtn, tableColGapInsertBtn, tableDropIndicator, tableContextMenu, uploadBackdrop, previewNoteBackdrop, docxInput, previewSelectionToolbar);
|
|
1055
|
+
root.append(header, toolbar, pageRow, previewLayout, colorPalette, tablePicker, tableTools, tableRowDeleteBtn, tableMoveHandle, tableScaleHandle, tableColEdgeLayer, tableRowEdgeLayer, tableRowGapInsertBtn, tableColGapInsertBtn, tableDropIndicator, tableContextMenu, uploadBackdrop, previewNoteBackdrop, docxInput, previewSelectionToolbar, loadWarning);
|
|
1006
1056
|
container.innerHTML = "";
|
|
1007
1057
|
root.append(floatingToolbar);
|
|
1008
1058
|
container.append(root);
|
|
1059
|
+
if (initialLoadErrorMessage) {
|
|
1060
|
+
status.textContent = `加载数据异常:${initialLoadErrorMessage}`;
|
|
1061
|
+
showLoadWarning(initialLoadErrorMessage);
|
|
1062
|
+
}
|
|
1009
1063
|
renderWorkbenchIcons();
|
|
1010
1064
|
let editorRenderKey = "";
|
|
1011
1065
|
let lastSelection = null;
|
|
@@ -1082,8 +1136,24 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
1082
1136
|
fullscreenBtn.title = ariaLabel;
|
|
1083
1137
|
fullscreenBtn.setAttribute("aria-label", ariaLabel);
|
|
1084
1138
|
fullscreenBtn.style.display = isFullscreen ? "inline-flex" : "none";
|
|
1085
|
-
|
|
1086
|
-
|
|
1139
|
+
};
|
|
1140
|
+
const shouldShowExtensionAction = (action) => {
|
|
1141
|
+
const isFullscreen = isWorkbenchFullscreen();
|
|
1142
|
+
const isEditorMode = state.mode === "editor";
|
|
1143
|
+
const visibleByRule = action.visibility === "always"
|
|
1144
|
+
? true
|
|
1145
|
+
: action.visibility === "fullscreen"
|
|
1146
|
+
? isFullscreen
|
|
1147
|
+
: isEditorMode;
|
|
1148
|
+
const visibleByPlacement = action.placement === "toolbar"
|
|
1149
|
+
? isEditorMode && state.features.textToolbar
|
|
1150
|
+
: true;
|
|
1151
|
+
return visibleByRule && visibleByPlacement;
|
|
1152
|
+
};
|
|
1153
|
+
const updateExtensionActionButtonsVisibility = () => {
|
|
1154
|
+
extensionActionButtons.forEach(({ action, button }) => {
|
|
1155
|
+
button.style.display =
|
|
1156
|
+
shouldShowExtensionAction(action) ? "inline-flex" : "none";
|
|
1087
1157
|
});
|
|
1088
1158
|
};
|
|
1089
1159
|
const updateShellViewportHeight = () => {
|
|
@@ -1123,6 +1193,7 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
1123
1193
|
};
|
|
1124
1194
|
const syncWorkbenchLayoutAfterFullscreenChange = () => {
|
|
1125
1195
|
updateFullscreenButtonState();
|
|
1196
|
+
updateExtensionActionButtonsVisibility();
|
|
1126
1197
|
updateShellViewportHeight();
|
|
1127
1198
|
updateTopControlShieldHeight();
|
|
1128
1199
|
updateInlineResizeOverlay();
|
|
@@ -3437,6 +3508,14 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
3437
3508
|
});
|
|
3438
3509
|
return container.innerHTML;
|
|
3439
3510
|
};
|
|
3511
|
+
const normalizePastedRichHtml = (html) => {
|
|
3512
|
+
const stripped = stripMediaTagsFromHtml(html);
|
|
3513
|
+
if (!stripped.trim()) {
|
|
3514
|
+
return "";
|
|
3515
|
+
}
|
|
3516
|
+
const flowBlocks = parseRichHTMLToFlowBlocks(stripped);
|
|
3517
|
+
return flowBlocksToHTML(flowBlocks);
|
|
3518
|
+
};
|
|
3440
3519
|
const createPasteAnchor = () => {
|
|
3441
3520
|
editorArea.focus();
|
|
3442
3521
|
if (!restoreSelectionRange()) {
|
|
@@ -3809,8 +3888,15 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
3809
3888
|
previewArea.classList.toggle("show", state.mode === "preview");
|
|
3810
3889
|
editorArea.style.display = state.mode === "editor" ? "block" : "none";
|
|
3811
3890
|
const showEditorControls = state.mode === "editor";
|
|
3891
|
+
const hasVisibleHeaderExtensionAction = extensionActionButtons.some(({ action }) => {
|
|
3892
|
+
return action.placement === "header" && shouldShowExtensionAction(action);
|
|
3893
|
+
});
|
|
3812
3894
|
header.style.display =
|
|
3813
|
-
showEditorControls ||
|
|
3895
|
+
showEditorControls ||
|
|
3896
|
+
isWorkbenchFullscreen() ||
|
|
3897
|
+
hasVisibleHeaderExtensionAction
|
|
3898
|
+
? "flex"
|
|
3899
|
+
: "none";
|
|
3814
3900
|
toolbar.style.display =
|
|
3815
3901
|
showEditorControls && state.features.textToolbar ? "flex" : "none";
|
|
3816
3902
|
pageRow.style.display = "none";
|
|
@@ -3829,6 +3915,7 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
3829
3915
|
hideTablePicker();
|
|
3830
3916
|
hideTableTools();
|
|
3831
3917
|
}
|
|
3918
|
+
updateExtensionActionButtonsVisibility();
|
|
3832
3919
|
updateTopControlShieldHeight();
|
|
3833
3920
|
prevPageBtn.disabled = state.pageIndex <= 0;
|
|
3834
3921
|
nextPageBtn.disabled = state.pageIndex >= state.doc.pages.length - 1;
|
|
@@ -4054,6 +4141,9 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
4054
4141
|
tableWidthInput,
|
|
4055
4142
|
tableHeightInput,
|
|
4056
4143
|
tableRowHeightInput,
|
|
4144
|
+
...extensionActionButtons
|
|
4145
|
+
.filter(({ action }) => action.placement === "toolbar")
|
|
4146
|
+
.map(({ button }) => button),
|
|
4057
4147
|
].forEach((control) => {
|
|
4058
4148
|
control.addEventListener("mousedown", preserveSelectionForInputControl);
|
|
4059
4149
|
control.addEventListener("focus", preserveSelectionForInputControl);
|
|
@@ -4215,6 +4305,25 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
4215
4305
|
if (!clipboard) {
|
|
4216
4306
|
return;
|
|
4217
4307
|
}
|
|
4308
|
+
const htmlContent = clipboard.getData("text/html");
|
|
4309
|
+
const plainContent = clipboard.getData("text/plain");
|
|
4310
|
+
const normalizedRichHtml = normalizePastedRichHtml(htmlContent);
|
|
4311
|
+
if (normalizedRichHtml.trim()) {
|
|
4312
|
+
event.preventDefault();
|
|
4313
|
+
cacheSelectionRange();
|
|
4314
|
+
const pasteAnchorId = createPasteAnchor();
|
|
4315
|
+
if (!pasteAnchorId) {
|
|
4316
|
+
status.textContent = "粘贴失败:无法定位插入位置";
|
|
4317
|
+
return;
|
|
4318
|
+
}
|
|
4319
|
+
insertHtmlBeforePasteAnchor(pasteAnchorId, normalizedRichHtml);
|
|
4320
|
+
removePasteAnchor(pasteAnchorId);
|
|
4321
|
+
syncEditorToDoc();
|
|
4322
|
+
status.textContent = "已粘贴富文本内容";
|
|
4323
|
+
updateInlineResizeOverlay();
|
|
4324
|
+
syncToolbarState();
|
|
4325
|
+
return;
|
|
4326
|
+
}
|
|
4218
4327
|
const mediaFiles = Array.from(clipboard.items)
|
|
4219
4328
|
.map((item) => item.getAsFile())
|
|
4220
4329
|
.filter((file) => {
|
|
@@ -4226,8 +4335,6 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
4226
4335
|
}
|
|
4227
4336
|
event.preventDefault();
|
|
4228
4337
|
cacheSelectionRange();
|
|
4229
|
-
const htmlContent = clipboard.getData("text/html");
|
|
4230
|
-
const plainContent = clipboard.getData("text/plain");
|
|
4231
4338
|
const pasteAnchorId = createPasteAnchor();
|
|
4232
4339
|
if (!pasteAnchorId) {
|
|
4233
4340
|
status.textContent = "粘贴失败:无法定位插入位置";
|
|
@@ -5030,6 +5137,8 @@ export function mountEditorWorkbench(container, options = {}) {
|
|
|
5030
5137
|
closeWorkbenchFullscreen();
|
|
5031
5138
|
hideTablePicker();
|
|
5032
5139
|
hideTableTools();
|
|
5140
|
+
loadWarningToggleBtn.removeEventListener("click", handleLoadWarningToggle);
|
|
5141
|
+
loadWarningCloseBtn.removeEventListener("click", handleLoadWarningClose);
|
|
5033
5142
|
document.removeEventListener("selectionchange", handleSelectionChange);
|
|
5034
5143
|
document.removeEventListener("pointermove", onMediaPointerMove);
|
|
5035
5144
|
document.removeEventListener("pointerup", onMediaPointerUp);
|
|
@@ -5202,35 +5311,108 @@ function parseRichHTMLToFlowBlocks(html, defaultTextStyle) {
|
|
|
5202
5311
|
return [createDefaultTextFlowBlock()];
|
|
5203
5312
|
}
|
|
5204
5313
|
const nodes = Array.from(root.childNodes).filter((node) => {
|
|
5205
|
-
if (node.nodeType
|
|
5206
|
-
return
|
|
5314
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
5315
|
+
return (node.nodeValue || "").trim().length > 0;
|
|
5316
|
+
}
|
|
5317
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
5318
|
+
return false;
|
|
5207
5319
|
}
|
|
5208
|
-
return (node.
|
|
5320
|
+
return !isIgnorableImportedElementTag(node.tagName);
|
|
5209
5321
|
});
|
|
5210
5322
|
if (!nodes.length) {
|
|
5211
5323
|
return [createDefaultTextFlowBlock()];
|
|
5212
5324
|
}
|
|
5213
5325
|
const result = [];
|
|
5214
|
-
|
|
5326
|
+
let flowIndex = 0;
|
|
5327
|
+
const pushParagraphIfMeaningful = (paragraph) => {
|
|
5328
|
+
if (!hasMeaningfulParagraphContent(paragraph)) {
|
|
5329
|
+
return;
|
|
5330
|
+
}
|
|
5331
|
+
result.push(createTextFlowBlock(paragraph, flowIndex));
|
|
5332
|
+
flowIndex += 1;
|
|
5333
|
+
};
|
|
5334
|
+
const pushNode = (node) => {
|
|
5215
5335
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
5336
|
+
const text = node.nodeValue || "";
|
|
5337
|
+
if (!text.trim()) {
|
|
5338
|
+
return;
|
|
5339
|
+
}
|
|
5216
5340
|
const paragraph = {
|
|
5217
|
-
id: `p-${Date.now()}-${
|
|
5341
|
+
id: `p-${Date.now()}-${flowIndex}`,
|
|
5218
5342
|
type: "p",
|
|
5219
5343
|
align: "left",
|
|
5220
|
-
runs: applyImportedDefaultTextStyle([{ text
|
|
5344
|
+
runs: applyImportedDefaultTextStyle([{ text }], defaultTextStyle),
|
|
5221
5345
|
};
|
|
5222
|
-
|
|
5346
|
+
pushParagraphIfMeaningful(paragraph);
|
|
5347
|
+
return;
|
|
5348
|
+
}
|
|
5349
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
5223
5350
|
return;
|
|
5224
5351
|
}
|
|
5225
5352
|
const element = node;
|
|
5226
5353
|
if (element.tagName === "TABLE") {
|
|
5227
|
-
result.push(parseTableElement(element,
|
|
5354
|
+
result.push(parseTableElement(element, flowIndex));
|
|
5355
|
+
flowIndex += 1;
|
|
5356
|
+
return;
|
|
5357
|
+
}
|
|
5358
|
+
const hasNestedTable = Boolean(element.querySelector("table"));
|
|
5359
|
+
if (!hasNestedTable) {
|
|
5360
|
+
pushParagraphIfMeaningful(parseElementToParagraph(element, flowIndex, defaultTextStyle));
|
|
5228
5361
|
return;
|
|
5229
5362
|
}
|
|
5230
|
-
|
|
5363
|
+
let textContainer = element.cloneNode(false);
|
|
5364
|
+
const flushTextContainer = () => {
|
|
5365
|
+
if (!hasMeaningfulElementContent(textContainer)) {
|
|
5366
|
+
textContainer = element.cloneNode(false);
|
|
5367
|
+
return;
|
|
5368
|
+
}
|
|
5369
|
+
const paragraph = parseElementToParagraph(textContainer, flowIndex, defaultTextStyle);
|
|
5370
|
+
pushParagraphIfMeaningful(paragraph);
|
|
5371
|
+
textContainer = element.cloneNode(false);
|
|
5372
|
+
};
|
|
5373
|
+
Array.from(element.childNodes).forEach((child) => {
|
|
5374
|
+
if (child.nodeType === Node.ELEMENT_NODE) {
|
|
5375
|
+
const childElement = child;
|
|
5376
|
+
if (childElement.tagName === "TABLE") {
|
|
5377
|
+
flushTextContainer();
|
|
5378
|
+
result.push(parseTableElement(childElement, flowIndex));
|
|
5379
|
+
flowIndex += 1;
|
|
5380
|
+
return;
|
|
5381
|
+
}
|
|
5382
|
+
if (childElement.querySelector("table")) {
|
|
5383
|
+
flushTextContainer();
|
|
5384
|
+
pushNode(childElement);
|
|
5385
|
+
return;
|
|
5386
|
+
}
|
|
5387
|
+
}
|
|
5388
|
+
textContainer.append(child.cloneNode(true));
|
|
5389
|
+
});
|
|
5390
|
+
flushTextContainer();
|
|
5391
|
+
};
|
|
5392
|
+
nodes.forEach((node) => {
|
|
5393
|
+
pushNode(node);
|
|
5231
5394
|
});
|
|
5232
5395
|
return result.length ? result : [createDefaultTextFlowBlock()];
|
|
5233
5396
|
}
|
|
5397
|
+
function hasMeaningfulElementContent(element) {
|
|
5398
|
+
const text = (element.textContent || "").replace(/\u00a0/g, " ").trim();
|
|
5399
|
+
if (text.length > 0) {
|
|
5400
|
+
return true;
|
|
5401
|
+
}
|
|
5402
|
+
return Boolean(element.querySelector("img,video,br"));
|
|
5403
|
+
}
|
|
5404
|
+
function hasMeaningfulParagraphContent(paragraph) {
|
|
5405
|
+
if (Array.isArray(paragraph.inlineElements) && paragraph.inlineElements.length) {
|
|
5406
|
+
return true;
|
|
5407
|
+
}
|
|
5408
|
+
const runs = Array.isArray(paragraph.runs) ? paragraph.runs : [];
|
|
5409
|
+
return runs.some((run) => {
|
|
5410
|
+
if (run.inlineRef) {
|
|
5411
|
+
return true;
|
|
5412
|
+
}
|
|
5413
|
+
return (run.text || "").replace(/\u00a0/g, " ").trim().length > 0;
|
|
5414
|
+
});
|
|
5415
|
+
}
|
|
5234
5416
|
function parseElementToParagraph(element, index, defaultTextStyle) {
|
|
5235
5417
|
const parsedLineHeight = parseLineHeight(element.style.lineHeight);
|
|
5236
5418
|
const parsedBefore = parsePx(element.style.marginTop);
|
|
@@ -5463,6 +5645,9 @@ function extractRuns(node, inheritedMarks, inlineElements) {
|
|
|
5463
5645
|
return [];
|
|
5464
5646
|
}
|
|
5465
5647
|
const element = node;
|
|
5648
|
+
if (isIgnorableImportedElementTag(element.tagName)) {
|
|
5649
|
+
return [];
|
|
5650
|
+
}
|
|
5466
5651
|
if (element.tagName === "BR") {
|
|
5467
5652
|
const marks = cleanupMarks(inheritedMarks);
|
|
5468
5653
|
return [marks ? { text: "\n", marks } : { text: "\n" }];
|
|
@@ -7055,6 +7240,26 @@ function normalizeStyleAttribute(styleValue) {
|
|
|
7055
7240
|
.filter((segment) => segment.length > 0)
|
|
7056
7241
|
.join(";");
|
|
7057
7242
|
}
|
|
7243
|
+
function isIgnorableImportedElementTag(tagName) {
|
|
7244
|
+
const normalized = String(tagName || "")
|
|
7245
|
+
.trim()
|
|
7246
|
+
.toUpperCase();
|
|
7247
|
+
if (!normalized) {
|
|
7248
|
+
return false;
|
|
7249
|
+
}
|
|
7250
|
+
if (normalized === "SCRIPT" ||
|
|
7251
|
+
normalized === "STYLE" ||
|
|
7252
|
+
normalized === "META" ||
|
|
7253
|
+
normalized === "LINK" ||
|
|
7254
|
+
normalized === "TITLE" ||
|
|
7255
|
+
normalized === "HEAD" ||
|
|
7256
|
+
normalized === "BASE" ||
|
|
7257
|
+
normalized === "XML" ||
|
|
7258
|
+
normalized === "O:P") {
|
|
7259
|
+
return true;
|
|
7260
|
+
}
|
|
7261
|
+
return normalized.startsWith("W:");
|
|
7262
|
+
}
|
|
7058
7263
|
function normalizeStoredTableCellHTML(html) {
|
|
7059
7264
|
const source = String(html || "").trim();
|
|
7060
7265
|
if (!source) {
|
|
@@ -7066,7 +7271,20 @@ function normalizeStoredTableCellHTML(html) {
|
|
|
7066
7271
|
if (!root) {
|
|
7067
7272
|
return "";
|
|
7068
7273
|
}
|
|
7069
|
-
root.querySelectorAll("
|
|
7274
|
+
const allElements = Array.from(root.querySelectorAll("*"));
|
|
7275
|
+
allElements.forEach((node) => {
|
|
7276
|
+
if (isIgnorableImportedElementTag(node.tagName)) {
|
|
7277
|
+
node.remove();
|
|
7278
|
+
}
|
|
7279
|
+
});
|
|
7280
|
+
const commentWalker = doc.createTreeWalker(root, NodeFilter.SHOW_COMMENT);
|
|
7281
|
+
const comments = [];
|
|
7282
|
+
while (commentWalker.nextNode()) {
|
|
7283
|
+
comments.push(commentWalker.currentNode);
|
|
7284
|
+
}
|
|
7285
|
+
comments.forEach((commentNode) => {
|
|
7286
|
+
commentNode.remove();
|
|
7287
|
+
});
|
|
7070
7288
|
root.querySelectorAll("*").forEach((node) => {
|
|
7071
7289
|
Array.from(node.attributes).forEach((attr) => {
|
|
7072
7290
|
if (attr.name.toLowerCase().startsWith("on")) {
|
|
@@ -7658,3 +7876,12 @@ function isRecord(value) {
|
|
|
7658
7876
|
function clone(value) {
|
|
7659
7877
|
return JSON.parse(JSON.stringify(value));
|
|
7660
7878
|
}
|
|
7879
|
+
function resolveErrorMessage(error, fallback = "未知错误") {
|
|
7880
|
+
if (error instanceof Error && error.message) {
|
|
7881
|
+
return error.message;
|
|
7882
|
+
}
|
|
7883
|
+
if (typeof error === "string" && error.trim()) {
|
|
7884
|
+
return error.trim();
|
|
7885
|
+
}
|
|
7886
|
+
return fallback;
|
|
7887
|
+
}
|