@file-viewer/core 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +160 -0
- package/README.en.md +78 -0
- package/README.md +83 -0
- package/dist/assets.d.ts +62 -0
- package/dist/assets.js +260 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +1 -0
- package/dist/capabilities.d.ts +24 -0
- package/dist/capabilities.js +95 -0
- package/dist/document.d.ts +9 -0
- package/dist/document.js +86 -0
- package/dist/documentDom/anchors.d.ts +7 -0
- package/dist/documentDom/anchors.js +196 -0
- package/dist/documentDom/index.d.ts +5 -0
- package/dist/documentDom/index.js +3 -0
- package/dist/documentDom/providers.d.ts +13 -0
- package/dist/documentDom/providers.js +52 -0
- package/dist/documentDom/scroll.d.ts +12 -0
- package/dist/documentDom/scroll.js +42 -0
- package/dist/documentDom.d.ts +5 -0
- package/dist/documentDom.js +3 -0
- package/dist/documentEvents.d.ts +73 -0
- package/dist/documentEvents.js +150 -0
- package/dist/documentSearch.d.ts +50 -0
- package/dist/documentSearch.js +459 -0
- package/dist/documentZoom.d.ts +47 -0
- package/dist/documentZoom.js +184 -0
- package/dist/export.d.ts +26 -0
- package/dist/export.js +466 -0
- package/dist/formats.d.ts +305 -0
- package/dist/formats.js +207 -0
- package/dist/headless.d.ts +25 -0
- package/dist/headless.js +14 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.js +118 -0
- package/dist/lifecycleFacade.d.ts +46 -0
- package/dist/lifecycleFacade.js +68 -0
- package/dist/loading.d.ts +59 -0
- package/dist/loading.js +489 -0
- package/dist/operations.d.ts +287 -0
- package/dist/operations.js +485 -0
- package/dist/options.d.ts +16 -0
- package/dist/options.js +92 -0
- package/dist/presentation.d.ts +14 -0
- package/dist/presentation.js +16 -0
- package/dist/printLayout.d.ts +19 -0
- package/dist/printLayout.js +83 -0
- package/dist/registry.d.ts +2 -0
- package/dist/registry.js +63 -0
- package/dist/rendererDispatcher.d.ts +21 -0
- package/dist/rendererDispatcher.js +42 -0
- package/dist/rendererHandler.d.ts +165 -0
- package/dist/rendererHandler.js +354 -0
- package/dist/renderers/archive.d.ts +2 -0
- package/dist/renderers/archive.js +547 -0
- package/dist/renderers/archiveCache.d.ts +10 -0
- package/dist/renderers/archiveCache.js +96 -0
- package/dist/renderers/archiveFallback.d.ts +7 -0
- package/dist/renderers/archiveFallback.js +166 -0
- package/dist/renderers/archiveShared.d.ts +23 -0
- package/dist/renderers/archiveShared.js +71 -0
- package/dist/renderers/audio.d.ts +8 -0
- package/dist/renderers/audio.js +219 -0
- package/dist/renderers/cad.d.ts +2 -0
- package/dist/renderers/cad.js +445 -0
- package/dist/renderers/code.d.ts +11 -0
- package/dist/renderers/code.js +233 -0
- package/dist/renderers/data.d.ts +7 -0
- package/dist/renderers/data.js +370 -0
- package/dist/renderers/drawing.d.ts +10 -0
- package/dist/renderers/drawing.js +537 -0
- package/dist/renderers/eda.d.ts +2 -0
- package/dist/renderers/eda.js +434 -0
- package/dist/renderers/edaParser.d.ts +77 -0
- package/dist/renderers/edaParser.js +569 -0
- package/dist/renderers/email.d.ts +2 -0
- package/dist/renderers/email.js +463 -0
- package/dist/renderers/epub.d.ts +2 -0
- package/dist/renderers/epub.js +330 -0
- package/dist/renderers/geo.d.ts +2 -0
- package/dist/renderers/geo.js +284 -0
- package/dist/renderers/image.d.ts +2 -0
- package/dist/renderers/image.js +179 -0
- package/dist/renderers/index.d.ts +21 -0
- package/dist/renderers/index.js +207 -0
- package/dist/renderers/markdown.d.ts +2 -0
- package/dist/renderers/markdown.js +83 -0
- package/dist/renderers/model.d.ts +2 -0
- package/dist/renderers/model.js +566 -0
- package/dist/renderers/ofd.d.ts +2 -0
- package/dist/renderers/ofd.js +255 -0
- package/dist/renderers/openDocument.d.ts +2 -0
- package/dist/renderers/openDocument.js +122 -0
- package/dist/renderers/pdf.d.ts +3 -0
- package/dist/renderers/pdf.js +846 -0
- package/dist/renderers/pdfStyles.d.ts +1 -0
- package/dist/renderers/pdfStyles.js +1 -0
- package/dist/renderers/pptx.d.ts +2 -0
- package/dist/renderers/pptx.js +202 -0
- package/dist/renderers/spreadsheet/state.d.ts +80 -0
- package/dist/renderers/spreadsheet/state.js +96 -0
- package/dist/renderers/spreadsheet/view.d.ts +25 -0
- package/dist/renderers/spreadsheet/view.js +833 -0
- package/dist/renderers/spreadsheet/worker/index.d.ts +2 -0
- package/dist/renderers/spreadsheet/worker/index.js +1 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +73 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +623 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +2 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/color.js +73 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +1 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/index.js +1 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +18 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +106 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +1 -0
- package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +11 -0
- package/dist/renderers/spreadsheet/worker/type.d.ts +57 -0
- package/dist/renderers/spreadsheet/worker/type.js +1 -0
- package/dist/renderers/spreadsheet.d.ts +3 -0
- package/dist/renderers/spreadsheet.js +929 -0
- package/dist/renderers/typst.d.ts +8 -0
- package/dist/renderers/typst.js +415 -0
- package/dist/renderers/umd/parser.d.ts +30 -0
- package/dist/renderers/umd/parser.js +408 -0
- package/dist/renderers/umd.d.ts +2 -0
- package/dist/renderers/umd.js +297 -0
- package/dist/renderers/video.d.ts +8 -0
- package/dist/renderers/video.js +108 -0
- package/dist/renderers/wordDoc.d.ts +5 -0
- package/dist/renderers/wordDoc.js +284 -0
- package/dist/renderers/wordDocx.d.ts +5 -0
- package/dist/renderers/wordDocx.js +501 -0
- package/dist/renderers/wordDocx.worker.d.ts +1 -0
- package/dist/renderers/wordDocx.worker.js +96 -0
- package/dist/source.d.ts +18 -0
- package/dist/source.js +152 -0
- package/dist/sourceLoading.d.ts +566 -0
- package/dist/sourceLoading.js +918 -0
- package/dist/state.d.ts +16 -0
- package/dist/state.js +81 -0
- package/dist/types.d.ts +446 -0
- package/dist/types.js +1 -0
- package/dist/viewer.d.ts +8 -0
- package/dist/viewer.js +285 -0
- package/dist/viewerOperations.d.ts +88 -0
- package/dist/viewerOperations.js +242 -0
- package/dist/watermark.d.ts +15 -0
- package/dist/watermark.js +81 -0
- package/dist/worker.d.ts +34 -0
- package/dist/worker.js +101 -0
- package/package.json +109 -0
- package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +183 -0
- package/vendor/ofd/dltech/jbig2/ccitt.js +1070 -0
- package/vendor/ofd/dltech/jbig2/compatibility.js +12 -0
- package/vendor/ofd/dltech/jbig2/core_utils.js +180 -0
- package/vendor/ofd/dltech/jbig2/is_node.js +27 -0
- package/vendor/ofd/dltech/jbig2/jbig2.js +2589 -0
- package/vendor/ofd/dltech/jbig2/jbig2_stream.js +81 -0
- package/vendor/ofd/dltech/jbig2/primitives.js +387 -0
- package/vendor/ofd/dltech/jbig2/stream.js +1348 -0
- package/vendor/ofd/dltech/jbig2/util.js +972 -0
- package/vendor/ofd/dltech/ofd/ofd.d.ts +11 -0
- package/vendor/ofd/dltech/ofd/ofd.js +100 -0
- package/vendor/ofd/dltech/ofd/ofd_parser.js +395 -0
- package/vendor/ofd/dltech/ofd/ofd_render.js +473 -0
- package/vendor/ofd/dltech/ofd/ofd_util.js +350 -0
- package/vendor/ofd/dltech/ofd/pipeline.js +26 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { buildFileViewerDocumentTextChunks } from './document.js';
|
|
2
|
+
import { getCurrentFileViewerDocumentAnchor, resolveFileViewerScrollContainer, scrollToFileViewerDocumentAnchor, } from './documentDom.js';
|
|
3
|
+
import { cloneFileViewerSearchState, createFileViewerDomSearchController, createFileViewerDomSearchControllerActionHandlers, } from './documentSearch.js';
|
|
4
|
+
export const createFileViewerSearchChangeState = (state) => {
|
|
5
|
+
return cloneFileViewerSearchState(state);
|
|
6
|
+
};
|
|
7
|
+
export const resolveFileViewerLocationChangeAnchor = ({ root, anchors, }) => {
|
|
8
|
+
return getCurrentFileViewerDocumentAnchor(root || null, anchors);
|
|
9
|
+
};
|
|
10
|
+
export const createFileViewerDocumentChangeSnapshot = ({ root, anchors, searchState, }) => {
|
|
11
|
+
return {
|
|
12
|
+
searchState: createFileViewerSearchChangeState(searchState),
|
|
13
|
+
locationAnchor: resolveFileViewerLocationChangeAnchor({ root, anchors }),
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export const createFileViewerDocumentFeatureControllerActionHandlers = ({ root, searchTarget, searchOptions, waitForDomUpdate, preferredScrollContainer, getAiOptions, onSearchChange, onLocationChange, }) => {
|
|
17
|
+
let documentActions = null;
|
|
18
|
+
const searchController = createFileViewerDomSearchController({
|
|
19
|
+
root,
|
|
20
|
+
options: searchOptions,
|
|
21
|
+
waitForDomUpdate,
|
|
22
|
+
preferredScrollContainer: () => { var _a, _b; return (_b = (_a = preferredScrollContainer === null || preferredScrollContainer === void 0 ? void 0 : preferredScrollContainer()) !== null && _a !== void 0 ? _a : documentActions === null || documentActions === void 0 ? void 0 : documentActions.getScrollContainer()) !== null && _b !== void 0 ? _b : null; },
|
|
23
|
+
});
|
|
24
|
+
const searchActions = createFileViewerDomSearchControllerActionHandlers(searchTarget, searchController);
|
|
25
|
+
documentActions = createFileViewerDocumentFeatureActions({
|
|
26
|
+
root,
|
|
27
|
+
searchController: {
|
|
28
|
+
getAnchors: () => searchTarget.anchors.value,
|
|
29
|
+
getSearchState: () => searchTarget.state,
|
|
30
|
+
observe: searchActions.observe,
|
|
31
|
+
refreshAnchors: searchActions.refreshAnchors,
|
|
32
|
+
search: searchActions.search,
|
|
33
|
+
clear: searchActions.clear,
|
|
34
|
+
next: searchActions.next,
|
|
35
|
+
previous: searchActions.previous,
|
|
36
|
+
},
|
|
37
|
+
getAiOptions,
|
|
38
|
+
onSearchChange,
|
|
39
|
+
onLocationChange,
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
...documentActions,
|
|
43
|
+
destroyDocumentFeatures: searchActions.destroy,
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export const dispatchFileViewerSearchChange = ({ state, onChange, }) => {
|
|
47
|
+
const payload = createFileViewerSearchChangeState(state);
|
|
48
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(payload);
|
|
49
|
+
return true;
|
|
50
|
+
};
|
|
51
|
+
export const dispatchFileViewerLocationChange = ({ anchor, onChange, }) => {
|
|
52
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(anchor);
|
|
53
|
+
return true;
|
|
54
|
+
};
|
|
55
|
+
export const createFileViewerDocumentFeatureActions = ({ root, searchController, getAiOptions, onSearchChange, onLocationChange, }) => {
|
|
56
|
+
const getRoot = () => root() || null;
|
|
57
|
+
const getAnchors = () => searchController.getAnchors();
|
|
58
|
+
const getSearchState = () => createFileViewerSearchChangeState(searchController.getSearchState());
|
|
59
|
+
const notifySearchChange = () => {
|
|
60
|
+
const state = getSearchState();
|
|
61
|
+
dispatchFileViewerSearchChange({
|
|
62
|
+
state,
|
|
63
|
+
onChange: onSearchChange,
|
|
64
|
+
});
|
|
65
|
+
return state;
|
|
66
|
+
};
|
|
67
|
+
const getCurrentDocumentAnchor = () => {
|
|
68
|
+
return resolveFileViewerLocationChangeAnchor({
|
|
69
|
+
root: getRoot(),
|
|
70
|
+
anchors: getAnchors(),
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
const notifyLocationChange = () => {
|
|
74
|
+
const anchor = getCurrentDocumentAnchor();
|
|
75
|
+
dispatchFileViewerLocationChange({
|
|
76
|
+
anchor,
|
|
77
|
+
onChange: onLocationChange,
|
|
78
|
+
});
|
|
79
|
+
return anchor;
|
|
80
|
+
};
|
|
81
|
+
const maybeNotifyLocationChange = (actionOptions) => {
|
|
82
|
+
if ((actionOptions === null || actionOptions === void 0 ? void 0 : actionOptions.notify) === false) {
|
|
83
|
+
return getCurrentDocumentAnchor();
|
|
84
|
+
}
|
|
85
|
+
return notifyLocationChange();
|
|
86
|
+
};
|
|
87
|
+
const refreshDocumentIndex = async (actionOptions) => {
|
|
88
|
+
searchController.observe();
|
|
89
|
+
const anchors = await searchController.refreshAnchors();
|
|
90
|
+
maybeNotifyLocationChange(actionOptions);
|
|
91
|
+
return anchors;
|
|
92
|
+
};
|
|
93
|
+
const ensureAnchors = async (actionOptions) => {
|
|
94
|
+
if (!getAnchors().length) {
|
|
95
|
+
await refreshDocumentIndex(actionOptions);
|
|
96
|
+
}
|
|
97
|
+
return getAnchors();
|
|
98
|
+
};
|
|
99
|
+
const scrollToLoadedAnchor = (anchor, actionOptions) => {
|
|
100
|
+
const result = scrollToFileViewerDocumentAnchor(getRoot(), anchor);
|
|
101
|
+
maybeNotifyLocationChange(actionOptions);
|
|
102
|
+
return result;
|
|
103
|
+
};
|
|
104
|
+
return {
|
|
105
|
+
refreshDocumentIndex,
|
|
106
|
+
async clearDocumentState() {
|
|
107
|
+
await searchController.clear();
|
|
108
|
+
return getSearchState();
|
|
109
|
+
},
|
|
110
|
+
getScrollContainer() {
|
|
111
|
+
return resolveFileViewerScrollContainer(getRoot());
|
|
112
|
+
},
|
|
113
|
+
async searchDocument(query) {
|
|
114
|
+
await searchController.search(query);
|
|
115
|
+
return notifySearchChange();
|
|
116
|
+
},
|
|
117
|
+
async clearDocumentSearch() {
|
|
118
|
+
await searchController.clear();
|
|
119
|
+
return notifySearchChange();
|
|
120
|
+
},
|
|
121
|
+
async nextSearchResult() {
|
|
122
|
+
await searchController.next();
|
|
123
|
+
notifyLocationChange();
|
|
124
|
+
return notifySearchChange();
|
|
125
|
+
},
|
|
126
|
+
async previousSearchResult() {
|
|
127
|
+
await searchController.previous();
|
|
128
|
+
notifyLocationChange();
|
|
129
|
+
return notifySearchChange();
|
|
130
|
+
},
|
|
131
|
+
getSearchState,
|
|
132
|
+
async collectDocumentAnchors(actionOptions) {
|
|
133
|
+
await refreshDocumentIndex(actionOptions);
|
|
134
|
+
return getAnchors();
|
|
135
|
+
},
|
|
136
|
+
getCurrentDocumentAnchor,
|
|
137
|
+
scrollToLoadedAnchor,
|
|
138
|
+
async scrollToAnchor(anchor, actionOptions) {
|
|
139
|
+
await ensureAnchors(actionOptions);
|
|
140
|
+
return scrollToLoadedAnchor(anchor, actionOptions);
|
|
141
|
+
},
|
|
142
|
+
async scrollToLine(line, actionOptions) {
|
|
143
|
+
await ensureAnchors(actionOptions);
|
|
144
|
+
return scrollToLoadedAnchor(line, actionOptions);
|
|
145
|
+
},
|
|
146
|
+
getDocumentTextChunks(textOptions) {
|
|
147
|
+
return buildFileViewerDocumentTextChunks(getAnchors(), textOptions !== null && textOptions !== void 0 ? textOptions : getAiOptions === null || getAiOptions === void 0 ? void 0 : getAiOptions());
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { FileViewerDocumentAnchor, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchState } from './types';
|
|
2
|
+
export interface CreateFileViewerDomSearchControllerOptions {
|
|
3
|
+
root: () => HTMLElement | null | undefined;
|
|
4
|
+
options?: () => boolean | FileViewerSearchOptions | undefined;
|
|
5
|
+
waitForDomUpdate?: () => Promise<void> | void;
|
|
6
|
+
preferredScrollContainer?: () => HTMLElement | null | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface FileViewerInternalSearchMatch extends FileViewerSearchMatch {
|
|
9
|
+
element: HTMLElement;
|
|
10
|
+
}
|
|
11
|
+
export interface FileViewerDomSearchController {
|
|
12
|
+
readonly anchors: FileViewerDocumentAnchor[];
|
|
13
|
+
readonly state: FileViewerSearchState;
|
|
14
|
+
getInternalMatches(): FileViewerInternalSearchMatch[];
|
|
15
|
+
observe(): void;
|
|
16
|
+
refreshAnchors(): Promise<FileViewerDocumentAnchor[]>;
|
|
17
|
+
search(query: string): Promise<FileViewerSearchState>;
|
|
18
|
+
next(): Promise<FileViewerSearchState>;
|
|
19
|
+
previous(): Promise<FileViewerSearchState>;
|
|
20
|
+
clear(): Promise<FileViewerSearchState>;
|
|
21
|
+
destroy(): void;
|
|
22
|
+
}
|
|
23
|
+
export interface FileViewerDocumentAnchorsTarget {
|
|
24
|
+
value: FileViewerDocumentAnchor[];
|
|
25
|
+
}
|
|
26
|
+
export interface FileViewerDomSearchControllerStateTarget {
|
|
27
|
+
anchors: FileViewerDocumentAnchorsTarget;
|
|
28
|
+
state: MutableFileViewerSearchState;
|
|
29
|
+
}
|
|
30
|
+
export interface FileViewerDomSearchControllerActionHandlers {
|
|
31
|
+
observe(): FileViewerSearchState;
|
|
32
|
+
refreshAnchors(): Promise<FileViewerDocumentAnchor[]>;
|
|
33
|
+
search(query: string): Promise<FileViewerSearchState>;
|
|
34
|
+
next(): Promise<FileViewerSearchState>;
|
|
35
|
+
previous(): Promise<FileViewerSearchState>;
|
|
36
|
+
clear(): Promise<FileViewerSearchState>;
|
|
37
|
+
destroy(): FileViewerSearchState;
|
|
38
|
+
}
|
|
39
|
+
export declare const DEFAULT_FILE_VIEWER_SEARCH_MATCH_CLASS = "flyfish-search-match";
|
|
40
|
+
export declare const DEFAULT_FILE_VIEWER_SEARCH_ACTIVE_CLASS = "flyfish-search-match--active";
|
|
41
|
+
export declare const DEFAULT_FILE_VIEWER_SEARCH_MAX_MATCHES = 1000;
|
|
42
|
+
export declare const cloneFileViewerSearchState: (state: FileViewerSearchState) => FileViewerSearchState;
|
|
43
|
+
export type MutableFileViewerSearchState = FileViewerSearchState;
|
|
44
|
+
export declare const applyFileViewerSearchState: <Target extends MutableFileViewerSearchState>(target: Target, source: FileViewerSearchState) => Target;
|
|
45
|
+
export declare const syncFileViewerDomSearchControllerState: <Target extends FileViewerDomSearchControllerStateTarget>(target: Target, controller: Pick<FileViewerDomSearchController, "anchors" | "state">) => FileViewerSearchState;
|
|
46
|
+
export declare const observeFileViewerDomSearchController: <Target extends FileViewerDomSearchControllerStateTarget>(target: Target, controller: Pick<FileViewerDomSearchController, "observe" | "anchors" | "state">) => FileViewerSearchState;
|
|
47
|
+
export declare const runFileViewerDomSearchControllerAction: <Target extends FileViewerDomSearchControllerStateTarget, Result>(target: Target, controller: Pick<FileViewerDomSearchController, "anchors" | "state">, action: () => Result | Promise<Result>) => Promise<FileViewerSearchState>;
|
|
48
|
+
export declare const destroyFileViewerDomSearchController: <Target extends FileViewerDomSearchControllerStateTarget>(target: Target, controller: Pick<FileViewerDomSearchController, "destroy" | "anchors" | "state">) => FileViewerSearchState;
|
|
49
|
+
export declare const createFileViewerDomSearchControllerActionHandlers: <Target extends FileViewerDomSearchControllerStateTarget>(target: Target, controller: FileViewerDomSearchController) => FileViewerDomSearchControllerActionHandlers;
|
|
50
|
+
export declare const createFileViewerDomSearchController: ({ root, options, waitForDomUpdate, preferredScrollContainer, }: CreateFileViewerDomSearchControllerOptions) => FileViewerDomSearchController;
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, findFileViewerSearchProvider, } from './documentDom.js';
|
|
2
|
+
import { createEmptyFileViewerSearchState, normalizeFileViewerSearchOptions, } from './document.js';
|
|
3
|
+
export const DEFAULT_FILE_VIEWER_SEARCH_MATCH_CLASS = 'flyfish-search-match';
|
|
4
|
+
export const DEFAULT_FILE_VIEWER_SEARCH_ACTIVE_CLASS = 'flyfish-search-match--active';
|
|
5
|
+
export const DEFAULT_FILE_VIEWER_SEARCH_MAX_MATCHES = 1000;
|
|
6
|
+
const SKIP_SELECTOR = [
|
|
7
|
+
'script',
|
|
8
|
+
'style',
|
|
9
|
+
'textarea',
|
|
10
|
+
'input',
|
|
11
|
+
'select',
|
|
12
|
+
'button',
|
|
13
|
+
'.viewer-actions',
|
|
14
|
+
'.viewer-watermark',
|
|
15
|
+
'.state-panel',
|
|
16
|
+
'.pdf-toolbar',
|
|
17
|
+
'.pdf-nav-pane',
|
|
18
|
+
'.flyfish-search-match',
|
|
19
|
+
'.textLayer',
|
|
20
|
+
'.annotationLayer',
|
|
21
|
+
'.xfaLayer',
|
|
22
|
+
'svg',
|
|
23
|
+
'canvas',
|
|
24
|
+
'iframe',
|
|
25
|
+
'video',
|
|
26
|
+
'audio',
|
|
27
|
+
].join(',');
|
|
28
|
+
const cloneSearchMatch = (match) => ({
|
|
29
|
+
...match,
|
|
30
|
+
anchor: match.anchor ? { ...match.anchor } : null,
|
|
31
|
+
});
|
|
32
|
+
export const cloneFileViewerSearchState = (state) => ({
|
|
33
|
+
query: state.query,
|
|
34
|
+
total: state.total,
|
|
35
|
+
currentIndex: state.currentIndex,
|
|
36
|
+
current: state.current ? cloneSearchMatch(state.current) : null,
|
|
37
|
+
matches: state.matches.map(cloneSearchMatch),
|
|
38
|
+
});
|
|
39
|
+
export const applyFileViewerSearchState = (target, source) => {
|
|
40
|
+
const nextState = cloneFileViewerSearchState(source);
|
|
41
|
+
target.query = nextState.query;
|
|
42
|
+
target.total = nextState.total;
|
|
43
|
+
target.currentIndex = nextState.currentIndex;
|
|
44
|
+
target.current = nextState.current;
|
|
45
|
+
target.matches = nextState.matches;
|
|
46
|
+
return target;
|
|
47
|
+
};
|
|
48
|
+
export const syncFileViewerDomSearchControllerState = (target, controller) => {
|
|
49
|
+
target.anchors.value = controller.anchors;
|
|
50
|
+
applyFileViewerSearchState(target.state, controller.state);
|
|
51
|
+
return target.state;
|
|
52
|
+
};
|
|
53
|
+
export const observeFileViewerDomSearchController = (target, controller) => {
|
|
54
|
+
controller.observe();
|
|
55
|
+
return syncFileViewerDomSearchControllerState(target, controller);
|
|
56
|
+
};
|
|
57
|
+
export const runFileViewerDomSearchControllerAction = async (target, controller, action) => {
|
|
58
|
+
await action();
|
|
59
|
+
return syncFileViewerDomSearchControllerState(target, controller);
|
|
60
|
+
};
|
|
61
|
+
export const destroyFileViewerDomSearchController = (target, controller) => {
|
|
62
|
+
controller.destroy();
|
|
63
|
+
return syncFileViewerDomSearchControllerState(target, controller);
|
|
64
|
+
};
|
|
65
|
+
export const createFileViewerDomSearchControllerActionHandlers = (target, controller) => {
|
|
66
|
+
return {
|
|
67
|
+
observe() {
|
|
68
|
+
return observeFileViewerDomSearchController(target, controller);
|
|
69
|
+
},
|
|
70
|
+
async refreshAnchors() {
|
|
71
|
+
await runFileViewerDomSearchControllerAction(target, controller, () => controller.refreshAnchors());
|
|
72
|
+
return target.anchors.value;
|
|
73
|
+
},
|
|
74
|
+
async search(query) {
|
|
75
|
+
return runFileViewerDomSearchControllerAction(target, controller, () => controller.search(query));
|
|
76
|
+
},
|
|
77
|
+
async next() {
|
|
78
|
+
return runFileViewerDomSearchControllerAction(target, controller, () => controller.next());
|
|
79
|
+
},
|
|
80
|
+
async previous() {
|
|
81
|
+
return runFileViewerDomSearchControllerAction(target, controller, () => controller.previous());
|
|
82
|
+
},
|
|
83
|
+
async clear() {
|
|
84
|
+
return runFileViewerDomSearchControllerAction(target, controller, () => controller.clear());
|
|
85
|
+
},
|
|
86
|
+
destroy() {
|
|
87
|
+
return destroyFileViewerDomSearchController(target, controller);
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
92
|
+
const normalizeQuery = (value) => value.replace(/\s+/g, ' ').trim();
|
|
93
|
+
const createSearchRegExp = (query, options) => {
|
|
94
|
+
const source = options.wholeWord ? `\\b${escapeRegExp(query)}\\b` : escapeRegExp(query);
|
|
95
|
+
return new RegExp(source, options.caseSensitive ? 'g' : 'gi');
|
|
96
|
+
};
|
|
97
|
+
const getSerializableMatches = (matches) => {
|
|
98
|
+
return matches.map(({ element: _element, ...match }) => match);
|
|
99
|
+
};
|
|
100
|
+
const unwrapMark = (mark) => {
|
|
101
|
+
const parent = mark.parentNode;
|
|
102
|
+
if (!parent) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
while (mark.firstChild) {
|
|
106
|
+
parent.insertBefore(mark.firstChild, mark);
|
|
107
|
+
}
|
|
108
|
+
parent.removeChild(mark);
|
|
109
|
+
parent.normalize();
|
|
110
|
+
};
|
|
111
|
+
const isSkippableTextNode = (node, root) => {
|
|
112
|
+
const parent = node.parentElement;
|
|
113
|
+
if (!parent || parent.closest(SKIP_SELECTOR)) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
return !root.contains(parent) || !node.data.trim();
|
|
117
|
+
};
|
|
118
|
+
const getNodeFilterConstant = (root, key) => {
|
|
119
|
+
const view = root.ownerDocument.defaultView;
|
|
120
|
+
const localNodeFilter = (view === null || view === void 0 ? void 0 : view.NodeFilter) || (typeof NodeFilter !== 'undefined' ? NodeFilter : undefined);
|
|
121
|
+
if (localNodeFilter) {
|
|
122
|
+
return localNodeFilter[key];
|
|
123
|
+
}
|
|
124
|
+
return key === 'SHOW_TEXT' ? 4 : key === 'FILTER_REJECT' ? 2 : 1;
|
|
125
|
+
};
|
|
126
|
+
const walkTextNodes = (root) => {
|
|
127
|
+
const nodes = [];
|
|
128
|
+
const walker = root.ownerDocument.createTreeWalker(root, getNodeFilterConstant(root, 'SHOW_TEXT'), {
|
|
129
|
+
acceptNode(node) {
|
|
130
|
+
return isSkippableTextNode(node, root)
|
|
131
|
+
? getNodeFilterConstant(root, 'FILTER_REJECT')
|
|
132
|
+
: getNodeFilterConstant(root, 'FILTER_ACCEPT');
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
let current = walker.nextNode();
|
|
136
|
+
while (current) {
|
|
137
|
+
if (!isSkippableTextNode(current, root)) {
|
|
138
|
+
nodes.push(current);
|
|
139
|
+
}
|
|
140
|
+
current = walker.nextNode();
|
|
141
|
+
}
|
|
142
|
+
return nodes;
|
|
143
|
+
};
|
|
144
|
+
const getMutationObserverConstructor = (root) => {
|
|
145
|
+
var _a, _b;
|
|
146
|
+
return ((_b = (_a = root === null || root === void 0 ? void 0 : root.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.MutationObserver) ||
|
|
147
|
+
(typeof MutationObserver !== 'undefined' ? MutationObserver : undefined);
|
|
148
|
+
};
|
|
149
|
+
const getWindowLike = (root) => {
|
|
150
|
+
var _a;
|
|
151
|
+
return ((_a = root === null || root === void 0 ? void 0 : root.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) || (typeof window !== 'undefined' ? window : undefined);
|
|
152
|
+
};
|
|
153
|
+
const isScrollableElement = (element) => {
|
|
154
|
+
const range = Math.max(0, element.scrollHeight - element.clientHeight);
|
|
155
|
+
if (range <= 2) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
const view = element.ownerDocument.defaultView || (typeof window !== 'undefined' ? window : undefined);
|
|
159
|
+
if (!(view === null || view === void 0 ? void 0 : view.getComputedStyle)) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
const style = view.getComputedStyle(element);
|
|
163
|
+
const overflowY = style.overflowY || style.overflow;
|
|
164
|
+
return ['auto', 'scroll', 'overlay', 'visible'].includes(overflowY);
|
|
165
|
+
};
|
|
166
|
+
export const createFileViewerDomSearchController = ({ root, options, waitForDomUpdate, preferredScrollContainer, }) => {
|
|
167
|
+
let anchors = [];
|
|
168
|
+
let internalMatches = [];
|
|
169
|
+
const marks = new Set();
|
|
170
|
+
const state = createEmptyFileViewerSearchState();
|
|
171
|
+
let observer = null;
|
|
172
|
+
let shouldObserve = false;
|
|
173
|
+
let debounceTimer = null;
|
|
174
|
+
let applying = false;
|
|
175
|
+
const getOptions = () => normalizeFileViewerSearchOptions(options === null || options === void 0 ? void 0 : options());
|
|
176
|
+
const syncState = () => {
|
|
177
|
+
const serializable = getSerializableMatches(internalMatches);
|
|
178
|
+
state.total = serializable.length;
|
|
179
|
+
state.currentIndex = serializable.length ? Math.max(0, Math.min(state.currentIndex, serializable.length - 1)) : -1;
|
|
180
|
+
state.current = state.currentIndex >= 0 ? serializable[state.currentIndex] : null;
|
|
181
|
+
state.matches = serializable;
|
|
182
|
+
};
|
|
183
|
+
const applyExternalState = (nextState) => {
|
|
184
|
+
return applyFileViewerSearchState(state, nextState);
|
|
185
|
+
};
|
|
186
|
+
const clearMarks = () => {
|
|
187
|
+
Array.from(marks).forEach(unwrapMark);
|
|
188
|
+
marks.clear();
|
|
189
|
+
internalMatches = [];
|
|
190
|
+
state.total = 0;
|
|
191
|
+
state.currentIndex = -1;
|
|
192
|
+
state.current = null;
|
|
193
|
+
state.matches = [];
|
|
194
|
+
};
|
|
195
|
+
const runProviderAction = async (action, fallbackQuery = state.query) => {
|
|
196
|
+
var _a;
|
|
197
|
+
const provider = findFileViewerSearchProvider(root());
|
|
198
|
+
if (!provider) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
clearMarks();
|
|
202
|
+
const nextState = await action(provider);
|
|
203
|
+
return applyExternalState(nextState || ((_a = provider.getState) === null || _a === void 0 ? void 0 : _a.call(provider)) || createEmptyFileViewerSearchState(fallbackQuery));
|
|
204
|
+
};
|
|
205
|
+
const disconnectObserver = () => {
|
|
206
|
+
observer === null || observer === void 0 ? void 0 : observer.disconnect();
|
|
207
|
+
observer = null;
|
|
208
|
+
};
|
|
209
|
+
const getMatchScrollContainer = (element) => {
|
|
210
|
+
const currentRoot = root() || null;
|
|
211
|
+
const preferred = (preferredScrollContainer === null || preferredScrollContainer === void 0 ? void 0 : preferredScrollContainer()) || null;
|
|
212
|
+
if (preferred && (preferred === element || preferred.contains(element))) {
|
|
213
|
+
return preferred;
|
|
214
|
+
}
|
|
215
|
+
let current = element.parentElement;
|
|
216
|
+
while (current) {
|
|
217
|
+
if (isScrollableElement(current)) {
|
|
218
|
+
return current;
|
|
219
|
+
}
|
|
220
|
+
if (current === currentRoot) {
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
current = current.parentElement;
|
|
224
|
+
}
|
|
225
|
+
return currentRoot;
|
|
226
|
+
};
|
|
227
|
+
const scrollMatchIntoView = (element) => {
|
|
228
|
+
const container = getMatchScrollContainer(element);
|
|
229
|
+
if (!container) {
|
|
230
|
+
element.scrollIntoView({ block: 'center', inline: 'nearest' });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const lockedLeft = container.scrollLeft;
|
|
234
|
+
const containerRect = container.getBoundingClientRect();
|
|
235
|
+
const elementRect = element.getBoundingClientRect();
|
|
236
|
+
const targetTop = elementRect.top - containerRect.top + container.scrollTop
|
|
237
|
+
- (container.clientHeight / 2)
|
|
238
|
+
+ (elementRect.height / 2);
|
|
239
|
+
const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);
|
|
240
|
+
const nextTop = Math.max(0, Math.min(targetTop, maxTop));
|
|
241
|
+
if (typeof container.scrollTo === 'function') {
|
|
242
|
+
container.scrollTo({
|
|
243
|
+
top: nextTop,
|
|
244
|
+
left: lockedLeft,
|
|
245
|
+
behavior: 'auto',
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
container.scrollTop = nextTop;
|
|
250
|
+
container.scrollLeft = lockedLeft;
|
|
251
|
+
}
|
|
252
|
+
container.scrollLeft = lockedLeft;
|
|
253
|
+
};
|
|
254
|
+
const setActiveMatch = (index, scroll = true) => {
|
|
255
|
+
const normalizedOptions = getOptions();
|
|
256
|
+
if (!internalMatches.length) {
|
|
257
|
+
syncState();
|
|
258
|
+
return state;
|
|
259
|
+
}
|
|
260
|
+
const normalized = ((index % internalMatches.length) + internalMatches.length) % internalMatches.length;
|
|
261
|
+
internalMatches.forEach(match => {
|
|
262
|
+
match.element.classList.remove(normalizedOptions.activeClassName || DEFAULT_FILE_VIEWER_SEARCH_ACTIVE_CLASS);
|
|
263
|
+
});
|
|
264
|
+
const active = internalMatches[normalized];
|
|
265
|
+
active.element.classList.add(normalizedOptions.activeClassName || DEFAULT_FILE_VIEWER_SEARCH_ACTIVE_CLASS);
|
|
266
|
+
state.currentIndex = normalized;
|
|
267
|
+
syncState();
|
|
268
|
+
if (scroll) {
|
|
269
|
+
scrollMatchIntoView(active.element);
|
|
270
|
+
}
|
|
271
|
+
return state;
|
|
272
|
+
};
|
|
273
|
+
const highlightTextNode = (node, expression, maxMatches, nextMatches) => {
|
|
274
|
+
var _a;
|
|
275
|
+
const currentRoot = root();
|
|
276
|
+
if (!currentRoot) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const normalizedOptions = getOptions();
|
|
280
|
+
const text = node.data;
|
|
281
|
+
let lastIndex = 0;
|
|
282
|
+
let match;
|
|
283
|
+
const fragment = node.ownerDocument.createDocumentFragment();
|
|
284
|
+
let matched = false;
|
|
285
|
+
expression.lastIndex = 0;
|
|
286
|
+
while ((match = expression.exec(text)) && nextMatches.length < maxMatches) {
|
|
287
|
+
if (!match[0]) {
|
|
288
|
+
expression.lastIndex += 1;
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
if (match.index > lastIndex) {
|
|
292
|
+
fragment.appendChild(node.ownerDocument.createTextNode(text.slice(lastIndex, match.index)));
|
|
293
|
+
}
|
|
294
|
+
const mark = node.ownerDocument.createElement('mark');
|
|
295
|
+
mark.className = normalizedOptions.className || DEFAULT_FILE_VIEWER_SEARCH_MATCH_CLASS;
|
|
296
|
+
mark.textContent = match[0];
|
|
297
|
+
mark.dataset.searchMatchId = `viewer-search-match-${nextMatches.length + 1}`;
|
|
298
|
+
marks.add(mark);
|
|
299
|
+
fragment.appendChild(mark);
|
|
300
|
+
matched = true;
|
|
301
|
+
const anchor = findFileViewerAnchorForElement(node.parentElement, anchors, currentRoot);
|
|
302
|
+
nextMatches.push({
|
|
303
|
+
id: mark.dataset.searchMatchId,
|
|
304
|
+
index: nextMatches.length,
|
|
305
|
+
text: match[0],
|
|
306
|
+
anchor,
|
|
307
|
+
line: anchor === null || anchor === void 0 ? void 0 : anchor.line,
|
|
308
|
+
page: anchor === null || anchor === void 0 ? void 0 : anchor.page,
|
|
309
|
+
element: mark,
|
|
310
|
+
});
|
|
311
|
+
lastIndex = match.index + match[0].length;
|
|
312
|
+
}
|
|
313
|
+
if (!matched) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (lastIndex < text.length) {
|
|
317
|
+
fragment.appendChild(node.ownerDocument.createTextNode(text.slice(lastIndex)));
|
|
318
|
+
}
|
|
319
|
+
(_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.replaceChild(fragment, node);
|
|
320
|
+
};
|
|
321
|
+
const startObserver = () => {
|
|
322
|
+
disconnectObserver();
|
|
323
|
+
const currentRoot = root();
|
|
324
|
+
const MutationObserverCtor = getMutationObserverConstructor(currentRoot);
|
|
325
|
+
if (!shouldObserve || !currentRoot || !MutationObserverCtor) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
observer = new MutationObserverCtor(rerunAfterDomChange);
|
|
329
|
+
observer.observe(currentRoot, {
|
|
330
|
+
childList: true,
|
|
331
|
+
subtree: true,
|
|
332
|
+
characterData: true,
|
|
333
|
+
});
|
|
334
|
+
};
|
|
335
|
+
const resumeObserver = () => {
|
|
336
|
+
if (!shouldObserve) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const view = getWindowLike(root());
|
|
340
|
+
if (view === null || view === void 0 ? void 0 : view.setTimeout) {
|
|
341
|
+
view.setTimeout(startObserver, 0);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
setTimeout(startObserver, 0);
|
|
345
|
+
};
|
|
346
|
+
const runSearch = async (query, preferredIndex = 0) => {
|
|
347
|
+
const normalizedQuery = normalizeQuery(query);
|
|
348
|
+
const normalizedOptions = getOptions();
|
|
349
|
+
state.query = normalizedQuery;
|
|
350
|
+
disconnectObserver();
|
|
351
|
+
applying = true;
|
|
352
|
+
try {
|
|
353
|
+
clearMarks();
|
|
354
|
+
const currentRoot = root();
|
|
355
|
+
if (!normalizedQuery || normalizedOptions.enabled === false || !currentRoot) {
|
|
356
|
+
const providerState = await runProviderAction(provider => { var _a; return (_a = provider.clear) === null || _a === void 0 ? void 0 : _a.call(provider); }, normalizedQuery);
|
|
357
|
+
if (providerState) {
|
|
358
|
+
return providerState;
|
|
359
|
+
}
|
|
360
|
+
return state;
|
|
361
|
+
}
|
|
362
|
+
const providerState = await runProviderAction(provider => provider.search(normalizedQuery, normalizedOptions), normalizedQuery);
|
|
363
|
+
if (providerState) {
|
|
364
|
+
return providerState;
|
|
365
|
+
}
|
|
366
|
+
await (waitForDomUpdate === null || waitForDomUpdate === void 0 ? void 0 : waitForDomUpdate());
|
|
367
|
+
const nextRoot = root();
|
|
368
|
+
if (!nextRoot) {
|
|
369
|
+
return state;
|
|
370
|
+
}
|
|
371
|
+
anchors = collectFileViewerDocumentAnchors(nextRoot);
|
|
372
|
+
const expression = createSearchRegExp(normalizedQuery, normalizedOptions);
|
|
373
|
+
const maxMatches = Math.max(1, normalizedOptions.maxMatches || DEFAULT_FILE_VIEWER_SEARCH_MAX_MATCHES);
|
|
374
|
+
const nextMatches = [];
|
|
375
|
+
const textNodes = walkTextNodes(nextRoot);
|
|
376
|
+
for (const node of textNodes) {
|
|
377
|
+
if (nextMatches.length >= maxMatches) {
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
highlightTextNode(node, expression, maxMatches, nextMatches);
|
|
381
|
+
}
|
|
382
|
+
internalMatches = nextMatches;
|
|
383
|
+
syncState();
|
|
384
|
+
if (nextMatches.length) {
|
|
385
|
+
setActiveMatch(preferredIndex, true);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
finally {
|
|
389
|
+
applying = false;
|
|
390
|
+
resumeObserver();
|
|
391
|
+
}
|
|
392
|
+
return state;
|
|
393
|
+
};
|
|
394
|
+
const rerunAfterDomChange = () => {
|
|
395
|
+
var _a;
|
|
396
|
+
const normalizedOptions = getOptions();
|
|
397
|
+
if (!state.query || applying || normalizedOptions.enabled === false) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
if (debounceTimer !== null) {
|
|
401
|
+
clearTimeout(debounceTimer);
|
|
402
|
+
}
|
|
403
|
+
debounceTimer = setTimeout(() => {
|
|
404
|
+
debounceTimer = null;
|
|
405
|
+
void runSearch(state.query, Math.max(0, state.currentIndex));
|
|
406
|
+
}, (_a = normalizedOptions.debounce) !== null && _a !== void 0 ? _a : 180);
|
|
407
|
+
};
|
|
408
|
+
return {
|
|
409
|
+
get anchors() {
|
|
410
|
+
return anchors;
|
|
411
|
+
},
|
|
412
|
+
state,
|
|
413
|
+
getInternalMatches: () => internalMatches,
|
|
414
|
+
observe() {
|
|
415
|
+
shouldObserve = true;
|
|
416
|
+
startObserver();
|
|
417
|
+
},
|
|
418
|
+
async refreshAnchors() {
|
|
419
|
+
await (waitForDomUpdate === null || waitForDomUpdate === void 0 ? void 0 : waitForDomUpdate());
|
|
420
|
+
anchors = collectFileViewerDocumentAnchors(root() || null);
|
|
421
|
+
return anchors;
|
|
422
|
+
},
|
|
423
|
+
search: (query) => runSearch(query, 0),
|
|
424
|
+
next: async () => {
|
|
425
|
+
const providerState = await runProviderAction(provider => { var _a, _b; return ((_a = provider.next) === null || _a === void 0 ? void 0 : _a.call(provider)) || ((_b = provider.getState) === null || _b === void 0 ? void 0 : _b.call(provider)); });
|
|
426
|
+
return providerState || setActiveMatch(state.currentIndex + 1);
|
|
427
|
+
},
|
|
428
|
+
previous: async () => {
|
|
429
|
+
const providerState = await runProviderAction(provider => { var _a, _b; return ((_a = provider.previous) === null || _a === void 0 ? void 0 : _a.call(provider)) || ((_b = provider.getState) === null || _b === void 0 ? void 0 : _b.call(provider)); });
|
|
430
|
+
return providerState || setActiveMatch(state.currentIndex - 1);
|
|
431
|
+
},
|
|
432
|
+
clear: async () => {
|
|
433
|
+
state.query = '';
|
|
434
|
+
disconnectObserver();
|
|
435
|
+
applying = true;
|
|
436
|
+
try {
|
|
437
|
+
clearMarks();
|
|
438
|
+
const providerState = await runProviderAction(provider => { var _a; return (_a = provider.clear) === null || _a === void 0 ? void 0 : _a.call(provider); }, '');
|
|
439
|
+
if (providerState) {
|
|
440
|
+
return providerState;
|
|
441
|
+
}
|
|
442
|
+
return state;
|
|
443
|
+
}
|
|
444
|
+
finally {
|
|
445
|
+
applying = false;
|
|
446
|
+
resumeObserver();
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
destroy() {
|
|
450
|
+
shouldObserve = false;
|
|
451
|
+
disconnectObserver();
|
|
452
|
+
if (debounceTimer !== null) {
|
|
453
|
+
clearTimeout(debounceTimer);
|
|
454
|
+
debounceTimer = null;
|
|
455
|
+
}
|
|
456
|
+
clearMarks();
|
|
457
|
+
},
|
|
458
|
+
};
|
|
459
|
+
};
|