frond-js 0.4.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.
- package/LICENSE +21 -0
- package/README.en.md +247 -0
- package/README.md +211 -0
- package/dist/abort-BY8vBk0v.d.cts +99 -0
- package/dist/abort-BY8vBk0v.d.ts +99 -0
- package/dist/adapter-3G46J3CA.cjs +503 -0
- package/dist/adapter-3ONQWJVQ.js +501 -0
- package/dist/adapter-55QHWRSE.js +124 -0
- package/dist/adapter-DF34GBWJ.cjs +19 -0
- package/dist/adapter-EXTNILTC.cjs +126 -0
- package/dist/adapter-GOFC7TMC.js +284 -0
- package/dist/adapter-LRJTQ47I.cjs +286 -0
- package/dist/adapter-TWWZML4A.js +17 -0
- package/dist/adapter-ZM5FQTJT.js +1415 -0
- package/dist/adapter-ZRNSDQUV.cjs +1417 -0
- package/dist/chunk-2SUG7YFZ.cjs +108 -0
- package/dist/chunk-B2L2YVXD.js +89 -0
- package/dist/chunk-D4KWSEZD.js +393 -0
- package/dist/chunk-EZTIZO6R.cjs +430 -0
- package/dist/chunk-G7DLWGBW.cjs +103 -0
- package/dist/chunk-GTGLDLJD.cjs +479 -0
- package/dist/chunk-IIV6VIUJ.cjs +83 -0
- package/dist/chunk-JDTHZQUK.js +102 -0
- package/dist/chunk-JJVXT3AC.js +30 -0
- package/dist/chunk-LIXRYQL2.js +473 -0
- package/dist/chunk-NABYHI6X.cjs +400 -0
- package/dist/chunk-SJVOYNTF.js +425 -0
- package/dist/chunk-SLI2YL25.cjs +252 -0
- package/dist/chunk-U4264IQH.js +78 -0
- package/dist/chunk-UY2YRCFC.js +250 -0
- package/dist/chunk-WCZTTQ7Z.cjs +32 -0
- package/dist/core/index.cjs +162 -0
- package/dist/core/index.d.cts +321 -0
- package/dist/core/index.d.ts +321 -0
- package/dist/core/index.js +49 -0
- package/dist/default-DRLIJX73.js +1183 -0
- package/dist/default-UK52WOO5.cjs +1192 -0
- package/dist/formats/epub/index.cjs +29 -0
- package/dist/formats/epub/index.d.cts +286 -0
- package/dist/formats/epub/index.d.ts +286 -0
- package/dist/formats/epub/index.js +11 -0
- package/dist/index.cjs +655 -0
- package/dist/index.d.cts +335 -0
- package/dist/index.d.ts +335 -0
- package/dist/index.js +600 -0
- package/dist/render/index.cjs +2 -0
- package/dist/render/index.d.cts +116 -0
- package/dist/render/index.d.ts +116 -0
- package/dist/render/index.js +1 -0
- package/dist/types-B76GOMxj.d.ts +129 -0
- package/dist/types-B7mslPBY.d.cts +166 -0
- package/dist/types-B7mslPBY.d.ts +166 -0
- package/dist/types-BH88rUYt.d.cts +129 -0
- package/dist/types-C-5eHSRH.d.ts +379 -0
- package/dist/types-CPUqTEPW.d.cts +379 -0
- package/dist/types-DQYmArgv.d.cts +17 -0
- package/dist/types-DQYmArgv.d.ts +17 -0
- package/package.json +115 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkEZTIZO6R_cjs = require('../../chunk-EZTIZO6R.cjs');
|
|
4
|
+
require('../../chunk-WCZTTQ7Z.cjs');
|
|
5
|
+
require('../../chunk-NABYHI6X.cjs');
|
|
6
|
+
require('../../chunk-SLI2YL25.cjs');
|
|
7
|
+
require('../../chunk-IIV6VIUJ.cjs');
|
|
8
|
+
require('../../chunk-G7DLWGBW.cjs');
|
|
9
|
+
|
|
10
|
+
// src/formats/epub/index.ts
|
|
11
|
+
var EPUB_MEDIA_TYPE = "application/epub+zip";
|
|
12
|
+
|
|
13
|
+
Object.defineProperty(exports, "openBook", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () { return chunkEZTIZO6R_cjs.openBook; }
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(exports, "parseContainer", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return chunkEZTIZO6R_cjs.parseContainer; }
|
|
20
|
+
});
|
|
21
|
+
Object.defineProperty(exports, "parseOpf", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return chunkEZTIZO6R_cjs.parseOpf; }
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(exports, "parseToc", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function () { return chunkEZTIZO6R_cjs.parseToc; }
|
|
28
|
+
});
|
|
29
|
+
exports.EPUB_MEDIA_TYPE = EPUB_MEDIA_TYPE;
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { Z as ZipArchive } from '../../types-BH88rUYt.cjs';
|
|
2
|
+
import { a as Book, T as TocItem, B as BookSource } from '../../types-CPUqTEPW.cjs';
|
|
3
|
+
import { O as OperationOptions } from '../../types-DQYmArgv.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* EPUB 解析(OCF 容器 / OPF package)的公共类型。
|
|
7
|
+
*
|
|
8
|
+
* 本模块属于 `frond-js/formats/epub`,经 subpath export 与动态 import 按需加载,
|
|
9
|
+
* **不计入 core 的 30KB gzip 预算**(ADR-0001)。
|
|
10
|
+
*
|
|
11
|
+
* 依赖方向:只依赖 `frond-js/core`,不得依赖 `render/`、`reader/`(ARCHITECTURE §1)。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* OCF 规范定义的 package document 媒体类型。
|
|
16
|
+
*
|
|
17
|
+
* 目前只支持这一种。其他媒体类型(如 `text/xml`)在 rootfile 选择阶段被跳过。
|
|
18
|
+
*/
|
|
19
|
+
type EpubPackageMediaType = 'application/oebps-package+xml';
|
|
20
|
+
/** {@link parseContainer} 的解析结果。 */
|
|
21
|
+
interface EpubContainer {
|
|
22
|
+
/**
|
|
23
|
+
* package document(OPF)在归档内的路径。
|
|
24
|
+
*
|
|
25
|
+
* 已完成规范化:前导 `/` 与 `.` 段被移除,`\` 归一化为 `/`,
|
|
26
|
+
* `..` 仅在归档根目录之内回退。**可直接交给归档读取层**。
|
|
27
|
+
*/
|
|
28
|
+
readonly opfPath: string;
|
|
29
|
+
/** 被选中 rootfile 声明的媒体类型。 */
|
|
30
|
+
readonly mediaType: EpubPackageMediaType;
|
|
31
|
+
}
|
|
32
|
+
/** {@link parseContainer} 的选项。 */
|
|
33
|
+
interface ParseContainerOptions extends OperationOptions {
|
|
34
|
+
/** 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。 */
|
|
35
|
+
readonly source?: string;
|
|
36
|
+
/**
|
|
37
|
+
* container 文档在归档内的路径。
|
|
38
|
+
*
|
|
39
|
+
* 默认 `META-INF/container.xml`(OCF 规范固定位置)。
|
|
40
|
+
* 仅用于错误定位或兼容非标准归档,正常 EPUB 无需设置。
|
|
41
|
+
*/
|
|
42
|
+
readonly containerPath?: string;
|
|
43
|
+
}
|
|
44
|
+
/** {@link parseOpf} 的选项。 */
|
|
45
|
+
interface ParseOpfOptions extends OperationOptions {
|
|
46
|
+
/**
|
|
47
|
+
* 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。
|
|
48
|
+
*
|
|
49
|
+
* 缺省时退化为 OPF 的归档路径,仍能定位到具体文件。
|
|
50
|
+
*/
|
|
51
|
+
readonly source?: string;
|
|
52
|
+
}
|
|
53
|
+
/** {@link parseToc} 的选项。 */
|
|
54
|
+
interface ParseTocOptions extends OperationOptions {
|
|
55
|
+
/**
|
|
56
|
+
* 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。
|
|
57
|
+
*
|
|
58
|
+
* 缺省时退化为目录文档(NAV 或 NCX)在归档内的路径。
|
|
59
|
+
*/
|
|
60
|
+
readonly source?: string;
|
|
61
|
+
}
|
|
62
|
+
/** {@link openBook} 的选项。 */
|
|
63
|
+
interface OpenBookOptions extends OperationOptions {
|
|
64
|
+
/**
|
|
65
|
+
* 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。
|
|
66
|
+
*
|
|
67
|
+
* 缺省时**逐层退化**为该层实际访问的归档路径(container → OPF → NAV/NCX),
|
|
68
|
+
* 而不是一个笼统的占位串 —— 这样错误 message 总能指到真正出问题的那个文件。
|
|
69
|
+
*/
|
|
70
|
+
readonly source?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* {@link openBook} 的结果。
|
|
74
|
+
*
|
|
75
|
+
* 为什么是「三件套」而不是直接返回 `Book`:
|
|
76
|
+
*
|
|
77
|
+
* - **`toc` 不放进 `Book`**(T1.8 决策)。目录解析需要额外一次归档读取,
|
|
78
|
+
* 而 `parseOpf` 是纯 OPF 解析、不应隐式触发 IO(见 `docs/API.md` §10.3)。
|
|
79
|
+
* 把 `toc` 挂在编排结果上,`Book` 就能保持「只由 OPF 决定」的干净语义。
|
|
80
|
+
* - **`archive` 一并返回**。渲染层要按 `ManifestItem.href` / `TocItem.href`
|
|
81
|
+
* 读取 XHTML / CSS / 图片,而这些路径只有归档能解。若不返回,调用方就得
|
|
82
|
+
* 自己再调一次 `parseZip` —— 而 `parseZip` 是同步且不可取消的,
|
|
83
|
+
* 等于让调用方多付一次全量中央目录扫描,还绕开了 `signal`。
|
|
84
|
+
* 这里返回的归档**不复制字节**,只持有传入 `Uint8Array` 的引用。
|
|
85
|
+
*/
|
|
86
|
+
interface OpenedBook {
|
|
87
|
+
/** 已解析的归档(只读视图)。生命周期与传入的字节绑定。 */
|
|
88
|
+
readonly archive: ZipArchive;
|
|
89
|
+
/** 书籍模型:metadata / manifest / spine / 目录线索。**不含 `toc`**。 */
|
|
90
|
+
readonly book: Book;
|
|
91
|
+
/** 目录树,按文档顺序。无目录(既无 NAV 也无 NCX)时为空数组。 */
|
|
92
|
+
readonly toc: readonly TocItem[];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* OCF container 解析(T1.4)。
|
|
97
|
+
*
|
|
98
|
+
* 读取 `META-INF/container.xml`,解析 `rootfiles`,选择受支持的 package
|
|
99
|
+
* document,输出其在归档内的路径。**本层不解析 OPF 内容** —— 那是 T1.5 的职责。
|
|
100
|
+
*
|
|
101
|
+
* 错误分类(沿用 T1.3 的二分原则):
|
|
102
|
+
* - 结构损坏(XML 非法)→ `ParseError`
|
|
103
|
+
* - 不符合 OCF 规范(container 缺失、无受支持 rootfile、路径越界、空路径、控制字符)
|
|
104
|
+
* → `FormatError`
|
|
105
|
+
*
|
|
106
|
+
* 依赖方向:只依赖 `frond-js/core`(ARCHITECTURE §1 / §3.4)。
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 解析 OCF container,定位 package document(OPF)。
|
|
111
|
+
*
|
|
112
|
+
* @param archive - 已解析的 ZIP 归档。
|
|
113
|
+
* @param options - 取消信号、源标识、container 路径覆盖。
|
|
114
|
+
* @returns OPF 在归档内的规范化路径与其媒体类型。
|
|
115
|
+
* @throws {FormatError} container 缺失、无受支持的 rootfile、路径越界或非法。
|
|
116
|
+
* @throws {ParseError} container XML 结构损坏。
|
|
117
|
+
* @throws {AbortError} 操作被取消。
|
|
118
|
+
*/
|
|
119
|
+
declare function parseContainer(archive: ZipArchive, options?: ParseContainerOptions): Promise<EpubContainer>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* OPF package document 解析(T1.5)。
|
|
123
|
+
*
|
|
124
|
+
* 把 OPF 转成跨格式的 `Book` 模型(`frond-js/core` 的 `model/types.ts`)。
|
|
125
|
+
* 覆盖 REQ-EPUB-003(元数据)与 REQ-EPUB-004(spine 顺序与 `linear`)。
|
|
126
|
+
*
|
|
127
|
+
* 错误分类(沿用 T1.3 的二分原则):
|
|
128
|
+
* - 结构损坏(XML 非法) → `ParseError`
|
|
129
|
+
* - 不符合 OPF 规范(缺必需字段、重复 id、
|
|
130
|
+
* 未知 idref、路径越界、根元素不对) → `FormatError`
|
|
131
|
+
*
|
|
132
|
+
* 设计取舍:
|
|
133
|
+
* - **不静默生成不完整模型**(规格 §4.2):`itemref@idref` 悬空、manifest 重复 `id`、
|
|
134
|
+
* 缺少 `title` / `identifier` / `language` 一律抛错。
|
|
135
|
+
* - 唯一例外是**可选线索**:`spine@toc` 悬空时 `ncxPath` 置空而不报错 ——
|
|
136
|
+
* 它只是 EPUB 2 遗留的目录提示,且 EPUB 3 已弃用;与 `dcterms:modified` 同理,
|
|
137
|
+
* 不因一个可选线索缺失就拒掉整本能读的书。
|
|
138
|
+
*
|
|
139
|
+
* 依赖方向:只依赖 `frond-js/core`(ARCHITECTURE §1 / §3.4)。
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 解析 OPF package document,产出 `Book` 模型。
|
|
144
|
+
*
|
|
145
|
+
* @param archive - 已解析的 ZIP 归档。
|
|
146
|
+
* @param opfPath - OPF 在归档内的路径(通常来自 {@link parseContainer})。
|
|
147
|
+
* @param options - 取消信号与源标识。
|
|
148
|
+
* @returns 只读的 `Book`:`format` / metadata / `resources` / `chapters`(跨格式层)
|
|
149
|
+
* 与 `manifest` / `spine` / `manifestIndex` / `opfPath` / `basePath` / 目录线索(EPUB 专属层)。
|
|
150
|
+
* `resources` 由 `manifest`、`chapters` 由 `spine` **派生**(ADR-0014)。
|
|
151
|
+
* `direction`(通用可选层)来自 `spine@page-progression-direction`,缺省 / `default` /
|
|
152
|
+
* 非法值一律**缺席**(不是 `undefined` 值,见 `resolveDirection`)。
|
|
153
|
+
* @throws {FormatError} 缺必需字段、重复 id、未知 idref、路径非法、根元素不对。
|
|
154
|
+
* @throws {ParseError} OPF XML 结构损坏。
|
|
155
|
+
* @throws {AbortError} 操作被取消。
|
|
156
|
+
*/
|
|
157
|
+
declare function parseOpf(archive: ZipArchive, opfPath: string, options?: ParseOpfOptions): Promise<Book>;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* EPUB 目录解析(T1.6):NAV(EPUB 3)与 NCX(EPUB 2 降级)。
|
|
161
|
+
*
|
|
162
|
+
* 覆盖 REQ-EPUB-001(目录可读)与 REQ-EPUB-002(EPUB 2 降级)。
|
|
163
|
+
*
|
|
164
|
+
* 选择规则(规格 §4.3):
|
|
165
|
+
* 1. manifest 中 `properties` 含 `nav` 的 XHTML 目录文档(EPUB 3)**优先**
|
|
166
|
+
* 2. 缺少 NAV 时,用 `spine@toc` 指向的 NCX(EPUB 2)
|
|
167
|
+
* 3. 两者线索都没有 → 空目录
|
|
168
|
+
*
|
|
169
|
+
* ⚠️ NAV **存在但损坏**时不回退到 NCX —— 「缺少」与「损坏」是两回事,
|
|
170
|
+
* 静默降级会掩盖真实缺陷(与 T1.5「不静默生成不完整模型」一致)。
|
|
171
|
+
*
|
|
172
|
+
* 口径(T1.6 Step 1 已确认):
|
|
173
|
+
* - `TocItem.href` **不含** fragment,与 `ManifestItem.href` 一致;
|
|
174
|
+
* fragment 单独成字段,因此 `href` 可直接交给归档读取层
|
|
175
|
+
* - 只含 fragment 的链接(`#top`)→ `href` = 引用文档自身路径,**永不为空**
|
|
176
|
+
* - 缺 `href` / 缺 `content@src` → `FormatError`;label 缺失则宽容为空串
|
|
177
|
+
* (label 只影响展示,缺目标则目录项无法使用)
|
|
178
|
+
*
|
|
179
|
+
* 相对链接按**引用它的文档**(NAV / NCX 文件)所在目录解析,而非 OPF 目录 ——
|
|
180
|
+
* 这是 EPUB 规范的定义。两者通常同目录,此时结果与「按 OPF 基准」一致。
|
|
181
|
+
*
|
|
182
|
+
* 错误分类(沿用 T1.3 的二分原则):
|
|
183
|
+
* - 结构损坏(XML 非法) → `ParseError`
|
|
184
|
+
* - 不符合规范(缺链接、路径越界)→ `FormatError`
|
|
185
|
+
*
|
|
186
|
+
* 依赖方向:只依赖 `frond-js/core`(ARCHITECTURE §1 / §3.4)。
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* 解析书籍目录。
|
|
191
|
+
*
|
|
192
|
+
* NAV(EPUB 3)优先,缺失时降级到 NCX(EPUB 2)。线索来自 {@link parseOpf}
|
|
193
|
+
* 产出的 `Book.tocItem` / `Book.ncxPath`;两者都没有时返回空数组。
|
|
194
|
+
*
|
|
195
|
+
* @param archive - 已解析的 ZIP 归档。
|
|
196
|
+
* @param book - 已解析的 `Book`(通常来自 {@link parseOpf})。
|
|
197
|
+
* @param options - 取消信号与源标识。
|
|
198
|
+
* @returns 目录树;无目录时为空数组。每一项的 `href` 可直接交给归档读取层。
|
|
199
|
+
* @throws {FormatError} 目录项缺目标、路径越界、NAV/NCX 文档在归档中缺失。
|
|
200
|
+
* @throws {ParseError} 目录文档 XML 结构损坏。
|
|
201
|
+
* @throws {AbortError} 操作被取消。
|
|
202
|
+
*/
|
|
203
|
+
declare function parseToc(archive: ZipArchive, book: Book, options?: ParseTocOptions): Promise<readonly TocItem[]>;
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* EPUB 端到端编排(T1.8)。
|
|
207
|
+
*
|
|
208
|
+
* 把 `parseZip → parseContainer → parseOpf → parseToc` 串成一条链,
|
|
209
|
+
* 让调用方用一次调用完成「字节 → `{ archive, book, toc }`」。
|
|
210
|
+
*
|
|
211
|
+
* 为什么不把这四步塞进一个函数体内部、而是保持四个独立导出:
|
|
212
|
+
* 分层各有用途 —— 只想读元数据时不必解析目录(省一次归档读取),
|
|
213
|
+
* 只想验容器时不必读 OPF。编排层只是**给最常见的完整路径**提供一个便捷入口,
|
|
214
|
+
* 不取代分层 API(`docs/API.md` §9–§11)。
|
|
215
|
+
*
|
|
216
|
+
* 本模块属于 `frond-js/formats/epub`,经 subpath export 与动态 import 按需加载,
|
|
217
|
+
* **不计入 core 的 30KB gzip 预算**(ADR-0001)。
|
|
218
|
+
*
|
|
219
|
+
* 依赖方向:只依赖 `frond-js/core`,不得依赖 `render/`、`reader/`(ARCHITECTURE §1)。
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* 从 EPUB 字节打开一本书:ZIP → container.xml → OPF → NAV / NCX 目录。
|
|
224
|
+
*
|
|
225
|
+
* 等价于手工串联:
|
|
226
|
+
* ```ts
|
|
227
|
+
* const archive = parseZip(bytes);
|
|
228
|
+
* const { opfPath } = await parseContainer(archive);
|
|
229
|
+
* const book = await parseOpf(archive, opfPath);
|
|
230
|
+
* const toc = await parseToc(archive, book);
|
|
231
|
+
* ```
|
|
232
|
+
* 但有三处编排层的额外保证:
|
|
233
|
+
*
|
|
234
|
+
* 1. **`signal` 在 `parseZip` 之前就被检查**。`parseZip` 是同步且不可取消的,
|
|
235
|
+
* 已取消的调用不应白白扫一遍中央目录(H6 / H7)。
|
|
236
|
+
* 2. **`source` 缺省时逐层退化**,而不是填一个笼统的占位串 ——
|
|
237
|
+
* 于是错误 message 总会指到真正出问题的那个文件(REQ-EPUB-007)。
|
|
238
|
+
* 3. **接受可注入的字节源**(REQ-CORE-005):除裸 `Uint8Array` 外,还可传入
|
|
239
|
+
* {@link BookSource},宿主借此接入内存 / OPFS / 远端分片,core 无需感知差异。
|
|
240
|
+
*
|
|
241
|
+
* 后续三层(container / OPF / 目录)各自在入口处重新检查 `signal`,
|
|
242
|
+
* 因此取消在任意两次归档读取之间都能及时生效,无需在此重复检查。
|
|
243
|
+
*
|
|
244
|
+
* @param source - 完整 EPUB 归档字节,或提供它的 {@link BookSource}。
|
|
245
|
+
* 传 `Uint8Array` 时**不会被复制**,返回的 `archive` 持有其引用。
|
|
246
|
+
* 传 `BookSource` 时**一次性读全** `[0, size)` —— 见
|
|
247
|
+
* `core/formats/bytes.ts` 的 `resolveBookBytes`(T3.0.3 起由注册表与本函数共用同一实现)。
|
|
248
|
+
* @param options - 取消信号与源标识。
|
|
249
|
+
* @returns `{ archive, book, toc }`;无目录时 `toc` 为空数组。
|
|
250
|
+
* @throws {FormatError} 归档结构非法(ZIP64 / 加密 / 条目缺失)、OCF 或 OPF 语义违规、
|
|
251
|
+
* 目录文档缺失;或字节源未提供合法总长 / 返回字节数与总长不符。
|
|
252
|
+
* @throws {ParseError} container / OPF / 目录文档 XML 结构损坏。
|
|
253
|
+
* @throws {AbortError} 操作被取消。
|
|
254
|
+
*/
|
|
255
|
+
declare function openBook(source: Uint8Array | BookSource, options?: OpenBookOptions): Promise<OpenedBook>;
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* `frond-js/formats/epub` — EPUB 3 解析器入口。
|
|
259
|
+
*
|
|
260
|
+
* 已实现:**T1.4 OCF container**(`parseContainer`)、**T1.5 OPF package**(`parseOpf`)、
|
|
261
|
+
* **T1.6 NAV / NCX 目录**(`parseToc`)、**T1.8 端到端编排**(`openBook`)。
|
|
262
|
+
*
|
|
263
|
+
* 分层 API 与编排 API 并存:`openBook` 是「字节 → `{ archive, book, toc }`」的
|
|
264
|
+
* 便捷入口,但**不取代** `parseContainer` / `parseOpf` / `parseToc` ——
|
|
265
|
+
* 只想读元数据时不必解析目录,只想验容器时不必读 OPF。
|
|
266
|
+
*
|
|
267
|
+
* CFI(T1.7)不在本入口 —— 它属**跨格式复用能力**,位于 `frond-js/core`
|
|
268
|
+
* (划分判据见 `docs/ARCHITECTURE.md` §1)。
|
|
269
|
+
*
|
|
270
|
+
* 本入口以 subpath export + 动态 import 方式按需加载,因此
|
|
271
|
+
* **不计入 core 的 30KB gzip 预算**(ADR-0001)。
|
|
272
|
+
*
|
|
273
|
+
* ⚠️ **`epubAdapter`(格式适配层端口)刻意不从本入口 re-export**(T3.0.3 决定):
|
|
274
|
+
* 它实现的是 `core/formats/types.ts` 的 `FormatAdapter`,而该端口**未从任何入口公开**,
|
|
275
|
+
* 且 `ReaderOptions` 也没有注册表注入点 ⇒ 公开它等于发布一个「消费者既无法命名其类型、
|
|
276
|
+
* 也无法注入」的 API。**加公开面以后再加是非破坏性的,收回却是破坏性的**,
|
|
277
|
+
* 故先保持内部;等第三方格式包有真实消费者时再定公开面(见 ADR-0013「落地时的修订」)。
|
|
278
|
+
* 内部消费方(`src/reader/formats.ts`、单测)直接 import `./adapter.js`。
|
|
279
|
+
*
|
|
280
|
+
* 依赖方向:只依赖 `frond-js/core`,不得依赖 `render/`、`reader/`(ARCHITECTURE §1 / §3.4)。
|
|
281
|
+
*/
|
|
282
|
+
|
|
283
|
+
/** EPUB 容器媒体类型(OCF 规范定义)。 */
|
|
284
|
+
declare const EPUB_MEDIA_TYPE = "application/epub+zip";
|
|
285
|
+
|
|
286
|
+
export { EPUB_MEDIA_TYPE, type EpubContainer, type EpubPackageMediaType, type OpenBookOptions, type OpenedBook, type ParseContainerOptions, type ParseOpfOptions, type ParseTocOptions, openBook, parseContainer, parseOpf, parseToc };
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { Z as ZipArchive } from '../../types-B76GOMxj.js';
|
|
2
|
+
import { a as Book, T as TocItem, B as BookSource } from '../../types-C-5eHSRH.js';
|
|
3
|
+
import { O as OperationOptions } from '../../types-DQYmArgv.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* EPUB 解析(OCF 容器 / OPF package)的公共类型。
|
|
7
|
+
*
|
|
8
|
+
* 本模块属于 `frond-js/formats/epub`,经 subpath export 与动态 import 按需加载,
|
|
9
|
+
* **不计入 core 的 30KB gzip 预算**(ADR-0001)。
|
|
10
|
+
*
|
|
11
|
+
* 依赖方向:只依赖 `frond-js/core`,不得依赖 `render/`、`reader/`(ARCHITECTURE §1)。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* OCF 规范定义的 package document 媒体类型。
|
|
16
|
+
*
|
|
17
|
+
* 目前只支持这一种。其他媒体类型(如 `text/xml`)在 rootfile 选择阶段被跳过。
|
|
18
|
+
*/
|
|
19
|
+
type EpubPackageMediaType = 'application/oebps-package+xml';
|
|
20
|
+
/** {@link parseContainer} 的解析结果。 */
|
|
21
|
+
interface EpubContainer {
|
|
22
|
+
/**
|
|
23
|
+
* package document(OPF)在归档内的路径。
|
|
24
|
+
*
|
|
25
|
+
* 已完成规范化:前导 `/` 与 `.` 段被移除,`\` 归一化为 `/`,
|
|
26
|
+
* `..` 仅在归档根目录之内回退。**可直接交给归档读取层**。
|
|
27
|
+
*/
|
|
28
|
+
readonly opfPath: string;
|
|
29
|
+
/** 被选中 rootfile 声明的媒体类型。 */
|
|
30
|
+
readonly mediaType: EpubPackageMediaType;
|
|
31
|
+
}
|
|
32
|
+
/** {@link parseContainer} 的选项。 */
|
|
33
|
+
interface ParseContainerOptions extends OperationOptions {
|
|
34
|
+
/** 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。 */
|
|
35
|
+
readonly source?: string;
|
|
36
|
+
/**
|
|
37
|
+
* container 文档在归档内的路径。
|
|
38
|
+
*
|
|
39
|
+
* 默认 `META-INF/container.xml`(OCF 规范固定位置)。
|
|
40
|
+
* 仅用于错误定位或兼容非标准归档,正常 EPUB 无需设置。
|
|
41
|
+
*/
|
|
42
|
+
readonly containerPath?: string;
|
|
43
|
+
}
|
|
44
|
+
/** {@link parseOpf} 的选项。 */
|
|
45
|
+
interface ParseOpfOptions extends OperationOptions {
|
|
46
|
+
/**
|
|
47
|
+
* 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。
|
|
48
|
+
*
|
|
49
|
+
* 缺省时退化为 OPF 的归档路径,仍能定位到具体文件。
|
|
50
|
+
*/
|
|
51
|
+
readonly source?: string;
|
|
52
|
+
}
|
|
53
|
+
/** {@link parseToc} 的选项。 */
|
|
54
|
+
interface ParseTocOptions extends OperationOptions {
|
|
55
|
+
/**
|
|
56
|
+
* 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。
|
|
57
|
+
*
|
|
58
|
+
* 缺省时退化为目录文档(NAV 或 NCX)在归档内的路径。
|
|
59
|
+
*/
|
|
60
|
+
readonly source?: string;
|
|
61
|
+
}
|
|
62
|
+
/** {@link openBook} 的选项。 */
|
|
63
|
+
interface OpenBookOptions extends OperationOptions {
|
|
64
|
+
/**
|
|
65
|
+
* 源标识,用于错误定位(REQ-EPUB-007)。通常传文件名或 URL。
|
|
66
|
+
*
|
|
67
|
+
* 缺省时**逐层退化**为该层实际访问的归档路径(container → OPF → NAV/NCX),
|
|
68
|
+
* 而不是一个笼统的占位串 —— 这样错误 message 总能指到真正出问题的那个文件。
|
|
69
|
+
*/
|
|
70
|
+
readonly source?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* {@link openBook} 的结果。
|
|
74
|
+
*
|
|
75
|
+
* 为什么是「三件套」而不是直接返回 `Book`:
|
|
76
|
+
*
|
|
77
|
+
* - **`toc` 不放进 `Book`**(T1.8 决策)。目录解析需要额外一次归档读取,
|
|
78
|
+
* 而 `parseOpf` 是纯 OPF 解析、不应隐式触发 IO(见 `docs/API.md` §10.3)。
|
|
79
|
+
* 把 `toc` 挂在编排结果上,`Book` 就能保持「只由 OPF 决定」的干净语义。
|
|
80
|
+
* - **`archive` 一并返回**。渲染层要按 `ManifestItem.href` / `TocItem.href`
|
|
81
|
+
* 读取 XHTML / CSS / 图片,而这些路径只有归档能解。若不返回,调用方就得
|
|
82
|
+
* 自己再调一次 `parseZip` —— 而 `parseZip` 是同步且不可取消的,
|
|
83
|
+
* 等于让调用方多付一次全量中央目录扫描,还绕开了 `signal`。
|
|
84
|
+
* 这里返回的归档**不复制字节**,只持有传入 `Uint8Array` 的引用。
|
|
85
|
+
*/
|
|
86
|
+
interface OpenedBook {
|
|
87
|
+
/** 已解析的归档(只读视图)。生命周期与传入的字节绑定。 */
|
|
88
|
+
readonly archive: ZipArchive;
|
|
89
|
+
/** 书籍模型:metadata / manifest / spine / 目录线索。**不含 `toc`**。 */
|
|
90
|
+
readonly book: Book;
|
|
91
|
+
/** 目录树,按文档顺序。无目录(既无 NAV 也无 NCX)时为空数组。 */
|
|
92
|
+
readonly toc: readonly TocItem[];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* OCF container 解析(T1.4)。
|
|
97
|
+
*
|
|
98
|
+
* 读取 `META-INF/container.xml`,解析 `rootfiles`,选择受支持的 package
|
|
99
|
+
* document,输出其在归档内的路径。**本层不解析 OPF 内容** —— 那是 T1.5 的职责。
|
|
100
|
+
*
|
|
101
|
+
* 错误分类(沿用 T1.3 的二分原则):
|
|
102
|
+
* - 结构损坏(XML 非法)→ `ParseError`
|
|
103
|
+
* - 不符合 OCF 规范(container 缺失、无受支持 rootfile、路径越界、空路径、控制字符)
|
|
104
|
+
* → `FormatError`
|
|
105
|
+
*
|
|
106
|
+
* 依赖方向:只依赖 `frond-js/core`(ARCHITECTURE §1 / §3.4)。
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 解析 OCF container,定位 package document(OPF)。
|
|
111
|
+
*
|
|
112
|
+
* @param archive - 已解析的 ZIP 归档。
|
|
113
|
+
* @param options - 取消信号、源标识、container 路径覆盖。
|
|
114
|
+
* @returns OPF 在归档内的规范化路径与其媒体类型。
|
|
115
|
+
* @throws {FormatError} container 缺失、无受支持的 rootfile、路径越界或非法。
|
|
116
|
+
* @throws {ParseError} container XML 结构损坏。
|
|
117
|
+
* @throws {AbortError} 操作被取消。
|
|
118
|
+
*/
|
|
119
|
+
declare function parseContainer(archive: ZipArchive, options?: ParseContainerOptions): Promise<EpubContainer>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* OPF package document 解析(T1.5)。
|
|
123
|
+
*
|
|
124
|
+
* 把 OPF 转成跨格式的 `Book` 模型(`frond-js/core` 的 `model/types.ts`)。
|
|
125
|
+
* 覆盖 REQ-EPUB-003(元数据)与 REQ-EPUB-004(spine 顺序与 `linear`)。
|
|
126
|
+
*
|
|
127
|
+
* 错误分类(沿用 T1.3 的二分原则):
|
|
128
|
+
* - 结构损坏(XML 非法) → `ParseError`
|
|
129
|
+
* - 不符合 OPF 规范(缺必需字段、重复 id、
|
|
130
|
+
* 未知 idref、路径越界、根元素不对) → `FormatError`
|
|
131
|
+
*
|
|
132
|
+
* 设计取舍:
|
|
133
|
+
* - **不静默生成不完整模型**(规格 §4.2):`itemref@idref` 悬空、manifest 重复 `id`、
|
|
134
|
+
* 缺少 `title` / `identifier` / `language` 一律抛错。
|
|
135
|
+
* - 唯一例外是**可选线索**:`spine@toc` 悬空时 `ncxPath` 置空而不报错 ——
|
|
136
|
+
* 它只是 EPUB 2 遗留的目录提示,且 EPUB 3 已弃用;与 `dcterms:modified` 同理,
|
|
137
|
+
* 不因一个可选线索缺失就拒掉整本能读的书。
|
|
138
|
+
*
|
|
139
|
+
* 依赖方向:只依赖 `frond-js/core`(ARCHITECTURE §1 / §3.4)。
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 解析 OPF package document,产出 `Book` 模型。
|
|
144
|
+
*
|
|
145
|
+
* @param archive - 已解析的 ZIP 归档。
|
|
146
|
+
* @param opfPath - OPF 在归档内的路径(通常来自 {@link parseContainer})。
|
|
147
|
+
* @param options - 取消信号与源标识。
|
|
148
|
+
* @returns 只读的 `Book`:`format` / metadata / `resources` / `chapters`(跨格式层)
|
|
149
|
+
* 与 `manifest` / `spine` / `manifestIndex` / `opfPath` / `basePath` / 目录线索(EPUB 专属层)。
|
|
150
|
+
* `resources` 由 `manifest`、`chapters` 由 `spine` **派生**(ADR-0014)。
|
|
151
|
+
* `direction`(通用可选层)来自 `spine@page-progression-direction`,缺省 / `default` /
|
|
152
|
+
* 非法值一律**缺席**(不是 `undefined` 值,见 `resolveDirection`)。
|
|
153
|
+
* @throws {FormatError} 缺必需字段、重复 id、未知 idref、路径非法、根元素不对。
|
|
154
|
+
* @throws {ParseError} OPF XML 结构损坏。
|
|
155
|
+
* @throws {AbortError} 操作被取消。
|
|
156
|
+
*/
|
|
157
|
+
declare function parseOpf(archive: ZipArchive, opfPath: string, options?: ParseOpfOptions): Promise<Book>;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* EPUB 目录解析(T1.6):NAV(EPUB 3)与 NCX(EPUB 2 降级)。
|
|
161
|
+
*
|
|
162
|
+
* 覆盖 REQ-EPUB-001(目录可读)与 REQ-EPUB-002(EPUB 2 降级)。
|
|
163
|
+
*
|
|
164
|
+
* 选择规则(规格 §4.3):
|
|
165
|
+
* 1. manifest 中 `properties` 含 `nav` 的 XHTML 目录文档(EPUB 3)**优先**
|
|
166
|
+
* 2. 缺少 NAV 时,用 `spine@toc` 指向的 NCX(EPUB 2)
|
|
167
|
+
* 3. 两者线索都没有 → 空目录
|
|
168
|
+
*
|
|
169
|
+
* ⚠️ NAV **存在但损坏**时不回退到 NCX —— 「缺少」与「损坏」是两回事,
|
|
170
|
+
* 静默降级会掩盖真实缺陷(与 T1.5「不静默生成不完整模型」一致)。
|
|
171
|
+
*
|
|
172
|
+
* 口径(T1.6 Step 1 已确认):
|
|
173
|
+
* - `TocItem.href` **不含** fragment,与 `ManifestItem.href` 一致;
|
|
174
|
+
* fragment 单独成字段,因此 `href` 可直接交给归档读取层
|
|
175
|
+
* - 只含 fragment 的链接(`#top`)→ `href` = 引用文档自身路径,**永不为空**
|
|
176
|
+
* - 缺 `href` / 缺 `content@src` → `FormatError`;label 缺失则宽容为空串
|
|
177
|
+
* (label 只影响展示,缺目标则目录项无法使用)
|
|
178
|
+
*
|
|
179
|
+
* 相对链接按**引用它的文档**(NAV / NCX 文件)所在目录解析,而非 OPF 目录 ——
|
|
180
|
+
* 这是 EPUB 规范的定义。两者通常同目录,此时结果与「按 OPF 基准」一致。
|
|
181
|
+
*
|
|
182
|
+
* 错误分类(沿用 T1.3 的二分原则):
|
|
183
|
+
* - 结构损坏(XML 非法) → `ParseError`
|
|
184
|
+
* - 不符合规范(缺链接、路径越界)→ `FormatError`
|
|
185
|
+
*
|
|
186
|
+
* 依赖方向:只依赖 `frond-js/core`(ARCHITECTURE §1 / §3.4)。
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* 解析书籍目录。
|
|
191
|
+
*
|
|
192
|
+
* NAV(EPUB 3)优先,缺失时降级到 NCX(EPUB 2)。线索来自 {@link parseOpf}
|
|
193
|
+
* 产出的 `Book.tocItem` / `Book.ncxPath`;两者都没有时返回空数组。
|
|
194
|
+
*
|
|
195
|
+
* @param archive - 已解析的 ZIP 归档。
|
|
196
|
+
* @param book - 已解析的 `Book`(通常来自 {@link parseOpf})。
|
|
197
|
+
* @param options - 取消信号与源标识。
|
|
198
|
+
* @returns 目录树;无目录时为空数组。每一项的 `href` 可直接交给归档读取层。
|
|
199
|
+
* @throws {FormatError} 目录项缺目标、路径越界、NAV/NCX 文档在归档中缺失。
|
|
200
|
+
* @throws {ParseError} 目录文档 XML 结构损坏。
|
|
201
|
+
* @throws {AbortError} 操作被取消。
|
|
202
|
+
*/
|
|
203
|
+
declare function parseToc(archive: ZipArchive, book: Book, options?: ParseTocOptions): Promise<readonly TocItem[]>;
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* EPUB 端到端编排(T1.8)。
|
|
207
|
+
*
|
|
208
|
+
* 把 `parseZip → parseContainer → parseOpf → parseToc` 串成一条链,
|
|
209
|
+
* 让调用方用一次调用完成「字节 → `{ archive, book, toc }`」。
|
|
210
|
+
*
|
|
211
|
+
* 为什么不把这四步塞进一个函数体内部、而是保持四个独立导出:
|
|
212
|
+
* 分层各有用途 —— 只想读元数据时不必解析目录(省一次归档读取),
|
|
213
|
+
* 只想验容器时不必读 OPF。编排层只是**给最常见的完整路径**提供一个便捷入口,
|
|
214
|
+
* 不取代分层 API(`docs/API.md` §9–§11)。
|
|
215
|
+
*
|
|
216
|
+
* 本模块属于 `frond-js/formats/epub`,经 subpath export 与动态 import 按需加载,
|
|
217
|
+
* **不计入 core 的 30KB gzip 预算**(ADR-0001)。
|
|
218
|
+
*
|
|
219
|
+
* 依赖方向:只依赖 `frond-js/core`,不得依赖 `render/`、`reader/`(ARCHITECTURE §1)。
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* 从 EPUB 字节打开一本书:ZIP → container.xml → OPF → NAV / NCX 目录。
|
|
224
|
+
*
|
|
225
|
+
* 等价于手工串联:
|
|
226
|
+
* ```ts
|
|
227
|
+
* const archive = parseZip(bytes);
|
|
228
|
+
* const { opfPath } = await parseContainer(archive);
|
|
229
|
+
* const book = await parseOpf(archive, opfPath);
|
|
230
|
+
* const toc = await parseToc(archive, book);
|
|
231
|
+
* ```
|
|
232
|
+
* 但有三处编排层的额外保证:
|
|
233
|
+
*
|
|
234
|
+
* 1. **`signal` 在 `parseZip` 之前就被检查**。`parseZip` 是同步且不可取消的,
|
|
235
|
+
* 已取消的调用不应白白扫一遍中央目录(H6 / H7)。
|
|
236
|
+
* 2. **`source` 缺省时逐层退化**,而不是填一个笼统的占位串 ——
|
|
237
|
+
* 于是错误 message 总会指到真正出问题的那个文件(REQ-EPUB-007)。
|
|
238
|
+
* 3. **接受可注入的字节源**(REQ-CORE-005):除裸 `Uint8Array` 外,还可传入
|
|
239
|
+
* {@link BookSource},宿主借此接入内存 / OPFS / 远端分片,core 无需感知差异。
|
|
240
|
+
*
|
|
241
|
+
* 后续三层(container / OPF / 目录)各自在入口处重新检查 `signal`,
|
|
242
|
+
* 因此取消在任意两次归档读取之间都能及时生效,无需在此重复检查。
|
|
243
|
+
*
|
|
244
|
+
* @param source - 完整 EPUB 归档字节,或提供它的 {@link BookSource}。
|
|
245
|
+
* 传 `Uint8Array` 时**不会被复制**,返回的 `archive` 持有其引用。
|
|
246
|
+
* 传 `BookSource` 时**一次性读全** `[0, size)` —— 见
|
|
247
|
+
* `core/formats/bytes.ts` 的 `resolveBookBytes`(T3.0.3 起由注册表与本函数共用同一实现)。
|
|
248
|
+
* @param options - 取消信号与源标识。
|
|
249
|
+
* @returns `{ archive, book, toc }`;无目录时 `toc` 为空数组。
|
|
250
|
+
* @throws {FormatError} 归档结构非法(ZIP64 / 加密 / 条目缺失)、OCF 或 OPF 语义违规、
|
|
251
|
+
* 目录文档缺失;或字节源未提供合法总长 / 返回字节数与总长不符。
|
|
252
|
+
* @throws {ParseError} container / OPF / 目录文档 XML 结构损坏。
|
|
253
|
+
* @throws {AbortError} 操作被取消。
|
|
254
|
+
*/
|
|
255
|
+
declare function openBook(source: Uint8Array | BookSource, options?: OpenBookOptions): Promise<OpenedBook>;
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* `frond-js/formats/epub` — EPUB 3 解析器入口。
|
|
259
|
+
*
|
|
260
|
+
* 已实现:**T1.4 OCF container**(`parseContainer`)、**T1.5 OPF package**(`parseOpf`)、
|
|
261
|
+
* **T1.6 NAV / NCX 目录**(`parseToc`)、**T1.8 端到端编排**(`openBook`)。
|
|
262
|
+
*
|
|
263
|
+
* 分层 API 与编排 API 并存:`openBook` 是「字节 → `{ archive, book, toc }`」的
|
|
264
|
+
* 便捷入口,但**不取代** `parseContainer` / `parseOpf` / `parseToc` ——
|
|
265
|
+
* 只想读元数据时不必解析目录,只想验容器时不必读 OPF。
|
|
266
|
+
*
|
|
267
|
+
* CFI(T1.7)不在本入口 —— 它属**跨格式复用能力**,位于 `frond-js/core`
|
|
268
|
+
* (划分判据见 `docs/ARCHITECTURE.md` §1)。
|
|
269
|
+
*
|
|
270
|
+
* 本入口以 subpath export + 动态 import 方式按需加载,因此
|
|
271
|
+
* **不计入 core 的 30KB gzip 预算**(ADR-0001)。
|
|
272
|
+
*
|
|
273
|
+
* ⚠️ **`epubAdapter`(格式适配层端口)刻意不从本入口 re-export**(T3.0.3 决定):
|
|
274
|
+
* 它实现的是 `core/formats/types.ts` 的 `FormatAdapter`,而该端口**未从任何入口公开**,
|
|
275
|
+
* 且 `ReaderOptions` 也没有注册表注入点 ⇒ 公开它等于发布一个「消费者既无法命名其类型、
|
|
276
|
+
* 也无法注入」的 API。**加公开面以后再加是非破坏性的,收回却是破坏性的**,
|
|
277
|
+
* 故先保持内部;等第三方格式包有真实消费者时再定公开面(见 ADR-0013「落地时的修订」)。
|
|
278
|
+
* 内部消费方(`src/reader/formats.ts`、单测)直接 import `./adapter.js`。
|
|
279
|
+
*
|
|
280
|
+
* 依赖方向:只依赖 `frond-js/core`,不得依赖 `render/`、`reader/`(ARCHITECTURE §1 / §3.4)。
|
|
281
|
+
*/
|
|
282
|
+
|
|
283
|
+
/** EPUB 容器媒体类型(OCF 规范定义)。 */
|
|
284
|
+
declare const EPUB_MEDIA_TYPE = "application/epub+zip";
|
|
285
|
+
|
|
286
|
+
export { EPUB_MEDIA_TYPE, type EpubContainer, type EpubPackageMediaType, type OpenBookOptions, type OpenedBook, type ParseContainerOptions, type ParseOpfOptions, type ParseTocOptions, openBook, parseContainer, parseOpf, parseToc };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { openBook, parseContainer, parseOpf, parseToc } from '../../chunk-SJVOYNTF.js';
|
|
2
|
+
import '../../chunk-JJVXT3AC.js';
|
|
3
|
+
import '../../chunk-D4KWSEZD.js';
|
|
4
|
+
import '../../chunk-UY2YRCFC.js';
|
|
5
|
+
import '../../chunk-U4264IQH.js';
|
|
6
|
+
import '../../chunk-B2L2YVXD.js';
|
|
7
|
+
|
|
8
|
+
// src/formats/epub/index.ts
|
|
9
|
+
var EPUB_MEDIA_TYPE = "application/epub+zip";
|
|
10
|
+
|
|
11
|
+
export { EPUB_MEDIA_TYPE };
|