@file-viewer/core 2.0.11 → 2.1.1

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.
Files changed (116) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/config/options.d.ts +1 -1
  4. package/dist/config/options.js +1 -1
  5. package/dist/contracts/types.d.ts +76 -1
  6. package/dist/headless.d.ts +3 -3
  7. package/dist/headless.js +2 -2
  8. package/dist/index.d.ts +10 -7
  9. package/dist/index.js +106 -49
  10. package/dist/lifecycle/operations.d.ts +1 -0
  11. package/dist/lifecycle/operations.js +65 -6
  12. package/dist/platform/assets.d.ts +3 -1
  13. package/dist/platform/assets.js +43 -6
  14. package/dist/registry/capabilities.d.ts +2 -2
  15. package/dist/registry/capabilities.js +2 -1
  16. package/dist/registry/formats.d.ts +20 -7
  17. package/dist/registry/formats.js +14 -5
  18. package/dist/registry/registry.d.ts +8 -1
  19. package/dist/registry/registry.js +29 -0
  20. package/dist/renderers/image.js +1 -10
  21. package/dist/renderers/index.d.ts +320 -2
  22. package/dist/renderers/index.js +27 -157
  23. package/dist/viewer/createViewer.js +86 -3
  24. package/package.json +17 -44
  25. package/dist/renderers/archive.d.ts +0 -2
  26. package/dist/renderers/archive.js +0 -547
  27. package/dist/renderers/archiveCache.d.ts +0 -10
  28. package/dist/renderers/archiveCache.js +0 -96
  29. package/dist/renderers/archiveFallback.d.ts +0 -7
  30. package/dist/renderers/archiveFallback.js +0 -166
  31. package/dist/renderers/archiveShared.d.ts +0 -23
  32. package/dist/renderers/archiveShared.js +0 -71
  33. package/dist/renderers/audio.d.ts +0 -8
  34. package/dist/renderers/audio.js +0 -219
  35. package/dist/renderers/cad.d.ts +0 -2
  36. package/dist/renderers/cad.js +0 -446
  37. package/dist/renderers/code.d.ts +0 -11
  38. package/dist/renderers/code.js +0 -233
  39. package/dist/renderers/data.d.ts +0 -7
  40. package/dist/renderers/data.js +0 -370
  41. package/dist/renderers/drawing.d.ts +0 -10
  42. package/dist/renderers/drawing.js +0 -882
  43. package/dist/renderers/eda.d.ts +0 -2
  44. package/dist/renderers/eda.js +0 -434
  45. package/dist/renderers/edaParser.d.ts +0 -77
  46. package/dist/renderers/edaParser.js +0 -569
  47. package/dist/renderers/email.d.ts +0 -2
  48. package/dist/renderers/email.js +0 -463
  49. package/dist/renderers/epub.d.ts +0 -2
  50. package/dist/renderers/epub.js +0 -331
  51. package/dist/renderers/geo.d.ts +0 -2
  52. package/dist/renderers/geo.js +0 -284
  53. package/dist/renderers/markdown.d.ts +0 -2
  54. package/dist/renderers/markdown.js +0 -83
  55. package/dist/renderers/model.d.ts +0 -2
  56. package/dist/renderers/model.js +0 -567
  57. package/dist/renderers/ofd.d.ts +0 -2
  58. package/dist/renderers/ofd.js +0 -256
  59. package/dist/renderers/openDocument.d.ts +0 -2
  60. package/dist/renderers/openDocument.js +0 -122
  61. package/dist/renderers/pdf.d.ts +0 -3
  62. package/dist/renderers/pdf.js +0 -1001
  63. package/dist/renderers/pdfStyles.d.ts +0 -1
  64. package/dist/renderers/pdfStyles.js +0 -1
  65. package/dist/renderers/pptx.d.ts +0 -2
  66. package/dist/renderers/pptx.js +0 -217
  67. package/dist/renderers/spreadsheet/state.d.ts +0 -80
  68. package/dist/renderers/spreadsheet/state.js +0 -96
  69. package/dist/renderers/spreadsheet/view.d.ts +0 -25
  70. package/dist/renderers/spreadsheet/view.js +0 -833
  71. package/dist/renderers/spreadsheet/worker/index.d.ts +0 -2
  72. package/dist/renderers/spreadsheet/worker/index.js +0 -1
  73. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +0 -73
  74. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +0 -623
  75. package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +0 -2
  76. package/dist/renderers/spreadsheet/worker/sheetjs/color.js +0 -73
  77. package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +0 -1
  78. package/dist/renderers/spreadsheet/worker/sheetjs/index.js +0 -1
  79. package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +0 -18
  80. package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +0 -106
  81. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +0 -1
  82. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +0 -11
  83. package/dist/renderers/spreadsheet/worker/type.d.ts +0 -57
  84. package/dist/renderers/spreadsheet/worker/type.js +0 -1
  85. package/dist/renderers/spreadsheet.d.ts +0 -3
  86. package/dist/renderers/spreadsheet.js +0 -929
  87. package/dist/renderers/typst.d.ts +0 -8
  88. package/dist/renderers/typst.js +0 -547
  89. package/dist/renderers/umd/parser.d.ts +0 -30
  90. package/dist/renderers/umd/parser.js +0 -408
  91. package/dist/renderers/umd.d.ts +0 -2
  92. package/dist/renderers/umd.js +0 -297
  93. package/dist/renderers/video.d.ts +0 -8
  94. package/dist/renderers/video.js +0 -108
  95. package/dist/renderers/wordDoc.d.ts +0 -5
  96. package/dist/renderers/wordDoc.js +0 -284
  97. package/dist/renderers/wordDocx.d.ts +0 -5
  98. package/dist/renderers/wordDocx.js +0 -985
  99. package/dist/renderers/wordDocx.worker.d.ts +0 -1
  100. package/dist/renderers/wordDocx.worker.js +0 -96
  101. package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +0 -183
  102. package/vendor/ofd/dltech/jbig2/ccitt.js +0 -1070
  103. package/vendor/ofd/dltech/jbig2/compatibility.js +0 -12
  104. package/vendor/ofd/dltech/jbig2/core_utils.js +0 -180
  105. package/vendor/ofd/dltech/jbig2/is_node.js +0 -27
  106. package/vendor/ofd/dltech/jbig2/jbig2.js +0 -2589
  107. package/vendor/ofd/dltech/jbig2/jbig2_stream.js +0 -81
  108. package/vendor/ofd/dltech/jbig2/primitives.js +0 -387
  109. package/vendor/ofd/dltech/jbig2/stream.js +0 -1348
  110. package/vendor/ofd/dltech/jbig2/util.js +0 -972
  111. package/vendor/ofd/dltech/ofd/ofd.d.ts +0 -11
  112. package/vendor/ofd/dltech/ofd/ofd.js +0 -100
  113. package/vendor/ofd/dltech/ofd/ofd_parser.js +0 -395
  114. package/vendor/ofd/dltech/ofd/ofd_render.js +0 -473
  115. package/vendor/ofd/dltech/ofd/ofd_util.js +0 -350
  116. package/vendor/ofd/dltech/ofd/pipeline.js +0 -26
