react-book-reader 1.0.0 → 1.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.
@@ -0,0 +1,774 @@
1
+ const K = (n, t) => n.map((e, s, i) => t(e, s, i) ? s : null).filter((e) => e != null), B = (n, t) => [-1, ...t, n.length].reduce(({ xs: e, a: s }, i) => ({ xs: e?.concat([n.slice(s + 1, i)]) ?? [], a: i }), {}).xs, G = (n, t) => n.slice(0, -1).concat([n[n.length - 1].concat(t[0])]).concat(t.slice(1)), C = /\d/, x = /^epubcfi\((.*)\)$/, N = (n) => n.replace(/[\^[\](),;=]/g, "^$&"), $ = (n) => x.test(n) ? n : `epubcfi(${n})`, q = (n) => n.match(x)?.[1] ?? n, X = (n) => (...t) => `epubcfi(${n(...t.map((e) => e.match(x)?.[1] ?? e))})`, Q = X((...n) => n.join("!")), Y = (n) => {
2
+ const t = [];
3
+ let e, s, i = "";
4
+ const o = (a) => (t.push(a), e = null, i = ""), r = (a) => (i += a, s = !1);
5
+ for (const a of Array.from(n.trim()).concat("")) {
6
+ if (a === "^" && !s) {
7
+ s = !0;
8
+ continue;
9
+ }
10
+ if (e === "!") o(["!"]);
11
+ else if (e === ",") o([","]);
12
+ else if (e === "/" || e === ":")
13
+ if (C.test(a)) {
14
+ r(a);
15
+ continue;
16
+ } else o([e, parseInt(i)]);
17
+ else if (e === "~")
18
+ if (C.test(a) || a === ".") {
19
+ r(a);
20
+ continue;
21
+ } else o(["~", parseFloat(i)]);
22
+ else if (e === "@") {
23
+ if (a === ":") {
24
+ o(["@", parseFloat(i)]), e = "@";
25
+ continue;
26
+ }
27
+ if (C.test(a) || a === ".") {
28
+ r(a);
29
+ continue;
30
+ } else o(["@", parseFloat(i)]);
31
+ } else if (e === "[") {
32
+ a === ";" && !s ? (o(["[", i]), e = ";") : a === "," && !s ? (o(["[", i]), e = "[") : a === "]" && !s ? o(["[", i]) : r(a);
33
+ continue;
34
+ } else if (e?.startsWith(";")) {
35
+ a === "=" && !s ? (e = `;${i}`, i = "") : a === ";" && !s ? (o([e, i]), e = ";") : a === "]" && !s ? o([e, i]) : r(a);
36
+ continue;
37
+ }
38
+ (a === "/" || a === ":" || a === "~" || a === "@" || a === "[" || a === "!" || a === ",") && (e = a);
39
+ }
40
+ return t;
41
+ }, M = (n, t) => K(n, ([e]) => e === t), tt = (n) => {
42
+ const t = [];
43
+ let e;
44
+ for (const [s, i] of n) {
45
+ if (s === "/") t.push({ index: i });
46
+ else {
47
+ const o = t[t.length - 1];
48
+ if (s === ":") o.offset = i;
49
+ else if (s === "~") o.temporal = i;
50
+ else if (s === "@") o.spatial = (o.spatial ?? []).concat(i);
51
+ else if (s === ";s") o.side = i;
52
+ else if (s === "[")
53
+ if (e === "/" && i) o.id = i;
54
+ else {
55
+ o.text = (o.text ?? []).concat(i);
56
+ continue;
57
+ }
58
+ }
59
+ e = s;
60
+ }
61
+ return t;
62
+ }, k = (n) => B(n, M(n, "!")).map(tt), b = (n) => {
63
+ const t = Y(q(n)), e = M(t, ",");
64
+ if (!e.length) return k(t);
65
+ const [s, i, o] = B(t, e).map(k);
66
+ return { parent: s, start: i, end: o };
67
+ }, et = ({ index: n, id: t, offset: e, temporal: s, spatial: i, text: o, side: r }) => {
68
+ const a = r ? `;s=${r}` : "";
69
+ return `/${n}` + (t ? `[${N(t)}${a}]` : "") + (e != null && n % 2 ? `:${e}` : "") + (s ? `~${s}` : "") + (i ? `@${i.join(":")}` : "") + (o || !t && r ? "[" + (o?.map(N)?.join(",") ?? "") + a + "]" : "");
70
+ }, W = (n) => n.parent ? [n.parent, n.start, n.end].map(W).join(",") : n.map((t) => t.map(et).join("")).join("!"), E = (n) => $(W(n)), m = (n, t) => typeof n == "string" ? E(m(b(n), t)) : n.parent ? G(n.parent, n[t ? "end" : "start"]) : n, st = (n, t) => {
71
+ typeof n == "string" && (n = b(n)), typeof t == "string" && (t = b(t)), n = m(n), t = m(t, !0);
72
+ const e = n[n.length - 1], s = t[t.length - 1], i = [], o = [], r = [];
73
+ let a = !0;
74
+ const h = Math.max(e.length, s.length);
75
+ for (let l = 0; l < h; l++) {
76
+ const d = e[l], f = s[l];
77
+ a &&= d?.index === f?.index && !d?.offset && !f?.offset, a ? i.push(d) : (d && o.push(d), f && r.push(f));
78
+ }
79
+ const c = n.slice(0, -1).concat([i]);
80
+ return E({ parent: c, start: [o], end: [r] });
81
+ }, F = ({ nodeType: n }) => n === 3 || n === 4, v = ({ nodeType: n }) => n === 1, D = (n, t) => {
82
+ const e = Array.from(n.childNodes).filter((s) => F(s) || v(s));
83
+ return t ? e.map((s) => {
84
+ const i = t(s);
85
+ return i === NodeFilter.FILTER_REJECT ? null : i === NodeFilter.FILTER_SKIP ? D(s, t) : s;
86
+ }).flat().filter((s) => s) : e;
87
+ }, I = (n, t) => {
88
+ const e = D(n, t).reduce((s, i) => {
89
+ let o = s[s.length - 1];
90
+ return o ? F(i) ? Array.isArray(o) ? o.push(i) : F(o) ? s[s.length - 1] = [o, i] : s.push(i) : v(o) ? s.push(null, i) : s.push(i) : s.push(i), s;
91
+ }, []);
92
+ return v(e[0]) && e.unshift("first"), v(e[e.length - 1]) && e.push("last"), e.unshift("before"), e.push("after"), e;
93
+ }, S = (n, t, e) => {
94
+ const { id: s } = t[t.length - 1];
95
+ if (s) {
96
+ const r = n.ownerDocument.getElementById(s);
97
+ if (r) return { node: r, offset: 0 };
98
+ }
99
+ for (const { index: r } of t) {
100
+ const a = n ? I(n, e)[r] : null;
101
+ if (a === "first") return { node: n.firstChild ?? n };
102
+ if (a === "last") return { node: n.lastChild ?? n };
103
+ if (a === "before") return { node: n, before: !0 };
104
+ if (a === "after") return { node: n, after: !0 };
105
+ n = a;
106
+ }
107
+ const { offset: i } = t[t.length - 1];
108
+ if (!Array.isArray(n)) return { node: n, offset: i };
109
+ let o = 0;
110
+ for (const r of n) {
111
+ const { length: a } = r.nodeValue;
112
+ if (o + a >= i) return { node: r, offset: i - o };
113
+ o += a;
114
+ }
115
+ }, A = (n, t, e) => {
116
+ const { parentNode: s, id: i } = n, o = I(s, e), r = o.findIndex((c) => Array.isArray(c) ? c.some((l) => l === n) : c === n), a = o[r];
117
+ if (Array.isArray(a)) {
118
+ let c = 0;
119
+ for (const l of a)
120
+ if (l === n) {
121
+ c += t;
122
+ break;
123
+ } else c += l.nodeValue.length;
124
+ t = c;
125
+ }
126
+ const h = { id: i, index: r, offset: t };
127
+ return (s !== n.ownerDocument.documentElement ? A(s, null, e).concat(h) : [h]).filter((c) => c.index !== -1);
128
+ }, nt = (n, t) => {
129
+ const { startContainer: e, startOffset: s, endContainer: i, endOffset: o } = n, r = A(e, s, t);
130
+ if (n.collapsed) return E([r]);
131
+ const a = A(i, o, t);
132
+ return st([r], [a]);
133
+ }, it = (n, t, e) => {
134
+ const s = m(t), i = m(t, !0), o = n.documentElement, r = S(o, s[0], e), a = S(o, i[0], e), h = n.createRange();
135
+ return r.before ? h.setStartBefore(r.node) : r.after ? h.setStartAfter(r.node) : h.setStart(r.node, r.offset), a.before ? h.setEndBefore(a.node) : a.after ? h.setEndAfter(a.node) : h.setEnd(a.node, a.offset), h;
136
+ }, At = (n) => {
137
+ const t = [], { parentNode: e } = n[0], s = A(e);
138
+ for (const [i, o] of I(e).entries()) {
139
+ const r = n[t.length];
140
+ o === r && t.push(E([s.concat({ id: r.id, index: i })]));
141
+ }
142
+ return t;
143
+ }, xt = (n, t) => S(n.documentElement, m(t)).node, z = {
144
+ fromIndex: (n) => $(`/6/${(n + 1) * 2}`),
145
+ toIndex: (n) => n?.at(-1).index / 2 - 1
146
+ }, ot = (n) => {
147
+ let t = 0;
148
+ const e = (s) => {
149
+ if (s.id = t++, s.subitems) for (const i of s.subitems) e(i);
150
+ };
151
+ for (const s of n) e(s);
152
+ return n;
153
+ }, j = (n) => n.map((t) => t.subitems?.length ? [t, j(t.subitems)].flat() : t).flat();
154
+ class L {
155
+ async init({ toc: t, ids: e, splitHref: s, getFragment: i }) {
156
+ ot(t);
157
+ const o = j(t), r = /* @__PURE__ */ new Map();
158
+ for (const [h, c] of o.entries()) {
159
+ const [l, d] = await s(c?.href) ?? [], f = { fragment: d, item: c };
160
+ r.has(l) ? r.get(l).items.push(f) : r.set(l, { prev: o[h - 1], items: [f] });
161
+ }
162
+ const a = /* @__PURE__ */ new Map();
163
+ for (const [h, c] of e.entries())
164
+ r.has(c) ? a.set(c, r.get(c)) : a.set(c, a.get(e[h - 1]));
165
+ this.ids = e, this.map = a, this.getFragment = i;
166
+ }
167
+ getProgress(t, e) {
168
+ if (!this.ids) return;
169
+ const s = this.ids[t], i = this.map.get(s);
170
+ if (!i) return null;
171
+ const { prev: o, items: r } = i;
172
+ if (!r) return o;
173
+ if (!e || r.length === 1 && !r[0].fragment) return r[0].item;
174
+ const a = e.startContainer.getRootNode();
175
+ for (const [h, { fragment: c }] of r.entries()) {
176
+ const l = this.getFragment(a, c);
177
+ if (l && e.comparePoint(l, 0) > 0)
178
+ return r[h - 1]?.item ?? o;
179
+ }
180
+ return r[r.length - 1].item;
181
+ }
182
+ }
183
+ class rt {
184
+ constructor(t, e, s) {
185
+ this.sizes = t.map((i) => i.linear != "no" && i.size > 0 ? i.size : 0), this.sizePerLoc = e, this.sizePerTimeUnit = s, this.sizeTotal = this.sizes.reduce((i, o) => i + o, 0), this.sectionFractions = this.#e();
186
+ }
187
+ #e() {
188
+ const { sizeTotal: t } = this, e = [0];
189
+ let s = 0;
190
+ for (const i of this.sizes) e.push((s += i) / t);
191
+ return e;
192
+ }
193
+ // get progress given index of and fractions within a section
194
+ getProgress(t, e, s = 0) {
195
+ const { sizes: i, sizePerLoc: o, sizePerTimeUnit: r, sizeTotal: a } = this, h = i[t] ?? 0, l = i.slice(0, t).reduce((p, w) => p + w, 0) + e * h, d = l + s * h, f = a - l, u = (1 - e) * h;
196
+ return {
197
+ fraction: d / a,
198
+ section: {
199
+ current: t,
200
+ total: i.length
201
+ },
202
+ location: {
203
+ current: Math.floor(l / o),
204
+ next: Math.floor(d / o),
205
+ total: Math.ceil(a / o)
206
+ },
207
+ time: {
208
+ section: u / r,
209
+ total: f / r
210
+ }
211
+ };
212
+ }
213
+ // the inverse of `getProgress`
214
+ // get index of and fraction in section based on total fraction
215
+ getSection(t) {
216
+ if (t <= 0) return [0, 0];
217
+ if (t >= 1) return [this.sizes.length - 1, 1];
218
+ t = t + Number.EPSILON;
219
+ const { sizeTotal: e } = this;
220
+ let s = this.sectionFractions.findIndex((o) => o > t) - 1;
221
+ if (s < 0) return [0, 0];
222
+ for (; !this.sizes[s]; ) s++;
223
+ const i = (t - this.sectionFractions[s]) / (this.sizes[s] / e);
224
+ return [s, i];
225
+ }
226
+ }
227
+ const g = (n) => document.createElementNS("http://www.w3.org/2000/svg", n);
228
+ class R {
229
+ #e = g("svg");
230
+ #t = /* @__PURE__ */ new Map();
231
+ constructor() {
232
+ Object.assign(this.#e.style, {
233
+ position: "absolute",
234
+ top: "0",
235
+ left: "0",
236
+ width: "100%",
237
+ height: "100%",
238
+ pointerEvents: "none"
239
+ });
240
+ }
241
+ get element() {
242
+ return this.#e;
243
+ }
244
+ add(t, e, s, i) {
245
+ this.#t.has(t) && this.remove(t), typeof e == "function" && (e = e(this.#e.getRootNode()));
246
+ const o = e.getClientRects(), r = s(o, i);
247
+ this.#e.append(r), this.#t.set(t, { range: e, draw: s, options: i, element: r, rects: o });
248
+ }
249
+ remove(t) {
250
+ this.#t.has(t) && (this.#e.removeChild(this.#t.get(t).element), this.#t.delete(t));
251
+ }
252
+ redraw() {
253
+ for (const t of this.#t.values()) {
254
+ const { range: e, draw: s, options: i, element: o } = t;
255
+ this.#e.removeChild(o);
256
+ const r = e.getClientRects(), a = s(r, i);
257
+ this.#e.append(a), t.element = a, t.rects = r;
258
+ }
259
+ }
260
+ hitTest({ x: t, y: e }) {
261
+ const s = Array.from(this.#t.entries());
262
+ for (let i = s.length - 1; i >= 0; i--) {
263
+ const [o, r] = s[i];
264
+ for (const { left: a, top: h, right: c, bottom: l } of r.rects)
265
+ if (h <= e && a <= t && l > e && c > t)
266
+ return [o, r.range];
267
+ }
268
+ return [];
269
+ }
270
+ static underline(t, e = {}) {
271
+ const { color: s = "red", width: i = 2, writingMode: o } = e, r = g("g");
272
+ if (r.setAttribute("fill", s), o === "vertical-rl" || o === "vertical-lr")
273
+ for (const { right: a, top: h, height: c } of t) {
274
+ const l = g("rect");
275
+ l.setAttribute("x", a - i), l.setAttribute("y", h), l.setAttribute("height", c), l.setAttribute("width", i), r.append(l);
276
+ }
277
+ else for (const { left: a, bottom: h, width: c } of t) {
278
+ const l = g("rect");
279
+ l.setAttribute("x", a), l.setAttribute("y", h - i), l.setAttribute("height", i), l.setAttribute("width", c), r.append(l);
280
+ }
281
+ return r;
282
+ }
283
+ static strikethrough(t, e = {}) {
284
+ const { color: s = "red", width: i = 2, writingMode: o } = e, r = g("g");
285
+ if (r.setAttribute("fill", s), o === "vertical-rl" || o === "vertical-lr")
286
+ for (const { right: a, left: h, top: c, height: l } of t) {
287
+ const d = g("rect");
288
+ d.setAttribute("x", (a + h) / 2), d.setAttribute("y", c), d.setAttribute("height", l), d.setAttribute("width", i), r.append(d);
289
+ }
290
+ else for (const { left: a, top: h, bottom: c, width: l } of t) {
291
+ const d = g("rect");
292
+ d.setAttribute("x", a), d.setAttribute("y", (h + c) / 2), d.setAttribute("height", i), d.setAttribute("width", l), r.append(d);
293
+ }
294
+ return r;
295
+ }
296
+ static squiggly(t, e = {}) {
297
+ const { color: s = "red", width: i = 2, writingMode: o } = e, r = g("g");
298
+ r.setAttribute("fill", "none"), r.setAttribute("stroke", s), r.setAttribute("stroke-width", i);
299
+ const a = i * 1.5;
300
+ if (o === "vertical-rl" || o === "vertical-lr")
301
+ for (const { right: h, top: c, height: l } of t) {
302
+ const d = g("path"), f = Math.round(l / a / 1.5), u = l / f, p = Array.from(
303
+ { length: f },
304
+ (w, T) => `l${T % 2 ? -a : a} ${u}`
305
+ ).join("");
306
+ d.setAttribute("d", `M${h} ${c}${p}`), r.append(d);
307
+ }
308
+ else for (const { left: h, bottom: c, width: l } of t) {
309
+ const d = g("path"), f = Math.round(l / a / 1.5), u = l / f, p = Array.from(
310
+ { length: f },
311
+ (w, T) => `l${u} ${T % 2 ? a : -a}`
312
+ ).join("");
313
+ d.setAttribute("d", `M${h} ${c}${p}`), r.append(d);
314
+ }
315
+ return r;
316
+ }
317
+ static highlight(t, e = {}) {
318
+ const { color: s = "red" } = e, i = g("g");
319
+ i.setAttribute("fill", s), i.style.opacity = "var(--overlayer-highlight-opacity, .3)", i.style.mixBlendMode = "var(--overlayer-highlight-blend-mode, normal)";
320
+ for (const { left: o, top: r, height: a, width: h } of t) {
321
+ const c = g("rect");
322
+ c.setAttribute("x", o), c.setAttribute("y", r), c.setAttribute("height", a), c.setAttribute("width", h), i.append(c);
323
+ }
324
+ return i;
325
+ }
326
+ static outline(t, e = {}) {
327
+ const { color: s = "red", width: i = 3, radius: o = 3 } = e, r = g("g");
328
+ r.setAttribute("fill", "none"), r.setAttribute("stroke", s), r.setAttribute("stroke-width", i);
329
+ for (const { left: a, top: h, height: c, width: l } of t) {
330
+ const d = g("rect");
331
+ d.setAttribute("x", a), d.setAttribute("y", h), d.setAttribute("height", c), d.setAttribute("width", l), d.setAttribute("rx", o), r.append(d);
332
+ }
333
+ return r;
334
+ }
335
+ // make an exact copy of an image in the overlay
336
+ // one can then apply filters to the entire element, without affecting them;
337
+ // it's a bit silly and probably better to just invert images twice
338
+ // (though the color will be off in that case if you do heu-rotate)
339
+ static copyImage([t], e = {}) {
340
+ const { src: s } = e, i = g("image"), { left: o, top: r, height: a, width: h } = t;
341
+ return i.setAttribute("href", s), i.setAttribute("x", o), i.setAttribute("y", r), i.setAttribute("height", a), i.setAttribute("width", h), i;
342
+ }
343
+ }
344
+ const at = (n, t) => {
345
+ const e = [];
346
+ for (let s = t.currentNode; s; s = t.nextNode()) {
347
+ const i = n.comparePoint(s, 0);
348
+ if (i === 0) e.push(s);
349
+ else if (i > 0) break;
350
+ }
351
+ return e;
352
+ }, ct = (n, t) => {
353
+ const e = [];
354
+ for (let s = t.nextNode(); s; s = t.nextNode())
355
+ e.push(s);
356
+ return e;
357
+ }, lt = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_CDATA_SECTION, ht = (n) => {
358
+ if (n.nodeType === 1) {
359
+ const t = n.tagName.toLowerCase();
360
+ return t === "script" || t === "style" ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_SKIP;
361
+ }
362
+ return NodeFilter.FILTER_ACCEPT;
363
+ }, O = function* (n, t, e) {
364
+ const s = n.commonAncestorContainer ?? n.body ?? n, i = document.createTreeWalker(s, lt, { acceptNode: e || ht }), r = (n.commonAncestorContainer ? at : ct)(n, i), a = r.map((c) => c.nodeValue), h = (c, l, d, f) => {
365
+ const u = document.createRange();
366
+ return u.setStart(r[c], l), u.setEnd(r[d], f), u;
367
+ };
368
+ for (const c of t(a, h)) yield c;
369
+ }, y = "foliate-search:", dt = async (n) => {
370
+ const t = new Uint8Array(await n.slice(0, 4).arrayBuffer());
371
+ return t[0] === 80 && t[1] === 75 && t[2] === 3 && t[3] === 4;
372
+ }, ut = async (n) => {
373
+ const t = new Uint8Array(await n.slice(0, 5).arrayBuffer());
374
+ return t[0] === 37 && t[1] === 80 && t[2] === 68 && t[3] === 70 && t[4] === 45;
375
+ }, ft = ({ name: n, type: t }) => t === "application/vnd.comicbook+zip" || n.endsWith(".cbz"), gt = ({ name: n, type: t }) => t === "application/x-fictionbook+xml" || n.endsWith(".fb2"), pt = ({ name: n, type: t }) => t === "application/x-zip-compressed-fb2" || n.endsWith(".fb2.zip") || n.endsWith(".fbz"), mt = async (n) => {
376
+ const { configure: t, ZipReader: e, BlobReader: s, TextWriter: i, BlobWriter: o } = await import("./zip-Bw0cufIw.js");
377
+ t({ useWebWorkers: !1 });
378
+ const a = await new e(new s(n)).getEntries(), h = new Map(a.map((u) => [u.filename, u])), c = (u) => (p, ...w) => h.has(p) ? u(h.get(p), ...w) : null, l = c((u) => u.getData(new i())), d = c((u, p) => u.getData(new o(p)));
379
+ return { entries: a, loadText: l, loadBlob: d, getSize: (u) => h.get(u)?.uncompressedSize ?? 0 };
380
+ }, _ = async (n) => n.isFile ? n : (await Promise.all(Array.from(
381
+ await new Promise((t, e) => n.createReader().readEntries((s) => t(s), (s) => e(s))),
382
+ _
383
+ ))).flat(), wt = async (n) => {
384
+ const t = await _(n), e = await Promise.all(
385
+ t.map((l) => new Promise((d, f) => l.file(
386
+ (u) => d([u, l.fullPath]),
387
+ (u) => f(u)
388
+ )))
389
+ ), s = new Map(e.map(([l, d]) => [d.replace(n.fullPath + "/", ""), l])), i = new TextDecoder(), o = (l) => l ? i.decode(l) : null, r = (l) => s.get(l)?.arrayBuffer() ?? null;
390
+ return { loadText: async (l) => o(await r(l)), loadBlob: (l) => s.get(l), getSize: (l) => s.get(l)?.size ?? 0 };
391
+ };
392
+ class H extends Error {
393
+ }
394
+ class U extends Error {
395
+ }
396
+ class V extends Error {
397
+ }
398
+ const yt = async (n) => {
399
+ const t = await fetch(n);
400
+ if (!t.ok) throw new H(
401
+ `${t.status} ${t.statusText}`,
402
+ { cause: t }
403
+ );
404
+ return new File([await t.blob()], new URL(t.url).pathname);
405
+ }, Z = async (n) => {
406
+ typeof n == "string" && (n = await yt(n));
407
+ let t;
408
+ if (n.isDirectory) {
409
+ const e = await wt(n), { EPUB: s } = await import("./epub-CiyU4mPz.js");
410
+ t = await new s(e).init();
411
+ } else if (n.size) if (await dt(n)) {
412
+ const e = await mt(n);
413
+ if (ft(n)) {
414
+ const { makeComicBook: s } = await import("./comic-book-D8f_Cc7Q.js");
415
+ t = s(e, n);
416
+ } else if (pt(n)) {
417
+ const { makeFB2: s } = await import("./fb2-DCqZtzQ5.js"), { entries: i } = e, o = i.find((a) => a.filename.endsWith(".fb2")), r = await e.loadBlob((o ?? i[0]).filename);
418
+ t = await s(r);
419
+ } else {
420
+ const { EPUB: s } = await import("./epub-CiyU4mPz.js");
421
+ t = await new s(e).init();
422
+ }
423
+ } else if (await ut(n)) {
424
+ const { makePDF: e } = await import("./pdf-BboyxV4m.js");
425
+ t = await e(n);
426
+ } else {
427
+ const { isMOBI: e, MOBI: s } = await import("./mobi-CikMBloG.js");
428
+ if (await e(n)) {
429
+ const i = await import("./fflate-CExlDunL.js");
430
+ t = await new s({ unzlib: i.unzlibSync }).open(n);
431
+ } else if (gt(n)) {
432
+ const { makeFB2: i } = await import("./fb2-DCqZtzQ5.js");
433
+ t = await i(n);
434
+ }
435
+ }
436
+ else throw new U("File not found");
437
+ if (!t) throw new V("File type not supported");
438
+ return t;
439
+ };
440
+ class P {
441
+ #e;
442
+ #t;
443
+ #n;
444
+ #s;
445
+ constructor(t, e, s = {}) {
446
+ this.#t = t, this.#n = e, this.#s = s, this.#s.hidden && this.hide(), this.#t.addEventListener("mousemove", ({ screenX: i, screenY: o }) => {
447
+ i === this.#s.x && o === this.#s.y || (this.#s.x = i, this.#s.y = o, this.show(), this.#e && clearTimeout(this.#e), e() && (this.#e = setTimeout(this.hide.bind(this), 1e3)));
448
+ }, !1);
449
+ }
450
+ cloneFor(t) {
451
+ return new P(t, this.#n, this.#s);
452
+ }
453
+ hide() {
454
+ this.#t.style.cursor = "none", this.#s.hidden = !0;
455
+ }
456
+ show() {
457
+ this.#t.style.removeProperty("cursor"), this.#s.hidden = !1;
458
+ }
459
+ }
460
+ class vt extends EventTarget {
461
+ #e = [];
462
+ #t = -1;
463
+ pushState(t) {
464
+ const e = this.#e[this.#t];
465
+ e === t || e?.fraction && e.fraction === t.fraction || (this.#e[++this.#t] = t, this.#e.length = this.#t + 1, this.dispatchEvent(new Event("index-change")));
466
+ }
467
+ replaceState(t) {
468
+ const e = this.#t;
469
+ this.#e[e] = t;
470
+ }
471
+ back() {
472
+ const t = this.#t;
473
+ if (t <= 0) return;
474
+ const e = { state: this.#e[t - 1] };
475
+ this.#t = t - 1, this.dispatchEvent(new CustomEvent("popstate", { detail: e })), this.dispatchEvent(new Event("index-change"));
476
+ }
477
+ forward() {
478
+ const t = this.#t;
479
+ if (t >= this.#e.length - 1) return;
480
+ const e = { state: this.#e[t + 1] };
481
+ this.#t = t + 1, this.dispatchEvent(new CustomEvent("popstate", { detail: e })), this.dispatchEvent(new Event("index-change"));
482
+ }
483
+ get canGoBack() {
484
+ return this.#t > 0;
485
+ }
486
+ get canGoForward() {
487
+ return this.#t < this.#e.length - 1;
488
+ }
489
+ clear() {
490
+ this.#e = [], this.#t = -1;
491
+ }
492
+ }
493
+ const bt = (n) => {
494
+ if (!n) return {};
495
+ try {
496
+ const t = Intl.getCanonicalLocales(n)[0], e = new Intl.Locale(t), s = ["zh", "ja", "kr"].includes(e.language), i = (e.getTextInfo?.() ?? e.textInfo)?.direction;
497
+ return { canonical: t, locale: e, isCJK: s, direction: i };
498
+ } catch (t) {
499
+ return console.warn(t), {};
500
+ }
501
+ };
502
+ class J extends HTMLElement {
503
+ #e = this.attachShadow({ mode: "closed" });
504
+ #t;
505
+ #n;
506
+ #s;
507
+ #o = /* @__PURE__ */ new Map();
508
+ #a = new P(this, () => this.hasAttribute("autohide-cursor"));
509
+ isFixedLayout = !1;
510
+ lastLocation;
511
+ history = new vt();
512
+ constructor() {
513
+ super(), this.history.addEventListener("popstate", ({ detail: t }) => {
514
+ const e = this.resolveNavigation(t.state);
515
+ this.renderer.goTo(e);
516
+ });
517
+ }
518
+ async open(t) {
519
+ if ((typeof t == "string" || typeof t.arrayBuffer == "function" || t.isDirectory) && (t = await Z(t)), this.book = t, this.language = bt(t.metadata?.language), t.splitTOCHref && t.getTOCFragment) {
520
+ const e = t.sections.map((o) => o.id);
521
+ this.#t = new rt(t.sections, 1500, 1600);
522
+ const s = t.splitTOCHref.bind(t), i = t.getTOCFragment.bind(t);
523
+ this.#n = new L(), await this.#n.init({
524
+ toc: t.toc ?? [],
525
+ ids: e,
526
+ splitHref: s,
527
+ getFragment: i
528
+ }), this.#s = new L(), await this.#s.init({
529
+ toc: t.pageList ?? [],
530
+ ids: e,
531
+ splitHref: s,
532
+ getFragment: i
533
+ });
534
+ }
535
+ if (this.isFixedLayout = this.book.rendition?.layout === "pre-paginated", this.isFixedLayout ? (await import("./fixed-layout-CMyaX9h8.js"), this.renderer = document.createElement("foliate-fxl")) : (await import("./paginator-CpnI4Urk.js"), this.renderer = document.createElement("foliate-paginator")), this.renderer.setAttribute("exportparts", "head,foot,filter"), this.renderer.addEventListener("load", (e) => this.#l(e.detail)), this.renderer.addEventListener("relocate", (e) => this.#c(e.detail)), this.renderer.addEventListener("create-overlayer", (e) => e.detail.attach(this.#d(e.detail))), this.renderer.open(t), this.#e.append(this.renderer), t.sections.some((e) => e.mediaOverlay)) {
536
+ const e = t.media.activeClass, s = t.media.playbackActiveClass;
537
+ this.mediaOverlay = t.getMediaOverlay();
538
+ let i;
539
+ this.mediaOverlay.addEventListener("highlight", (o) => {
540
+ const r = this.resolveNavigation(o.detail.text);
541
+ this.renderer.goTo(r).then(() => {
542
+ const { doc: a } = this.renderer.getContents().find((c) => c.index = r.index), h = r.anchor(a);
543
+ h.classList.add(e), s && h.ownerDocument.documentElement.classList.add(s), i = new WeakRef(h);
544
+ });
545
+ }), this.mediaOverlay.addEventListener("unhighlight", () => {
546
+ const o = i?.deref();
547
+ o && (o.classList.remove(e), s && o.ownerDocument.documentElement.classList.remove(s));
548
+ });
549
+ }
550
+ }
551
+ close() {
552
+ this.renderer?.destroy(), this.renderer?.remove(), this.#t = null, this.#n = null, this.#s = null, this.#o = /* @__PURE__ */ new Map(), this.lastLocation = null, this.history.clear(), this.tts = null, this.mediaOverlay = null;
553
+ }
554
+ goToTextStart() {
555
+ return this.goTo(this.book.landmarks?.find((t) => t.type.includes("bodymatter") || t.type.includes("text"))?.href ?? this.book.sections.findIndex((t) => t.linear !== "no"));
556
+ }
557
+ async init({ lastLocation: t, showTextStart: e }) {
558
+ const s = t ? this.resolveNavigation(t) : null;
559
+ s ? (await this.renderer.goTo(s), this.history.pushState(t)) : e ? await this.goToTextStart() : (this.history.pushState(0), await this.next());
560
+ }
561
+ #i(t, e, s) {
562
+ return this.dispatchEvent(new CustomEvent(t, { detail: e, cancelable: s }));
563
+ }
564
+ #c({ reason: t, range: e, index: s, fraction: i, size: o }) {
565
+ const r = this.#t?.getProgress(s, i, o) ?? {}, a = this.#n?.getProgress(s, e), h = this.#s?.getProgress(s, e), c = this.getCFI(s, e);
566
+ this.lastLocation = { ...r, tocItem: a, pageItem: h, cfi: c, range: e }, (t === "snap" || t === "page" || t === "scroll") && this.history.replaceState(c), this.#i("relocate", this.lastLocation);
567
+ }
568
+ #l({ doc: t, index: e }) {
569
+ t.documentElement.lang ||= this.language.canonical ?? "", this.language.isCJK || (t.documentElement.dir ||= this.language.direction ?? ""), this.#h(t, e), this.#a.cloneFor(t.documentElement), this.#i("load", { doc: t, index: e });
570
+ }
571
+ #h(t, e) {
572
+ const { book: s } = this, i = s.sections[e];
573
+ t.addEventListener("click", (o) => {
574
+ const r = o.target.closest("a[href]");
575
+ if (!r) return;
576
+ o.preventDefault();
577
+ const a = r.getAttribute("href"), h = i?.resolveHref?.(a) ?? a;
578
+ s?.isExternal?.(h) ? Promise.resolve(this.#i("external-link", { a: r, href: h }, !0)).then((c) => c ? globalThis.open(h, "_blank") : null).catch((c) => console.error(c)) : Promise.resolve(this.#i("link", { a: r, href: h }, !0)).then((c) => c ? this.goTo(h) : null).catch((c) => console.error(c));
579
+ });
580
+ }
581
+ async addAnnotation(t, e) {
582
+ const { value: s } = t;
583
+ if (s.startsWith(y)) {
584
+ const h = s.replace(y, ""), { index: c, anchor: l } = await this.resolveNavigation(h), d = this.#r(c);
585
+ if (d) {
586
+ const { overlayer: f, doc: u } = d;
587
+ if (e) {
588
+ f.remove(s);
589
+ return;
590
+ }
591
+ const p = u ? l(u) : l;
592
+ f.add(s, p, R.outline);
593
+ }
594
+ return;
595
+ }
596
+ const { index: i, anchor: o } = await this.resolveNavigation(s), r = this.#r(i);
597
+ if (r) {
598
+ const { overlayer: h, doc: c } = r;
599
+ if (h.remove(s), !e) {
600
+ const l = c ? o(c) : o, d = (f, u) => h.add(s, l, f, u);
601
+ this.#i("draw-annotation", { draw: d, annotation: t, doc: c, range: l });
602
+ }
603
+ }
604
+ const a = this.#n.getProgress(i)?.label ?? "";
605
+ return { index: i, label: a };
606
+ }
607
+ deleteAnnotation(t) {
608
+ return this.addAnnotation(t, !0);
609
+ }
610
+ #r(t) {
611
+ return this.renderer.getContents().find((e) => e.index === t && e.overlayer);
612
+ }
613
+ #d({ doc: t, index: e }) {
614
+ const s = new R();
615
+ t.addEventListener("click", (o) => {
616
+ const [r, a] = s.hitTest(o);
617
+ r && !r.startsWith(y) && this.#i("show-annotation", { value: r, index: e, range: a });
618
+ }, !1);
619
+ const i = this.#o.get(e);
620
+ if (i) for (const o of i) this.addAnnotation(o);
621
+ return this.#i("create-overlay", { index: e }), s;
622
+ }
623
+ async showAnnotation(t) {
624
+ const { value: e } = t, s = await this.goTo(e);
625
+ if (s) {
626
+ const { index: i, anchor: o } = s, { doc: r } = this.#r(i), a = o(r);
627
+ this.#i("show-annotation", { value: e, index: i, range: a });
628
+ }
629
+ }
630
+ getCFI(t, e) {
631
+ const s = this.book.sections[t].cfi ?? z.fromIndex(t);
632
+ return e ? Q(s, nt(e)) : s;
633
+ }
634
+ resolveCFI(t) {
635
+ if (this.book.resolveCFI)
636
+ return this.book.resolveCFI(t);
637
+ {
638
+ const e = b(t);
639
+ return { index: z.toIndex((e.parent ?? e).shift()), anchor: (o) => it(o, e) };
640
+ }
641
+ }
642
+ resolveNavigation(t) {
643
+ try {
644
+ if (typeof t == "number") return { index: t };
645
+ if (typeof t.fraction == "number") {
646
+ const [e, s] = this.#t.getSection(t.fraction);
647
+ return { index: e, anchor: s };
648
+ }
649
+ return x.test(t) ? this.resolveCFI(t) : this.book.resolveHref(t);
650
+ } catch (e) {
651
+ console.error(e), console.error(`Could not resolve target ${t}`);
652
+ }
653
+ }
654
+ async goTo(t) {
655
+ const e = this.resolveNavigation(t);
656
+ try {
657
+ return await this.renderer.goTo(e), this.history.pushState(t), e;
658
+ } catch (s) {
659
+ console.error(s), console.error(`Could not go to ${t}`);
660
+ }
661
+ }
662
+ async goToFraction(t) {
663
+ const [e, s] = this.#t.getSection(t);
664
+ await this.renderer.goTo({ index: e, anchor: s }), this.history.pushState({ fraction: t });
665
+ }
666
+ async select(t) {
667
+ try {
668
+ const e = await this.resolveNavigation(t);
669
+ await this.renderer.goTo({ ...e, select: !0 }), this.history.pushState(t);
670
+ } catch (e) {
671
+ console.error(e), console.error(`Could not go to ${t}`);
672
+ }
673
+ }
674
+ deselect() {
675
+ for (const { doc: t } of this.renderer.getContents())
676
+ t.defaultView.getSelection().removeAllRanges();
677
+ }
678
+ getSectionFractions() {
679
+ return (this.#t?.sectionFractions ?? []).map((t) => t + Number.EPSILON);
680
+ }
681
+ getProgressOf(t, e) {
682
+ const s = this.#n?.getProgress(t, e), i = this.#s?.getProgress(t, e);
683
+ return { tocItem: s, pageItem: i };
684
+ }
685
+ async getTOCItemOf(t) {
686
+ try {
687
+ const { index: e, anchor: s } = await this.resolveNavigation(t), i = await this.book.sections[e].createDocument(), o = s(i), r = o instanceof Range, a = r ? o : i.createRange();
688
+ return r || a.selectNodeContents(o), this.#n.getProgress(e, a);
689
+ } catch (e) {
690
+ console.error(e), console.error(`Could not get ${t}`);
691
+ }
692
+ }
693
+ async prev(t) {
694
+ await this.renderer.prev(t);
695
+ }
696
+ async next(t) {
697
+ await this.renderer.next(t);
698
+ }
699
+ goLeft() {
700
+ return this.book.dir === "rtl" ? this.next() : this.prev();
701
+ }
702
+ goRight() {
703
+ return this.book.dir === "rtl" ? this.prev() : this.next();
704
+ }
705
+ async *#u(t, e, s) {
706
+ const i = await this.book.sections[s].createDocument();
707
+ for (const { range: o, excerpt: r } of t(i, e))
708
+ yield { cfi: this.getCFI(s, o), excerpt: r };
709
+ }
710
+ async *#f(t, e) {
711
+ const { sections: s } = this.book;
712
+ for (const [i, { createDocument: o }] of s.entries()) {
713
+ if (!o) continue;
714
+ const r = await o(), a = Array.from(t(r, e), ({ range: c, excerpt: l }) => ({ cfi: this.getCFI(i, c), excerpt: l }));
715
+ yield { progress: (i + 1) / s.length }, a.length && (yield { index: i, subitems: a });
716
+ }
717
+ }
718
+ async *search(t) {
719
+ this.clearSearch();
720
+ const { searchMatcher: e } = await import("./search-aqQXTfxz.js"), { query: s, index: i } = t, o = e(
721
+ O,
722
+ { defaultLocale: this.language, ...t }
723
+ ), r = i != null ? this.#u(o, s, i) : this.#f(o, s), a = [];
724
+ this.#o.set(i, a);
725
+ for await (const h of r)
726
+ if (h.subitems) {
727
+ const c = h.subitems.map(({ cfi: l }) => ({ value: y + l }));
728
+ this.#o.set(h.index, c);
729
+ for (const l of c) this.addAnnotation(l);
730
+ yield {
731
+ label: this.#n.getProgress(h.index)?.label ?? "",
732
+ subitems: h.subitems
733
+ };
734
+ } else {
735
+ if (h.cfi) {
736
+ const c = { value: y + h.cfi };
737
+ a.push(c), this.addAnnotation(c);
738
+ }
739
+ yield h;
740
+ }
741
+ yield "done";
742
+ }
743
+ clearSearch() {
744
+ for (const t of this.#o.values())
745
+ for (const e of t) this.deleteAnnotation(e);
746
+ this.#o.clear();
747
+ }
748
+ async initTTS(t = "word", e) {
749
+ const s = this.renderer.getContents()[0].doc;
750
+ if (this.tts && this.tts.doc === s) return;
751
+ const { TTS: i } = await import("./tts-UQB-k9b_.js");
752
+ this.tts = new i(s, O, e || ((o) => this.renderer.scrollToAnchor(o, !0)), t);
753
+ }
754
+ startMediaOverlay() {
755
+ const { index: t } = this.renderer.getContents()[0];
756
+ return this.mediaOverlay.start(t);
757
+ }
758
+ }
759
+ customElements.define("foliate-view", J);
760
+ const Et = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
761
+ __proto__: null,
762
+ NotFoundError: U,
763
+ ResponseError: H,
764
+ UnsupportedTypeError: V,
765
+ View: J,
766
+ makeBook: Z
767
+ }, Symbol.toStringTag, { value: "Module" }));
768
+ export {
769
+ it as a,
770
+ At as f,
771
+ b as p,
772
+ xt as t,
773
+ Et as v
774
+ };