@file-viewer/core 2.1.16 → 2.1.18
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/README.en.md +4 -1
- package/README.md +4 -1
- package/dist/contracts/types.d.ts +72 -3
- package/dist/features/document/dom/providers.js +6 -3
- package/dist/features/document/fit.d.ts +46 -0
- package/dist/features/document/fit.js +339 -0
- package/dist/features/document/viewState.js +64 -4
- package/dist/headless.d.ts +2 -2
- package/dist/headless.js +1 -1
- package/dist/i18n/messages.js +53 -2
- package/dist/index.d.ts +6 -4
- package/dist/index.js +3 -2
- package/dist/lifecycle/operations.d.ts +4 -1
- package/dist/lifecycle/operations.js +39 -2
- package/dist/platform/assets.js +3 -3
- package/dist/renderers/image.d.ts +2 -2
- package/dist/renderers/image.js +20 -16
- package/dist/renderers/index.js +4 -4
- package/dist/rendering/handler.d.ts +33 -5
- package/dist/rendering/handler.js +130 -4
- package/dist/source/loading.d.ts +3 -1
- package/dist/source/loading.js +6 -2
- package/dist/viewer/createViewer.js +131 -20
- package/dist/viewer/operations.js +1 -1
- package/dist/viewer/state.d.ts +2 -2
- package/dist/viewer/state.js +39 -6
- package/package.json +2 -2
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { findFileViewerViewStateProvider, findFileViewerZoomProvider, } from './dom/index.js';
|
|
2
|
+
export const FILE_VIEWER_FIT_MODES = [
|
|
3
|
+
'auto',
|
|
4
|
+
'contain',
|
|
5
|
+
'cover',
|
|
6
|
+
'width',
|
|
7
|
+
'height',
|
|
8
|
+
'actual',
|
|
9
|
+
'scale-down',
|
|
10
|
+
];
|
|
11
|
+
export const FILE_VIEWER_FIT_RESIZE_MODES = [
|
|
12
|
+
'until-interaction',
|
|
13
|
+
'always',
|
|
14
|
+
'initial',
|
|
15
|
+
];
|
|
16
|
+
const DEFAULT_FILE_VIEWER_FIT_RESIZE = 'until-interaction';
|
|
17
|
+
const DEFAULT_FILE_VIEWER_FIT_PADDING = 0;
|
|
18
|
+
const MAX_FILE_VIEWER_FIT_RETRIES = 8;
|
|
19
|
+
const isRecord = (value) => {
|
|
20
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
21
|
+
};
|
|
22
|
+
export const isFileViewerFitMode = (value) => {
|
|
23
|
+
return typeof value === 'string' && FILE_VIEWER_FIT_MODES.includes(value);
|
|
24
|
+
};
|
|
25
|
+
export const isFileViewerFitResize = (value) => {
|
|
26
|
+
return typeof value === 'string' &&
|
|
27
|
+
FILE_VIEWER_FIT_RESIZE_MODES.includes(value);
|
|
28
|
+
};
|
|
29
|
+
const normalizePositiveNumber = (value) => {
|
|
30
|
+
const nextValue = Number(value);
|
|
31
|
+
return Number.isFinite(nextValue) && nextValue > 0 ? nextValue : undefined;
|
|
32
|
+
};
|
|
33
|
+
const normalizePadding = (value) => {
|
|
34
|
+
const nextValue = Number(value);
|
|
35
|
+
return Number.isFinite(nextValue) && nextValue > 0 ? nextValue : DEFAULT_FILE_VIEWER_FIT_PADDING;
|
|
36
|
+
};
|
|
37
|
+
export const normalizeFileViewerFitOptions = (fit) => {
|
|
38
|
+
if (fit === undefined || fit === null || fit === false) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
if (isFileViewerFitMode(fit)) {
|
|
42
|
+
return {
|
|
43
|
+
mode: fit,
|
|
44
|
+
resize: DEFAULT_FILE_VIEWER_FIT_RESIZE,
|
|
45
|
+
padding: DEFAULT_FILE_VIEWER_FIT_PADDING,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (!isRecord(fit)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const minScale = normalizePositiveNumber(fit.minScale);
|
|
52
|
+
const rawMaxScale = normalizePositiveNumber(fit.maxScale);
|
|
53
|
+
const maxScale = minScale !== undefined && rawMaxScale !== undefined && rawMaxScale < minScale
|
|
54
|
+
? minScale
|
|
55
|
+
: rawMaxScale;
|
|
56
|
+
return {
|
|
57
|
+
mode: isFileViewerFitMode(fit.mode) ? fit.mode : 'auto',
|
|
58
|
+
resize: isFileViewerFitResize(fit.resize) ? fit.resize : DEFAULT_FILE_VIEWER_FIT_RESIZE,
|
|
59
|
+
padding: normalizePadding(fit.padding),
|
|
60
|
+
minScale,
|
|
61
|
+
maxScale,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
const clampScale = (scale, minScale, maxScale) => {
|
|
65
|
+
let nextScale = scale;
|
|
66
|
+
if (Number.isFinite(minScale)) {
|
|
67
|
+
nextScale = Math.max(Number(minScale), nextScale);
|
|
68
|
+
}
|
|
69
|
+
if (Number.isFinite(maxScale)) {
|
|
70
|
+
nextScale = Math.min(Number(maxScale), nextScale);
|
|
71
|
+
}
|
|
72
|
+
return nextScale;
|
|
73
|
+
};
|
|
74
|
+
export const resolveFileViewerFitScale = ({ mode, viewportWidth, viewportHeight, contentWidth, contentHeight, currentScale = 1, minScale, maxScale, }) => {
|
|
75
|
+
if (viewportWidth <= 0 ||
|
|
76
|
+
viewportHeight <= 0 ||
|
|
77
|
+
contentWidth <= 0 ||
|
|
78
|
+
contentHeight <= 0) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const widthScale = viewportWidth / contentWidth;
|
|
82
|
+
const heightScale = viewportHeight / contentHeight;
|
|
83
|
+
const containScale = Math.min(widthScale, heightScale);
|
|
84
|
+
const coverScale = Math.max(widthScale, heightScale);
|
|
85
|
+
const nextScale = (() => {
|
|
86
|
+
switch (mode) {
|
|
87
|
+
case 'cover':
|
|
88
|
+
return coverScale;
|
|
89
|
+
case 'width':
|
|
90
|
+
return widthScale;
|
|
91
|
+
case 'height':
|
|
92
|
+
return heightScale;
|
|
93
|
+
case 'actual':
|
|
94
|
+
return 1;
|
|
95
|
+
case 'scale-down':
|
|
96
|
+
return Math.min(1, containScale);
|
|
97
|
+
case 'auto':
|
|
98
|
+
case 'contain':
|
|
99
|
+
default:
|
|
100
|
+
return containScale;
|
|
101
|
+
}
|
|
102
|
+
})();
|
|
103
|
+
if (!Number.isFinite(nextScale) || nextScale <= 0) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
return clampScale(nextScale, minScale, maxScale);
|
|
107
|
+
};
|
|
108
|
+
export const hasFileViewerExplicitInitialViewState = (state) => {
|
|
109
|
+
var _a, _b;
|
|
110
|
+
if (!state) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
const scale = Number((_a = state.scale) !== null && _a !== void 0 ? _a : (_b = state.zoom) === null || _b === void 0 ? void 0 : _b.scale);
|
|
114
|
+
if (Number.isFinite(scale) && scale > 0) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
if (Number.isFinite(state.page) || Number.isFinite(state.rotation)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (state.navigation && Object.keys(state.navigation).length > 0) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
if (state.extra && Object.keys(state.extra).length > 0) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
const scroll = state.scroll || {};
|
|
127
|
+
return ['top', 'left', 'topRatio', 'leftRatio'].some(key => {
|
|
128
|
+
const value = scroll[key];
|
|
129
|
+
return Number.isFinite(value);
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
const createNoopFitResult = (fit, reason, source = 'viewer', provider = 'none') => ({
|
|
133
|
+
applied: false,
|
|
134
|
+
mode: fit.mode,
|
|
135
|
+
resize: fit.resize,
|
|
136
|
+
source,
|
|
137
|
+
reason,
|
|
138
|
+
provider,
|
|
139
|
+
});
|
|
140
|
+
const withProviderResult = (result, request, provider) => ({
|
|
141
|
+
applied: !!(result === null || result === void 0 ? void 0 : result.applied),
|
|
142
|
+
mode: (result === null || result === void 0 ? void 0 : result.mode) || request.mode,
|
|
143
|
+
resize: (result === null || result === void 0 ? void 0 : result.resize) || request.resize,
|
|
144
|
+
scale: result === null || result === void 0 ? void 0 : result.scale,
|
|
145
|
+
source: (result === null || result === void 0 ? void 0 : result.source) || request.source,
|
|
146
|
+
reason: result === null || result === void 0 ? void 0 : result.reason,
|
|
147
|
+
provider: (result === null || result === void 0 ? void 0 : result.provider) || provider,
|
|
148
|
+
state: result === null || result === void 0 ? void 0 : result.state,
|
|
149
|
+
});
|
|
150
|
+
const readViewportSize = (root) => {
|
|
151
|
+
var _a;
|
|
152
|
+
const rect = (_a = root.getBoundingClientRect) === null || _a === void 0 ? void 0 : _a.call(root);
|
|
153
|
+
return {
|
|
154
|
+
width: Math.max(0, (rect === null || rect === void 0 ? void 0 : rect.width) || root.clientWidth || 0),
|
|
155
|
+
height: Math.max(0, (rect === null || rect === void 0 ? void 0 : rect.height) || root.clientHeight || 0),
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
export const createFileViewerFitController = ({ root, enabled, getFit = () => undefined, onFit, }) => {
|
|
159
|
+
let resizeObserver = null;
|
|
160
|
+
let resizeFrame = null;
|
|
161
|
+
let retryTimer = null;
|
|
162
|
+
let userInteracted = false;
|
|
163
|
+
let retryCount = 0;
|
|
164
|
+
const getWindow = () => {
|
|
165
|
+
var _a;
|
|
166
|
+
const currentRoot = root();
|
|
167
|
+
return ((_a = currentRoot === null || currentRoot === void 0 ? void 0 : currentRoot.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) ||
|
|
168
|
+
(typeof window !== 'undefined' ? window : undefined);
|
|
169
|
+
};
|
|
170
|
+
const cancelFrame = () => {
|
|
171
|
+
if (resizeFrame === null) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const view = getWindow();
|
|
175
|
+
if (view === null || view === void 0 ? void 0 : view.cancelAnimationFrame) {
|
|
176
|
+
view.cancelAnimationFrame(resizeFrame);
|
|
177
|
+
}
|
|
178
|
+
resizeFrame = null;
|
|
179
|
+
};
|
|
180
|
+
const cancelRetry = () => {
|
|
181
|
+
if (retryTimer) {
|
|
182
|
+
clearTimeout(retryTimer);
|
|
183
|
+
}
|
|
184
|
+
retryTimer = null;
|
|
185
|
+
};
|
|
186
|
+
const resolveFit = (fit, reason) => {
|
|
187
|
+
const configured = fit === undefined ? getFit() : fit;
|
|
188
|
+
if (configured !== undefined && configured !== null) {
|
|
189
|
+
return normalizeFileViewerFitOptions(configured);
|
|
190
|
+
}
|
|
191
|
+
return reason === 'api' ? normalizeFileViewerFitOptions('auto') : null;
|
|
192
|
+
};
|
|
193
|
+
const scheduleRetry = (fit, source, reason) => {
|
|
194
|
+
if (retryCount >= MAX_FILE_VIEWER_FIT_RETRIES) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
cancelRetry();
|
|
198
|
+
retryCount += 1;
|
|
199
|
+
retryTimer = setTimeout(() => {
|
|
200
|
+
retryTimer = null;
|
|
201
|
+
void runFit(fit, { source, reason: reason === 'api' ? 'api' : 'retry' });
|
|
202
|
+
}, 32 * retryCount);
|
|
203
|
+
};
|
|
204
|
+
const runFit = async (fit, runOptions = {}) => {
|
|
205
|
+
const source = runOptions.source || 'api';
|
|
206
|
+
const reason = runOptions.reason || 'api';
|
|
207
|
+
const normalized = resolveFit(fit, reason);
|
|
208
|
+
if (!normalized) {
|
|
209
|
+
return {
|
|
210
|
+
applied: false,
|
|
211
|
+
mode: 'auto',
|
|
212
|
+
resize: DEFAULT_FILE_VIEWER_FIT_RESIZE,
|
|
213
|
+
source,
|
|
214
|
+
reason: 'not-configured',
|
|
215
|
+
provider: 'none',
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
if ((enabled === null || enabled === void 0 ? void 0 : enabled()) === false) {
|
|
219
|
+
return createNoopFitResult(normalized, 'disabled', source);
|
|
220
|
+
}
|
|
221
|
+
const currentRoot = root();
|
|
222
|
+
if (!currentRoot) {
|
|
223
|
+
scheduleRetry(fit, source, reason);
|
|
224
|
+
return createNoopFitResult(normalized, 'no-root', source);
|
|
225
|
+
}
|
|
226
|
+
const viewport = readViewportSize(currentRoot);
|
|
227
|
+
if (viewport.width <= 0 || viewport.height <= 0) {
|
|
228
|
+
scheduleRetry(fit, source, reason);
|
|
229
|
+
return createNoopFitResult(normalized, 'zero-size', source);
|
|
230
|
+
}
|
|
231
|
+
const request = {
|
|
232
|
+
...normalized,
|
|
233
|
+
source,
|
|
234
|
+
reason,
|
|
235
|
+
viewportWidth: Math.max(0, viewport.width - normalized.padding * 2),
|
|
236
|
+
viewportHeight: Math.max(0, viewport.height - normalized.padding * 2),
|
|
237
|
+
container: currentRoot,
|
|
238
|
+
};
|
|
239
|
+
const viewStateProvider = findFileViewerViewStateProvider(currentRoot);
|
|
240
|
+
if (viewStateProvider === null || viewStateProvider === void 0 ? void 0 : viewStateProvider.fit) {
|
|
241
|
+
const result = withProviderResult(await viewStateProvider.fit(request), request, 'view-state');
|
|
242
|
+
if (result.applied) {
|
|
243
|
+
retryCount = 0;
|
|
244
|
+
onFit === null || onFit === void 0 ? void 0 : onFit(result);
|
|
245
|
+
return result;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const zoomProvider = findFileViewerZoomProvider(currentRoot);
|
|
249
|
+
if (zoomProvider === null || zoomProvider === void 0 ? void 0 : zoomProvider.fit) {
|
|
250
|
+
const result = withProviderResult(await zoomProvider.fit(request), request, 'zoom');
|
|
251
|
+
if (result.applied) {
|
|
252
|
+
retryCount = 0;
|
|
253
|
+
onFit === null || onFit === void 0 ? void 0 : onFit(result);
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const noop = createNoopFitResult(normalized, viewStateProvider || zoomProvider
|
|
258
|
+
? 'unsupported'
|
|
259
|
+
: 'no-provider', source);
|
|
260
|
+
if (noop.reason === 'no-provider') {
|
|
261
|
+
scheduleRetry(fit, source, reason);
|
|
262
|
+
}
|
|
263
|
+
return noop;
|
|
264
|
+
};
|
|
265
|
+
const scheduleFit = (reason = 'resize') => {
|
|
266
|
+
const normalized = normalizeFileViewerFitOptions(getFit());
|
|
267
|
+
if (!normalized || normalized.resize === 'initial') {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (normalized.resize === 'until-interaction' && userInteracted) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
cancelFrame();
|
|
274
|
+
const view = getWindow();
|
|
275
|
+
const run = () => {
|
|
276
|
+
resizeFrame = null;
|
|
277
|
+
void runFit(undefined, { source: 'viewer', reason });
|
|
278
|
+
};
|
|
279
|
+
if (view === null || view === void 0 ? void 0 : view.requestAnimationFrame) {
|
|
280
|
+
resizeFrame = view.requestAnimationFrame(run);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
resizeFrame = setTimeout(run, 16);
|
|
284
|
+
};
|
|
285
|
+
const disconnectObserver = () => {
|
|
286
|
+
cancelFrame();
|
|
287
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
|
|
288
|
+
resizeObserver = null;
|
|
289
|
+
};
|
|
290
|
+
const controller = {
|
|
291
|
+
normalize: normalizeFileViewerFitOptions,
|
|
292
|
+
fit: async (fit, options) => {
|
|
293
|
+
cancelRetry();
|
|
294
|
+
userInteracted = false;
|
|
295
|
+
return runFit(fit, {
|
|
296
|
+
source: (options === null || options === void 0 ? void 0 : options.source) || 'api',
|
|
297
|
+
reason: (options === null || options === void 0 ? void 0 : options.reason) || 'api',
|
|
298
|
+
});
|
|
299
|
+
},
|
|
300
|
+
applyInitialFit: async (initialOptions = {}) => {
|
|
301
|
+
cancelRetry();
|
|
302
|
+
retryCount = 0;
|
|
303
|
+
userInteracted = false;
|
|
304
|
+
if (initialOptions.skip) {
|
|
305
|
+
const normalized = normalizeFileViewerFitOptions(getFit()) ||
|
|
306
|
+
normalizeFileViewerFitOptions('auto');
|
|
307
|
+
return createNoopFitResult(normalized, 'initial-view-state', 'initial');
|
|
308
|
+
}
|
|
309
|
+
return runFit(undefined, { source: 'initial', reason: 'initial' });
|
|
310
|
+
},
|
|
311
|
+
scheduleFit,
|
|
312
|
+
observe() {
|
|
313
|
+
var _a, _b;
|
|
314
|
+
disconnectObserver();
|
|
315
|
+
const currentRoot = root();
|
|
316
|
+
const ResizeObserverCtor = ((_b = (_a = currentRoot === null || currentRoot === void 0 ? void 0 : currentRoot.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.ResizeObserver) ||
|
|
317
|
+
(typeof ResizeObserver !== 'undefined' ? ResizeObserver : undefined);
|
|
318
|
+
if (!currentRoot || !ResizeObserverCtor) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
resizeObserver = new ResizeObserverCtor(() => scheduleFit('resize'));
|
|
322
|
+
resizeObserver.observe(currentRoot);
|
|
323
|
+
},
|
|
324
|
+
markUserInteraction() {
|
|
325
|
+
userInteracted = true;
|
|
326
|
+
cancelRetry();
|
|
327
|
+
},
|
|
328
|
+
resetAutoFit() {
|
|
329
|
+
userInteracted = false;
|
|
330
|
+
retryCount = 0;
|
|
331
|
+
},
|
|
332
|
+
destroy() {
|
|
333
|
+
disconnectObserver();
|
|
334
|
+
cancelRetry();
|
|
335
|
+
retryCount = 0;
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
return controller;
|
|
339
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { findFileViewerViewStateProvider, findFileViewerZoomProvider, registerFileViewerViewStateProvider, resolveFileViewerScrollContainer, unregisterFileViewerViewStateProvider, } from './dom/index.js';
|
|
2
|
+
import { resolveFileViewerFitScale } from './fit.js';
|
|
2
3
|
export const cloneFileViewerViewState = (state) => {
|
|
3
4
|
if (!state) {
|
|
4
5
|
return null;
|
|
@@ -69,7 +70,7 @@ const resolveScrollValue = (value, ratio, maxValue) => {
|
|
|
69
70
|
return undefined;
|
|
70
71
|
};
|
|
71
72
|
export const registerFileViewerGenericViewStateProvider = ({ host, renderer, scrollTarget, }) => {
|
|
72
|
-
var _a;
|
|
73
|
+
var _a, _b;
|
|
73
74
|
const emitter = createFileViewerViewStateChangeEmitter();
|
|
74
75
|
const ownerWindow = getViewStateWindow(host);
|
|
75
76
|
let destroyed = false;
|
|
@@ -122,6 +123,63 @@ export const registerFileViewerGenericViewStateProvider = ({ host, renderer, scr
|
|
|
122
123
|
scrollElement.scrollLeft = Math.min(Math.max(0, left), maxLeft);
|
|
123
124
|
}
|
|
124
125
|
};
|
|
126
|
+
const fit = async (request) => {
|
|
127
|
+
var _a, _b, _c, _d;
|
|
128
|
+
const zoomProvider = getZoomProvider();
|
|
129
|
+
if (zoomProvider === null || zoomProvider === void 0 ? void 0 : zoomProvider.fit) {
|
|
130
|
+
return zoomProvider.fit(request);
|
|
131
|
+
}
|
|
132
|
+
if (!(zoomProvider === null || zoomProvider === void 0 ? void 0 : zoomProvider.setZoom)) {
|
|
133
|
+
return {
|
|
134
|
+
applied: false,
|
|
135
|
+
mode: request.mode,
|
|
136
|
+
resize: request.resize,
|
|
137
|
+
source: request.source,
|
|
138
|
+
reason: 'zoom-provider-unavailable',
|
|
139
|
+
provider: 'view-state',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const zoomState = zoomProvider.getState();
|
|
143
|
+
const currentScale = Number(zoomState.scale) > 0 ? Number(zoomState.scale) : 1;
|
|
144
|
+
const scrollElement = resolveScrollTarget();
|
|
145
|
+
const viewportWidth = request.viewportWidth || scrollElement.clientWidth || host.clientWidth;
|
|
146
|
+
const viewportHeight = request.viewportHeight || scrollElement.clientHeight || host.clientHeight;
|
|
147
|
+
const contentWidth = Math.max(scrollElement.scrollWidth || 0, host.scrollWidth || 0, ((_a = scrollElement.getBoundingClientRect) === null || _a === void 0 ? void 0 : _a.call(scrollElement).width) || 0);
|
|
148
|
+
const contentHeight = Math.max(scrollElement.scrollHeight || 0, host.scrollHeight || 0, ((_b = scrollElement.getBoundingClientRect) === null || _b === void 0 ? void 0 : _b.call(scrollElement).height) || 0);
|
|
149
|
+
const scale = resolveFileViewerFitScale({
|
|
150
|
+
mode: request.mode,
|
|
151
|
+
viewportWidth,
|
|
152
|
+
viewportHeight,
|
|
153
|
+
contentWidth: contentWidth / currentScale,
|
|
154
|
+
contentHeight: contentHeight / currentScale,
|
|
155
|
+
currentScale,
|
|
156
|
+
minScale: (_c = request.minScale) !== null && _c !== void 0 ? _c : zoomState.minScale,
|
|
157
|
+
maxScale: (_d = request.maxScale) !== null && _d !== void 0 ? _d : zoomState.maxScale,
|
|
158
|
+
});
|
|
159
|
+
if (!scale) {
|
|
160
|
+
return {
|
|
161
|
+
applied: false,
|
|
162
|
+
mode: request.mode,
|
|
163
|
+
resize: request.resize,
|
|
164
|
+
source: request.source,
|
|
165
|
+
reason: 'unmeasurable',
|
|
166
|
+
provider: 'view-state',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
suppressProgrammaticScrollEvents();
|
|
170
|
+
await zoomProvider.setZoom(scale);
|
|
171
|
+
await waitForViewStateFrame(host);
|
|
172
|
+
const state = emit('fit', request.source);
|
|
173
|
+
return {
|
|
174
|
+
applied: true,
|
|
175
|
+
mode: request.mode,
|
|
176
|
+
resize: request.resize,
|
|
177
|
+
scale,
|
|
178
|
+
source: request.source,
|
|
179
|
+
provider: 'view-state',
|
|
180
|
+
state,
|
|
181
|
+
};
|
|
182
|
+
};
|
|
125
183
|
const scheduleScrollChange = () => {
|
|
126
184
|
if (destroyed || Date.now() < suppressScrollEventUntil || scrollFrame) {
|
|
127
185
|
return;
|
|
@@ -156,21 +214,23 @@ export const registerFileViewerGenericViewStateProvider = ({ host, renderer, scr
|
|
|
156
214
|
}
|
|
157
215
|
return getState();
|
|
158
216
|
},
|
|
217
|
+
fit,
|
|
159
218
|
subscribe: emitter.subscribe,
|
|
160
219
|
};
|
|
161
220
|
host.dataset.viewerViewStateProvider = 'generic';
|
|
162
221
|
registerFileViewerViewStateProvider(host, provider);
|
|
163
|
-
host.addEventListener('scroll', scheduleScrollChange, {
|
|
222
|
+
(_a = host.addEventListener) === null || _a === void 0 ? void 0 : _a.call(host, 'scroll', scheduleScrollChange, {
|
|
164
223
|
capture: true,
|
|
165
224
|
passive: true,
|
|
166
225
|
});
|
|
167
226
|
const zoomProvider = getZoomProvider();
|
|
168
|
-
unsubscribeZoom = ((
|
|
227
|
+
unsubscribeZoom = ((_b = zoomProvider === null || zoomProvider === void 0 ? void 0 : zoomProvider.subscribe) === null || _b === void 0 ? void 0 : _b.call(zoomProvider, () => {
|
|
169
228
|
emit('zoom-change', 'viewer');
|
|
170
229
|
})) || null;
|
|
171
230
|
return {
|
|
172
231
|
provider,
|
|
173
232
|
destroy() {
|
|
233
|
+
var _a;
|
|
174
234
|
destroyed = true;
|
|
175
235
|
unsubscribeZoom === null || unsubscribeZoom === void 0 ? void 0 : unsubscribeZoom();
|
|
176
236
|
unsubscribeZoom = null;
|
|
@@ -178,7 +238,7 @@ export const registerFileViewerGenericViewStateProvider = ({ host, renderer, scr
|
|
|
178
238
|
ownerWindow.cancelAnimationFrame(scrollFrame);
|
|
179
239
|
}
|
|
180
240
|
scrollFrame = 0;
|
|
181
|
-
host.removeEventListener('scroll', scheduleScrollChange, true);
|
|
241
|
+
(_a = host.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(host, 'scroll', scheduleScrollChange, true);
|
|
182
242
|
unregisterFileViewerViewStateProvider(host);
|
|
183
243
|
},
|
|
184
244
|
};
|
package/dist/headless.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export type { FileViewerRendererAssetDefinition, FileViewerRendererAssetKind, Fi
|
|
|
3
3
|
export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities';
|
|
4
4
|
export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE, DEFAULT_FILE_VIEWER_ZOOM_SCALE, buildFileViewerDocumentTextChunks, createEmptyFileViewerSearchState, createFileViewerZoomState, normalizeFileViewerAiOptions, normalizeFileViewerSearchOptions, } from './features/document/model';
|
|
5
5
|
export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats';
|
|
6
|
-
export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerOperationContextEvent, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarPosition, resolveFileViewerToolbarState, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations';
|
|
6
|
+
export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, DEFAULT_FILE_VIEWER_TOOLBAR_ORDER, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerOperationContextEvent, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarPosition, resolveFileViewerToolbarOrder, resolveFileViewerToolbarState, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations';
|
|
7
7
|
export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages';
|
|
8
8
|
export type { FileViewerI18nInput, FileViewerResolvedLocale, ResolveFileViewerI18nInput, } from './i18n/messages';
|
|
9
9
|
export type { BuildFileViewerLifecycleContextFromNormalizedSourceInput, BuildFileViewerOperationContextFromLifecycleStateInput, BuildFileViewerLifecycleContextInput, BuiltFileViewerLifecycleContext, BuiltFileViewerOperationContext, CreateFileViewerLifecycleActionsInput, CreateFileViewerPublicApiInput, CreateFileViewerToolbarActionsInput, CreateFileViewerToolbarControllerActionHandlersInput, DispatchFileViewerLifecycleEventInput, DispatchFileViewerOperationAvailabilityChangeInput, DispatchFileViewerOperationContextEventInput, DispatchFileViewerZoomChangeInput, FileViewerActiveUnloadState, FileViewerLifecycleActions, FileViewerLifecycleComponentEmit, FileViewerLifecycleHookErrorLogger, FileViewerLifecycleStateController, FileViewerOperationErrorLogger, FileViewerToolbarActions, FileViewerToolbarControllerActionHandlers, FileViewerToolbarState, FileViewerToolbarZoomSyncSnapshot, FileViewerZoomButtonAction, ReportFileViewerLifecycleHookErrorInput, ReportFileViewerOperationErrorInput, ResolveFileViewerBeforeOperationErrorMessageInput, ResolveFileViewerLifecycleHookErrorMessageInput, ResolveFileViewerOperationAvailabilityInput, ResolveFileViewerToolbarStateInput, RunFileViewerActiveUnloadCompleteInput, RunFileViewerActiveUnloadStartInput, RunFileViewerBeforeOperationInput, RunFileViewerToolbarAvailabilitySyncInput, RunFileViewerToolbarZoomSyncInput, SerializedFileViewerContext, } from './lifecycle/operations';
|
|
@@ -24,4 +24,4 @@ export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRI
|
|
|
24
24
|
export type { FileViewerErrorMessageFormatter, } from './viewer/state';
|
|
25
25
|
export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark';
|
|
26
26
|
export type { FileViewerWatermarkPresentationState, FileViewerWatermarkStyle, } from './features/watermark';
|
|
27
|
-
export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
|
|
27
|
+
export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
|
package/dist/headless.js
CHANGED
|
@@ -7,7 +7,7 @@ export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WA
|
|
|
7
7
|
export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities.js';
|
|
8
8
|
export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE, DEFAULT_FILE_VIEWER_ZOOM_SCALE, buildFileViewerDocumentTextChunks, createEmptyFileViewerSearchState, createFileViewerZoomState, normalizeFileViewerAiOptions, normalizeFileViewerSearchOptions, } from './features/document/model.js';
|
|
9
9
|
export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats.js';
|
|
10
|
-
export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerOperationContextEvent, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarPosition, resolveFileViewerToolbarState, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
|
|
10
|
+
export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, DEFAULT_FILE_VIEWER_TOOLBAR_ORDER, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerOperationContextEvent, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarPosition, resolveFileViewerToolbarOrder, resolveFileViewerToolbarState, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
|
|
11
11
|
export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages.js';
|
|
12
12
|
export { getFileViewerOptionsSearchParam, normalizeFileViewerTheme, parseFileViewerOptions, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options.js';
|
|
13
13
|
export { resolveFileViewerPresentationState, } from './presentation/state.js';
|
package/dist/i18n/messages.js
CHANGED
|
@@ -42,6 +42,13 @@ const ZH_CN_MESSAGES = {
|
|
|
42
42
|
'error.load': '加载文件异常',
|
|
43
43
|
'error.stream': '加载 PDF 流式预览异常',
|
|
44
44
|
'error.beforeOperation': '操作前置校验失败',
|
|
45
|
+
'error.unknown': '未知错误',
|
|
46
|
+
'error.blobUnavailable': '当前运行环境不支持 Blob,无法读取文件内容。',
|
|
47
|
+
'error.sourceUnsupported': '不支持当前文件来源输入。',
|
|
48
|
+
'error.fileReadArrayBuffer': '读取文件二进制内容失败。',
|
|
49
|
+
'error.fileReadDataUrl': '读取文件 Data URL 失败。',
|
|
50
|
+
'error.fileReadText': '读取文件文本内容失败。',
|
|
51
|
+
'error.imageDataUrlRead': '读取图片数据失败。',
|
|
45
52
|
'operation.download': '下载原始文件',
|
|
46
53
|
'operation.print': '打印完整渲染内容',
|
|
47
54
|
'operation.exportHtml': '导出渲染 HTML',
|
|
@@ -88,6 +95,22 @@ const ZH_CN_MESSAGES = {
|
|
|
88
95
|
'spreadsheet.state.rowsAndColumns': '共 {rows} 行,{cols} 列,按视口预取平滑加载',
|
|
89
96
|
'spreadsheet.error.parseFailed': 'Excel 解析失败',
|
|
90
97
|
'spreadsheet.error.workerFailed': 'Excel Worker 运行失败',
|
|
98
|
+
'word.error.invalidDocx': '文件不是有效的 DOCX/OOXML 压缩包,可能下载不完整或被服务端错误内容替换,请重新上传或检查文件源。',
|
|
99
|
+
'word.error.missingOdfContent': 'ODF 文件缺少 content.xml。',
|
|
100
|
+
'word.error.odfXmlParseFailed': 'ODF XML 解析失败。',
|
|
101
|
+
'word.title.rtf': 'RTF 文档预览',
|
|
102
|
+
'word.title.openDocumentPresentation': 'OpenDocument 演示文稿预览',
|
|
103
|
+
'word.title.openDocumentText': 'OpenDocument 文档预览',
|
|
104
|
+
'word.page.fallback': '第 {page} 页',
|
|
105
|
+
'word.page.empty': '该页没有可提取文本',
|
|
106
|
+
'word.body': '正文',
|
|
107
|
+
'word.body.empty': '没有提取到可读文本',
|
|
108
|
+
'ofd.state.loading': '正在解析 OFD...',
|
|
109
|
+
'ofd.error.empty': 'OFD 文件中没有可渲染的文档',
|
|
110
|
+
'ofd.error.parseFailed': 'OFD 文件解析失败',
|
|
111
|
+
'presentation.state.loading': '正在解析 PPTX...',
|
|
112
|
+
'presentation.error.title': 'PPTX 预览失败',
|
|
113
|
+
'presentation.error.parseFailed': 'PPTX 解析失败',
|
|
91
114
|
'archive.error.nestedUnsupported': '不支持 .{type} 格式的在线预览,请下载后预览或转换为支持的格式',
|
|
92
115
|
'archive.loading.readingDirectory': '正在读取压缩包目录...',
|
|
93
116
|
'archive.loading.readingDirectoryHint': '大文件会在 Worker 中解析,避免阻塞主线程。',
|
|
@@ -124,6 +147,8 @@ const ZH_CN_MESSAGES = {
|
|
|
124
147
|
'archive.loading.initializingWorker': '正在初始化压缩包解析 Worker...',
|
|
125
148
|
'archive.loading.initializingWorkerHint': '大文件会在 Worker 中解析,避免阻塞主线程。',
|
|
126
149
|
'archive.error.workerInitFailed': '压缩包 Worker 初始化失败',
|
|
150
|
+
'archive.error.workerUnsupported': '当前浏览器不支持 Web Worker。',
|
|
151
|
+
'archive.error.indexedDbUnavailable': 'IndexedDB 不可用',
|
|
127
152
|
'archive.error.entryTooLarge': '压缩包内文件 {name} 体积 {size} 超过预览上限 {limit}。',
|
|
128
153
|
'archive.loading.extracting': '正在按需解压 {name}...',
|
|
129
154
|
'archive.loading.rendering': '正在渲染 {name}...',
|
|
@@ -419,6 +444,13 @@ const EN_US_MESSAGES = {
|
|
|
419
444
|
'error.load': 'Failed to load file',
|
|
420
445
|
'error.stream': 'Failed to load streaming PDF preview',
|
|
421
446
|
'error.beforeOperation': 'Before-operation check failed',
|
|
447
|
+
'error.unknown': 'Unknown error',
|
|
448
|
+
'error.blobUnavailable': 'Blob is not available in the current execution environment.',
|
|
449
|
+
'error.sourceUnsupported': 'Unsupported file source input.',
|
|
450
|
+
'error.fileReadArrayBuffer': 'Failed to read the file as an ArrayBuffer.',
|
|
451
|
+
'error.fileReadDataUrl': 'Failed to read the file as a data URL.',
|
|
452
|
+
'error.fileReadText': 'Failed to read the file as text.',
|
|
453
|
+
'error.imageDataUrlRead': 'Unable to read image data URL.',
|
|
422
454
|
'operation.download': 'Download original file',
|
|
423
455
|
'operation.print': 'Print complete rendered content',
|
|
424
456
|
'operation.exportHtml': 'Export rendered HTML',
|
|
@@ -465,6 +497,22 @@ const EN_US_MESSAGES = {
|
|
|
465
497
|
'spreadsheet.state.rowsAndColumns': '{rows} rows, {cols} columns, loading smoothly by viewport',
|
|
466
498
|
'spreadsheet.error.parseFailed': 'Failed to parse Excel',
|
|
467
499
|
'spreadsheet.error.workerFailed': 'Excel Worker failed',
|
|
500
|
+
'word.error.invalidDocx': 'The file is not a valid DOCX/OOXML package. It may be incomplete or replaced by an error response from the server. Upload it again or check the file source.',
|
|
501
|
+
'word.error.missingOdfContent': 'The ODF file is missing content.xml.',
|
|
502
|
+
'word.error.odfXmlParseFailed': 'Failed to parse ODF XML.',
|
|
503
|
+
'word.title.rtf': 'RTF document preview',
|
|
504
|
+
'word.title.openDocumentPresentation': 'OpenDocument presentation preview',
|
|
505
|
+
'word.title.openDocumentText': 'OpenDocument document preview',
|
|
506
|
+
'word.page.fallback': 'Page {page}',
|
|
507
|
+
'word.page.empty': 'No extractable text on this page',
|
|
508
|
+
'word.body': 'Body',
|
|
509
|
+
'word.body.empty': 'No readable text was extracted',
|
|
510
|
+
'ofd.state.loading': 'Parsing OFD...',
|
|
511
|
+
'ofd.error.empty': 'The OFD file has no renderable document.',
|
|
512
|
+
'ofd.error.parseFailed': 'Failed to parse OFD file',
|
|
513
|
+
'presentation.state.loading': 'Parsing PPTX...',
|
|
514
|
+
'presentation.error.title': 'PPTX preview failed',
|
|
515
|
+
'presentation.error.parseFailed': 'Failed to parse PPTX',
|
|
468
516
|
'archive.error.nestedUnsupported': '.{type} cannot be previewed online. Download it or convert it to a supported format.',
|
|
469
517
|
'archive.loading.readingDirectory': 'Reading archive directory...',
|
|
470
518
|
'archive.loading.readingDirectoryHint': 'Large files are parsed in a Worker to keep the main thread responsive.',
|
|
@@ -501,6 +549,8 @@ const EN_US_MESSAGES = {
|
|
|
501
549
|
'archive.loading.initializingWorker': 'Initializing archive parsing Worker...',
|
|
502
550
|
'archive.loading.initializingWorkerHint': 'Large files are parsed in a Worker to keep the main thread responsive.',
|
|
503
551
|
'archive.error.workerInitFailed': 'Archive Worker initialization failed',
|
|
552
|
+
'archive.error.workerUnsupported': 'This browser does not support Web Workers.',
|
|
553
|
+
'archive.error.indexedDbUnavailable': 'IndexedDB is unavailable',
|
|
504
554
|
'archive.error.entryTooLarge': 'Entry {name} is {size}, exceeding the preview limit {limit}.',
|
|
505
555
|
'archive.loading.extracting': 'Extracting {name} on demand...',
|
|
506
556
|
'archive.loading.rendering': 'Rendering {name}...',
|
|
@@ -760,10 +810,11 @@ export const FILE_VIEWER_BUILTIN_MESSAGES = Object.freeze({
|
|
|
760
810
|
});
|
|
761
811
|
const getBrowserLocale = () => {
|
|
762
812
|
var _a;
|
|
763
|
-
|
|
813
|
+
const browserNavigator = typeof window !== 'undefined' ? window.navigator : undefined;
|
|
814
|
+
if (!browserNavigator) {
|
|
764
815
|
return undefined;
|
|
765
816
|
}
|
|
766
|
-
return ((_a =
|
|
817
|
+
return ((_a = browserNavigator.languages) === null || _a === void 0 ? void 0 : _a[0]) || browserNavigator.language;
|
|
767
818
|
};
|
|
768
819
|
export const normalizeFileViewerLocale = (locale) => {
|
|
769
820
|
const candidate = !locale || locale === 'auto'
|