@prose-reader/streamer 1.24.0 → 1.26.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.
@@ -1,266 +1,361 @@
1
- import { urlJoin as v, PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME as J, isXmlBasedMimeType as q, detectMimeTypeFromName as W } from "@prose-reader/shared";
2
- import g from "xmldoc";
3
- let b = !1;
1
+ import {
2
+ urlJoin as v,
3
+ PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME as J,
4
+ isXmlBasedMimeType as q,
5
+ detectMimeTypeFromName as W,
6
+ } from "@prose-reader/shared"
7
+ import g from "xmldoc"
8
+ let b = !1
4
9
  const h = {
5
- enable: (e) => {
6
- b = e;
10
+ enable: (e) => {
11
+ b = e
12
+ },
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ log: (...e) => {
15
+ b && console.log("[prose-reader-streamer]", ...e)
16
+ },
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ warn: (...e) => {
19
+ b && console.warn("[prose-reader-streamer]", ...e)
20
+ },
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ error: (...e) => {
23
+ console.error(...e)
24
+ },
25
+ time: (e) => {
26
+ b && console.time(`[prose-reader-streamer] [metric] ${e}`)
27
+ },
28
+ timeEnd: (e) => {
29
+ b && console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)
30
+ },
31
+ metric: (e, i = 1 / 0) => {
32
+ const a = typeof e == "number" ? e : e.duration
33
+ b &&
34
+ (e.duration <= i
35
+ ? console.log("[prose-reader-streamer] [metric] ", `${e.name} took ${a}ms`)
36
+ : console.warn(
37
+ "[prose-reader-streamer] [metric] ",
38
+ `${e.name} took ${e.duration}ms which is above the ${i}ms target for this function`
39
+ ))
40
+ },
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ measurePerformance:
43
+ (e, i = 10, a) =>
44
+ (...r) => {
45
+ const t = performance.now(),
46
+ n = a(...r)
47
+ if (n && n.then)
48
+ return n.then((s) => {
49
+ const d = performance.now()
50
+ return h.metric({ name: e, duration: d - t }, i), s
51
+ })
52
+ const o = performance.now()
53
+ return h.metric({ name: e, duration: o - t }, i), n
54
+ },
7
55
  },