@@ -1,408 +0,0 @@
1
- import { inflate, inflateRaw } from 'pako';
2
- const UMD_MAGIC = 0xde9a9b89;
3
- const SECTION_MARKER = 0x23;
4
- const DATA_MARKER = 0x24;
5
- const MAX_SECTION_HEADER_SIZE = 5;
6
- const SECTION = {
7
- VERSION: 0x01,
8
- TITLE: 0x02,
9
- AUTHOR: 0x03,
10
- YEAR: 0x04,
11
- MONTH: 0x05,
12
- DAY: 0x06,
13
- CATEGORY: 0x07,
14
- PUBLISHER: 0x08,
15
- VENDOR: 0x09,
16
- CID: 0x0a,
17
- CONTENT_LENGTH: 0x0b,
18
- IMAGE: 0x0e,
19
- MIXED_IMAGE: 0x0f,
20
- TEXT_SEGMENT_INDEX: 0x81,
21
- COVER: 0x82,
22
- CHAPTER_OFFSETS: 0x83,
23
- CHAPTER_TITLES: 0x84,
24
- PAGE_OFFSETS: 0x87,
25
- SPLASH: 0xf1
26
- };
27
- class UmdCursor {
28
- constructor(buffer) {
29
- this.offset = 0;
30
- this.bytes = new Uint8Array(buffer);
31
- this.view = new DataView(buffer);
32
- }
33
- get remaining() {
34
- return this.bytes.length - this.offset;
35
- }
36
- peek() {
37
- return this.remaining > 0 ? this.bytes[this.offset] : undefined;
38
- }
39
- readUint8() {
40
- this.ensure(1);
41
- const value = this.view.getUint8(this.offset);
42
- this.offset += 1;
43
- return value;
44
- }
45
- readUint16() {
46
- this.ensure(2);
47
- const value = this.view.getUint16(this.offset, true);
48
- this.offset += 2;
49
- return value;
50
- }
51
- readUint32() {
52
- this.ensure(4);
53
- const value = this.view.getUint32(this.offset, true);
54
- this.offset += 4;
55
- return value;
56
- }
57
- readBytes(length) {
58
- const safeLength = Math.max(0, Math.min(length, this.remaining));
59
- const start = this.offset;
60
- this.offset += safeLength;
61
- return this.bytes.slice(start, start + safeLength);
62
- }
63
- ensure(size) {
64
- if (this.remaining < size) {
65
- throw new Error('UMD 文件结构不完整,读取时遇到意外结尾');
66
- }
67
- }
68
- }
69
- const readUint32From = (bytes, offset = 0) => {
70
- if (bytes.length < offset + 4) {
71
- return 0;
72
- }
73
- return new DataView(bytes.buffer, bytes.byteOffset + offset, 4).getUint32(0, true);
74
- };
75
- const decodeUtf16 = (bytes) => {
76
- if (!bytes.length) {
77
- return '';
78
- }
79
- if (typeof TextDecoder === 'function') {
80
- return new TextDecoder('utf-16le').decode(bytes);
81
- }
82
- let output = '';
83
- for (let index = 0; index + 1 < bytes.length; index += 2) {
84
- output += String.fromCharCode(bytes[index] | (bytes[index + 1] << 8));
85
- }
86
- return output;
87
- };
88
- const decodeMetadata = (bytes) => {
89
- return decodeUtf16(bytes)
90
- .replace(/\u0000+$/g, '')
91
- .trim();
92
- };
93
- const normalizeContent = (value) => {
94
- return value
95
- .replace(/\u0000+$/g, '')
96
- .replace(/\u2029/g, '\n')
97
- .replace(/\r\n?/g, '\n');
98
- };
99
- const joinByteArrays = (parts, expectedLength = 0) => {
100
- const totalLength = parts.reduce((sum, part) => sum + part.length, 0);
101
- const length = expectedLength > 0 ? Math.min(expectedLength, totalLength) : totalLength;
102
- const result = new Uint8Array(length);
103
- let offset = 0;
104
- for (const part of parts) {
105
- if (offset >= length) {
106
- break;
107
- }
108
- const next = part.subarray(0, Math.min(part.length, length - offset));
109
- result.set(next, offset);
110
- offset += next.length;
111
- }
112
- return result;
113
- };
114
- const inflateSegment = (bytes) => {
115
- try {
116
- return inflate(bytes);
117
- }
118
- catch {
119
- return inflateRaw(bytes);
120
- }
121
- };
122
- const parseChapterTitles = (bytes) => {
123
- const titles = [];
124
- let offset = 0;
125
- while (offset < bytes.length) {
126
- const length = bytes[offset];
127
- offset += 1;
128
- if (!length || offset + length > bytes.length) {
129
- break;
130
- }
131
- titles.push(decodeMetadata(bytes.subarray(offset, offset + length)));
132
- offset += length;
133
- }
134
- return titles;
135
- };
136
- const parseOffsets = (bytes) => {
137
- const offsets = [];
138
- const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
139
- for (let offset = 0; offset + 4 <= bytes.length; offset += 4) {
140
- offsets.push(view.getUint32(offset, true));
141
- }
142
- return offsets;
143
- };
144
- const detectImage = (bytes) => {
145
- if (bytes.length >= 8 &&
146
- bytes[0] === 0x89 &&
147
- bytes[1] === 0x50 &&
148
- bytes[2] === 0x4e &&
149
- bytes[3] === 0x47) {
150
- return { extension: 'png', mimeType: 'image/png' };
151
- }
152
- if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {
153
- return { extension: 'jpg', mimeType: 'image/jpeg' };
154
- }
155
- if (bytes.length >= 6 &&
156
- bytes[0] === 0x47 &&
157
- bytes[1] === 0x49 &&
158
- bytes[2] === 0x46) {
159
- return { extension: 'gif', mimeType: 'image/gif' };
160
- }
161
- if (bytes.length >= 2 && bytes[0] === 0x42 && bytes[1] === 0x4d) {
162
- return { extension: 'bmp', mimeType: 'image/bmp' };
163
- }
164
- if (bytes.length >= 12 &&
165
- bytes[0] === 0x52 &&
166
- bytes[1] === 0x49 &&
167
- bytes[2] === 0x46 &&
168
- bytes[3] === 0x46 &&
169
- bytes[8] === 0x57 &&
170
- bytes[9] === 0x45 &&
171
- bytes[10] === 0x42 &&
172
- bytes[11] === 0x50) {
173
- return { extension: 'webp', mimeType: 'image/webp' };
174
- }
175
- return { extension: 'bin', mimeType: 'application/octet-stream' };
176
- };
177
- const createImage = (bytes, prefix, index) => {
178
- const { extension, mimeType } = detectImage(bytes);
179
- return {
180
- bytes,
181
- extension,
182
- id: `${prefix}-${index}-${bytes.length}`,
183
- mimeType
184
- };
185
- };
186
- const toBookKind = (rawType) => {
187
- if (rawType === 1) {
188
- return 'text';
189
- }
190
- if (rawType === 2) {
191
- return 'comic';
192
- }
193
- if (rawType === 3) {
194
- return 'mixed';
195
- }
196
- return 'unknown';
197
- };
198
- const formatPublishedAt = ({ day, month, year }) => {
199
- const parts = [year, month, day].filter(Boolean);
200
- return parts.join('-');
201
- };
202
- const createTextChapters = (textBytes, chapterOffsets, titles) => {
203
- if (!textBytes.length) {
204
- return [];
205
- }
206
- const offsets = chapterOffsets.length ? chapterOffsets : [0];
207
- const safeOffsets = offsets
208
- .map(offset => Math.max(0, Math.min(offset, textBytes.length)))
209
- .filter((offset, index, list) => index === 0 || offset > list[index - 1]);
210
- return safeOffsets.map((start, index) => {
211
- const end = index + 1 < safeOffsets.length ? safeOffsets[index + 1] : textBytes.length;
212
- const alignedStart = start - (start % 2);
213
- const alignedEnd = end - (end % 2);
214
- const content = normalizeContent(decodeUtf16(textBytes.subarray(alignedStart, alignedEnd)));
215
- return {
216
- content,
217
- end: alignedEnd,
218
- id: `chapter-${index}-${alignedStart}`,
219
- images: [],
220
- start: alignedStart,
221
- title: titles[index] || `章节 ${index + 1}`
222
- };
223
- });
224
- };
225
- const createImageChapters = (images, chapterOffsets, titles) => {
226
- if (!images.length) {
227
- return [];
228
- }
229
- const offsets = chapterOffsets.length ? chapterOffsets : [0];
230
- const safeOffsets = offsets
231
- .map(offset => Math.max(0, Math.min(offset, images.length)))
232
- .filter((offset, index, list) => index === 0 || offset > list[index - 1]);
233
- return safeOffsets.map((start, index) => {
234
- const end = index + 1 < safeOffsets.length ? safeOffsets[index + 1] : images.length;
235
- return {
236
- content: '',
237
- end,
238
- id: `image-chapter-${index}-${start}`,
239
- images: images.slice(start, end),
240
- start,
241
- title: titles[index] || `图集 ${index + 1}`
242
- };
243
- });
244
- };
245
- const createEmptyChapters = (titles) => {
246
- return titles.map((title, index) => ({
247
- content: '',
248
- end: index,
249
- id: `empty-chapter-${index}`,
250
- images: [],
251
- start: index,
252
- title: title || `章节 ${index + 1}`
253
- }));
254
- };
255
- export const parseUmdBook = (buffer) => {
256
- const cursor = new UmdCursor(buffer);
257
- const metadata = {
258
- author: '',
259
- category: '',
260
- day: '',
261
- month: '',
262
- publishedAt: '',
263
- publisher: '',
264
- title: '',
265
- vendor: '',
266
- year: ''
267
- };
268
- const sectionChecks = new Map();
269
- const warnings = [];
270
- const textSegments = [];
271
- const images = [];
272
- let activeSection = 0;
273
- let chapterOffsets = [];
274
- let chapterTitles = [];
275
- let contentLength = 0;
276
- let cover;
277
- let rawType = 0;
278
- if (cursor.readUint32() !== UMD_MAGIC) {
279
- throw new Error('不是有效的 UMD 电子书文件');
280
- }
281
- while (cursor.remaining > 0) {
282
- if (cursor.peek() !== SECTION_MARKER) {
283
- break;
284
- }
285
- cursor.readUint8();
286
- const sectionType = cursor.readUint16();
287
- const sectionFlag = cursor.readUint8();
288
- const sectionLength = Math.max(0, cursor.readUint8() - MAX_SECTION_HEADER_SIZE);
289
- const payload = cursor.readBytes(sectionLength);
290
- const dataSection = sectionType === SECTION.CID || sectionType === SECTION.SPLASH
291
- ? activeSection
292
- : sectionType;
293
- switch (sectionType) {
294
- case SECTION.VERSION:
295
- rawType = payload[0] || sectionFlag;
296
- break;
297
- case SECTION.TITLE:
298
- metadata.title = decodeMetadata(payload);
299
- break;
300
- case SECTION.AUTHOR:
301
- metadata.author = decodeMetadata(payload);
302
- break;
303
- case SECTION.YEAR:
304
- metadata.year = decodeMetadata(payload);
305
- break;
306
- case SECTION.MONTH:
307
- metadata.month = decodeMetadata(payload);
308
- break;
309
- case SECTION.DAY:
310
- metadata.day = decodeMetadata(payload);
311
- break;
312
- case SECTION.CATEGORY:
313
- metadata.category = decodeMetadata(payload);
314
- break;
315
- case SECTION.PUBLISHER:
316
- metadata.publisher = decodeMetadata(payload);
317
- break;
318
- case SECTION.VENDOR:
319
- metadata.vendor = decodeMetadata(payload);
320
- break;
321
- case SECTION.CONTENT_LENGTH:
322
- contentLength = readUint32From(payload);
323
- break;
324
- case SECTION.TEXT_SEGMENT_INDEX:
325
- case SECTION.CHAPTER_OFFSETS:
326
- case SECTION.CHAPTER_TITLES:
327
- case SECTION.PAGE_OFFSETS:
328
- sectionChecks.set(sectionType, readUint32From(payload));
329
- break;
330
- case SECTION.COVER:
331
- sectionChecks.set(sectionType, readUint32From(payload, 1));
332
- break;
333
- case SECTION.IMAGE:
334
- case SECTION.MIXED_IMAGE:
335
- rawType = rawType || (sectionType === SECTION.MIXED_IMAGE ? 3 : 2);
336
- break;
337
- default:
338
- break;
339
- }
340
- activeSection = dataSection || activeSection;
341
- while (cursor.peek() === DATA_MARKER) {
342
- cursor.readUint8();
343
- const check = cursor.readUint32();
344
- const dataLength = Math.max(0, cursor.readUint32() - 9);
345
- const data = cursor.readBytes(dataLength);
346
- switch (dataSection) {
347
- case SECTION.COVER:
348
- cover = createImage(data, 'cover', check);
349
- break;
350
- case SECTION.CHAPTER_OFFSETS:
351
- chapterOffsets = parseOffsets(data);
352
- break;
353
- case SECTION.CHAPTER_TITLES:
354
- if (check === sectionChecks.get(SECTION.CHAPTER_TITLES)) {
355
- chapterTitles = parseChapterTitles(data);
356
- }
357
- else {
358
- textSegments.push(data);
359
- }
360
- break;
361
- case SECTION.IMAGE:
362
- case SECTION.MIXED_IMAGE:
363
- images.push(createImage(data, 'image', images.length));
364
- break;
365
- default:
366
- break;
367
- }
368
- }
369
- }
370
- const inflatedText = textSegments.map(segment => {
371
- try {
372
- return inflateSegment(segment);
373
- }
374
- catch (error) {
375
- warnings.push(error instanceof Error ? error.message : String(error));
376
- return new Uint8Array();
377
- }
378
- });
379
- const joinedText = joinByteArrays(inflatedText, contentLength);
380
- if (contentLength > joinedText.length && textSegments.length) {
381
- warnings.push('UMD 正文长度小于声明长度,文件可能不完整');
382
- }
383
- let chapters = createTextChapters(joinedText, chapterOffsets, chapterTitles);
384
- if (!chapters.length) {
385
- chapters = createImageChapters(images, chapterOffsets, chapterTitles);
386
- }
387
- else if (images.length && rawType !== 1) {
388
- chapters = createImageChapters(images, chapterOffsets, chapterTitles);
389
- }
390
- if (!chapters.length && chapterTitles.length) {
391
- chapters = createEmptyChapters(chapterTitles);
392
- }
393
- metadata.publishedAt = formatPublishedAt(metadata);
394
- return {
395
- author: metadata.author,
396
- category: metadata.category,
397
- chapters,
398
- contentLength: contentLength || joinedText.length,
399
- cover,
400
- kind: toBookKind(rawType),
401
- publishedAt: metadata.publishedAt,
402
- publisher: metadata.publisher,
403
- rawType,
404
- title: metadata.title || 'UMD 电子书',
405
- vendor: metadata.vendor,
406
- warnings
407
- };
408
- };
@@ -1,2 +0,0 @@
1
- import type { FileViewerRenderedInstance } from '../contracts/types';
2
- export default function renderUmd(buffer: ArrayBuffer, target: HTMLDivElement): Promise<FileViewerRenderedInstance>;