@file-viewer/core 2.1.1 → 2.1.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.
@@ -1,9 +1,16 @@
1
1
  import { normalizeFileExtension } from '../source/index.js';
2
+ import { DEFAULT_RENDERER_DEFINITIONS } from '../registry/formats.js';
3
+ import { resolveFileViewerLocale, translateFileViewerMessage, } from '../i18n/messages.js';
2
4
  export const FILE_VIEWER_PREVIEW_MESSAGES = Object.freeze({
3
5
  downloading: '正在下载文件资源...',
4
6
  streamingPdf: '正在建立 PDF 流式预览...',
5
7
  reading: '正在解析文件内容...',
6
8
  });
9
+ export const resolveFileViewerPreviewMessages = (i18n) => Object.freeze({
10
+ downloading: translateFileViewerMessage(i18n, 'preview.downloading'),
11
+ streamingPdf: translateFileViewerMessage(i18n, 'preview.streamingPdf'),
12
+ reading: translateFileViewerMessage(i18n, 'preview.reading'),
13
+ });
7
14
  export const DEFAULT_FILE_VIEWER_STATE_THEME = Object.freeze({
8
15
  accent: '#5f6f82',
9
16
  soft: 'rgba(95, 111, 130, 0.12)',
@@ -16,6 +23,105 @@ const extensionLabel = (extension) => {
16
23
  const normalized = normalizeFileExtension(extension);
17
24
  return normalized ? `.${normalized}` : '当前';
18
25
  };
26
+ const rendererPackageById = {
27
+ 'office-word-openxml': '@file-viewer/renderer-word',
28
+ 'office-word-binary': '@file-viewer/renderer-word',
29
+ 'office-presentation': '@file-viewer/renderer-presentation',
30
+ 'open-document': '@file-viewer/renderer-word',
31
+ 'spreadsheet-openxml': '@file-viewer/renderer-spreadsheet',
32
+ pdf: '@file-viewer/renderer-pdf',
33
+ ofd: '@file-viewer/renderer-ofd',
34
+ typst: '@file-viewer/renderer-typst',
35
+ archive: '@file-viewer/renderer-archive',
36
+ email: '@file-viewer/renderer-email',
37
+ eda: '@file-viewer/renderer-eda',
38
+ cad: '@file-viewer/renderer-cad',
39
+ model: '@file-viewer/renderer-3d',
40
+ geo: '@file-viewer/renderer-geo',
41
+ drawing: '@file-viewer/renderer-drawing',
42
+ mindmap: '@file-viewer/renderer-mindmap',
43
+ epub: '@file-viewer/renderer-epub',
44
+ umd: '@file-viewer/renderer-epub',
45
+ image: '@file-viewer/renderer-image',
46
+ markdown: '@file-viewer/renderer-text',
47
+ code: '@file-viewer/renderer-text',
48
+ video: '@file-viewer/renderer-media',
49
+ audio: '@file-viewer/renderer-media',
50
+ 'data-asset': '@file-viewer/renderer-data',
51
+ };
52
+ const officeRendererIds = new Set([
53
+ 'office-word-openxml',
54
+ 'office-word-binary',
55
+ 'office-presentation',
56
+ 'open-document',
57
+ 'spreadsheet-openxml',
58
+ 'pdf',
59
+ 'ofd',
60
+ ]);
61
+ const liteRendererIds = new Set([
62
+ 'image',
63
+ 'markdown',
64
+ 'code',
65
+ 'video',
66
+ 'audio',
67
+ ]);
68
+ const engineeringRendererIds = new Set([
69
+ 'typst',
70
+ 'archive',
71
+ 'eda',
72
+ 'cad',
73
+ 'model',
74
+ 'geo',
75
+ 'drawing',
76
+ 'mindmap',
77
+ 'data-asset',
78
+ ]);
79
+ const resolvePresetHint = (definition) => {
80
+ if (officeRendererIds.has(definition.id)) {
81
+ return {
82
+ packageName: '@file-viewer/preset-office',
83
+ vitePreset: 'office',
84
+ label: 'Office preset',
85
+ };
86
+ }
87
+ if (engineeringRendererIds.has(definition.id)) {
88
+ return {
89
+ packageName: '@file-viewer/preset-engineering',
90
+ vitePreset: 'engineering',
91
+ label: 'Engineering preset',
92
+ };
93
+ }
94
+ if (liteRendererIds.has(definition.id)) {
95
+ return {
96
+ packageName: '@file-viewer/preset-lite',
97
+ vitePreset: 'lite',
98
+ label: 'Lite preset',
99
+ };
100
+ }
101
+ return {
102
+ packageName: '@file-viewer/preset-all',
103
+ vitePreset: 'all',
104
+ label: 'Full preset',
105
+ };
106
+ };
107
+ export const resolveFileViewerRendererInstallHint = (extension = '') => {
108
+ const normalized = normalizeFileExtension(extension);
109
+ const definition = DEFAULT_RENDERER_DEFINITIONS.find(item => item.extensions.map(normalizeFileExtension).includes(normalized));
110
+ if (!definition) {
111
+ return null;
112
+ }
113
+ const preset = resolvePresetHint(definition);
114
+ return {
115
+ extension: normalized,
116
+ rendererId: definition.id,
117
+ rendererLabel: definition.label,
118
+ rendererCategory: definition.category,
119
+ rendererPackage: rendererPackageById[definition.id],
120
+ presetPackage: preset.packageName,
121
+ vitePreset: preset.vitePreset,
122
+ presetLabel: preset.label,
123
+ };
124
+ };
19
125
  const createFileViewerStateDescriptor = ({ state, extension = '', title, message, description, theme = DEFAULT_FILE_VIEWER_STATE_THEME, recoverable, }) => ({
20
126
  state,
21
127
  extension: normalizeFileExtension(extension),
@@ -25,39 +131,68 @@ const createFileViewerStateDescriptor = ({ state, extension = '', title, message
25
131
  theme,
26
132
  recoverable,
27
133
  });
28
- export const createFileViewerPreviewLoadingState = (extension = '', message = FILE_VIEWER_PREVIEW_MESSAGES.reading, theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
134
+ export const createFileViewerPreviewLoadingState = (extension = '', message, theme = DEFAULT_FILE_VIEWER_STATE_THEME, i18n) => createFileViewerStateDescriptor({
29
135
  state: 'loading',
30
136
  extension,
31
137
  title: theme.label,
32
- message,
138
+ message: message || translateFileViewerMessage(i18n, 'preview.reading'),
33
139
  description: theme.hint,
34
140
  theme,
35
141
  recoverable: false,
36
142
  });
37
- export const createFileViewerReadyState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
143
+ export const createFileViewerReadyState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME, i18n) => createFileViewerStateDescriptor({
38
144
  state: 'ready',
39
145
  extension,
40
- title: '预览完成',
41
- message: '文件内容已完成渲染。',
146
+ title: translateFileViewerMessage(i18n, 'state.ready.title'),
147
+ message: translateFileViewerMessage(i18n, 'state.ready.message'),
42
148
  theme,
43
149
  recoverable: false,
44
150
  });
45
- export const createFileViewerEmptyState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
151
+ export const createFileViewerEmptyState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME, i18n) => createFileViewerStateDescriptor({
46
152
  state: 'empty',
47
153
  extension,
48
- title: '暂无文件',
49
- message: '请选择文件或提供可访问的文件地址后开始预览。',
154
+ title: translateFileViewerMessage(i18n, 'state.empty.title'),
155
+ message: translateFileViewerMessage(i18n, 'state.empty.message'),
50
156
  theme,
51
157
  recoverable: true,
52
158
  });
53
- export const createFileViewerUnsupportedState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => {
159
+ export const createFileViewerUnsupportedState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME, i18n) => {
54
160
  const label = extensionLabel(extension);
161
+ const installHint = resolveFileViewerRendererInstallHint(extension);
162
+ if (installHint) {
163
+ const locale = resolveFileViewerLocale(i18n);
164
+ const localeRendererTip = installHint.rendererPackage
165
+ ? locale === 'zh-CN'
166
+ ? `;如果需要极致裁剪,也可以只安装 ${installHint.rendererPackage}`
167
+ : `; for a strict custom cut, install only ${installHint.rendererPackage}`
168
+ : '';
169
+ return createFileViewerStateDescriptor({
170
+ state: 'unsupported',
171
+ extension,
172
+ title: translateFileViewerMessage(i18n, 'state.unsupported.install.title'),
173
+ message: translateFileViewerMessage(i18n, 'state.unsupported.install.message', {
174
+ extension: label,
175
+ rendererLabel: installHint.rendererLabel,
176
+ }),
177
+ description: translateFileViewerMessage(i18n, 'state.unsupported.install.description', {
178
+ extension: label,
179
+ rendererLabel: installHint.rendererLabel,
180
+ presetPackage: installHint.presetPackage,
181
+ vitePreset: installHint.vitePreset,
182
+ rendererTip: localeRendererTip,
183
+ }),
184
+ theme,
185
+ recoverable: true,
186
+ });
187
+ }
55
188
  return createFileViewerStateDescriptor({
56
189
  state: 'unsupported',
57
190
  extension,
58
- title: '暂不支持在线预览',
59
- message: `不支持${label}格式的在线预览,请下载后预览或转换为支持的格式。`,
60
- description: DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION,
191
+ title: translateFileViewerMessage(i18n, 'state.unsupported.title'),
192
+ message: translateFileViewerMessage(i18n, 'state.unsupported.message', {
193
+ extension: label,
194
+ }),
195
+ description: translateFileViewerMessage(i18n, 'state.unsupported.description'),
61
196
  theme,
62
197
  recoverable: true,
63
198
  });
@@ -71,10 +206,10 @@ export const normalizeFileViewerErrorMessage = (error) => {
71
206
  export const formatFileViewerErrorMessage = (prefix, error) => {
72
207
  return `${prefix}:${normalizeFileViewerErrorMessage(error)}`;
73
208
  };
74
- export const createFileViewerErrorState = (extension = '', error = '未知错误', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
209
+ export const createFileViewerErrorState = (extension = '', error = '未知错误', theme = DEFAULT_FILE_VIEWER_STATE_THEME, i18n) => createFileViewerStateDescriptor({
75
210
  state: 'error',
76
211
  extension,
77
- title: '预览失败',
212
+ title: translateFileViewerMessage(i18n, 'state.error.title'),
78
213
  message: normalizeFileViewerErrorMessage(error),
79
214
  theme,
80
215
  recoverable: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Framework-neutral modular TypeScript core for Flyfish File Viewer renderer orchestration, lifecycle APIs, search, zoom, print, and export",