@file-viewer/core 2.0.11 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) 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 +71 -1
  6. package/dist/headless.d.ts +2 -2
  7. package/dist/headless.js +1 -1
  8. package/dist/index.d.ts +9 -6
  9. package/dist/index.js +105 -48
  10. package/dist/platform/assets.d.ts +3 -1
  11. package/dist/platform/assets.js +18 -2
  12. package/dist/registry/capabilities.d.ts +2 -2
  13. package/dist/registry/capabilities.js +2 -1
  14. package/dist/registry/formats.d.ts +20 -7
  15. package/dist/registry/formats.js +14 -5
  16. package/dist/registry/registry.d.ts +8 -1
  17. package/dist/registry/registry.js +29 -0
  18. package/dist/renderers/image.js +1 -10
  19. package/dist/renderers/index.d.ts +320 -2
  20. package/dist/renderers/index.js +27 -157
  21. package/dist/viewer/createViewer.js +86 -3
  22. package/package.json +17 -44
  23. package/dist/renderers/archive.d.ts +0 -2
  24. package/dist/renderers/archive.js +0 -547
  25. package/dist/renderers/archiveCache.d.ts +0 -10
  26. package/dist/renderers/archiveCache.js +0 -96
  27. package/dist/renderers/archiveFallback.d.ts +0 -7
  28. package/dist/renderers/archiveFallback.js +0 -166
  29. package/dist/renderers/archiveShared.d.ts +0 -23
  30. package/dist/renderers/archiveShared.js +0 -71
  31. package/dist/renderers/audio.d.ts +0 -8
  32. package/dist/renderers/audio.js +0 -219
  33. package/dist/renderers/cad.d.ts +0 -2
  34. package/dist/renderers/cad.js +0 -446
  35. package/dist/renderers/code.d.ts +0 -11
  36. package/dist/renderers/code.js +0 -233
  37. package/dist/renderers/data.d.ts +0 -7
  38. package/dist/renderers/data.js +0 -370
  39. package/dist/renderers/drawing.d.ts +0 -10
  40. package/dist/renderers/drawing.js +0 -882
  41. package/dist/renderers/eda.d.ts +0 -2
  42. package/dist/renderers/eda.js +0 -434
  43. package/dist/renderers/edaParser.d.ts +0 -77
  44. package/dist/renderers/edaParser.js +0 -569
  45. package/dist/renderers/email.d.ts +0 -2
  46. package/dist/renderers/email.js +0 -463
  47. package/dist/renderers/epub.d.ts +0 -2
  48. package/dist/renderers/epub.js +0 -331
  49. package/dist/renderers/geo.d.ts +0 -2
  50. package/dist/renderers/geo.js +0 -284
  51. package/dist/renderers/markdown.d.ts +0 -2
  52. package/dist/renderers/markdown.js +0 -83
  53. package/dist/renderers/model.d.ts +0 -2
  54. package/dist/renderers/model.js +0 -567
  55. package/dist/renderers/ofd.d.ts +0 -2
  56. package/dist/renderers/ofd.js +0 -256
  57. package/dist/renderers/openDocument.d.ts +0 -2
  58. package/dist/renderers/openDocument.js +0 -122
  59. package/dist/renderers/pdf.d.ts +0 -3
  60. package/dist/renderers/pdf.js +0 -1001
  61. package/dist/renderers/pdfStyles.d.ts +0 -1
  62. package/dist/renderers/pdfStyles.js +0 -1
  63. package/dist/renderers/pptx.d.ts +0 -2
  64. package/dist/renderers/pptx.js +0 -217
  65. package/dist/renderers/spreadsheet/state.d.ts +0 -80
  66. package/dist/renderers/spreadsheet/state.js +0 -96
  67. package/dist/renderers/spreadsheet/view.d.ts +0 -25
  68. package/dist/renderers/spreadsheet/view.js +0 -833
  69. package/dist/renderers/spreadsheet/worker/index.d.ts +0 -2
  70. package/dist/renderers/spreadsheet/worker/index.js +0 -1
  71. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +0 -73
  72. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +0 -623
  73. package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +0 -2
  74. package/dist/renderers/spreadsheet/worker/sheetjs/color.js +0 -73
  75. package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +0 -1
  76. package/dist/renderers/spreadsheet/worker/sheetjs/index.js +0 -1
  77. package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +0 -18
  78. package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +0 -106
  79. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +0 -1
  80. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +0 -11
  81. package/dist/renderers/spreadsheet/worker/type.d.ts +0 -57
  82. package/dist/renderers/spreadsheet/worker/type.js +0 -1
  83. package/dist/renderers/spreadsheet.d.ts +0 -3
  84. package/dist/renderers/spreadsheet.js +0 -929
  85. package/dist/renderers/typst.d.ts +0 -8
  86. package/dist/renderers/typst.js +0 -547
  87. package/dist/renderers/umd/parser.d.ts +0 -30
  88. package/dist/renderers/umd/parser.js +0 -408
  89. package/dist/renderers/umd.d.ts +0 -2
  90. package/dist/renderers/umd.js +0 -297
  91. package/dist/renderers/video.d.ts +0 -8
  92. package/dist/renderers/video.js +0 -108
  93. package/dist/renderers/wordDoc.d.ts +0 -5
  94. package/dist/renderers/wordDoc.js +0 -284
  95. package/dist/renderers/wordDocx.d.ts +0 -5
  96. package/dist/renderers/wordDocx.js +0 -985
  97. package/dist/renderers/wordDocx.worker.d.ts +0 -1
  98. package/dist/renderers/wordDocx.worker.js +0 -96
  99. package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +0 -183
  100. package/vendor/ofd/dltech/jbig2/ccitt.js +0 -1070
  101. package/vendor/ofd/dltech/jbig2/compatibility.js +0 -12
  102. package/vendor/ofd/dltech/jbig2/core_utils.js +0 -180
  103. package/vendor/ofd/dltech/jbig2/is_node.js +0 -27
  104. package/vendor/ofd/dltech/jbig2/jbig2.js +0 -2589
  105. package/vendor/ofd/dltech/jbig2/jbig2_stream.js +0 -81
  106. package/vendor/ofd/dltech/jbig2/primitives.js +0 -387
  107. package/vendor/ofd/dltech/jbig2/stream.js +0 -1348
  108. package/vendor/ofd/dltech/jbig2/util.js +0 -972
  109. package/vendor/ofd/dltech/ofd/ofd.d.ts +0 -11
  110. package/vendor/ofd/dltech/ofd/ofd.js +0 -100
  111. package/vendor/ofd/dltech/ofd/ofd_parser.js +0 -395
  112. package/vendor/ofd/dltech/ofd/ofd_render.js +0 -473
  113. package/vendor/ofd/dltech/ofd/ofd_util.js +0 -350
  114. 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>;