@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.
- package/README.en.md +2 -2
- package/README.md +2 -2
- package/dist/config/options.d.ts +1 -1
- package/dist/config/options.js +1 -1
- package/dist/contracts/types.d.ts +76 -1
- package/dist/headless.d.ts +3 -3
- package/dist/headless.js +2 -2
- package/dist/index.d.ts +10 -7
- package/dist/index.js +106 -49
- package/dist/lifecycle/operations.d.ts +1 -0
- package/dist/lifecycle/operations.js +65 -6
- package/dist/platform/assets.d.ts +3 -1
- package/dist/platform/assets.js +43 -6
- package/dist/registry/capabilities.d.ts +2 -2
- package/dist/registry/capabilities.js +2 -1
- package/dist/registry/formats.d.ts +20 -7
- package/dist/registry/formats.js +14 -5
- package/dist/registry/registry.d.ts +8 -1
- package/dist/registry/registry.js +29 -0
- package/dist/renderers/image.js +1 -10
- package/dist/renderers/index.d.ts +320 -2
- package/dist/renderers/index.js +27 -157
- package/dist/viewer/createViewer.js +86 -3
- package/package.json +17 -44
- package/dist/renderers/archive.d.ts +0 -2
- package/dist/renderers/archive.js +0 -547
- package/dist/renderers/archiveCache.d.ts +0 -10
- package/dist/renderers/archiveCache.js +0 -96
- package/dist/renderers/archiveFallback.d.ts +0 -7
- package/dist/renderers/archiveFallback.js +0 -166
- package/dist/renderers/archiveShared.d.ts +0 -23
- package/dist/renderers/archiveShared.js +0 -71
- package/dist/renderers/audio.d.ts +0 -8
- package/dist/renderers/audio.js +0 -219
- package/dist/renderers/cad.d.ts +0 -2
- package/dist/renderers/cad.js +0 -446
- package/dist/renderers/code.d.ts +0 -11
- package/dist/renderers/code.js +0 -233
- package/dist/renderers/data.d.ts +0 -7
- package/dist/renderers/data.js +0 -370
- package/dist/renderers/drawing.d.ts +0 -10
- package/dist/renderers/drawing.js +0 -882
- package/dist/renderers/eda.d.ts +0 -2
- package/dist/renderers/eda.js +0 -434
- package/dist/renderers/edaParser.d.ts +0 -77
- package/dist/renderers/edaParser.js +0 -569
- package/dist/renderers/email.d.ts +0 -2
- package/dist/renderers/email.js +0 -463
- package/dist/renderers/epub.d.ts +0 -2
- package/dist/renderers/epub.js +0 -331
- package/dist/renderers/geo.d.ts +0 -2
- package/dist/renderers/geo.js +0 -284
- package/dist/renderers/markdown.d.ts +0 -2
- package/dist/renderers/markdown.js +0 -83
- package/dist/renderers/model.d.ts +0 -2
- package/dist/renderers/model.js +0 -567
- package/dist/renderers/ofd.d.ts +0 -2
- package/dist/renderers/ofd.js +0 -256
- package/dist/renderers/openDocument.d.ts +0 -2
- package/dist/renderers/openDocument.js +0 -122
- package/dist/renderers/pdf.d.ts +0 -3
- package/dist/renderers/pdf.js +0 -1001
- package/dist/renderers/pdfStyles.d.ts +0 -1
- package/dist/renderers/pdfStyles.js +0 -1
- package/dist/renderers/pptx.d.ts +0 -2
- package/dist/renderers/pptx.js +0 -217
- package/dist/renderers/spreadsheet/state.d.ts +0 -80
- package/dist/renderers/spreadsheet/state.js +0 -96
- package/dist/renderers/spreadsheet/view.d.ts +0 -25
- package/dist/renderers/spreadsheet/view.js +0 -833
- package/dist/renderers/spreadsheet/worker/index.d.ts +0 -2
- package/dist/renderers/spreadsheet/worker/index.js +0 -1
- package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +0 -73
- package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +0 -623
- package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +0 -2
- package/dist/renderers/spreadsheet/worker/sheetjs/color.js +0 -73
- package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +0 -1
- package/dist/renderers/spreadsheet/worker/sheetjs/index.js +0 -1
- package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +0 -18
- package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +0 -106
- package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +0 -1
- package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +0 -11
- package/dist/renderers/spreadsheet/worker/type.d.ts +0 -57
- package/dist/renderers/spreadsheet/worker/type.js +0 -1
- package/dist/renderers/spreadsheet.d.ts +0 -3
- package/dist/renderers/spreadsheet.js +0 -929
- package/dist/renderers/typst.d.ts +0 -8
- package/dist/renderers/typst.js +0 -547
- package/dist/renderers/umd/parser.d.ts +0 -30
- package/dist/renderers/umd/parser.js +0 -408
- package/dist/renderers/umd.d.ts +0 -2
- package/dist/renderers/umd.js +0 -297
- package/dist/renderers/video.d.ts +0 -8
- package/dist/renderers/video.js +0 -108
- package/dist/renderers/wordDoc.d.ts +0 -5
- package/dist/renderers/wordDoc.js +0 -284
- package/dist/renderers/wordDocx.d.ts +0 -5
- package/dist/renderers/wordDocx.js +0 -985
- package/dist/renderers/wordDocx.worker.d.ts +0 -1
- package/dist/renderers/wordDocx.worker.js +0 -96
- package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +0 -183
- package/vendor/ofd/dltech/jbig2/ccitt.js +0 -1070
- package/vendor/ofd/dltech/jbig2/compatibility.js +0 -12
- package/vendor/ofd/dltech/jbig2/core_utils.js +0 -180
- package/vendor/ofd/dltech/jbig2/is_node.js +0 -27
- package/vendor/ofd/dltech/jbig2/jbig2.js +0 -2589
- package/vendor/ofd/dltech/jbig2/jbig2_stream.js +0 -81
- package/vendor/ofd/dltech/jbig2/primitives.js +0 -387
- package/vendor/ofd/dltech/jbig2/stream.js +0 -1348
- package/vendor/ofd/dltech/jbig2/util.js +0 -972
- package/vendor/ofd/dltech/ofd/ofd.d.ts +0 -11
- package/vendor/ofd/dltech/ofd/ofd.js +0 -100
- package/vendor/ofd/dltech/ofd/ofd_parser.js +0 -395
- package/vendor/ofd/dltech/ofd/ofd_render.js +0 -473
- package/vendor/ofd/dltech/ofd/ofd_util.js +0 -350
- 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
|
-
};
|
package/dist/renderers/umd.d.ts
DELETED