@file-viewer/core 3.3.1 → 3.3.3
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/assets.d.ts +2 -2
- package/dist/assets.js +1 -5
- package/dist/browser/controller.d.ts +1 -2
- package/dist/browser/controller.js +8 -39
- package/dist/browser/source-feedback.d.ts +1 -2
- package/dist/browser/source-feedback.js +2 -3
- package/dist/browser/toolbar-focus.d.ts +0 -1
- package/dist/browser/toolbar-focus.js +0 -3
- package/dist/browser/toolbar-keyboard.d.ts +1 -0
- package/dist/browser/toolbar-keyboard.js +63 -0
- package/dist/browser.d.ts +2 -2
- package/dist/browser.js +2 -2
- package/dist/config/options.d.ts +1 -1
- package/dist/contracts/types.d.ts +1 -470
- package/dist/contracts/xml.d.ts +0 -11
- package/dist/export.d.ts +3 -10
- package/dist/export.js +2 -9
- package/dist/exportDocument.d.ts +1 -12
- package/dist/exportDocument.js +2 -31
- package/dist/features/document/dom/anchors.d.ts +1 -1
- package/dist/features/document/dom/index.d.ts +5 -5
- package/dist/features/document/dom/index.js +3 -3
- package/dist/features/document/dom/providers.d.ts +1 -1
- package/dist/features/document/events.d.ts +2 -2
- package/dist/features/document/events.js +3 -3
- package/dist/features/document/fit.d.ts +1 -1
- package/dist/features/document/fit.js +1 -1
- package/dist/features/document/imageHandTool.d.ts +0 -2
- package/dist/features/document/imageHandTool.js +1 -5
- package/dist/features/document/model.d.ts +1 -1
- package/dist/features/document/search.d.ts +1 -1
- package/dist/features/document/search.js +2 -2
- package/dist/features/document/viewState.d.ts +1 -1
- package/dist/features/document/viewState.js +2 -2
- package/dist/features/document/zoom.d.ts +1 -1
- package/dist/features/document/zoom.js +3 -3
- package/dist/features/document/zoomGestures.d.ts +2 -2
- package/dist/features/document/zoomGestures.js +0 -2
- package/dist/features/printMask.d.ts +1 -1
- package/dist/features/printMaskDesigner.d.ts +2 -6
- package/dist/features/printMaskDesigner.js +2 -11
- package/dist/features/printMaskLoader.d.ts +1 -7
- package/dist/features/printMaskLoader.js +1 -7
- package/dist/features/watermark.d.ts +1 -1
- package/dist/headless.d.ts +29 -29
- package/dist/headless.js +16 -21
- package/dist/i18n/messages.d.ts +1 -1
- package/dist/i18n/messages.de.d.ts +1 -5
- package/dist/i18n/messages.de.js +1 -5
- package/dist/i18n/messages.ja.d.ts +1 -6
- package/dist/i18n/messages.ja.js +1 -6
- package/dist/i18n/messages.js +4 -4
- package/dist/index.d.ts +77 -77
- package/dist/index.js +39 -39
- package/dist/lifecycle/facade.d.ts +4 -4
- package/dist/lifecycle/facade.js +2 -2
- package/dist/lifecycle/operations.d.ts +4 -5
- package/dist/lifecycle/operations.js +4 -10
- package/dist/output/canvasImage.d.ts +1 -2
- package/dist/output/canvasImage.js +1 -4
- package/dist/output/export.d.ts +1 -3
- package/dist/output/export.js +0 -12
- package/dist/output/printLayout.d.ts +0 -5
- package/dist/output/printLayout.js +0 -4
- package/dist/output/snapshotDownload.d.ts +1 -2
- package/dist/output/snapshotDownload.js +2 -3
- package/dist/platform/assets.d.ts +4 -11
- package/dist/platform/assets.js +20 -45
- package/dist/platform/copiedAssets.d.ts +0 -1
- package/dist/platform/copiedAssets.js +1 -2
- package/dist/presentation/colorScheme.d.ts +1 -2
- package/dist/presentation/colorScheme.js +1 -2
- package/dist/presentation/state.d.ts +1 -1
- package/dist/presentation/state.js +3 -3
- package/dist/print-mask.d.ts +2 -2
- package/dist/print-mask.js +1 -1
- package/dist/registry/capabilities.d.ts +1 -14
- package/dist/registry/capabilities.js +2 -15
- package/dist/registry/formats.d.ts +1 -1
- package/dist/registry/formats.generated.d.ts +2 -3
- package/dist/registry/formats.generated.js +2 -3
- package/dist/registry/formats.js +2 -2
- package/dist/registry/registry.d.ts +1 -15
- package/dist/registry/registry.js +2 -10
- package/dist/renderers/image.d.ts +1 -1
- package/dist/renderers/image.js +5 -7
- package/dist/renderers/index.d.ts +3 -3
- package/dist/renderers/index.js +5 -11
- package/dist/rendering/dispatcher.d.ts +1 -6
- package/dist/rendering/dispatcher.js +3 -3
- package/dist/rendering/handler.d.ts +3 -13
- package/dist/rendering/handler.js +9 -21
- package/dist/security/svgResources.d.ts +0 -10
- package/dist/security/svgResources.js +0 -12
- package/dist/source/index.d.ts +3 -3
- package/dist/source/index.js +1 -1
- package/dist/source/loading.d.ts +4 -4
- package/dist/source/loading.js +4 -7
- package/dist/source/precheck.d.ts +1 -13
- package/dist/source/precheck.js +2 -9
- package/dist/source/textEncoding.d.ts +0 -18
- package/dist/source/textEncoding.js +0 -15
- package/dist/viewer/createViewer.d.ts +1 -1
- package/dist/viewer/createViewer.js +17 -28
- package/dist/viewer/loading.d.ts +2 -6
- package/dist/viewer/loading.js +1 -9
- package/dist/viewer/operations.d.ts +3 -3
- package/dist/viewer/operations.js +6 -14
- package/dist/viewer/state.d.ts +2 -6
- package/dist/viewer/state.js +3 -8
- package/package.json +3 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DEFAULT_RENDERER_DEFINITIONS } from
|
|
2
|
-
import { getExtension, normalizeFileExtension, normalizeFilename } from
|
|
1
|
+
import { DEFAULT_RENDERER_DEFINITIONS } from "./formats.js";
|
|
2
|
+
import { getExtension, normalizeFileExtension, normalizeFilename } from "../source/index.js";
|
|
3
3
|
const autoRendererBucketKey = '__flyfish_file_viewer_auto_renderer_presets__';
|
|
4
4
|
const getAutoRendererBucket = () => {
|
|
5
5
|
const host = globalThis;
|
|
@@ -217,7 +217,6 @@ const createRendererDefinitionInstallPlan = (registry, definitions) => {
|
|
|
217
217
|
...regularDefinitions,
|
|
218
218
|
...enhancerDefinitions,
|
|
219
219
|
];
|
|
220
|
-
// Validate the complete ownership transition before mutating the caller's registry.
|
|
221
220
|
const validationRegistry = createRendererRegistry(registry.list());
|
|
222
221
|
plannedDefinitions.forEach(definition => validationRegistry.register(definition));
|
|
223
222
|
return { definitions: plannedDefinitions };
|
|
@@ -328,13 +327,6 @@ export const hasFileViewerRendererPresetName = (input) => {
|
|
|
328
327
|
}
|
|
329
328
|
return false;
|
|
330
329
|
};
|
|
331
|
-
/**
|
|
332
|
-
* Normalizes `options.preset` / `options.presets` into renderer plugin inputs.
|
|
333
|
-
*
|
|
334
|
-
* Passing a preset object is the most portable integration style because it
|
|
335
|
-
* works in any bundler. String selectors intentionally only resolve presets
|
|
336
|
-
* that are already registered by a side-effect import or by build tooling.
|
|
337
|
-
*/
|
|
338
330
|
export const resolveFileViewerRendererPresetInputs = (input) => {
|
|
339
331
|
if (!input) {
|
|
340
332
|
return [];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { FileRenderContext, FileViewerRenderedInstance } from
|
|
1
|
+
import type { FileRenderContext, FileViewerRenderedInstance } from "../contracts/types.js";
|
|
2
2
|
export default function renderImage(buffer: ArrayBuffer, target: HTMLDivElement, type?: string, context?: FileRenderContext): Promise<FileViewerRenderedInstance>;
|
package/dist/renderers/image.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from
|
|
2
|
-
import { installFileViewerImageHandTool } from
|
|
3
|
-
import { resolveFileViewerFitScale, } from
|
|
4
|
-
import { createFileViewerTranslator } from
|
|
5
|
-
import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter } from
|
|
1
|
+
import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from "../features/document/dom/index.js";
|
|
2
|
+
import { installFileViewerImageHandTool } from "../features/document/imageHandTool.js";
|
|
3
|
+
import { resolveFileViewerFitScale, } from "../features/document/fit.js";
|
|
4
|
+
import { createFileViewerTranslator } from "../i18n/messages.js";
|
|
5
|
+
import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter } from "../features/document/zoom.js";
|
|
6
6
|
const imageMimeMap = {
|
|
7
7
|
avif: 'image/avif',
|
|
8
8
|
bmp: 'image/bmp',
|
|
@@ -201,8 +201,6 @@ export default async function renderImage(buffer, target, type, context) {
|
|
|
201
201
|
applyImageZoom();
|
|
202
202
|
zoomEmitter.emit();
|
|
203
203
|
};
|
|
204
|
-
// Zoom subscribers may resize the parent toolbar. Keep geometry writes out
|
|
205
|
-
// of ResizeObserver delivery so ancestor notifications remain deliverable.
|
|
206
204
|
const scheduleViewportUpdate = () => {
|
|
207
205
|
if (destroyed || viewportResizeFrame !== null)
|
|
208
206
|
return;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FileViewerBuiltinRendererPreset, FileRenderHandler, FileViewerRenderedInstance } from
|
|
1
|
+
import type { FileViewerBuiltinRendererPreset, FileRenderHandler, FileViewerRenderedInstance } from "../contracts/types.js";
|
|
2
2
|
type CoreBrowserRendererHandler = FileRenderHandler<FileViewerRenderedInstance, HTMLDivElement>;
|
|
3
3
|
interface CoreBrowserRendererHandlerEntry {
|
|
4
4
|
rendererId: string;
|
|
@@ -56,7 +56,7 @@ export declare const coreLiteRendererDefinitions: ({
|
|
|
56
56
|
readonly packageName: "@file-viewer/renderer-ppt";
|
|
57
57
|
readonly presets: readonly ["office", "all"];
|
|
58
58
|
readonly containerVersions: readonly ["PowerPoint 97-2003 Binary"];
|
|
59
|
-
readonly knownLimits: readonly ["
|
|
59
|
+
readonly knownLimits: readonly ["Host fonts and complex effects can differ from PowerPoint", "Macros are never executed"];
|
|
60
60
|
readonly capabilities: {
|
|
61
61
|
readonly download: true;
|
|
62
62
|
readonly print: "adapter";
|
|
@@ -724,7 +724,7 @@ export declare const coreLiteRendererDefinitions: ({
|
|
|
724
724
|
readonly status: "experimental";
|
|
725
725
|
readonly packageName: "@file-viewer/renderer-design";
|
|
726
726
|
readonly presets: readonly [];
|
|
727
|
-
readonly containerVersions: readonly ["IDML package", "@paged-media/introspect-wasm 0.
|
|
727
|
+
readonly containerVersions: readonly ["IDML package", "@paged-media/introspect-wasm 0.73.4"];
|
|
728
728
|
readonly knownLimits: readonly ["Pages are rendered locally by the CPU WASM engine in a module Worker; the browser never uploads the IDML package", "ZIP64, encrypted, multi-disk, overlapping, unsafe-path, unsupported-compression, and configured expansion-limit packages are rejected before the WASM engine opens them", "The current engine page tree lists TextFrame and Rectangle objects only even though other supported objects may still appear in rendered page pixels", "Each page render rebuilds the upstream document internally; interactive requests are latest-wins, preview is lazy, and print-all is bounded by the configured total RGBA working-set limit"];
|
|
729
729
|
readonly capabilities: {
|
|
730
730
|
readonly download: true;
|
package/dist/renderers/index.js
CHANGED
|
@@ -1,23 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// core shell and framework wrappers stay fast on first load.
|
|
6
|
-
import { DEFAULT_RENDERER_DEFINITIONS } from '../registry/formats.js';
|
|
7
|
-
import { createFileRenderHandlerRegistry } from '../rendering/handler.js';
|
|
8
|
-
import { createFileViewerRendererDispatcher } from '../rendering/dispatcher.js';
|
|
9
|
-
import { createFileViewerUnsupportedState } from '../viewer/state.js';
|
|
1
|
+
import { DEFAULT_RENDERER_DEFINITIONS } from "../registry/formats.js";
|
|
2
|
+
import { createFileRenderHandlerRegistry } from "../rendering/handler.js";
|
|
3
|
+
import { createFileViewerRendererDispatcher } from "../rendering/dispatcher.js";
|
|
4
|
+
import { createFileViewerUnsupportedState } from "../viewer/state.js";
|
|
10
5
|
const createWrapper = (el) => ({
|
|
11
6
|
$el: el,
|
|
12
7
|
unmount() {
|
|
13
|
-
// DOM renderers clean themselves up through their own returned instance.
|
|
14
8
|
},
|
|
15
9
|
});
|
|
16
10
|
export const coreBrowserRendererHandlers = [
|
|
17
11
|
{
|
|
18
12
|
rendererId: 'image',
|
|
19
13
|
handler: async (buffer, target, type, context) => {
|
|
20
|
-
const { default: renderImage } = await import(
|
|
14
|
+
const { default: renderImage } = await import("./image.js");
|
|
21
15
|
return renderImage(buffer, target, type, context);
|
|
22
16
|
},
|
|
23
17
|
},
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import type { RendererRegistry } from
|
|
1
|
+
import type { RendererRegistry } from "../contracts/types.js";
|
|
2
2
|
export interface FileViewerRendererHandlerEntry<Handler> {
|
|
3
3
|
rendererId: string;
|
|
4
4
|
handler: Handler;
|
|
5
5
|
}
|
|
6
|
-
/**
|
|
7
|
-
* Content-signature aware renderers can throw this shape when the filename
|
|
8
|
-
* extension points at the wrong container. The orchestration layer follows the
|
|
9
|
-
* redirect once, using the handler registered for the detected renderer id.
|
|
10
|
-
*/
|
|
11
6
|
export interface FileViewerRendererRedirectError extends Error {
|
|
12
7
|
actualRendererId: string;
|
|
13
8
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { DEFAULT_RENDERER_DEFINITIONS } from
|
|
2
|
-
import { createRendererRegistry } from
|
|
3
|
-
import { normalizeFileExtension } from
|
|
1
|
+
import { DEFAULT_RENDERER_DEFINITIONS } from "../registry/formats.js";
|
|
2
|
+
import { createRendererRegistry } from "../registry/registry.js";
|
|
3
|
+
import { normalizeFileExtension } from "../source/index.js";
|
|
4
4
|
export const resolveFileViewerRendererRedirectId = (error) => {
|
|
5
5
|
if (!error || typeof error !== 'object' || !('actualRendererId' in error)) {
|
|
6
6
|
return undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { FileViewerRendererDispatcher } from
|
|
2
|
-
import { type FileViewerMutableAccessor, type MutableFileViewerRenderReadinessState } from
|
|
3
|
-
import type { FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from
|
|
1
|
+
import type { FileViewerRendererDispatcher } from "./dispatcher.js";
|
|
2
|
+
import { type FileViewerMutableAccessor, type MutableFileViewerRenderReadinessState } from "../source/loading.js";
|
|
3
|
+
import type { FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from "../contracts/types.js";
|
|
4
4
|
export declare const FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE = "\u9884\u89C8\u5185\u5BB9\u5378\u8F7D\u5931\u8D25";
|
|
5
5
|
export interface ResolveFileViewerRenderSessionDisposeErrorMessageInput {
|
|
6
6
|
message?: string;
|
|
@@ -21,7 +21,6 @@ export interface RenderFileViewerHandlerInput<Rendered = unknown, Target extends
|
|
|
21
21
|
export interface CreateFileRenderHandlerLoaderOptions<Rendered = unknown, Target extends HTMLElement = HTMLElement> {
|
|
22
22
|
handler: FileRenderHandler<Rendered, Target>;
|
|
23
23
|
rendererId?: string;
|
|
24
|
-
/** Allows stream-preferred handlers to receive an empty buffer plus context.streamUrl. */
|
|
25
24
|
allowUrlSource?: boolean;
|
|
26
25
|
getTarget?: (context: RendererLoadContext) => Target;
|
|
27
26
|
createContext?: (context: RendererLoadContext) => FileRenderContext;
|
|
@@ -61,10 +60,6 @@ export interface FileViewerStyleHandle {
|
|
|
61
60
|
remove(): void;
|
|
62
61
|
}
|
|
63
62
|
export interface AppendFileViewerStyleOptions {
|
|
64
|
-
/**
|
|
65
|
-
* Constructable stylesheets are useful for long-lived ShadowRoots. Keep this
|
|
66
|
-
* opt-in so renderer styles still clean up naturally with their target node.
|
|
67
|
-
*/
|
|
68
63
|
adoptedStyleSheet?: boolean;
|
|
69
64
|
}
|
|
70
65
|
export interface ResetFileViewerRenderSurfaceInput<Session extends RendererSession = RendererSession> {
|
|
@@ -169,11 +164,6 @@ export interface CreateFileViewerRenderSurfaceActionHandlersInput<Session extend
|
|
|
169
164
|
export declare const DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS = "file-render";
|
|
170
165
|
export declare const FILE_VIEWER_RENDER_SURFACE_BACKGROUND_PROPERTY = "--file-viewer-render-surface-background";
|
|
171
166
|
export declare const normalizeFileViewerRenderSurfaceBackground: (value: unknown) => string | null;
|
|
172
|
-
/**
|
|
173
|
-
* Keeps the public UI option and the renderer-facing CSS custom property in
|
|
174
|
-
* sync. Custom properties inherit through Shadow DOM, so setting this on the
|
|
175
|
-
* render host covers both scoped and shadow-isolated renderer targets.
|
|
176
|
-
*/
|
|
177
167
|
export declare const syncFileViewerRenderSurfaceBackground: (target: HTMLElement | null | undefined, options?: Pick<FileViewerOptions, "ui"> | null) => string | null;
|
|
178
168
|
export declare const isFileViewerShadowRoot: (value: unknown) => value is ShadowRoot;
|
|
179
169
|
export declare const getFileViewerShadowRootForNode: (node: Node | null | undefined) => ShadowRoot | null;
|
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { createRendererRegistry } from '../registry/registry.js';
|
|
11
|
-
import { getExtension, normalizeFileExtension } from '../source/index.js';
|
|
12
|
-
import { applyFileViewerRenderReadinessState, } from '../source/loading.js';
|
|
13
|
-
import { findFileViewerViewStateProvider } from '../features/document/dom/index.js';
|
|
14
|
-
import { registerFileViewerGenericViewStateProvider } from '../features/document/viewState.js';
|
|
1
|
+
import { DEFAULT_RENDERER_DEFINITIONS } from "../registry/formats.js";
|
|
2
|
+
import { waitForFileViewerNextPaint } from "../output/export.js";
|
|
3
|
+
import { createFileViewerRendererDispatcher } from "./dispatcher.js";
|
|
4
|
+
import { resolveFileViewerRendererRedirectId } from "./dispatcher.js";
|
|
5
|
+
import { createRendererRegistry } from "../registry/registry.js";
|
|
6
|
+
import { getExtension, normalizeFileExtension } from "../source/index.js";
|
|
7
|
+
import { applyFileViewerRenderReadinessState, } from "../source/loading.js";
|
|
8
|
+
import { findFileViewerViewStateProvider } from "../features/document/dom/index.js";
|
|
9
|
+
import { registerFileViewerGenericViewStateProvider } from "../features/document/viewState.js";
|
|
15
10
|
export const FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE = '预览内容卸载失败';
|
|
16
11
|
export const DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS = 'file-render';
|
|
17
12
|
export const FILE_VIEWER_RENDER_SURFACE_BACKGROUND_PROPERTY = '--file-viewer-render-surface-background';
|
|
@@ -24,11 +19,6 @@ export const normalizeFileViewerRenderSurfaceBackground = (value) => {
|
|
|
24
19
|
const normalized = value.trim();
|
|
25
20
|
return normalized && normalized.toLowerCase() !== 'auto' ? normalized : null;
|
|
26
21
|
};
|
|
27
|
-
/**
|
|
28
|
-
* Keeps the public UI option and the renderer-facing CSS custom property in
|
|
29
|
-
* sync. Custom properties inherit through Shadow DOM, so setting this on the
|
|
30
|
-
* render host covers both scoped and shadow-isolated renderer targets.
|
|
31
|
-
*/
|
|
32
22
|
export const syncFileViewerRenderSurfaceBackground = (target, options) => {
|
|
33
23
|
var _a;
|
|
34
24
|
if (!target) {
|
|
@@ -161,8 +151,6 @@ export const appendFileViewerStyle = (target, css, options = {}) => {
|
|
|
161
151
|
const shadowRoot = getFileViewerShadowRootForNode(target);
|
|
162
152
|
const StyleSheet = shadowRoot ? getConstructableStyleSheet(shadowRoot) : null;
|
|
163
153
|
if (options.adoptedStyleSheet && shadowRoot && StyleSheet) {
|
|
164
|
-
// Use the target document's constructor. A stylesheet constructed in the
|
|
165
|
-
// parent window cannot be adopted by a ShadowRoot owned by an iframe.
|
|
166
154
|
const sheet = new StyleSheet();
|
|
167
155
|
sheet.replaceSync(css);
|
|
168
156
|
shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, sheet];
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Keep ordinary SVG styles while preventing imports and resource requests.
|
|
3
|
-
* Obfuscated URL tokens fail closed instead of depending on parser quirks.
|
|
4
|
-
*/
|
|
5
1
|
export declare const sanitizeFileViewerSvgCss: (value: string) => string;
|
|
6
|
-
/** Remove executable attributes and every SVG resource URL that can load data remotely. */
|
|
7
2
|
export declare const sanitizeFileViewerSvgResources: (root: ParentNode) => void;
|
|
8
|
-
/**
|
|
9
|
-
* Mermaid 11 resolves image-node URLs with `new Image()` while rendering,
|
|
10
|
-
* before its SVG can be sanitized. Reject image metadata and explicit remote
|
|
11
|
-
* URLs before calling Mermaid so an untrusted diagram cannot initiate I/O.
|
|
12
|
-
*/
|
|
13
3
|
export declare const assertFileViewerMermaidSourceHasNoExternalResources: (source: string) => void;
|
|
@@ -44,10 +44,6 @@ const isSafeSvgCssUrl = (value) => {
|
|
|
44
44
|
/^blob:/i.test(normalized) ||
|
|
45
45
|
SAFE_EMBEDDED_IMAGE_DATA_URL.test(normalized);
|
|
46
46
|
};
|
|
47
|
-
/**
|
|
48
|
-
* Keep ordinary SVG styles while preventing imports and resource requests.
|
|
49
|
-
* Obfuscated URL tokens fail closed instead of depending on parser quirks.
|
|
50
|
-
*/
|
|
51
47
|
export const sanitizeFileViewerSvgCss = (value) => {
|
|
52
48
|
const normalizedCharacters = [];
|
|
53
49
|
for (const character of value) {
|
|
@@ -93,7 +89,6 @@ export const sanitizeFileViewerSvgCss = (value) => {
|
|
|
93
89
|
chunks.push(normalized.slice(segmentStart));
|
|
94
90
|
return chunks.join('');
|
|
95
91
|
};
|
|
96
|
-
/** Remove executable attributes and every SVG resource URL that can load data remotely. */
|
|
97
92
|
export const sanitizeFileViewerSvgResources = (root) => {
|
|
98
93
|
root.querySelectorAll('*').forEach(element => {
|
|
99
94
|
for (const attribute of Array.from(element.attributes)) {
|
|
@@ -160,17 +155,10 @@ const canonicalizeMermaidSourceForResourceScan = (source) => {
|
|
|
160
155
|
}
|
|
161
156
|
return output;
|
|
162
157
|
};
|
|
163
|
-
/**
|
|
164
|
-
* Mermaid 11 resolves image-node URLs with `new Image()` while rendering,
|
|
165
|
-
* before its SVG can be sanitized. Reject image metadata and explicit remote
|
|
166
|
-
* URLs before calling Mermaid so an untrusted diagram cannot initiate I/O.
|
|
167
|
-
*/
|
|
168
158
|
export const assertFileViewerMermaidSourceHasNoExternalResources = (source) => {
|
|
169
159
|
const normalized = canonicalizeMermaidSourceForResourceScan(String(source || ''));
|
|
170
160
|
const compact = normalized.replace(/[\t\r\n ]+/g, '');
|
|
171
161
|
const hasImageMetadata = /(?:^|[,{])\s*(?:img|["']img["'])\s*:/im.test(normalized);
|
|
172
|
-
// HTML math labels are created by Mermaid before its SVG is returned. Reject
|
|
173
|
-
// loading elements even when their URL uses entities or a relative path.
|
|
174
162
|
const hasLoadingElement = /<\s*(?:img|image|iframe|object|embed|video|audio|source|link|script|style)\b/i.test(normalized);
|
|
175
163
|
const hasRemoteUrl = /(?:https?|ftp):\/\//i.test(compact) ||
|
|
176
164
|
/(?:^|[\s"'(=:,])(?:\/\/|\\\\)[A-Za-z0-9]/m.test(normalized);
|
package/dist/source/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { FileViewerFileRef, FileViewerSource, NormalizedFileViewerSource } from
|
|
2
|
-
export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from
|
|
3
|
-
export type { DecodedFileViewerText, FileViewerSingleByteTextEncoding, FileViewerTextEncoding, ResolvedFileViewerTextEncoding, ResolvedFileViewerTextSource, } from
|
|
1
|
+
import type { FileViewerFileRef, FileViewerSource, NormalizedFileViewerSource } from "../contracts/types.js";
|
|
2
|
+
export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from "./textEncoding.js";
|
|
3
|
+
export type { DecodedFileViewerText, FileViewerSingleByteTextEncoding, FileViewerTextEncoding, ResolvedFileViewerTextEncoding, ResolvedFileViewerTextSource, } from "./textEncoding.js";
|
|
4
4
|
export type FileViewerReadResult = string | ArrayBuffer | undefined | null;
|
|
5
5
|
export declare const DEFAULT_FILE_VIEWER_SOURCE_FILENAME = "preview.bin";
|
|
6
6
|
export declare const normalizeFileExtension: (extension: string) => string;
|
package/dist/source/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from
|
|
1
|
+
export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from "./textEncoding.js";
|
|
2
2
|
export const DEFAULT_FILE_VIEWER_SOURCE_FILENAME = 'preview.bin';
|
|
3
3
|
export const normalizeFileExtension = (extension) => {
|
|
4
4
|
return extension.trim().replace(/^\./, '').toLowerCase();
|
package/dist/source/loading.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { FileViewerFileRef, FileViewerLifecycleContext, FileViewerPdfOptions } from
|
|
2
|
-
import { type FileViewerLifecycleStateController } from
|
|
3
|
-
import { type FileViewerErrorMessageFormatter } from
|
|
4
|
-
import type { FileViewerI18nInput } from
|
|
1
|
+
import type { FileViewerFileRef, FileViewerLifecycleContext, FileViewerPdfOptions } from "../contracts/types.js";
|
|
2
|
+
import { type FileViewerLifecycleStateController } from "../lifecycle/operations.js";
|
|
3
|
+
import { type FileViewerErrorMessageFormatter } from "../viewer/state.js";
|
|
4
|
+
import type { FileViewerI18nInput } from "../i18n/messages.js";
|
|
5
5
|
export declare const DEFAULT_PDF_RANGE_CHUNK_SIZE: number;
|
|
6
6
|
export declare const DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME = "preview.pdf";
|
|
7
7
|
export declare const FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE = "\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25";
|
package/dist/source/loading.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { buildFileViewerLifecycleContext, } from
|
|
2
|
-
import { resolveFileViewerPreviewMessages, } from
|
|
3
|
-
import { translateFileViewerMessage } from
|
|
4
|
-
import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, getExtension, normalizeFilename, normalizeFileExtension, readFileViewerBuffer, resolveFileViewerSourceFilename, wrapFileViewerFileRef, } from
|
|
1
|
+
import { buildFileViewerLifecycleContext, } from "../lifecycle/operations.js";
|
|
2
|
+
import { resolveFileViewerPreviewMessages, } from "../viewer/state.js";
|
|
3
|
+
import { translateFileViewerMessage } from "../i18n/messages.js";
|
|
4
|
+
import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, getExtension, normalizeFilename, normalizeFileExtension, readFileViewerBuffer, resolveFileViewerSourceFilename, wrapFileViewerFileRef, } from "./index.js";
|
|
5
5
|
export const DEFAULT_PDF_RANGE_CHUNK_SIZE = 64 * 1024;
|
|
6
6
|
export const DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME = 'preview.pdf';
|
|
7
7
|
export const FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE = '文件下载失败';
|
|
@@ -117,7 +117,6 @@ const encodeFileViewerUrlPathSegment = (segment) => {
|
|
|
117
117
|
decoded = decodeURIComponent(segment);
|
|
118
118
|
}
|
|
119
119
|
catch {
|
|
120
|
-
// Invalid percent escapes are treated as literal filename characters.
|
|
121
120
|
}
|
|
122
121
|
return encodeURIComponent(decoded)
|
|
123
122
|
.replace(/%3A/gi, ':')
|
|
@@ -607,8 +606,6 @@ export const runFileViewerRemoteFilePreview = async ({ url, filename, type, vers
|
|
|
607
606
|
});
|
|
608
607
|
const sourceUrl = remoteSource.url;
|
|
609
608
|
const controller = requestController.createAbortController();
|
|
610
|
-
// The streaming helper finalizes its own load state; probe/download paths
|
|
611
|
-
// are finalized here, including cancellation before a renderer is mounted.
|
|
612
609
|
let streamFinalized = false;
|
|
613
610
|
try {
|
|
614
611
|
if (!remoteSource.streamPdf && shouldStreamRemoteUrl) {
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import type { FileViewerFileRef, FileViewerSource } from
|
|
1
|
+
import type { FileViewerFileRef, FileViewerSource } from "../contracts/types.js";
|
|
2
2
|
export type FileViewerPrecheckStatus = 'ready' | 'invalid' | 'unsupported';
|
|
3
3
|
export type FileViewerPrecheckReason = 'content-valid' | 'content-not-inspected' | 'content-inconclusive' | 'empty-structured-file' | 'signature-mismatch' | 'invalid-package' | 'missing-package-part' | 'unsupported-extension';
|
|
4
4
|
export interface FileViewerPrecheckOptions {
|
|
5
|
-
/** Filename used when a Blob or ArrayBuffer has no name. */
|
|
6
5
|
filename?: string;
|
|
7
|
-
/** Explicit extension, with or without a leading dot. */
|
|
8
6
|
type?: string;
|
|
9
|
-
/** Restricts the result to the renderers installed by the host application. */
|
|
10
7
|
supportedExtensions?: Iterable<string>;
|
|
11
|
-
/** Maximum ZIP central-directory bytes read from a Blob. Defaults to 8 MiB. */
|
|
12
8
|
maxPackageMetadataBytes?: number;
|
|
13
9
|
}
|
|
14
10
|
export interface FileViewerPrecheckResult {
|
|
@@ -17,7 +13,6 @@ export interface FileViewerPrecheckResult {
|
|
|
17
13
|
rendererId: string | null;
|
|
18
14
|
supported: boolean;
|
|
19
15
|
inspected: boolean;
|
|
20
|
-
/** `null` means the extension is supported but no structural validator exists. */
|
|
21
16
|
valid: boolean | null;
|
|
22
17
|
previewable: boolean;
|
|
23
18
|
status: FileViewerPrecheckStatus;
|
|
@@ -25,12 +20,5 @@ export interface FileViewerPrecheckResult {
|
|
|
25
20
|
missingParts: string[];
|
|
26
21
|
}
|
|
27
22
|
type FileViewerPrecheckInput = FileViewerSource | FileViewerFileRef;
|
|
28
|
-
/**
|
|
29
|
-
* Performs a cheap, renderer-free capability and structure check.
|
|
30
|
-
*
|
|
31
|
-
* This intentionally does not promise rendering fidelity. A `ready` result
|
|
32
|
-
* means the extension is available and any known container/signature checks
|
|
33
|
-
* passed; the real renderer remains the final authority for malformed content.
|
|
34
|
-
*/
|
|
35
23
|
export declare const precheckFileViewerSource: (input: FileViewerPrecheckInput, options?: FileViewerPrecheckOptions) => Promise<FileViewerPrecheckResult>;
|
|
36
24
|
export {};
|
package/dist/source/precheck.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS } from
|
|
2
|
-
import { getExtension, normalizeFileExtension, normalizeFilename, normalizeSource, } from
|
|
1
|
+
import { DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS } from "../registry/formats.js";
|
|
2
|
+
import { getExtension, normalizeFileExtension, normalizeFilename, normalizeSource, } from "./index.js";
|
|
3
3
|
const DEFAULT_MAX_PACKAGE_METADATA_BYTES = 8 * 1024 * 1024;
|
|
4
4
|
const ZIP_LOCAL_SIGNATURE = 0x04034b50;
|
|
5
5
|
const ZIP_CENTRAL_SIGNATURE = 0x02014b50;
|
|
@@ -203,13 +203,6 @@ const inspectStructuredContent = async (source, extension, maxPackageMetadataByt
|
|
|
203
203
|
}
|
|
204
204
|
return { inspected: false, valid: null, reason: 'content-not-inspected' };
|
|
205
205
|
};
|
|
206
|
-
/**
|
|
207
|
-
* Performs a cheap, renderer-free capability and structure check.
|
|
208
|
-
*
|
|
209
|
-
* This intentionally does not promise rendering fidelity. A `ready` result
|
|
210
|
-
* means the extension is available and any known container/signature checks
|
|
211
|
-
* passed; the real renderer remains the final authority for malformed content.
|
|
212
|
-
*/
|
|
213
206
|
export const precheckFileViewerSource = async (input, options = {}) => {
|
|
214
207
|
var _a;
|
|
215
208
|
const source = toSource(input, options);
|
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Single-byte legacy encodings supported by the browser TextDecoder API.
|
|
3
|
-
* Each byte decodes to one UTF-16 code unit, so the virtual
|
|
4
|
-
* large-text renderer can slice them at any byte offset.
|
|
5
|
-
*/
|
|
6
1
|
export type FileViewerSingleByteTextEncoding = 'iso-8859-1' | 'iso-8859-2' | 'iso-8859-15' | 'windows-1250' | 'windows-1251' | 'windows-1252';
|
|
7
2
|
export type FileViewerTextEncoding = 'auto' | 'utf-8' | 'utf-16le' | 'utf-16be' | 'gbk' | 'gb18030' | FileViewerSingleByteTextEncoding;
|
|
8
3
|
export type ResolvedFileViewerTextEncoding = Exclude<FileViewerTextEncoding, 'auto' | 'gbk'>;
|
|
9
|
-
/**
|
|
10
|
-
* Encoding used by `auto` when the bytes carry no BOM, do not look like
|
|
11
|
-
* UTF-16, and are not valid UTF-8. GB18030 keeps the historical behavior.
|
|
12
|
-
*/
|
|
13
4
|
export declare const DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING: ResolvedFileViewerTextEncoding;
|
|
14
5
|
export declare const isSingleByteFileViewerTextEncoding: (encoding: string | undefined) => encoding is FileViewerSingleByteTextEncoding;
|
|
15
6
|
export interface DecodedFileViewerText {
|
|
@@ -21,15 +12,6 @@ export interface ResolvedFileViewerTextSource {
|
|
|
21
12
|
bomLength: number;
|
|
22
13
|
}
|
|
23
14
|
export declare const isValidFileViewerUtf8: (bytes: Uint8Array) => boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Picks the decoder for a text buffer.
|
|
26
|
-
*
|
|
27
|
-
* `encoding` other than `auto` is used as-is. In `auto` mode the order is:
|
|
28
|
-
* BOM, UTF-16 byte structure, strict UTF-8, then `fallbackEncoding`. The
|
|
29
|
-
* fallback defaults to GB18030; pass `windows-1252`, `windows-1251`, or
|
|
30
|
-
* another supported label for Latin, Cyrillic, or Central European legacy
|
|
31
|
-
* files, which are otherwise misread as CJK text.
|
|
32
|
-
*/
|
|
33
15
|
export declare const resolveFileViewerTextEncoding: (bytes: Uint8Array, encoding?: FileViewerTextEncoding | string, fallbackEncoding?: FileViewerTextEncoding | string) => ResolvedFileViewerTextSource;
|
|
34
16
|
export declare const createFileViewerTextDecoder: (encoding: ResolvedFileViewerTextEncoding) => TextDecoder;
|
|
35
17
|
export declare const decodeFileViewerTextBuffer: (data: ArrayBuffer, encoding?: FileViewerTextEncoding | string, fallbackEncoding?: FileViewerTextEncoding | string) => DecodedFileViewerText;
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Encoding used by `auto` when the bytes carry no BOM, do not look like
|
|
3
|
-
* UTF-16, and are not valid UTF-8. GB18030 keeps the historical behavior.
|
|
4
|
-
*/
|
|
5
1
|
export const DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING = 'gb18030';
|
|
6
2
|
const SINGLE_BYTE_ENCODING_ALIASES = new Map([
|
|
7
3
|
['iso-8859-1', 'iso-8859-1'],
|
|
@@ -76,8 +72,6 @@ const normalizeFallbackEncoding = (fallbackEncoding) => {
|
|
|
76
72
|
const isContinuationByte = (value) => {
|
|
77
73
|
return value !== undefined && value >= 0x80 && value <= 0xbf;
|
|
78
74
|
};
|
|
79
|
-
// Validate bytes directly because older WebViews can accept the fatal option
|
|
80
|
-
// while still replacing malformed input. That would hide the GB18030 fallback.
|
|
81
75
|
export const isValidFileViewerUtf8 = (bytes) => {
|
|
82
76
|
for (let index = 0; index < bytes.length;) {
|
|
83
77
|
const first = bytes[index];
|
|
@@ -158,15 +152,6 @@ const inferBomlessUtf16 = (bytes) => {
|
|
|
158
152
|
}
|
|
159
153
|
return null;
|
|
160
154
|
};
|
|
161
|
-
/**
|
|
162
|
-
* Picks the decoder for a text buffer.
|
|
163
|
-
*
|
|
164
|
-
* `encoding` other than `auto` is used as-is. In `auto` mode the order is:
|
|
165
|
-
* BOM, UTF-16 byte structure, strict UTF-8, then `fallbackEncoding`. The
|
|
166
|
-
* fallback defaults to GB18030; pass `windows-1252`, `windows-1251`, or
|
|
167
|
-
* another supported label for Latin, Cyrillic, or Central European legacy
|
|
168
|
-
* files, which are otherwise misread as CJK text.
|
|
169
|
-
*/
|
|
170
155
|
export const resolveFileViewerTextEncoding = (bytes, encoding = 'auto', fallbackEncoding = DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING) => {
|
|
171
156
|
const normalized = normalizeEncoding(encoding);
|
|
172
157
|
if (normalized !== 'auto') {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, FileViewerRenderPurpose, RendererRegistry } from
|
|
1
|
+
import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, FileViewerRenderPurpose, RendererRegistry } from "../contracts/types.js";
|
|
2
2
|
export interface CreateViewerOptions {
|
|
3
3
|
registry?: RendererRegistry;
|
|
4
4
|
options?: FileViewerOptions;
|
|
@@ -1,26 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { createFileViewerCoreRendererRegistry } from '../renderers/index.js';
|
|
19
|
-
import { createFileViewerRequestScope } from '../source/loading.js';
|
|
20
|
-
import { normalizeSource } from '../source/index.js';
|
|
21
|
-
import { buildFileViewerWatermarkInlineStyle } from '../features/watermark.js';
|
|
22
|
-
import { createFileViewerSnapshotDownload } from '../output/snapshotDownload.js';
|
|
23
|
-
import { createFileViewerErrorState, createFileViewerUnsupportedState } from './state.js';
|
|
1
|
+
import { createEmptyFileViewerSearchState, } from "../features/document/model.js";
|
|
2
|
+
import { createFileViewerDocumentFeatureControllerActionHandlers, } from "../features/document/events.js";
|
|
3
|
+
import { createFileViewerZoomController } from "../features/document/zoom.js";
|
|
4
|
+
import { createFileViewerViewStateController } from "../features/document/viewState.js";
|
|
5
|
+
import { createFileViewerFitController, hasFileViewerExplicitInitialViewState, } from "../features/document/fit.js";
|
|
6
|
+
import { DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME, DEFAULT_FILE_VIEWER_EXPORT_FILENAME, DEFAULT_FILE_VIEWER_PREVIEW_TITLE, createFileViewerOriginalSourceStateFromNormalizedSource, executeFileViewerDownloadOperation, executeFileViewerExportHtmlOperation, executeFileViewerPrintOperation, resolveFileViewerDisplayFilename, resolveFileViewerOperationFilename, } from "./operations.js";
|
|
7
|
+
import { openFileViewerPrintMaskDesignerAsync } from "../features/printMaskLoader.js";
|
|
8
|
+
import { applyFileViewerZoomAvailability, createUnsupportedAvailability, getRendererAvailability, } from "../registry/capabilities.js";
|
|
9
|
+
import { buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, runFileViewerBeforeOperation, runFileViewerLifecycleHook, } from "../lifecycle/operations.js";
|
|
10
|
+
import { collectFileViewerRendererPlugins, createRendererRegistry, getFileViewerAutoRendererPresetVersion, hasFileViewerRendererPresetName, installFileViewerRendererPlugins, listFileViewerAutoRendererPresets, resolveFileViewerRendererPresetInputs, resolveFileViewerRendererDefinition, } from "../registry/registry.js";
|
|
11
|
+
import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, createFileViewerRenderSurface, removeFileViewerRenderTarget, syncFileViewerRenderSurfaceBackground, } from "../rendering/handler.js";
|
|
12
|
+
import { createFileViewerCoreRendererRegistry } from "../renderers/index.js";
|
|
13
|
+
import { createFileViewerRequestScope } from "../source/loading.js";
|
|
14
|
+
import { normalizeSource } from "../source/index.js";
|
|
15
|
+
import { buildFileViewerWatermarkInlineStyle } from "../features/watermark.js";
|
|
16
|
+
import { createFileViewerSnapshotDownload } from "../output/snapshotDownload.js";
|
|
17
|
+
import { createFileViewerErrorState, createFileViewerUnsupportedState } from "./state.js";
|
|
24
18
|
const emitLifecycle = async (options, onEvent, phase, source, version, startedAt, reason) => {
|
|
25
19
|
const now = Date.now();
|
|
26
20
|
const context = buildFileViewerLifecycleContextFromNormalizedSource({
|
|
@@ -390,9 +384,6 @@ export const createViewer = (container, createOptions = {}) => {
|
|
|
390
384
|
registry,
|
|
391
385
|
options: {
|
|
392
386
|
...inheritedOptions,
|
|
393
|
-
// The parent already resolved its renderer assembly into `registry`.
|
|
394
|
-
// Reuse that exact registry without reinstalling presets or mutating a
|
|
395
|
-
// shared registry while an attachment is open.
|
|
396
387
|
autoRenderers: false,
|
|
397
388
|
rendererMode: 'extend',
|
|
398
389
|
renderers: undefined,
|
|
@@ -686,8 +677,6 @@ export const createViewer = (container, createOptions = {}) => {
|
|
|
686
677
|
zoomController.refreshProvider();
|
|
687
678
|
viewStateController.refreshProvider();
|
|
688
679
|
const finishStaleLoad = async () => {
|
|
689
|
-
// unload/replace may already have disposed this session. Clear only
|
|
690
|
-
// the session still owned by this load, preserving a replacement.
|
|
691
680
|
if (renderSurfaceState.session === session && currentRenderTarget === targetHost) {
|
|
692
681
|
await destroyCurrent('replace');
|
|
693
682
|
}
|
package/dist/viewer/loading.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type FileViewerI18nInput } from
|
|
2
|
-
import type { FileViewerStateTheme } from
|
|
1
|
+
import { type FileViewerI18nInput } from "../i18n/messages.js";
|
|
2
|
+
import type { FileViewerStateTheme } from "../contracts/types.js";
|
|
3
3
|
export type FileViewerLoadingTheme = FileViewerStateTheme;
|
|
4
4
|
export interface FileViewerLoadingState {
|
|
5
5
|
loading: boolean;
|
|
@@ -51,8 +51,4 @@ export declare const syncFileViewerLoadingControllerState: <Target extends Mutab
|
|
|
51
51
|
export declare const runFileViewerLoadingControllerAction: <Target extends MutableFileViewerLoadingState>(target: Target, action: () => FileViewerLoadingState) => Target;
|
|
52
52
|
export declare const runFileViewerLoadingExtensionSync: <Target extends MutableFileViewerLoadingState>({ target, controller, extension, }: RunFileViewerLoadingExtensionSyncInput<Target>) => Target;
|
|
53
53
|
export declare const createFileViewerLoadingControllerActionHandlers: <Target extends MutableFileViewerLoadingState>(target: Target, controller: FileViewerLoadingController) => FileViewerLoadingControllerActionHandlers;
|
|
54
|
-
/**
|
|
55
|
-
* 统一管理加载、错误、文案和主题色。
|
|
56
|
-
* wrapper 只负责把这个加载状态映射到各自框架的响应式系统。
|
|
57
|
-
*/
|
|
58
54
|
export declare const createFileViewerLoadingController: (extend?: string, initialI18n?: FileViewerI18nInput) => FileViewerLoadingController;
|
package/dist/viewer/loading.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { translateFileViewerMessage, } from
|
|
1
|
+
import { translateFileViewerMessage, } from "../i18n/messages.js";
|
|
2
2
|
export const FALLBACK_FILE_VIEWER_LOADING_THEME = {
|
|
3
3
|
accent: '#5f6f82',
|
|
4
4
|
soft: 'rgba(95, 111, 130, 0.12)',
|
|
@@ -418,10 +418,6 @@ const FILE_VIEWER_LOADING_COPY_KEYS = {
|
|
|
418
418
|
flac: { label: 'loading.audio.label', hint: 'loading.audio.hint' },
|
|
419
419
|
weba: { label: 'loading.audio.label', hint: 'loading.audio.hint' },
|
|
420
420
|
};
|
|
421
|
-
/**
|
|
422
|
-
* 根据扩展名返回统一的加载主题。
|
|
423
|
-
* 这样不同预览器可以复用同一套视觉语义,避免颜色、图标和文案各写一份。
|
|
424
|
-
*/
|
|
425
421
|
const localizeFileViewerLoadingTheme = (theme, extend = '', i18n) => {
|
|
426
422
|
const normalized = extend.trim().toLowerCase();
|
|
427
423
|
const keys = FILE_VIEWER_LOADING_COPY_KEYS[normalized] || {
|
|
@@ -511,10 +507,6 @@ export const createFileViewerLoadingControllerActionHandlers = (target, controll
|
|
|
511
507
|
},
|
|
512
508
|
};
|
|
513
509
|
};
|
|
514
|
-
/**
|
|
515
|
-
* 统一管理加载、错误、文案和主题色。
|
|
516
|
-
* wrapper 只负责把这个加载状态映射到各自框架的响应式系统。
|
|
517
|
-
*/
|
|
518
510
|
export const createFileViewerLoadingController = (extend = '', initialI18n) => {
|
|
519
511
|
let currentExtend = extend;
|
|
520
512
|
let currentI18n = initialI18n;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { FileViewerErrorMessageFormatter } from
|
|
2
|
-
import { type FileViewerI18nInput } from
|
|
3
|
-
import type { FileRenderExportAdapter, FileViewerDownloadOptions, FileViewerExportHtmlOptions, FileViewerOperationType, FileViewerPrintOptions, NormalizedFileViewerSource } from
|
|
1
|
+
import type { FileViewerErrorMessageFormatter } from "./state.js";
|
|
2
|
+
import { type FileViewerI18nInput } from "../i18n/messages.js";
|
|
3
|
+
import type { FileRenderExportAdapter, FileViewerDownloadOptions, FileViewerExportHtmlOptions, FileViewerOperationType, FileViewerPrintOptions, NormalizedFileViewerSource } from "../contracts/types.js";
|
|
4
4
|
export interface FileViewerOriginalSourceState {
|
|
5
5
|
buffer?: ArrayBuffer | null;
|
|
6
6
|
file?: File | Blob | null;
|