8
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
- log: (...e) => {
10
- b && console.log("[prose-reader-streamer]", ...e);
56
+ Y =
57
+ ({ archive: e, resourcePath: i }) =>
58
+ async (a) => {
59
+ const r = Object.values(e.files).find((t) => t.uri === i)
60
+ if (r != null && r.basename.endsWith(".css")) {
61
+ const n = (a.body ?? (await r.string())).replaceAll("-webkit-writing-mode", "writing-mode")
62
+ return {
63
+ ...a,
64
+ body: n,
65
+ }
66
+ }
67
+ return a
68
+ },
69
+ x = (e) => {
70
+ const a = Object.values(e.files)
71
+ .filter((r) => !r.dir)
72
+ .find((r) => r.uri.endsWith(".opf"))
73
+ return {
74
+ data: a,
75
+ basePath: (a == null ? void 0 : a.uri.substring(0, a.uri.lastIndexOf("/"))) || "",
76
+ }
11
77
  },
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- warn: (...e) => {
14
- b && console.warn("[prose-reader-streamer]", ...e);
78
+ P = (e, { opfBasePath: i, baseUrl: a }) => {
79
+ const r = {
80
+ contents: [],
81
+ path: "",
82
+ href: "",
83
+ title: "",
84
+ }
85
+ let t = e.childNamed("span") || e.childNamed("a")
86
+ r.title = (t == null ? void 0 : t.attr.title) || (t == null ? void 0 : t.val.trim()) || r.title
87
+ let n = t == null ? void 0 : t.name
88
+ n !== "a" && ((t = e.descendantWithPath(`${n}.a`)), t && (n = t.name.toLowerCase())),
89
+ n === "a" && t != null && t.attr.href && ((r.path = v(i, t.attr.href)), (r.href = v(a, i, t.attr.href)))
90
+ const o = e.childNamed("ol")
91
+ if (o) {
92
+ const s = o.childrenNamed("li")
93
+ s && s.length > 0 && (r.contents = s.map((d) => P(d, { opfBasePath: i, baseUrl: a })))
94
+ }
95
+ return r
15
96
  },
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- error: (...e) => {
18
- console.error(...e);
97
+ K = (e, { opfBasePath: i, baseUrl: a }) => {
98
+ var n, o
99
+ const r = []
100
+ let t
101
+ return (
102
+ e.descendantWithPath("body.nav.ol")
103
+ ? (t = (n = e.descendantWithPath("body.nav.ol")) == null ? void 0 : n.children)
104
+ : e.descendantWithPath("body.section.nav.ol") &&
105
+ (t = (o = e.descendantWithPath("body.section.nav.ol")) == null ? void 0 : o.children),
106
+ t && t.length > 0 && t.filter((s) => s.name === "li").forEach((s) => r.push(P(s, { opfBasePath: i, baseUrl: a }))),
107
+ r
108
+ )
19
109
  },
20
- time: (e) => {
21
- b && console.time(`[prose-reader-streamer] [metric] ${e}`);
110
+ Q = async (e, i, { opfBasePath: a, baseUrl: r }) => {
111
+ var n
112
+ const t = (n = e.childNamed("manifest")) == null ? void 0 : n.childrenNamed("item").find((o) => o.attr.properties === "nav")
113
+ if (t) {
114
+ const o = Object.values(i.files).find((s) => s.uri.endsWith(t.attr.href || ""))
115
+ if (o) {
116
+ const s = new g.XmlDocument(await o.string())
117
+ return K(s, { opfBasePath: a, baseUrl: r })
118
+ }
119
+ }
22
120
  },
23
- timeEnd: (e) => {
24
- b && console.timeEnd(`[prose-reader-streamer] [metric] ${e}`);
121
+ z = (e, { opfBasePath: i, baseUrl: a, prefix: r }) => {
122
+ var s, d
123
+ const t = ((s = e == null ? void 0 : e.childNamed(`${r}content`)) == null ? void 0 : s.attr.src) || "",
124
+ n = {
125
+ title: ((d = e == null ? void 0 : e.descendantWithPath(`${r}navLabel.${r}text`)) == null ? void 0 : d.val) || "",
126
+ path: v(i, t),
127
+ href: v(a, i, t),
128
+ contents: [],
129
+ },
130
+ o = e.childrenNamed(`${r}navPoint`)
131
+ return o && o.length > 0 && (n.contents = o.map((p) => z(p, { opfBasePath: i, baseUrl: a, prefix: r }))), n
25
132
  },
26
- metric: (e, i = 1 / 0) => {
27
- const a = typeof e == "number" ? e : e.duration;
28
- b && (e.duration <= i ? console.log("[prose-reader-streamer] [metric] ", `${e.name} took ${a}ms`) : console.warn(
29
- "[prose-reader-streamer] [metric] ",
30
- `${e.name} took ${e.duration}ms which is above the ${i}ms target for this function`
31
- ));
133
+ Z = (e, { opfBasePath: i, baseUrl: a }) => {
134
+ var o
135
+ const r = [],
136
+ t = e.name
137
+ let n = ""
138
+ return (
139
+ t.indexOf(":") !== -1 && (n = t.split(":")[0] + ":"),
140
+ (o = e.childNamed(`${n}navMap`)) == null ||
141
+ o.childrenNamed(`${n}navPoint`).forEach((s) => r.push(z(s, { opfBasePath: i, baseUrl: a, prefix: n }))),
142
+ r
143
+ )
32
144
  },
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- measurePerformance: (e, i = 10, a) => (...r) => {
35
- const t = performance.now(), n = a(...r);
36
- if (n && n.then)
37
- return n.then((s) => {
38
- const d = performance.now();
39
- return h.metric({ name: e, duration: d - t }, i), s;
40
- });
41
- const o = performance.now();
42
- return h.metric({ name: e, duration: o - t }, i), n;
43
- }
44
- }, Y = ({ archive: e, resourcePath: i }) => async (a) => {
45
- const r = Object.values(e.files).find((t) => t.uri === i);
46
- if (r != null && r.basename.endsWith(".css")) {
47
- const n = (a.body ?? await r.string()).replaceAll("-webkit-writing-mode", "writing-mode");
48
- return {
49
- ...a,
50
- body: n
51
- };
52
- }
53
- return a;
54
- }, x = (e) => {
55
- const a = Object.values(e.files).filter((r) => !r.dir).find((r) => r.uri.endsWith(".opf"));
56
- return {
57
- data: a,
58
- basePath: (a == null ? void 0 : a.uri.substring(0, a.uri.lastIndexOf("/"))) || ""
59
- };
60
- }, P = (e, { opfBasePath: i, baseUrl: a }) => {
61
- const r = {
62
- contents: [],
63
- path: "",
64
- href: "",
65
- title: ""
66
- };
67
- let t = e.childNamed("span") || e.childNamed("a");
68
- r.title = (t == null ? void 0 : t.attr.title) || (t == null ? void 0 : t.val.trim()) || r.title;
69
- let n = t == null ? void 0 : t.name;
70
- n !== "a" && (t = e.descendantWithPath(`${n}.a`), t && (n = t.name.toLowerCase())), n === "a" && (t != null && t.attr.href) && (r.path = v(i, t.attr.href), r.href = v(a, i, t.attr.href));
71
- const o = e.childNamed("ol");
72
- if (o) {
73
- const s = o.childrenNamed("li");
74
- s && s.length > 0 && (r.contents = s.map((d) => P(d, { opfBasePath: i, baseUrl: a })));
75
- }
76
- return r;
77
- }, K = (e, { opfBasePath: i, baseUrl: a }) => {
78
- var n, o;
79
- const r = [];
80
- let t;
81
- return e.descendantWithPath("body.nav.ol") ? t = (n = e.descendantWithPath("body.nav.ol")) == null ? void 0 : n.children : e.descendantWithPath("body.section.nav.ol") && (t = (o = e.descendantWithPath("body.section.nav.ol")) == null ? void 0 : o.children), t && t.length > 0 && t.filter((s) => s.name === "li").forEach((s) => r.push(P(s, { opfBasePath: i, baseUrl: a }))), r;
82
- }, Q = async (e, i, { opfBasePath: a, baseUrl: r }) => {
83
- var n;
84
- const t = (n = e.childNamed("manifest")) == null ? void 0 : n.childrenNamed("item").find((o) => o.attr.properties === "nav");
85
- if (t) {
86
- const o = Object.values(i.files).find((s) => s.uri.endsWith(t.attr.href || ""));
87
- if (o) {
88
- const s = new g.XmlDocument(await o.string());
89
- return K(s, { opfBasePath: a, baseUrl: r });
90
- }
91
- }
92
- }, z = (e, { opfBasePath: i, baseUrl: a, prefix: r }) => {
93
- var s, d;
94
- const t = ((s = e == null ? void 0 : e.childNamed(`${r}content`)) == null ? void 0 : s.attr.src) || "", n = {
95
- title: ((d = e == null ? void 0 : e.descendantWithPath(`${r}navLabel.${r}text`)) == null ? void 0 : d.val) || "",
96
- path: v(i, t),
97
- href: v(a, i, t),
98
- contents: []
99
- }, o = e.childrenNamed(`${r}navPoint`);
100
- return o && o.length > 0 && (n.contents = o.map((p) => z(p, { opfBasePath: i, baseUrl: a, prefix: r }))), n;
101
- }, Z = (e, { opfBasePath: i, baseUrl: a }) => {
102
- var o;
103
- const r = [], t = e.name;
104
- let n = "";
105
- return t.indexOf(":") !== -1 && (n = t.split(":")[0] + ":"), (o = e.childNamed(`${n}navMap`)) == null || o.childrenNamed(`${n}navPoint`).forEach((s) => r.push(z(s, { opfBasePath: i, baseUrl: a, prefix: n }))), r;
106
- }, E = async ({
107
- opfData: e,
108
- opfBasePath: i,
109
- baseUrl: a,
110
- archive: r
111
- }) => {
112
- var o;
113
- const t = e.childNamed("spine"), n = t && t.attr.toc;
114
- if (n) {
115
- const s = (o = e.childNamed("manifest")) == null ? void 0 : o.childrenNamed("item").find((d) => d.attr.id === n);
116
- if (s) {
117
- const d = `${i}${i === "" ? "" : "/"}${s.attr.href}`, p = Object.values(r.files).find((m) => m.uri.endsWith(d));
118
- if (p) {
119
- const m = new g.XmlDocument(await p.string());
120
- return Z(m, { opfBasePath: i, baseUrl: a });
145
+ E = async ({ opfData: e, opfBasePath: i, baseUrl: a, archive: r }) => {
146
+ var o
147
+ const t = e.childNamed("spine"),
148
+ n = t && t.attr.toc
149
+ if (n) {
150
+ const s = (o = e.childNamed("manifest")) == null ? void 0 : o.childrenNamed("item").find((d) => d.attr.id === n)
151
+ if (s) {
152
+ const d = `${i}${i === "" ? "" : "/"}${s.attr.href}`,
153
+ p = Object.values(r.files).find((m) => m.uri.endsWith(d))
154
+ if (p) {
155
+ const m = new g.XmlDocument(await p.string())
156
+ return Z(m, { opfBasePath: i, baseUrl: a })
157
+ }
121
158
  }
122
159
  }
123
- }
124
- }, ee = async (e, i, { baseUrl: a }) => {
125
- const { basePath: r } = x(i) || {}, t = await E({
126
- opfData: e,
127
- opfBasePath: r,
128
- archive: i,
129
- baseUrl: a
130
- });
131
- return t || await Q(e, i, { opfBasePath: r, baseUrl: a });
132
- }, te = async (e) => {
133
- const i = {
134
- renditionLayout: void 0
135
- };
136
- return await Promise.all(
137
- e.files.map(async (a) => {
138
- var r, t;
139
- if (a.uri.endsWith("com.kobobooks.display-options.xml")) {
140
- const o = (r = new g.XmlDocument(await a.string()).childNamed("platform")) == null ? void 0 : r.childNamed("option");
141
- ((t = o == null ? void 0 : o.attr) == null ? void 0 : t.name) === "fixed-layout" && o.val === "true" && (i.renditionLayout = "pre-paginated");
160
+ },
161
+ ee = async (e, i, { baseUrl: a }) => {
162
+ const { basePath: r } = x(i) || {},
163
+ t = await E({
164
+ opfData: e,
165
+ opfBasePath: r,
166
+ archive: i,
167
+ baseUrl: a,
168
+ })
169
+ return t || (await Q(e, i, { opfBasePath: r, baseUrl: a }))
170
+ },
171
+ te = async (e) => {
172
+ const i = {
173
+ renditionLayout: void 0,
174
+ }
175
+ return (
176
+ await Promise.all(
177
+ e.files.map(async (a) => {
178
+ var r, t
179
+ if (a.uri.endsWith("com.kobobooks.display-options.xml")) {
180
+ const o = (r = new g.XmlDocument(await a.string()).childNamed("platform")) == null ? void 0 : r.childNamed("option")
181
+ ;((t = o == null ? void 0 : o.attr) == null ? void 0 : t.name) === "fixed-layout" &&
182
+ o.val === "true" &&
183
+ (i.renditionLayout = "pre-paginated")
184
+ }
185
+ })
186
+ ),
187
+ i
188
+ )
189
+ },
190
+ j = async ({ archive: e }) => {
191
+ const { data: i, basePath: a } = x(e) || {},
192
+ r = await (i == null ? void 0 : i.string())
193
+ if (!r) return []
194
+ const t = new g.XmlDocument(r),
195
+ n = t.childNamed("manifest"),
196
+ o = t.childNamed("spine"),
197
+ s = o == null ? void 0 : o.childrenNamed("itemref").map((m) => m.attr.idref),
198
+ d = (n == null ? void 0 : n.childrenNamed("item").filter((m) => s.includes(m.attr.id || ""))) || []
199
+ return e.files.filter((m) => d.find((f) => (a ? `${a}/${f.attr.href}` === m.uri : `${f.attr.href}` === m.uri)))
200
+ },
201
+ X = (e) => {
202
+ var a
203
+ const i = e.childNamed("manifest")
204
+ return (
205
+ ((a = i == null ? void 0 : i.childrenNamed("item")) == null
206
+ ? void 0
207
+ : a.map((r) => ({
208
+ href: r.attr.href || "",
209
+ id: r.attr.id || "",
210
+ mediaType: r.attr["media-type"],
211
+ }))) || []
212
+ )
213
+ },
214
+ ne =
215
+ ({ archive: e, baseUrl: i }) =>
216
+ async (a) => {
217
+ var L
218
+ const { data: r, basePath: t } = x(e) || {},
219
+ n = await te(e)
220
+ if (!r) return a
221
+ const o = await r.string()
222
+ h.log(o, n)
223
+ const s = new g.XmlDocument(o),
224
+ d = (await ee(s, e, { baseUrl: i })) || [],
225
+ p = s.childNamed("metadata"),
226
+ m = s.childNamed("manifest"),
227
+ f = s.childNamed("spine"),
228
+ F = s.childNamed("guide"),
229
+ w = p == null ? void 0 : p.childNamed("dc:title"),
230
+ $ = (p == null ? void 0 : p.childrenNamed("meta")) || [],
231
+ N = $.find((l) => l.attr.property === "rendition:layout"),
232
+ T = $.find((l) => l.attr.property === "rendition:flow"),
233
+ I = $.find((l) => l.attr.property === "rendition:spread"),
234
+ A = N == null ? void 0 : N.val,
235
+ M = T == null ? void 0 : T.val,
236
+ B = I == null ? void 0 : I.val,
237
+ _ = (w == null ? void 0 : w.val) || ((L = e.files.find(({ dir: l }) => l)) == null ? void 0 : L.basename) || "",
238
+ H = f == null ? void 0 : f.attr["page-progression-direction"],
239
+ U = (await j({ archive: e })).reduce((l, c) => c.size + l, 0)
240
+ return {
241
+ filename: e.filename,
242
+ nav: {
243
+ toc: d,
244
+ },
245
+ renditionLayout: A || n.renditionLayout || "reflowable",
246
+ renditionFlow: M || "auto",
247
+ renditionSpread: B,
248
+ title: _,
249
+ readingDirection: H || "ltr",
250
+ spineItems:
251
+ (f == null
252
+ ? void 0
253
+ : f.childrenNamed("itemref").map((l) => {
254
+ var C, R, O
255
+ const c =
256
+ m == null ? void 0 : m.childrenNamed("item").find((u) => u.attr.id === (l == null ? void 0 : l.attr.idref)),
257
+ V = (c == null ? void 0 : c.attr.href) || "",
258
+ D = ((C = l == null ? void 0 : l.attr.properties) == null ? void 0 : C.split(" ")) || [],
259
+ G = ((R = e.files.find((u) => u.uri.endsWith(V))) == null ? void 0 : R.size) || 0,
260
+ S = i ?? ""
261
+ return {
262
+ id: (c == null ? void 0 : c.attr.id) || "",
263
+ href:
264
+ (O = c == null ? void 0 : c.attr.href) != null && O.startsWith("https://")
265
+ ? c == null
266
+ ? void 0
267
+ : c.attr.href
268
+ : t
269
+ ? `${S}${t}/${c == null ? void 0 : c.attr.href}`
270
+ : `${S}${c == null ? void 0 : c.attr.href}`,
271
+ renditionLayout: A || "reflowable",
272
+ ...(D.find((u) => u === "rendition:layout-reflowable") && {
273
+ renditionLayout: "reflowable",
274
+ }),
275
+ progressionWeight: G / U,
276
+ pageSpreadLeft: D.some((u) => u === "page-spread-left") || void 0,
277
+ pageSpreadRight: D.some((u) => u === "page-spread-right") || void 0,
278
+ // size: itemSize
279
+ mediaType: c == null ? void 0 : c.attr["media-type"],
280
+ }
281
+ })) || [],
282
+ items: X(s),
283
+ guide:
284
+ F == null
285
+ ? void 0
286
+ : F.childrenNamed("reference").map((l) => ({
287
+ href: l.attr.href || "",
288
+ title: l.attr.title || "",
289
+ type: l.attr.type,
290
+ })),
142
291
  }
143
- })
144
- ), i;
145
- }, j = async ({ archive: e }) => {
146
- const { data: i, basePath: a } = x(e) || {}, r = await (i == null ? void 0 : i.string());
147
- if (!r)
148
- return [];
149
- const t = new g.XmlDocument(r), n = t.childNamed("manifest"), o = t.childNamed("spine"), s = o == null ? void 0 : o.childrenNamed("itemref").map((m) => m.attr.idref), d = (n == null ? void 0 : n.childrenNamed("item").filter((m) => s.includes(m.attr.id || ""))) || [];
150
- return e.files.filter((m) => d.find((f) => a ? `${a}/${f.attr.href}` === m.uri : `${f.attr.href}` === m.uri));
151
- }, X = (e) => {
152
- var a;
153
- const i = e.childNamed("manifest");
154
- return ((a = i == null ? void 0 : i.childrenNamed("item")) == null ? void 0 : a.map((r) => ({
155
- href: r.attr.href || "",
156
- id: r.attr.id || "",
157
- mediaType: r.attr["media-type"]
158
- }))) || [];
159
- }, ne = ({ archive: e, baseUrl: i }) => async (a) => {
160
- var L;
161
- const { data: r, basePath: t } = x(e) || {}, n = await te(e);
162
- if (!r)
163
- return a;
164
- const o = await r.string();
165
- h.log(o, n);
166
- const s = new g.XmlDocument(o), d = await ee(s, e, { baseUrl: i }) || [], p = s.childNamed("metadata"), m = s.childNamed("manifest"), f = s.childNamed("spine"), F = s.childNamed("guide"), w = p == null ? void 0 : p.childNamed("dc:title"), $ = (p == null ? void 0 : p.childrenNamed("meta")) || [], N = $.find((l) => l.attr.property === "rendition:layout"), T = $.find((l) => l.attr.property === "rendition:flow"), I = $.find((l) => l.attr.property === "rendition:spread"), A = N == null ? void 0 : N.val, M = T == null ? void 0 : T.val, B = I == null ? void 0 : I.val, _ = (w == null ? void 0 : w.val) || ((L = e.files.find(({ dir: l }) => l)) == null ? void 0 : L.basename) || "", H = f == null ? void 0 : f.attr["page-progression-direction"], U = (await j({ archive: e })).reduce((l, c) => c.size + l, 0);
167
- return {
168
- filename: e.filename,
169
- nav: {
170
- toc: d
171
292
  },
172
- renditionLayout: A || n.renditionLayout || "reflowable",
173
- renditionFlow: M || "auto",
174
- renditionSpread: B,
175
- title: _,
176
- readingDirection: H || "ltr",
177
- spineItems: (f == null ? void 0 : f.childrenNamed("itemref").map((l) => {
178
- var C, R, O;
179
- const c = m == null ? void 0 : m.childrenNamed("item").find((u) => u.attr.id === (l == null ? void 0 : l.attr.idref)), V = (c == null ? void 0 : c.attr.href) || "", D = ((C = l == null ? void 0 : l.attr.properties) == null ? void 0 : C.split(" ")) || [], G = ((R = e.files.find((u) => u.uri.endsWith(V))) == null ? void 0 : R.size) || 0, S = i ?? "";
293
+ re = async (e, i) => {
294
+ var t, n
295
+ const r = await ((t = x(e).data) == null ? void 0 : t.string())
296
+ if (r) {
297
+ const o = new g.XmlDocument(r)
180
298
  return {
181
- id: (c == null ? void 0 : c.attr.id) || "",
182
- href: (O = c == null ? void 0 : c.attr.href) != null && O.startsWith("https://") ? c == null ? void 0 : c.attr.href : t ? `${S}${t}/${c == null ? void 0 : c.attr.href}` : `${S}${c == null ? void 0 : c.attr.href}`,
183
- renditionLayout: A || "reflowable",
184
- ...D.find((u) => u === "rendition:layout-reflowable") && {
185
- renditionLayout: "reflowable"
186
- },
187
- progressionWeight: G / U,
188
- pageSpreadLeft: D.some((u) => u === "page-spread-left") || void 0,
189
- pageSpreadRight: D.some((u) => u === "page-spread-right") || void 0,
190
- // size: itemSize
191
- mediaType: c == null ? void 0 : c.attr["media-type"]
192
- };
193
- })) || [],
194
- items: X(s),
195
- guide: F == null ? void 0 : F.childrenNamed("reference").map((l) => ({
196
- href: l.attr.href || "",
197
- title: l.attr.title || "",
198
- type: l.attr.type
199
- }))
200
- };
201
- }, re = async (e, i) => {
202
- var t, n;
203
- const r = await ((t = x(e).data) == null ? void 0 : t.string());
204
- if (r) {
205
- const o = new g.XmlDocument(r);
299
+ mediaType: (n = X(o).find((d) => i.endsWith(d.href))) == null ? void 0 : n.mediaType,
300
+ }
301
+ }
206
302
  return {
207
- mediaType: (n = X(o).find((d) => i.endsWith(d.href))) == null ? void 0 : n.mediaType
208
- };
209
- }
210
- return {
211
- mediaType: ae(i)
212
- };
213
- }, ae = (e) => {
214
- if (e.endsWith(".css"))
215
- return "text/css; charset=UTF-8";
216
- if (e.endsWith(".jpg"))
217
- return "image/jpg";
218
- if (e.endsWith(".xhtml"))
219
- return "application/xhtml+xml";
220
- if (e.endsWith(".mp4"))
221
- return "video/mp4";
222
- if (e.endsWith(".svg"))
223
- return "image/svg+xml";
224
- }, ie = ({ archive: e, resourcePath: i }) => async (a) => {
225
- const r = Object.values(e.files).find((n) => n.uri === i);
226
- if (!r)
227
- return a;
228
- const t = await re(e, i);
229
- return {
230
- ...a,
231
- params: {
232
- ...a.params,
233
- status: 200,
234
- headers: {
235
- ...(r == null ? void 0 : r.encodingFormat) && {
236
- "Content-Type": r.encodingFormat
303
+ mediaType: ae(i),
304
+ }
305
+ },
306
+ ae = (e) => {
307
+ if (e.endsWith(".css")) return "text/css; charset=UTF-8"
308
+ if (e.endsWith(".jpg")) return "image/jpg"
309
+ if (e.endsWith(".xhtml")) return "application/xhtml+xml"
310
+ if (e.endsWith(".mp4")) return "video/mp4"
311
+ if (e.endsWith(".svg")) return "image/svg+xml"
312
+ },
313
+ ie =
314
+ ({ archive: e, resourcePath: i }) =>
315
+ async (a) => {
316
+ const r = Object.values(e.files).find((n) => n.uri === i)
317
+ if (!r) return a
318
+ const t = await re(e, i)
319
+ return {
320
+ ...a,
321
+ params: {
322
+ ...a.params,
323
+ status: 200,
324
+ headers: {
325
+ ...((r == null ? void 0 : r.encodingFormat) && {
326
+ "Content-Type": r.encodingFormat,
327
+ }),
328
+ ...(t.mediaType && {
329
+ "Content-Type": t.mediaType,
330
+ }),
331
+ },
237
332
  },
238
- ...t.mediaType && {
239
- "Content-Type": t.mediaType
240
- }
241
333
  }
334
+ },
335
+ ye = async (e, i) => {
336
+ const a = Object.values(e.files).find((n) => n.uri === i)
337
+ if (!a) throw new Error("no file found")
338
+ const r = {
339
+ params: {
340
+ status: 200,
341
+ },
342
+ },
343
+ t = [ie({ archive: e, resourcePath: i }), Y({ archive: e, resourcePath: i })]
344
+ try {
345
+ const n = await t.reduce(async (o, s) => await s(await o), Promise.resolve(r))
346
+ return (
347
+ h.log("Generated resource", i, n),
348
+ {
349
+ ...n,
350
+ body: n.body || (await a.blob()),
351
+ }
352
+ )
353
+ } catch (n) {
354
+ throw (h.error(n), n)
242
355
  }
243
- };
244
- }, ye = async (e, i) => {
245
- const a = Object.values(e.files).find((n) => n.uri === i);
246
- if (!a)
247
- throw new Error("no file found");
248
- const r = {
249
- params: {
250
- status: 200
251
- }
252
- }, t = [ie({ archive: e, resourcePath: i }), Y({ archive: e, resourcePath: i })];
253
- try {
254
- const n = await t.reduce(async (o, s) => await s(await o), Promise.resolve(r));
255
- return h.log("Generated resource", i, n), {
256
- ...n,
257
- body: n.body || await a.blob()
258
- };
259
- } catch (n) {
260
- throw h.error(n), n;
261
- }
262
- }, be = (e) => ({
263
- body: `
356
+ },
357
+ be = (e) => ({
358
+ body: `
264
359
  <!DOCTYPE html>
265
360
  <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
266
361
  <head>
@@ -271,131 +366,163 @@ const h = {
271
366
  </body>
272
367
  </html>
273
368
  `,
274
- params: {
275
- status: 500,
276
- headers: {
277
- "Content-Type": "text/html;charset=UTF-8"
278
- }
279
- }
280
- }), oe = ({ archive: e, baseUrl: i }) => async () => {
281
- var r;
282
- const a = Object.values(e.files).filter((t) => !t.dir);
283
- return {
284
- filename: e.filename,
285
- title: ((r = e.files.find(({ dir: t }) => t)) == null ? void 0 : r.basename.replace(/\/$/, "")) || "",
286
- renditionLayout: "pre-paginated",
287
- renditionSpread: "auto",
288
- readingDirection: "ltr",
289
- spineItems: a.map((t, n) => ({
290
- // some books such as cbz can have same basename inside different sub folder
291
- // we need to make sure to have unique index
292
- // /chap01/01.png, /chap02/01.png, etc
293
- id: `${n}.${t.basename}`,
294
- href: encodeURI(`${i}${t.uri}`),
295
- renditionLayout: "pre-paginated",
296
- progressionWeight: 1 / a.length,
297
- pageSpreadLeft: void 0,
298
- pageSpreadRight: void 0,
299
- mediaType: t.encodingFormat
300
- })),
301
- items: a.map((t, n) => ({
302
- id: `${n}.${t.basename}`,
303
- href: `${i}${t.uri}`
304
- }))
305
- };
306
- }, se = ({ archive: e, baseUrl: i }) => async (a) => {
307
- var s;
308
- const r = e.files.find((d) => d.basename.toLowerCase() === "comicinfo.xml");
309
- if (!r)
310
- return a;
311
- const t = await r.string(), o = ((s = new g.XmlDocument(t).childNamed("Manga")) == null ? void 0 : s.val) || "unknown";
312
- return {
313
- ...a,
314
- spineItems: a.spineItems.filter((d) => d.id.toLowerCase() !== "comicinfo.xml"),
315
- readingDirection: o === "YesAndRightToLeft" ? "rtl" : "ltr"
316
- };
317
- }, ce = (e) => {
318
- var a;
319
- const i = (a = e.descendantWithPath("head")) == null ? void 0 : a.childrenNamed("meta").find((r) => r.attr.name === "viewport");
320
- return !!(i && i.attr.name === "viewport");
321
- }, de = (e) => e.reduce(async (i, a) => {
322
- if (!await i || !q({
323
- mimeType: a.encodingFormat,
324
- uri: a.uri
325
- }))
326
- return !1;
327
- const t = await a.string();
328
- return t ? ce(new g.XmlDocument(t)) : !1;
329
- }, Promise.resolve(!0)), le = ({ archive: e, baseUrl: i }) => async (a) => {
330
- if (a.renditionLayout === "reflowable" && a.spineItems.every((t) => t.renditionLayout === "reflowable")) {
331
- const t = await j({ archive: e });
332
- if (await de(t))
369
+ params: {
370
+ status: 500,
371
+ headers: {
372
+ "Content-Type": "text/html;charset=UTF-8",
373
+ },
374
+ },
375
+ }),
376
+ oe =
377
+ ({ archive: e, baseUrl: i }) =>
378
+ async () => {
379
+ var r
380
+ const a = Object.values(e.files).filter((t) => !t.dir)
333
381
  return {
334
- ...a,
335
- spineItems: a.spineItems.map((o) => ({
336
- ...o,
337
- renditionLayout: "pre-paginated"
382
+ filename: e.filename,
383
+ title: ((r = e.files.find(({ dir: t }) => t)) == null ? void 0 : r.basename.replace(/\/$/, "")) || "",
384
+ renditionLayout: "pre-paginated",
385
+ renditionSpread: "auto",
386
+ readingDirection: "ltr",
387
+ spineItems: a.map((t, n) => ({
388
+ // some books such as cbz can have same basename inside different sub folder
389
+ // we need to make sure to have unique index
390
+ // /chap01/01.png, /chap02/01.png, etc
391
+ id: `${n}.${t.basename}`,
392
+ href: encodeURI(`${i}${t.uri}`),
393
+ renditionLayout: "pre-paginated",
394
+ progressionWeight: 1 / a.length,
395
+ pageSpreadLeft: void 0,
396
+ pageSpreadRight: void 0,
397
+ mediaType: t.encodingFormat,
338
398
  })),
339
- renditionLayout: "pre-paginated"
340
- };
341
- }
342
- return a;
343
- }, k = (e, i) => {
344
- var t;
345
- const a = e.split(/(\d+)/), r = i.split(/(\d+)/);
346
- for (let n = 0, o = a.length; n < o; n++)
347
- if (a[n] !== r[n])
348
- return (t = a[n]) != null && t.match(/\d/) ? +(a[n] || "") - +(r[n] || "") : (a[n] || "").localeCompare(r[n] || "");
349
- return 1;
350
- }, me = ({ archive: e, baseUrl: i }) => async (a) => {
351
- if (a.nav)
352
- return a;
353
- const r = [...e.files].sort((n, o) => k(n.uri, o.uri)), t = Object.values(r).reduce((n, o) => {
354
- const s = o.uri.split("/");
355
- return !o.dir && s.length > 1 && s.forEach((p, m) => {
356
- if (m === s.length - 1)
357
- return;
358
- n.find(({ title: w }) => w === p) || n.push({
359
- contents: [],
360
- href: v(i, encodeURI(o.uri)).replace(/\/$/, ""),
361
- path: o.uri.replace(/\/$/, ""),
362
- title: s[0] ?? ""
363
- });
364
- }), n;
365
- }, []);
366
- return t.length === 0 ? a : {
367
- ...a,
399
+ items: a.map((t, n) => ({
400
+ id: `${n}.${t.basename}`,
401
+ href: `${i}${t.uri}`,
402
+ })),
403
+ }
404
+ },
405
+ se =
406
+ ({ archive: e, baseUrl: i }) =>
407
+ async (a) => {
408
+ var s
409
+ const r = e.files.find((d) => d.basename.toLowerCase() === "comicinfo.xml")
410
+ if (!r) return a
411
+ const t = await r.string(),
412
+ o = ((s = new g.XmlDocument(t).childNamed("Manga")) == null ? void 0 : s.val) || "unknown"
413
+ return {
414
+ ...a,
415
+ spineItems: a.spineItems.filter((d) => d.id.toLowerCase() !== "comicinfo.xml"),
416
+ readingDirection: o === "YesAndRightToLeft" ? "rtl" : "ltr",
417
+ }
418
+ },
419
+ ce = (e) => {
420
+ var a
421
+ const i =
422
+ (a = e.descendantWithPath("head")) == null ? void 0 : a.childrenNamed("meta").find((r) => r.attr.name === "viewport")
423
+ return !!(i && i.attr.name === "viewport")
424
+ },
425
+ de = (e) =>
426
+ e.reduce(async (i, a) => {
427
+ if (
428
+ !(await i) ||
429
+ !q({
430
+ mimeType: a.encodingFormat,
431
+ uri: a.uri,
432
+ })
433
+ )
434
+ return !1
435
+ const t = await a.string()
436
+ return t ? ce(new g.XmlDocument(t)) : !1
437
+ }, Promise.resolve(!0)),
438
+ le =
439
+ ({ archive: e, baseUrl: i }) =>
440
+ async (a) => {
441
+ if (a.renditionLayout === "reflowable" && a.spineItems.every((t) => t.renditionLayout === "reflowable")) {
442
+ const t = await j({ archive: e })
443
+ if (await de(t))
444
+ return {
445
+ ...a,
446
+ spineItems: a.spineItems.map((o) => ({
447
+ ...o,
448
+ renditionLayout: "pre-paginated",
449
+ })),
450
+ renditionLayout: "pre-paginated",
451
+ }
452
+ }
453
+ return a
454
+ },
455
+ k = (e, i) => {
456
+ var t
457
+ const a = e.split(/(\d+)/),
458
+ r = i.split(/(\d+)/)
459
+ for (let n = 0, o = a.length; n < o; n++)
460
+ if (a[n] !== r[n])
461
+ return (t = a[n]) != null && t.match(/\d/) ? +(a[n] || "") - +(r[n] || "") : (a[n] || "").localeCompare(r[n] || "")
462
+ return 1
463
+ },
464
+ me =
465
+ ({ archive: e, baseUrl: i }) =>
466
+ async (a) => {
467
+ if (a.nav) return a
468
+ const r = [...e.files].sort((n, o) => k(n.uri, o.uri)),
469
+ t = Object.values(r).reduce((n, o) => {
470
+ const s = o.uri.split("/")
471
+ return (
472
+ !o.dir &&
473
+ s.length > 1 &&
474
+ s.forEach((p, m) => {
475
+ if (m === s.length - 1) return
476
+ n.find(({ title: w }) => w === p) ||
477
+ n.push({
478
+ contents: [],
479
+ href: v(i, encodeURI(o.uri)).replace(/\/$/, ""),
480
+ path: o.uri.replace(/\/$/, ""),
481
+ title: s[0] ?? "",
482
+ })
483
+ }),
484
+ n
485
+ )
486
+ }, [])
487
+ return t.length === 0
488
+ ? a
489
+ : {
490
+ ...a,
491
+ nav: {
492
+ toc: t,
493
+ },
494
+ }
495
+ },
496
+ pe = {
497
+ filename: "",
498
+ items: [],
368
499
  nav: {
369
- toc: t
500
+ toc: [],
501
+ },
502
+ readingDirection: "ltr",
503
+ renditionLayout: "pre-paginated",
504
+ renditionSpread: "auto",
505
+ spineItems: [],
506
+ title: "",
507
+ },
508
+ we = async (e, { baseUrl: i = "" } = {}) => {
509
+ const a = [
510
+ oe({ archive: e, baseUrl: i }),
511
+ ne({ archive: e, baseUrl: i }),
512
+ le({ archive: e, baseUrl: i }),
513
+ se({ archive: e, baseUrl: i }),
514
+ me({ archive: e, baseUrl: i }),
515
+ ]
516
+ try {
517
+ const r = await a.reduce(async (t, n) => await n(await t), Promise.resolve(pe))
518
+ return h.log("Generated manifest", r), r
519
+ } catch (r) {
520
+ throw (h.error(r), r)
370
521
  }
371
- };
372
- }, pe = {
373
- filename: "",
374
- items: [],
375
- nav: {
376
- toc: []
377
522
  },
378
- readingDirection: "ltr",
379
- renditionLayout: "pre-paginated",
380
- renditionSpread: "auto",
381
- spineItems: [],
382
- title: ""
383
- }, we = async (e, { baseUrl: i = "" } = {}) => {
384
- const a = [
385
- oe({ archive: e, baseUrl: i }),
386
- ne({ archive: e, baseUrl: i }),
387
- le({ archive: e, baseUrl: i }),
388
- se({ archive: e, baseUrl: i }),
389
- me({ archive: e, baseUrl: i })
390
- ];
391
- try {
392
- const r = await a.reduce(async (t, n) => await n(await t), Promise.resolve(pe));
393
- return h.log("Generated manifest", r), r;
394
- } catch (r) {
395
- throw h.error(r), r;
396
- }
397
- }, y = (e) => e.substring(e.lastIndexOf("/") + 1) || e, ve = async (e, i) => {
398
- const a = `
523
+ y = (e) => e.substring(e.lastIndexOf("/") + 1) || e,
524
+ ve = async (e, i) => {
525
+ const a = `
399
526
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
400
527
  <metadata>
401
528
  <meta property="rendition:layout">${i != null && i.useRenditionFlow ? "reflowable" : "pre-paginated"}</meta>
@@ -410,39 +537,44 @@ const h = {
410
537
  `)}
411
538
  </spine>
412
539
  </package>
413
- `, r = e.map((n) => ({
414
- dir: !1,
415
- basename: y(n),
416
- encodingFormat: W(n),
417
- uri: n,
418
- size: 100 / e.length,
419
- base64: async () => "",
420
- blob: async () => new Blob(),
421
- string: async () => ""
422
- }));
423
- return {
424
- filename: "",
425
- files: [{
426
- dir: !1,
427
- basename: "content.opf",
428
- uri: "content.opf",
429
- size: 0,
430
- base64: async () => a,
431
- blob: async () => new Blob(),
432
- string: async () => a
433
- }, ...r]
434
- };
435
- }, fe = async (e) => new Promise((i) => {
436
- const a = new FileReader();
437
- a.readAsDataURL(e), a.onloadend = function() {
438
- const r = a.result;
439
- i(r);
440
- };
441
- }), Fe = async (e, {
442
- mimeType: i,
443
- direction: a
444
- } = { mimeType: "text/plain" }) => {
445
- const r = `
540
+ `,
541
+ r = e.map((n) => ({
542
+ dir: !1,
543
+ basename: y(n),
544
+ encodingFormat: W(n),
545
+ uri: n,
546
+ size: 100 / e.length,
547
+ base64: async () => "",
548
+ blob: async () => new Blob(),
549
+ string: async () => "",
550
+ }))
551
+ return {
552
+ filename: "",
553
+ files: [
554
+ {
555
+ dir: !1,
556
+ basename: "content.opf",
557
+ uri: "content.opf",
558
+ size: 0,
559
+ base64: async () => a,
560
+ blob: async () => new Blob(),
561
+ string: async () => a,
562
+ },
563
+ ...r,
564
+ ],
565
+ }
566
+ },
567
+ fe = async (e) =>
568
+ new Promise((i) => {
569
+ const a = new FileReader()
570
+ a.readAsDataURL(e),
571
+ (a.onloadend = function () {
572
+ const r = a.result
573
+ i(r)
574
+ })
575
+ }),
576
+ Fe = async (e, { mimeType: i, direction: a } = { mimeType: "text/plain" }) => {
577
+ const r = `
446
578
  <?xml version="1.0" encoding="UTF-8"?>
447
579
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
448
580
  unique-identifier="ootuya-id">
@@ -457,73 +589,79 @@ const h = {
457
589
  <itemref idref="p01" />
458
590
  </spine>
459
591
  </package>
460
- `;
461
- return {
462
- filename: "content.txt",
463
- files: [
464
- {
465
- dir: !1,
466
- basename: y("generated.opf"),
467
- uri: "generated.opf",
468
- blob: async () => new Blob([r]),
469
- string: async () => r,
470
- base64: async () => btoa(r),
471
- size: 0
472
- },
592
+ `
593
+ return {
594
+ filename: "content.txt",
595
+ files: [
596
+ {
597
+ dir: !1,
598
+ basename: y("generated.opf"),
599
+ uri: "generated.opf",
600
+ blob: async () => new Blob([r]),
601
+ string: async () => r,
602
+ base64: async () => btoa(r),
603
+ size: 0,
604
+ },
605
+ {
606
+ dir: !1,
607
+ basename: y("p01.txt"),
608
+ uri: "p01.txt",
609
+ blob: async () => (typeof e == "string" ? new Blob([e]) : e),
610
+ string: async () => (typeof e == "string" ? e : e.text()),
611
+ base64: async () => (typeof e == "string" ? btoa(e) : fe(e)),
612
+ size: typeof e == "string" ? e.length : e.size,
613
+ encodingFormat: i,
614
+ },
615
+ ],
616
+ }
617
+ },
618
+ xe = async (e, { orderByAlpha: i, name: a } = {}) => {
619
+ let r = Object.values(e.files)
620
+ i && (r = r.sort((n, o) => k(n.name, o.name)))
621
+ const t = {
622
+ filename: a || "",
623
+ files: r.map((n) => ({
624
+ dir: n.dir,
625
+ basename: y(n.name),
626
+ uri: n.name,
627
+ blob: () => n.async("blob"),
628
+ string: () => n.async("string"),
629
+ base64: () => n.async("base64"),
630
+ ...(n.internalStream && {
631
+ stream: n.internalStream,
632
+ }),
633
+ // this is private API
634
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
635
+ // @ts-ignore
636
+ size: n._data.uncompressedSize,
637
+ })),
638
+ }
639
+ return h.log("Generated archive", t), t
640
+ },
641
+ $e = async (e, { orderByAlpha: i, name: a } = {}) => {
642
+ let r = e
643
+ return (
644
+ i && (r = r.sort((t, n) => k(t.name, n.name))),
473
645
  {
474
- dir: !1,
475
- basename: y("p01.txt"),
476
- uri: "p01.txt",
477
- blob: async () => typeof e == "string" ? new Blob([e]) : e,
478
- string: async () => typeof e == "string" ? e : e.text(),
479
- base64: async () => typeof e == "string" ? btoa(e) : fe(e),
480
- size: typeof e == "string" ? e.length : e.size,
481
- encodingFormat: i
646
+ filename: a || "",
647
+ files: r.map((t) => ({
648
+ dir: t.isDir,
649
+ basename: y(t.name),
650
+ uri: t.name,
651
+ blob: async () => new Blob([await t.data()]),
652
+ string: async () => {
653
+ const n = await t.data()
654
+ return String.fromCharCode.apply(null, Array.from(new Uint16Array(n)))
655
+ },
656
+ base64: async () => "",
657
+ size: t.size,
658
+ })),
482
659
  }
483
- ]
484
- };
485
- }, xe = async (e, { orderByAlpha: i, name: a } = {}) => {
486
- let r = Object.values(e.files);
487
- i && (r = r.sort((n, o) => k(n.name, o.name)));
488
- const t = {
489
- filename: a || "",
490
- files: r.map((n) => ({
491
- dir: n.dir,
492
- basename: y(n.name),
493
- uri: n.name,
494
- blob: () => n.async("blob"),
495
- string: () => n.async("string"),
496
- base64: () => n.async("base64"),
497
- ...n.internalStream && {
498
- stream: n.internalStream
499
- },
500
- // this is private API
501
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
502
- // @ts-ignore
503
- size: n._data.uncompressedSize
504
- }))
505
- };
506
- return h.log("Generated archive", t), t;
507
- }, $e = async (e, { orderByAlpha: i, name: a } = {}) => {
508
- let r = e;
509
- return i && (r = r.sort((t, n) => k(t.name, n.name))), {
510
- filename: a || "",
511
- files: r.map((t) => ({
512
- dir: t.isDir,
513
- basename: y(t.name),
514
- uri: t.name,
515
- blob: async () => new Blob([await t.data()]),
516
- string: async () => {
517
- const n = await t.data();
518
- return String.fromCharCode.apply(null, Array.from(new Uint16Array(n)));
519
- },
520
- base64: async () => "",
521
- size: t.size
522
- }))
523
- };
524
- }, Ne = ({ enableReport: e } = {}) => {
525
- h.enable(!!e);
526
- };
660
+ )
661
+ },
662
+ Ne = ({ enableReport: e } = {}) => {
663
+ h.enable(!!e)
664
+ }
527
665
  export {
528
666
  Ne as configure,
529
667
  $e as createArchiveFromArrayBufferList,
@@ -533,6 +671,6 @@ export {
533
671
  we as generateManifestFromArchive,
534
672
  ye as generateResourceFromArchive,
535
673
  be as generateResourceFromError,
536
- x as getArchiveOpfInfo
537
- };
674
+ x as getArchiveOpfInfo,
675
+ }
538
676
  //# sourceMappingURL=prose-streamer.js.map