@prose-reader/archive-reader 1.321.0 → 1.323.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/apple/readArchiveApple.d.ts +3 -0
  2. package/dist/apple/readArchiveApple.test.d.ts +1 -0
  3. package/dist/apple/resolve.d.ts +5 -2
  4. package/dist/archives/createArchiveFromJszip/index.cjs +1 -1
  5. package/dist/archives/createArchiveFromJszip/index.js +1 -1
  6. package/dist/archives/createArchiveFromLibArchive/index.cjs +1 -1
  7. package/dist/archives/createArchiveFromLibArchive/index.js +1 -1
  8. package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs +1 -1
  9. package/dist/archives/createArchiveFromNodeUnrarJs/index.js +1 -1
  10. package/dist/archives/createArchiveFromUnzipper/index.cjs +1 -1
  11. package/dist/archives/createArchiveFromUnzipper/index.js +1 -1
  12. package/dist/archives/createArchiveFromZipJs/index.cjs +1 -1
  13. package/dist/archives/createArchiveFromZipJs/index.js +1 -1
  14. package/dist/comicInfo/parse.d.ts +3 -43
  15. package/dist/comicInfo/readArchiveComicInfo.d.ts +3 -0
  16. package/dist/comicInfo/readArchiveComicInfo.test.d.ts +1 -0
  17. package/dist/comicInfo/resolve.d.ts +47 -2
  18. package/dist/{createArchiveFromEntries-Bal1_O58.js → createArchiveFromEntries-CFG3evXM.js} +2 -2
  19. package/dist/{createArchiveFromEntries-Bal1_O58.js.map → createArchiveFromEntries-CFG3evXM.js.map} +1 -1
  20. package/dist/{createArchiveFromEntries-Du93RwlN.cjs → createArchiveFromEntries-DcPCGgZW.cjs} +2 -2
  21. package/dist/{createArchiveFromEntries-Du93RwlN.cjs.map → createArchiveFromEntries-DcPCGgZW.cjs.map} +1 -1
  22. package/dist/index/index.cjs +3 -3
  23. package/dist/index/index.cjs.map +1 -1
  24. package/dist/index/index.js +622 -219
  25. package/dist/index/index.js.map +1 -1
  26. package/dist/index.d.ts +18 -4
  27. package/dist/kobo/readArchiveKobo.d.ts +3 -0
  28. package/dist/kobo/readArchiveKobo.test.d.ts +1 -0
  29. package/dist/kobo/resolve.d.ts +5 -2
  30. package/dist/layout/scanReadingOrderDocumentsViewport.d.ts +3 -0
  31. package/dist/layout/scanReadingOrderDocumentsViewport.test.d.ts +1 -0
  32. package/dist/opf/parse.d.ts +19 -0
  33. package/dist/opf/resolve.d.ts +24 -2
  34. package/dist/readingOrder/resolveArchiveReadingOrder.d.ts +16 -0
  35. package/dist/readingOrder/resolveArchiveReadingOrder.test.d.ts +1 -0
  36. package/dist/resolve.d.ts +2 -2
  37. package/dist/resolveArchive.d.ts +29 -0
  38. package/dist/resolveArchive.test.d.ts +1 -0
  39. package/dist/resolveMetadata.d.ts +12 -0
  40. package/dist/resolveMetadata.test.d.ts +1 -0
  41. package/dist/types/resolvedMetadata.d.ts +84 -0
  42. package/dist/utils/omitUndefined.d.ts +1 -0
  43. package/package.json +3 -3
  44. package/dist/types/archiveResolve.d.ts +0 -17
@@ -1,31 +1,56 @@
1
- import { n as e, t } from "../createArchiveFromEntries-Bal1_O58.js";
2
- import { n, t as r } from "../fileAccessors-etcCPnpQ.js";
3
- import { XmlDocument as i, XmlElement as a, XmlTextNode as o } from "xmldoc";
4
- import { createXmlSafeIdFactory as s, detectMimeTypeFromName as c, escapeXmlAttributeValue as l, getUriBasePath as u, getUriBasename as d, sortByTitleComparator as f, urlJoin as p } from "@prose-reader/shared";
1
+ import { n as e, r as t, t as n } from "../createArchiveFromEntries-CFG3evXM.js";
2
+ import { n as r, t as i } from "../fileAccessors-etcCPnpQ.js";
3
+ import { XmlDocument as a, XmlElement as o, XmlTextNode as s } from "xmldoc";
4
+ import { createXmlSafeIdFactory as c, detectMimeTypeFromName as l, escapeXmlAttributeValue as u, getUriBasePath as d, getUriBasename as f, isMediaContentMimeType as p, isXmlBasedMimeType as m, parseContentType as h, sortByTitleComparator as g, urlJoin as _ } from "@prose-reader/shared";
5
5
  //#region src/apple/parse.ts
6
- var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("option").map((e) => ({
6
+ var v = "com.apple.ibooks.display-options.xml", y = (e) => e.childrenNamed("option").map((e) => ({
7
7
  name: e.attr?.name,
8
8
  value: e.val
9
- })), g = (e) => {
10
- let t = new i(e);
9
+ })), b = (e) => {
10
+ let t = new a(e);
11
11
  if (t.name?.toLowerCase() !== "display_options") return { kind: "apple" };
12
12
  let n = t.childNamed("platform");
13
13
  return {
14
14
  kind: "apple",
15
- displayOptions: { ...n === void 0 ? {} : { platform: { options: h(n) } } }
15
+ displayOptions: { ...n === void 0 ? {} : { platform: { options: y(n) } } }
16
16
  };
17
- }, _ = async (e, n = {}) => t(e, (e) => e.isDir ? {
17
+ }, x = async (e) => new TextDecoder().decode(await e.arrayBuffer()), S = (e) => !e.dir, C = (e) => e.dir, w = (e, t) => {
18
+ let n = e.recordsByUri.get(t);
19
+ return n && S(n) ? n : void 0;
20
+ }, T = v.toLowerCase();
21
+ async function E(e) {
22
+ let t = e.records.find((e) => S(e) && e.basename.toLowerCase() === T);
23
+ if (t) return b(await x(t));
24
+ }
25
+ //#endregion
26
+ //#region src/utils/omitUndefined.ts
27
+ var D = (e) => {
28
+ let t = Object.entries(e).filter(([, e]) => e !== void 0);
29
+ return Object.fromEntries(t);
30
+ }, ee = { displayOptions: "apple.options" }, te = (e) => {
31
+ let t = e.displayOptions?.platform?.options, n = t?.find((e) => e.name === "fixed-layout")?.value.trim().toLowerCase(), r = n === "true" || n !== "false" && void 0, i = D({
32
+ fixedLayout: r,
33
+ options: t !== void 0 && t.length > 0 ? t.map(({ name: e, value: t }) => D({
34
+ name: e,
35
+ value: t
36
+ })) : void 0
37
+ });
38
+ return D({
39
+ renditionLayout: r === !0 ? "pre-paginated" : void 0,
40
+ apple: Object.keys(i).length > 0 ? i : void 0
41
+ });
42
+ }, ne = async (e, t = {}) => n(e, (e) => e.isDir ? {
18
43
  dir: !0,
19
44
  uri: e.name
20
45
  } : {
21
46
  dir: !1,
22
47
  uri: e.name,
23
48
  size: e.size,
24
- ...r(e.data, c(e.name) ?? "")
49
+ ...i(e.data, l(e.name) ?? "")
25
50
  }, {
26
- ...n,
51
+ ...t,
27
52
  close: () => Promise.resolve()
28
- }), v = async (t, { mimeType: r, direction: i } = { mimeType: "text/plain" }) => {
53
+ }), re = async (t, { mimeType: n, direction: i } = { mimeType: "text/plain" }) => {
29
54
  let a = `
30
55
  <?xml version="1.0" encoding="UTF-8"?>
31
56
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
@@ -44,50 +69,50 @@ var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("opti
44
69
  `;
45
70
  return e({
46
71
  filename: "content.txt",
47
- encodingFormat: r,
72
+ encodingFormat: n,
48
73
  records: [{
49
74
  dir: !1,
50
- basename: d("generated.opf"),
75
+ basename: f("generated.opf"),
51
76
  uri: "generated.opf",
52
77
  size: 0,
53
- ...n(async () => new Blob([a]))
78
+ ...r(async () => new Blob([a]))
54
79
  }, {
55
80
  dir: !1,
56
- basename: d("p01.txt"),
81
+ basename: f("p01.txt"),
57
82
  uri: "p01.txt",
58
83
  size: typeof t == "string" ? new Blob([t]).size : t.size,
59
- encodingFormat: r,
60
- ...n(async () => typeof t == "string" ? new Blob([t]) : t)
84
+ encodingFormat: n,
85
+ ...r(async () => typeof t == "string" ? new Blob([t]) : t)
61
86
  }],
62
87
  close: () => Promise.resolve()
63
88
  });
64
- }, y = async (t, r) => {
65
- let i = s(), a = t.map((e) => ({
89
+ }, ie = async (t, n) => {
90
+ let i = c(), a = t.map((e) => ({
66
91
  id: i(e),
67
92
  url: e
68
93
  })), o = `
69
94
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
70
95
  <metadata>
71
- <meta property="rendition:layout">${r?.useRenditionFlow ? "reflowable" : "pre-paginated"}</meta>
72
- ${r?.useRenditionFlow ? "<meta property=\"rendition:flow\">scrolled-continuous</meta>" : ""}
96
+ <meta property="rendition:layout">${n?.useRenditionFlow ? "reflowable" : "pre-paginated"}</meta>
97
+ ${n?.useRenditionFlow ? "<meta property=\"rendition:flow\">scrolled-continuous</meta>" : ""}
73
98
  </metadata>
74
99
  <manifest>
75
100
  ${a.map(({ id: e, url: t }) => {
76
- let n = c(t);
77
- return `<item id="${e}" href="${l(t)}" media-type="${l(n ?? "")}"/>`;
101
+ let n = l(t);
102
+ return `<item id="${e}" href="${u(t)}" media-type="${u(n ?? "")}"/>`;
78
103
  }).join("\n")}
79
104
  </manifest>
80
105
  <spine>
81
106
  ${a.map(({ id: e }) => `<itemref idref="${e}" />`).join("\n")}
82
107
  </spine>
83
108
  </package>
84
- `, u = t.map((e) => ({
109
+ `, s = t.map((e) => ({
85
110
  dir: !1,
86
- basename: d(e),
87
- encodingFormat: c(e),
111
+ basename: f(e),
112
+ encodingFormat: l(e),
88
113
  uri: e,
89
114
  size: 0,
90
- ...n(async () => (await fetch(e)).blob())
115
+ ...r(async () => (await fetch(e)).blob())
91
116
  }));
92
117
  return e({
93
118
  records: [{
@@ -95,64 +120,302 @@ var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("opti
95
120
  basename: "content.opf",
96
121
  uri: "content.opf",
97
122
  size: 0,
98
- ...n(async () => new Blob([o]))
99
- }, ...u],
123
+ ...r(async () => new Blob([o]))
124
+ }, ...s],
100
125
  close: () => Promise.resolve()
101
126
  });
102
- }, b = async (e) => new TextDecoder().decode(await e.arrayBuffer()), x = (e) => !e.dir, S = (e) => e.dir, C = (e, t) => {
103
- let n = e.recordsByUri.get(t);
104
- return n && x(n) ? n : void 0;
105
- }, w = "ComicInfo.xml", ee = /* @__PURE__ */ new Set(["Pages", "ComicInfo"]), te = (e) => e.children.some((e) => e.type === "element"), ne = (e) => {
127
+ }, O = "ComicInfo.xml", ae = /* @__PURE__ */ "AgeRating.AlternateCount.AlternateNumber.AlternateSeries.BlackAndWhite.Characters.Colorist.CommunityRating.Count.CoverArtist.Day.Editor.Format.Genre.GTIN.Imprint.Inker.LanguageISO.Letterer.Locations.MainCharacterOrTeam.Manga.Month.Notes.Number.PageCount.Penciller.Publisher.Review.ScanInformation.Series.SeriesGroup.StoryArc.StoryArcNumber.Summary.Tags.Teams.Title.Translator.Volume.Web.Writer.Year".split("."), oe = /* @__PURE__ */ new Set(["Pages", "ComicInfo"]), se = (e) => e.children.some((e) => e.type === "element"), ce = (e) => {
106
128
  let t = e.val.trim();
107
129
  return t.length > 0 ? t : void 0;
108
- }, re = (e) => {
130
+ }, le = (e) => {
109
131
  let t;
110
132
  try {
111
- t = new i(e);
133
+ t = new a(e);
112
134
  } catch (e) {
113
135
  let t = e instanceof Error ? e.message : String(e);
114
- throw Error(`${w} is malformed: ${t}`, { cause: e });
136
+ throw Error(`${O} is malformed: ${t}`, { cause: e });
115
137
  }
116
138
  let n = {};
117
139
  return t.eachChild((e) => {
118
- if (e.type !== "element" || ee.has(e.name) || te(e)) return;
119
- let t = ne(e);
140
+ if (e.type !== "element" || oe.has(e.name) || se(e)) return;
141
+ let t = ce(e);
120
142
  t !== void 0 && n[e.name] === void 0 && (n[e.name] = t);
121
143
  }), {
122
144
  kind: "comicInfo",
123
145
  ...n
124
146
  };
125
- }, ie = w.toLowerCase(), ae = (e) => e.records.find((e) => x(e) && e.basename.toLowerCase() === ie), T = [
147
+ }, ue = O.toLowerCase(), de = (e) => e.records.find((e) => S(e) && e.basename.toLowerCase() === ue), fe = [
126
148
  "Unknown",
127
149
  "No",
128
150
  "Yes",
129
151
  "YesAndRightToLeft"
130
- ], E = (e) => {
131
- for (let t of T) if (t === e) return !0;
152
+ ], pe = (e) => {
153
+ for (let t of fe) if (t === e) return !0;
132
154
  return !1;
133
- }, oe = "com.kobobooks.display-options.xml", se = (e) => {
155
+ };
156
+ //#endregion
157
+ //#region src/comicInfo/readArchiveComicInfo.ts
158
+ async function me(e) {
159
+ let t = de(e);
160
+ if (t) return le(await x(t));
161
+ }
162
+ //#endregion
163
+ //#region src/utils/normalizeGtin.ts
164
+ var he = /* @__PURE__ */ new Set([
165
+ 8,
166
+ 12,
167
+ 13,
168
+ 14
169
+ ]), k = (e) => {
170
+ if (e == null) return;
171
+ let t = String(e).replace(/\D/g, "");
172
+ if (!(t.length === 0 || !he.has(t.length))) return t;
173
+ }, ge = /(?:97[89])?\d{9}[\dXx]/, A = (e) => {
174
+ if (e == null) return;
175
+ let t = String(e).trim().replace(/^urn:isbn:/i, "").replace(/^isbn[:\s-]*/i, ""), n = t.replace(/[^0-9Xx]/g, "");
176
+ if (n.length === 10 || n.length === 13) return n.toUpperCase();
177
+ let r = t.match(ge);
178
+ if (r) return r[0].toUpperCase();
179
+ }, _e = {
180
+ AgeRating: "comic.ageRating",
181
+ AlternateCount: "comic.alternateSeries",
182
+ AlternateNumber: "comic.alternateSeries",
183
+ AlternateSeries: "comic.alternateSeries",
184
+ BlackAndWhite: "comic.blackAndWhite",
185
+ Characters: "comic.characters",
186
+ Colorist: "contributors",
187
+ CommunityRating: "comic.communityRating",
188
+ Count: "belongsTo.series",
189
+ CoverArtist: "contributors",
190
+ Day: "published",
191
+ Editor: "contributors",
192
+ Format: "comic.format",
193
+ Genre: "subjects",
194
+ GTIN: "identifiers",
195
+ Imprint: "imprint",
196
+ Inker: "contributors",
197
+ LanguageISO: "languages",
198
+ Letterer: "contributors",
199
+ Locations: "comic.locations",
200
+ MainCharacterOrTeam: "comic.mainCharacterOrTeam",
201
+ Manga: "readingDirection",
202
+ Month: "published",
203
+ Notes: "comic.notes",
204
+ Number: "belongsTo.series",
205
+ PageCount: "numberOfPages",
206
+ Penciller: "contributors",
207
+ Publisher: "publisher",
208
+ Review: "comic.review",
209
+ ScanInformation: "comic.scanInformation",
210
+ Series: "belongsTo.series",
211
+ SeriesGroup: "belongsTo.collection",
212
+ StoryArc: "comic.storyArcs",
213
+ StoryArcNumber: "comic.storyArcs",
214
+ Summary: "description",
215
+ Tags: "subjects",
216
+ Teams: "comic.teams",
217
+ Title: "title",
218
+ Translator: "contributors",
219
+ Volume: "comic.volume",
220
+ Web: "comic.web",
221
+ Writer: "contributors",
222
+ Year: "published"
223
+ }, ve = (e) => {
224
+ switch (e.Manga) {
225
+ case "YesAndRightToLeft": return "rtl";
226
+ case "Yes":
227
+ case "No": return "ltr";
228
+ default: return;
229
+ }
230
+ }, j = (e) => {
231
+ if (e === void 0) return;
232
+ let t = e.trim();
233
+ return t.length > 0 ? t : void 0;
234
+ }, M = (e) => e === void 0 ? [] : e.split(",").map((e) => e.trim()).filter((e) => e.length > 0), N = (e) => {
235
+ let t = j(e);
236
+ if (t === void 0 || !/^\d+$/.test(t)) return;
237
+ let n = Number.parseInt(t, 10);
238
+ return Number.isFinite(n) ? n : void 0;
239
+ }, P = (e) => {
240
+ let t = j(e);
241
+ if (t === void 0 || !/^\d+(\.\d+)?$/.test(t)) return;
242
+ let n = Number.parseFloat(t);
243
+ return Number.isFinite(n) ? n : void 0;
244
+ }, ye = (e) => {
245
+ let t = j(e)?.toLowerCase();
246
+ if (t === "yes") return !0;
247
+ if (t === "no") return !1;
248
+ }, be = (e) => {
249
+ switch (e.Manga) {
250
+ case "Yes":
251
+ case "YesAndRightToLeft": return !0;
252
+ case "No": return !1;
253
+ default: return;
254
+ }
255
+ }, xe = (e) => {
256
+ let t = N(e.Year), n = N(e.Month), r = N(e.Day);
257
+ if (!(t === void 0 && n === void 0 && r === void 0)) return {
258
+ ...t === void 0 ? {} : { year: t },
259
+ ...n === void 0 ? {} : { month: n },
260
+ ...r === void 0 ? {} : { day: r }
261
+ };
262
+ }, Se = [
263
+ ["Writer", "author"],
264
+ ["Penciller", "penciler"],
265
+ ["Inker", "inker"],
266
+ ["Colorist", "colorist"],
267
+ ["Letterer", "letterer"],
268
+ ["CoverArtist", "coverArtist"],
269
+ ["Editor", "editor"],
270
+ ["Translator", "translator"]
271
+ ], Ce = (e) => {
272
+ let t = /* @__PURE__ */ new Map();
273
+ for (let [n, r] of Se) for (let i of M(e[n])) {
274
+ let e = t.get(i);
275
+ e ? e.roles.includes(r) || e.roles.push(r) : t.set(i, {
276
+ name: i,
277
+ roles: [r]
278
+ });
279
+ }
280
+ return [...t.values()];
281
+ }, we = (e) => {
282
+ let t = j(e.Series);
283
+ if (t !== void 0) return D({
284
+ name: t,
285
+ position: P(e.Number),
286
+ total: N(e.Count)
287
+ });
288
+ }, Te = (e) => {
289
+ let t = j(e.AlternateSeries);
290
+ if (t !== void 0) return D({
291
+ name: t,
292
+ position: P(e.AlternateNumber),
293
+ total: N(e.AlternateCount)
294
+ });
295
+ }, Ee = (e) => {
296
+ let t = M(e.StoryArc);
297
+ if (t.length === 0) return [];
298
+ let n = M(e.StoryArcNumber);
299
+ return t.map((e, t) => D({
300
+ name: e,
301
+ position: P(n[t])
302
+ }));
303
+ }, F = (e) => e.length > 0 ? e : void 0, De = (e) => {
304
+ let t = F((e.Web ?? "").split(/\s+/).filter((e) => e.length > 0)), n = D({
305
+ manga: be(e),
306
+ blackAndWhite: ye(e.BlackAndWhite),
307
+ volume: N(e.Volume),
308
+ format: j(e.Format),
309
+ ageRating: j(e.AgeRating),
310
+ communityRating: P(e.CommunityRating),
311
+ notes: j(e.Notes),
312
+ review: j(e.Review),
313
+ web: t,
314
+ scanInformation: j(e.ScanInformation),
315
+ mainCharacterOrTeam: j(e.MainCharacterOrTeam),
316
+ characters: F(M(e.Characters)),
317
+ teams: F(M(e.Teams)),
318
+ locations: F(M(e.Locations)),
319
+ storyArcs: F(Ee(e)),
320
+ alternateSeries: Te(e)
321
+ });
322
+ return Object.keys(n).length > 0 ? n : void 0;
323
+ }, Oe = (e) => {
324
+ let t = we(e), n = F(M(e.SeriesGroup).map((e) => ({ name: e })));
325
+ if (!(t === void 0 && n === void 0)) return D({
326
+ series: t === void 0 ? void 0 : [t],
327
+ collection: n
328
+ });
329
+ }, I = (e) => {
330
+ let t = e.GTIN, n = j(t), r = j(e.LanguageISO), i = [...M(e.Genre), ...M(e.Tags)];
331
+ return D({
332
+ title: j(e.Title),
333
+ description: j(e.Summary),
334
+ publisher: j(e.Publisher),
335
+ imprint: j(e.Imprint),
336
+ languages: r === void 0 ? void 0 : [r],
337
+ subjects: F(i),
338
+ contributors: F(Ce(e)),
339
+ published: xe(e),
340
+ readingDirection: ve(e),
341
+ numberOfPages: N(e.PageCount),
342
+ gtin: k(t),
343
+ isbn: A(t),
344
+ identifiers: n === void 0 ? void 0 : [{
345
+ value: n,
346
+ scheme: "GTIN"
347
+ }],
348
+ belongsTo: Oe(e),
349
+ comic: De(e)
350
+ });
351
+ }, L = "com.kobobooks.display-options.xml", ke = (e) => {
134
352
  let t = e.childNamed("platform");
135
353
  if (!t) return {};
136
354
  for (let e of t.childrenNamed("option")) if (e.attr?.name === "fixed-layout") return e.val.trim().toLowerCase() === "true" ? { renditionLayout: "pre-paginated" } : {};
137
355
  return {};
138
- }, ce = (e) => {
139
- let t = new i(e);
356
+ }, R = (e) => {
357
+ let t = new a(e);
140
358
  return t.name?.toLowerCase() === "display_options" ? {
141
359
  kind: "kobo",
142
- ...se(t)
360
+ ...ke(t)
143
361
  } : { kind: "kobo" };
144
- }, D = (e) => {
362
+ };
363
+ //#endregion
364
+ //#region src/kobo/readArchiveKobo.ts
365
+ async function z(e) {
366
+ let n = e.records.filter((e) => S(e) && e.uri.endsWith("com.kobobooks.display-options.xml"));
367
+ if (n.length === 0) return;
368
+ let r;
369
+ for (let e of n) {
370
+ let n = await x(e);
371
+ try {
372
+ let { renditionLayout: e } = R(n);
373
+ e && (r = e);
374
+ } catch (n) {
375
+ t.error(`Unable to parse ${L} (${e.uri})`, n);
376
+ }
377
+ }
378
+ return {
379
+ kind: "kobo",
380
+ ...r === void 0 ? {} : { renditionLayout: r }
381
+ };
382
+ }
383
+ //#endregion
384
+ //#region src/kobo/resolve.ts
385
+ var Ae = { renditionLayout: "renditionLayout" }, B = (e) => D({
386
+ renditionLayout: e.renditionLayout,
387
+ kobo: e.renditionLayout === void 0 ? void 0 : { fixedLayout: e.renditionLayout === "pre-paginated" }
388
+ }), je = (e) => {
389
+ let t = e.descendantWithPath("head")?.childrenNamed("meta").find((e) => e.attr.name === "viewport");
390
+ return !!(t && t.attr.name === "viewport");
391
+ }, V = async (e, n) => {
392
+ if (n.length === 0) return !1;
393
+ for (let r of n) {
394
+ if (!m({
395
+ mimeType: r.mediaType,
396
+ uri: r.uri
397
+ })) return !1;
398
+ let n = w(e, r.uri);
399
+ if (!n || !S(n)) return !1;
400
+ try {
401
+ if (!je(new a(await x(n)))) return !1;
402
+ } catch (e) {
403
+ return t.error(`layout scan: unable to inspect ${r.uri}`, e), !1;
404
+ }
405
+ }
406
+ return !0;
407
+ }, Me = (e) => {
145
408
  let t = e.records.filter((e) => !e.dir).find((e) => e.uri.endsWith(".opf"));
146
409
  return {
147
410
  data: t,
148
411
  basePath: t?.uri.substring(0, t.uri.lastIndexOf("/")) || ""
149
412
  };
150
- }, le = async ({ archive: e, archiveOpf: t }) => {
413
+ }, Ne = async ({ archive: e, archiveOpf: t }) => {
151
414
  if (!t) return [];
152
415
  let { opf: n, basePath: r } = t, { spineRows: i } = n;
153
416
  return e.records.filter((e) => i.find((t) => r ? `${r}/${t.href}` === e.uri : `${t.href}` === e.uri));
154
- }, O = (e) => e.toLowerCase().endsWith(".opf"), ue = (e) => e.records.some((e) => !e.dir && (O(e.basename) || O(e.uri))), k = (e) => e === void 0 || e.trim().length === 0 ? [] : e.trim().split(/\s+/).filter((e) => e.length > 0), A = (e) => {
155
- let t = k(e);
417
+ }, Pe = (e) => e.toLowerCase().endsWith(".opf"), Fe = (e) => e.records.some((e) => !e.dir && (Pe(e.basename) || Pe(e.uri))), H = (e) => e === void 0 || e.trim().length === 0 ? [] : e.trim().split(/\s+/).filter((e) => e.length > 0), Ie = (e) => {
418
+ let t = H(e);
156
419
  if (t.length === 0) return {};
157
420
  let n;
158
421
  t.includes("rendition:layout-reflowable") && (n = "reflowable"), t.includes("rendition:layout-pre-paginated") && (n = "pre-paginated");
@@ -163,16 +426,16 @@ var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("opti
163
426
  ...t.includes("page-spread-left") ? { pageSpreadLeft: !0 } : {},
164
427
  ...t.includes("page-spread-right") ? { pageSpreadRight: !0 } : {}
165
428
  };
166
- }, j = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, M = (e, t) => j(e).toLowerCase() === t.toLowerCase(), N = (e) => e.type === "element", P = (e, t) => {
167
- for (let n of e.children) if (N(n) && M(n.name, t)) return n;
168
- }, F = (e, t) => {
429
+ }, U = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, Le = (e, t) => U(e).toLowerCase() === t.toLowerCase(), Re = (e) => e.type === "element", W = (e, t) => {
430
+ for (let n of e.children) if (Re(n) && Le(n.name, t)) return n;
431
+ }, G = (e, t) => {
169
432
  let n = [];
170
- for (let r of e.children) N(r) && M(r.name, t) && n.push(r);
433
+ for (let r of e.children) Re(r) && Le(r.name, t) && n.push(r);
171
434
  return n;
172
- }, de = (e) => {
435
+ }, ze = (e) => {
173
436
  let t = [];
174
437
  return e.eachChild((e) => {
175
- if (j(e.name).toLowerCase() !== "identifier") return;
438
+ if (U(e.name).toLowerCase() !== "identifier") return;
176
439
  let n = e.val.trim();
177
440
  if (n.length === 0) return;
178
441
  let r = (e.attr["opf:scheme"] ?? e.attr["opf:Scheme"] ?? e.attr.scheme)?.trim();
@@ -181,46 +444,80 @@ var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("opti
181
444
  ...r !== void 0 && r.length > 0 ? { scheme: r } : {}
182
445
  });
183
446
  }), t;
184
- }, I = (e, t) => {
447
+ }, K = (e, t) => {
185
448
  let n;
186
449
  return e.eachChild((e) => {
187
- if (n !== void 0 || j(e.name).toLowerCase() !== t.toLowerCase()) return;
450
+ if (n !== void 0 || U(e.name).toLowerCase() !== t.toLowerCase()) return;
188
451
  let r = e.val.trim();
189
452
  r.length > 0 && (n = r);
190
453
  }), n;
191
- }, L = (e, t) => {
454
+ }, q = (e, t) => {
192
455
  let n = [];
193
456
  return e.eachChild((e) => {
194
- if (j(e.name).toLowerCase() !== t.toLowerCase()) return;
457
+ if (U(e.name).toLowerCase() !== t.toLowerCase()) return;
195
458
  let r = e.val.trim();
196
459
  r.length > 0 && n.push(r);
197
460
  }), n;
198
- }, R = (e) => {
461
+ }, Be = (e) => {
199
462
  let t;
200
463
  return e.eachChild((e) => {
201
- if (t !== void 0 || j(e.name).toLowerCase() !== "meta" || e.attr.name?.toLowerCase() !== "cover") return;
464
+ if (t !== void 0 || U(e.name).toLowerCase() !== "meta" || e.attr.name?.toLowerCase() !== "cover") return;
202
465
  let n = e.attr.content?.trim();
203
466
  n !== void 0 && n.length > 0 && (t = n);
204
467
  }), t;
205
- }, z = ({ manifestItems: e, metadataEl: t }) => {
206
- let n = (e) => e.mediaType?.toLowerCase().includes("image/") === !0, r = e.find((e) => n(e) ? k(e.properties).includes("cover-image") : !1);
468
+ }, Ve = ({ manifestItems: e, metadataEl: t }) => {
469
+ let n = (e) => e.mediaType?.toLowerCase().includes("image/") === !0, r = e.find((e) => n(e) ? H(e.properties).includes("cover-image") : !1);
207
470
  if (r !== void 0) return r.href;
208
471
  if (t !== void 0) {
209
- let r = R(t);
472
+ let r = Be(t);
210
473
  if (r !== void 0) {
211
474
  let t = e.find((e) => e.id === r && n(e));
212
475
  if (t !== void 0) return t.href;
213
476
  }
214
477
  }
215
478
  return e.find((e) => e.id.toLowerCase().includes("cover") && n(e))?.href;
216
- }, B = (e, t) => {
217
- let n = F(e, "meta").find((e) => e.attr.property === t)?.val;
479
+ }, J = (e, t) => {
480
+ let n = e.attr[t]?.trim();
481
+ return n !== void 0 && n.length > 0 ? n : void 0;
482
+ }, He = (e) => {
483
+ let t = [];
484
+ return e.eachChild((e) => {
485
+ if (U(e.name).toLowerCase() !== "meta") return;
486
+ let n = J(e, "property"), r = J(e, "refines"), i = J(e, "scheme"), a = J(e, "id"), o = J(e, "name"), s = J(e, "content"), c = e.val.trim(), l = c.length > 0 ? c : void 0, u = {
487
+ ...n === void 0 ? {} : { property: n },
488
+ ...r === void 0 ? {} : { refines: r },
489
+ ...i === void 0 ? {} : { scheme: i },
490
+ ...a === void 0 ? {} : { id: a },
491
+ ...o === void 0 ? {} : { name: o },
492
+ ...s === void 0 ? {} : { content: s },
493
+ ...l === void 0 ? {} : { value: l }
494
+ };
495
+ Object.keys(u).length !== 0 && t.push(u);
496
+ }), t;
497
+ }, Ue = (e, t) => e.replace(/^#/, "") === t, We = (e, t) => {
498
+ let n = [];
499
+ return e.eachChild((e) => {
500
+ let r = U(e.name).toLowerCase();
501
+ if (r !== "creator" && r !== "contributor") return;
502
+ let i = e.val.trim();
503
+ if (i.length === 0) return;
504
+ let a = J(e, "id"), o = (e) => a === void 0 ? [] : t.flatMap((t) => t.refines !== void 0 && Ue(t.refines, a) && t.property === e && t.value !== void 0 ? [t.value] : []), s = J(e, "opf:role") ?? J(e, "role"), c = [...s === void 0 ? [] : [s], ...o("role")], l = J(e, "opf:file-as") ?? J(e, "file-as") ?? o("file-as")[0];
505
+ n.push({
506
+ name: i,
507
+ source: r,
508
+ ...a === void 0 ? {} : { id: a },
509
+ roles: c,
510
+ ...l === void 0 ? {} : { fileAs: l }
511
+ });
512
+ }), n;
513
+ }, Y = (e, t) => {
514
+ let n = G(e, "meta").find((e) => e.attr.property === t)?.val;
218
515
  if (!(n === void 0 || n.trim().length === 0)) return n;
219
- }, V = (e) => {
220
- let t = P(e, "guide");
516
+ }, Ge = (e) => {
517
+ let t = W(e, "guide");
221
518
  if (t === void 0) return [];
222
519
  let n = [];
223
- for (let e of F(t, "reference")) {
520
+ for (let e of G(t, "reference")) {
224
521
  let t = e.attr.href?.trim();
225
522
  t === void 0 || t.length === 0 || n.push({
226
523
  href: t,
@@ -229,7 +526,7 @@ var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("opti
229
526
  });
230
527
  }
231
528
  return n;
232
- }, H = (e) => {
529
+ }, Ke = (e) => {
233
530
  let t = e.attr.id, n = e.attr.href;
234
531
  if (t === void 0 || t.length === 0 || n === void 0 || n.length === 0) return;
235
532
  let r = e.attr["media-type"], i = e.attr.properties?.trim();
@@ -239,24 +536,24 @@ var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("opti
239
536
  ...r !== void 0 && r.length > 0 ? { mediaType: r } : {},
240
537
  ...i !== void 0 && i.length > 0 ? { properties: i } : {}
241
538
  };
242
- }, fe = (e) => {
539
+ }, qe = (e) => {
243
540
  let t = [], n = /* @__PURE__ */ new Map();
244
- for (let r of F(e, "item")) {
245
- let e = H(r);
541
+ for (let r of G(e, "item")) {
542
+ let e = Ke(r);
246
543
  e !== void 0 && (t.push(e), n.set(e.id, e));
247
544
  }
248
545
  return {
249
546
  items: t,
250
547
  byId: n
251
548
  };
252
- }, pe = (e, t) => {
549
+ }, Je = (e, t) => {
253
550
  let n = [];
254
- for (let r of F(t, "itemref")) {
551
+ for (let r of G(t, "itemref")) {
255
552
  let t = r.attr.idref;
256
553
  if (t === void 0 || t.trim().length === 0) continue;
257
554
  let i = e.get(t);
258
555
  if (i === void 0) continue;
259
- let a = A(r.attr.properties);
556
+ let a = Ie(r.attr.properties);
260
557
  n.push({
261
558
  idref: t,
262
559
  id: i.id,
@@ -270,128 +567,54 @@ var m = "com.apple.ibooks.display-options.xml", h = (e) => e.childrenNamed("opti
270
567
  });
271
568
  }
272
569
  return n;
273
- }, U = (e) => {
274
- let t = new i(e), n = P(t, "manifest"), r = P(t, "spine"), a = P(t, "metadata"), o = [], s = [];
570
+ }, Ye = (e) => {
571
+ let t = new a(e), n = W(t, "manifest"), r = W(t, "spine"), i = W(t, "metadata"), o = [], s = [];
275
572
  if (n !== void 0) {
276
- let { items: e, byId: t } = fe(n);
277
- o = e, r !== void 0 && (s = pe(t, r));
573
+ let { items: e, byId: t } = qe(n);
574
+ o = e, r !== void 0 && (s = Je(t, r));
278
575
  }
279
- let c = r?.attr["page-progression-direction"], l = c !== void 0 && c.trim().length > 0 ? c : void 0, u = r?.attr.toc, d = u !== void 0 && u.trim().length > 0 ? u.trim() : void 0, f, p, m, h, g = [], _ = [], v = [], y, b, x, S = [];
280
- a !== void 0 && (f = I(a, "title"), p = I(a, "publisher"), m = I(a, "rights"), h = I(a, "date"), g = L(a, "creator"), _ = L(a, "language"), v = L(a, "subject"), y = B(a, "rendition:layout"), b = B(a, "rendition:flow"), x = B(a, "rendition:spread"), S.push(...de(a)));
281
- let C = z({
576
+ let c = r?.attr["page-progression-direction"], l = c !== void 0 && c.trim().length > 0 ? c : void 0, u = r?.attr.toc, d = u !== void 0 && u.trim().length > 0 ? u.trim() : void 0, f, p, m, h, g, _ = [], v = [], y = [], b = [], x, S, C, w = [], T = [];
577
+ i !== void 0 && (f = K(i, "title"), p = K(i, "publisher"), m = K(i, "description"), h = K(i, "rights"), g = K(i, "date"), _ = q(i, "creator"), y = q(i, "language"), b = q(i, "subject"), x = Y(i, "rendition:layout"), S = Y(i, "rendition:flow"), C = Y(i, "rendition:spread"), w = He(i), v = We(i, w), T.push(...ze(i)));
578
+ let E = Ve({
282
579
  manifestItems: o,
283
- metadataEl: a
284
- }), w = V(t);
580
+ metadataEl: i
581
+ }), D = Ge(t);
285
582
  return {
286
583
  kind: "opf",
287
584
  manifestItems: o,
288
585
  spineRows: s,
289
586
  spineTocIdref: d,
290
- identifiers: S,
587
+ identifiers: T,
291
588
  title: f,
292
- creators: g,
589
+ creators: _,
590
+ contributors: v,
293
591
  publisher: p,
294
- rights: m,
295
- languages: _,
296
- subjects: v,
297
- date: h,
298
- coverHref: C,
299
- renditionLayoutMeta: y,
300
- renditionFlowMeta: b,
301
- renditionSpreadMeta: x,
592
+ description: m,
593
+ rights: h,
594
+ languages: y,
595
+ subjects: b,
596
+ date: g,
597
+ coverHref: E,
598
+ renditionLayoutMeta: x,
599
+ renditionFlowMeta: S,
600
+ renditionSpreadMeta: C,
302
601
  pageProgressionDirection: l,
303
- guide: w
602
+ guide: D,
603
+ metas: w
304
604
  };
305
605
  };
306
606
  //#endregion
307
607
  //#region src/opf/readArchiveOpf.ts
308
- async function W(e) {
309
- let { data: t, basePath: n } = D(e) || {};
608
+ async function X(e) {
609
+ let { data: t, basePath: n } = Me(e) || {};
310
610
  if (!(!t || t.dir)) return {
311
- opf: U(await b(t)),
611
+ opf: Ye(await x(t)),
312
612
  basePath: n
313
613
  };
314
614
  }
315
615
  //#endregion
316
- //#region src/apple/resolve.ts
317
- var me = (e) => ({
318
- gtin: void 0,
319
- isbn: void 0,
320
- readingDirection: void 0,
321
- renditionLayout: (e.displayOptions?.platform?.options?.find((e) => e.name === "fixed-layout")?.value)?.trim().toLowerCase() === "true" ? "pre-paginated" : void 0,
322
- title: void 0,
323
- authors: void 0,
324
- publisher: void 0,
325
- rights: void 0,
326
- languages: void 0,
327
- date: void 0,
328
- subjects: void 0
329
- }), he = /* @__PURE__ */ new Set([
330
- 8,
331
- 12,
332
- 13,
333
- 14
334
- ]), G = (e) => {
335
- if (e == null) return;
336
- let t = String(e).replace(/\D/g, "");
337
- if (!(t.length === 0 || !he.has(t.length))) return t;
338
- }, ge = /(?:97[89])?\d{9}[\dXx]/, K = (e) => {
339
- if (e == null) return;
340
- let t = String(e).trim().replace(/^urn:isbn:/i, "").replace(/^isbn[:\s-]*/i, ""), n = t.replace(/[^0-9Xx]/g, "");
341
- if (n.length === 10 || n.length === 13) return n.toUpperCase();
342
- let r = t.match(ge);
343
- if (r) return r[0].toUpperCase();
344
- }, _e = (e) => {
345
- switch (e.Manga) {
346
- case "YesAndRightToLeft": return "rtl";
347
- case "Yes":
348
- case "No": return "ltr";
349
- default: return;
350
- }
351
- }, q = (e) => {
352
- if (e === void 0) return;
353
- let t = e.trim();
354
- return t.length > 0 ? t : void 0;
355
- }, J = (e) => e === void 0 ? [] : e.split(",").map((e) => e.trim()).filter((e) => e.length > 0), Y = (e) => {
356
- let t = q(e);
357
- if (t === void 0 || !/^\d+$/.test(t)) return;
358
- let n = Number.parseInt(t, 10);
359
- return Number.isFinite(n) ? n : void 0;
360
- }, ve = (e) => {
361
- let t = Y(e.Year), n = Y(e.Month), r = Y(e.Day);
362
- if (!(t === void 0 && n === void 0 && r === void 0)) return {
363
- ...t === void 0 ? {} : { year: t },
364
- ...n === void 0 ? {} : { month: n },
365
- ...r === void 0 ? {} : { day: r }
366
- };
367
- }, ye = (e) => {
368
- let t = e.GTIN, n = q(e.LanguageISO), r = J(e.Writer), i = [...J(e.Genre), ...J(e.Tags)];
369
- return {
370
- gtin: G(t),
371
- isbn: K(t),
372
- readingDirection: _e(e),
373
- renditionLayout: void 0,
374
- title: q(e.Title),
375
- authors: r.length > 0 ? r : void 0,
376
- publisher: q(e.Publisher),
377
- rights: void 0,
378
- languages: n === void 0 ? void 0 : [n],
379
- date: ve(e),
380
- subjects: i.length > 0 ? i : void 0
381
- };
382
- }, be = (e) => ({
383
- gtin: void 0,
384
- isbn: void 0,
385
- readingDirection: void 0,
386
- renditionLayout: e.renditionLayout,
387
- title: void 0,
388
- authors: void 0,
389
- publisher: void 0,
390
- rights: void 0,
391
- languages: void 0,
392
- date: void 0,
393
- subjects: void 0
394
- }), X = (e) => {
616
+ //#region src/utils/parseW3cDtfDate.ts
617
+ var Xe = (e) => {
395
618
  if (e === void 0) return;
396
619
  let t = e.trim().match(/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?/);
397
620
  if (t === null) return;
@@ -401,26 +624,174 @@ var me = (e) => ({
401
624
  ...r === void 0 ? {} : { month: Number.parseInt(r, 10) },
402
625
  ...i === void 0 ? {} : { day: Number.parseInt(i, 10) }
403
626
  };
404
- }, xe = (e) => {
405
- for (let t of e) if (t.scheme !== void 0 && t.scheme.trim().toLowerCase() === "isbn" && K(t.value) !== void 0) return t.value;
406
- for (let t of e) if (K(t.value) !== void 0) return t.value;
407
- }, Se = (e) => {
408
- let t = e.pageProgressionDirection?.trim().toLowerCase(), n = t === "ltr" || t === "rtl" ? t : void 0, r = e.renditionLayoutMeta?.trim().toLowerCase(), i = r === "reflowable" || r === "pre-paginated" ? r : void 0, a = xe(e.identifiers);
627
+ }, Ze = {
628
+ manifestItems: "readingOrder",
629
+ spineRows: "readingOrder",
630
+ spineTocIdref: "toc",
631
+ identifiers: "identifiers",
632
+ title: "title",
633
+ creators: "contributors",
634
+ contributors: "contributors",
635
+ publisher: "publisher",
636
+ description: "description",
637
+ rights: "rights",
638
+ languages: "languages",
639
+ subjects: "subjects",
640
+ date: "published",
641
+ coverHref: "cover",
642
+ renditionLayoutMeta: "renditionLayout",
643
+ renditionFlowMeta: "renditionFlow",
644
+ renditionSpreadMeta: "renditionSpread",
645
+ pageProgressionDirection: "readingDirection",
646
+ guide: "guide",
647
+ metas: "properties"
648
+ }, Qe = (e) => {
649
+ for (let t of e) if (t.scheme !== void 0 && t.scheme.trim().toLowerCase() === "isbn" && A(t.value) !== void 0) return t.value;
650
+ for (let t of e) if (A(t.value) !== void 0) return t.value;
651
+ }, $e = {
652
+ art: "artist",
653
+ aut: "author",
654
+ clr: "colorist",
655
+ ctb: "contributor",
656
+ edt: "editor",
657
+ ill: "illustrator",
658
+ nrt: "narrator",
659
+ trl: "translator"
660
+ }, et = (e) => e.contributors.map((e) => {
661
+ let t = e.roles.map((e) => $e[e.trim().toLowerCase()] ?? e);
662
+ return D({
663
+ name: e.name,
664
+ roles: t.length > 0 ? t : [e.source === "creator" ? "author" : "contributor"],
665
+ sortAs: e.fileAs
666
+ });
667
+ }), tt = (e, t) => e.refines !== void 0 && e.refines.replace(/^#/, "") === t, nt = (e) => {
668
+ let t = e?.trim();
669
+ if (t === void 0 || !/^\d+(\.\d+)?$/.test(t)) return;
670
+ let n = Number.parseFloat(t);
671
+ return Number.isFinite(n) ? n : void 0;
672
+ }, rt = (e) => {
673
+ let t = [], n = [];
674
+ for (let r of e) {
675
+ if (r.property !== "belongs-to-collection" || r.value === void 0) continue;
676
+ let i = r.id, a = (t) => i === void 0 ? void 0 : e.find((e) => tt(e, i) && e.property === t && e.value !== void 0)?.value, o = a("collection-type")?.trim().toLowerCase(), s = D({
677
+ name: r.value,
678
+ position: nt(a("group-position"))
679
+ });
680
+ o === "series" ? t.push(s) : n.push(s);
681
+ }
682
+ if (t.length === 0) {
683
+ let n = e.find((e) => e.name?.toLowerCase() === "calibre:series" && e.content !== void 0)?.content;
684
+ n !== void 0 && t.push(D({
685
+ name: n,
686
+ position: nt(e.find((e) => e.name?.toLowerCase() === "calibre:series_index")?.content)
687
+ }));
688
+ }
409
689
  return {
410
- gtin: G(a),
411
- isbn: K(a),
412
- readingDirection: n,
413
- renditionLayout: i,
690
+ series: t,
691
+ collection: n
692
+ };
693
+ }, it = (e) => {
694
+ let t = e?.trim();
695
+ if (t === "scrolled-continuous" || t === "scrolled-doc" || t === "paginated" || t === "auto") return t;
696
+ }, at = (e) => {
697
+ let t = e?.trim();
698
+ if (t === "none" || t === "landscape" || t === "portrait" || t === "both" || t === "auto") return t;
699
+ }, ot = (e) => {
700
+ let t = e.pageProgressionDirection?.trim().toLowerCase(), n = t === "ltr" || t === "rtl" ? t : void 0, r = e.renditionLayoutMeta?.trim().toLowerCase(), i = r === "reflowable" || r === "pre-paginated" ? r : void 0, a = Qe(e.identifiers), o = et(e), { series: s, collection: c } = rt(e.metas), l = s.length > 0 || c.length > 0 ? D({
701
+ series: s.length > 0 ? s : void 0,
702
+ collection: c.length > 0 ? c : void 0
703
+ }) : void 0;
704
+ return D({
414
705
  title: e.title,
415
- authors: e.creators.length > 0 ? [...e.creators] : void 0,
706
+ description: e.description,
416
707
  publisher: e.publisher,
417
708
  rights: e.rights,
418
709
  languages: e.languages.length > 0 ? [...e.languages] : void 0,
419
- date: X(e.date),
420
- subjects: e.subjects.length > 0 ? [...e.subjects] : void 0
421
- };
422
- }, Ce = (e) => e.kind === "comicInfo" ? ye(e) : e.kind === "kobo" ? be(e) : e.kind === "apple" ? me(e) : Se(e), we = (e) => {
423
- let t = [...e.records].sort((e, t) => f(e.uri, t.uri)), n = (e, t, r, i, a) => {
710
+ subjects: e.subjects.length > 0 ? [...e.subjects] : void 0,
711
+ contributors: o.length > 0 ? o : void 0,
712
+ published: Xe(e.date),
713
+ readingDirection: n,
714
+ renditionLayout: i,
715
+ renditionFlow: it(e.renditionFlowMeta),
716
+ renditionSpread: at(e.renditionSpreadMeta),
717
+ gtin: k(a),
718
+ isbn: A(a),
719
+ identifiers: e.identifiers.length > 0 ? e.identifiers.map(({ value: e, scheme: t }) => D({
720
+ value: e,
721
+ scheme: t
722
+ })) : void 0,
723
+ belongsTo: l,
724
+ properties: e.metas.length > 0 ? [...e.metas] : void 0
725
+ });
726
+ }, st = (e) => {
727
+ let t = e?.trim().toLowerCase();
728
+ return t === "reflowable" || t === "pre-paginated" ? t : void 0;
729
+ }, ct = (e, t) => /^https?:\/\//.test(e) ? e : t ? `${t}/${e}` : e, lt = (e, { opf: t, basePath: n }) => {
730
+ let r = st(t.renditionLayoutMeta), i = t.spineRows.map((t) => {
731
+ let r = ct(t.href, n);
732
+ return {
733
+ row: t,
734
+ uri: r,
735
+ record: w(e, r)
736
+ };
737
+ }), a = i.reduce((e, { record: t }) => e + (t?.size ?? 0), 0);
738
+ return i.map(({ row: e, uri: n, record: i }) => D({
739
+ uri: n,
740
+ id: e.id,
741
+ mediaType: e.mediaType ?? i?.encodingFormat,
742
+ size: i?.size,
743
+ renditionLayout: e.renditionLayout ?? r,
744
+ renditionFlow: e.renditionFlow,
745
+ pageSpreadLeft: e.pageSpreadLeft,
746
+ pageSpreadRight: e.pageSpreadRight,
747
+ progressionWeight: a > 0 ? (i?.size ?? 0) / a : 1 / t.spineRows.length
748
+ }));
749
+ }, ut = O.toLowerCase(), dt = v.toLowerCase(), ft = (e) => {
750
+ let t = e.basename.toLowerCase();
751
+ return t === ut || t === dt || e.uri.endsWith("com.kobobooks.display-options.xml") || t.endsWith(".db");
752
+ }, pt = (e) => {
753
+ let t = e.records.filter(S).filter((e) => !ft(e));
754
+ return t.map((e) => {
755
+ let n = h(e.encodingFormat ?? "") || l(e.basename);
756
+ return D({
757
+ uri: e.uri,
758
+ mediaType: n,
759
+ size: e.size,
760
+ renditionLayout: n !== void 0 && p(n) ? "pre-paginated" : void 0,
761
+ progressionWeight: 1 / t.length
762
+ });
763
+ });
764
+ }, Z = async (e, { opf: t } = {}) => {
765
+ let n = t ?? await X(e).catch(() => void 0);
766
+ return n ? lt(e, n) : pt(e);
767
+ }, mt = (e) => e.kind === "comicInfo" ? I(e) : e.kind === "kobo" ? B(e) : e.kind === "apple" ? te(e) : ot(e), ht = (e) => {
768
+ let t = e.opf === void 0 ? void 0 : ot(e.opf), n = e.comicInfo === void 0 ? void 0 : I(e.comicInfo), r = e.apple === void 0 ? void 0 : te(e.apple), i = e.kobo === void 0 ? void 0 : B(e.kobo), a = [...t?.identifiers ?? [], ...n?.identifiers ?? []];
769
+ return D({
770
+ title: t?.title ?? n?.title,
771
+ description: t?.description ?? n?.description,
772
+ publisher: t?.publisher ?? n?.publisher,
773
+ imprint: n?.imprint,
774
+ rights: t?.rights,
775
+ languages: t?.languages ?? n?.languages,
776
+ subjects: t?.subjects ?? n?.subjects,
777
+ contributors: t?.contributors ?? n?.contributors,
778
+ published: t?.published ?? n?.published,
779
+ readingDirection: n?.readingDirection ?? t?.readingDirection,
780
+ renditionLayout: t?.renditionLayout ?? r?.renditionLayout ?? i?.renditionLayout,
781
+ renditionFlow: t?.renditionFlow,
782
+ renditionSpread: t?.renditionSpread,
783
+ numberOfPages: n?.numberOfPages,
784
+ gtin: t?.gtin ?? n?.gtin,
785
+ isbn: t?.isbn ?? n?.isbn,
786
+ identifiers: a.length > 0 ? a : void 0,
787
+ belongsTo: t?.belongsTo ?? n?.belongsTo,
788
+ properties: t?.properties,
789
+ comic: n?.comic,
790
+ apple: r?.apple,
791
+ kobo: i?.kobo
792
+ });
793
+ }, gt = (e) => {
794
+ let t = [...e.records].sort((e, t) => g(e.uri, t.uri)), n = (e, t, r, i, a) => {
424
795
  let o = e.find((e) => e.title === t), [s, ...c] = r;
425
796
  return o ? s ? [...e.filter((e) => e !== o), {
426
797
  ...o,
@@ -448,72 +819,104 @@ var me = (e) => ({
448
819
  let a = encodeURI(t.uri).replace(/#/g, "%23").replace(/\?/g, "%3F").replace(/\/$/, ""), o = t.uri.replace(/\/$/, "");
449
820
  return n(e, r, i, a, o);
450
821
  }, []);
451
- }, Z = (e) => e ? e.children.map((e) => e instanceof o ? e.text : e instanceof a ? Z(e) : "").join("").trim() : "", Te = (e) => k(e.properties).includes("nav"), Q = (e, { basePath: t }) => {
822
+ }, _t = (e) => e ? e.children.map((e) => e instanceof s ? e.text : e instanceof o ? _t(e) : "").join("").trim() : "", vt = (e) => H(e.properties).includes("nav"), yt = (e, { basePath: t }) => {
452
823
  let n = {
453
824
  contents: [],
454
825
  path: "",
455
826
  containerHref: "",
456
827
  title: ""
457
828
  }, r = e.childNamed("span") || e.childNamed("a");
458
- n.title = (r?.attr.title || r?.val.trim() || Z(r)) ?? "";
829
+ n.title = (r?.attr.title || r?.val.trim() || _t(r)) ?? "";
459
830
  let i = r?.name;
460
- i !== "a" && (r = e.descendantWithPath(`${i}.a`), r && (i = r.name.toLowerCase())), i === "a" && r?.attr.href && (n.path = p(t, r.attr.href), n.containerHref = n.path);
831
+ i !== "a" && (r = e.descendantWithPath(`${i}.a`), r && (i = r.name.toLowerCase())), i === "a" && r?.attr.href && (n.path = _(t, r.attr.href), n.containerHref = n.path);
461
832
  let a = e.childNamed("ol");
462
833
  if (a) {
463
834
  let e = a.childrenNamed("li");
464
- e && e.length > 0 && (n.contents = e.map((e) => Q(e, { basePath: t })));
835
+ e && e.length > 0 && (n.contents = e.map((e) => yt(e, { basePath: t })));
465
836
  }
466
837
  return n;
467
- }, Ee = (e, { basePath: t }) => {
838
+ }, bt = (e, { basePath: t }) => {
468
839
  let n = [], r;
469
- return e.descendantWithPath("body.nav.ol") ? r = e.descendantWithPath("body.nav.ol")?.children : e.descendantWithPath("body.section.nav.ol") && (r = e.descendantWithPath("body.section.nav.ol")?.children), r && r.length > 0 && r.filter((e) => e instanceof a && e.name === "li").forEach((e) => {
470
- n.push(Q(e, { basePath: t }));
840
+ return e.descendantWithPath("body.nav.ol") ? r = e.descendantWithPath("body.nav.ol")?.children : e.descendantWithPath("body.section.nav.ol") && (r = e.descendantWithPath("body.section.nav.ol")?.children), r && r.length > 0 && r.filter((e) => e instanceof o && e.name === "li").forEach((e) => {
841
+ n.push(yt(e, { basePath: t }));
471
842
  }), n;
472
- }, De = async (e, t) => {
473
- let n = e.manifestItems.find(Te);
843
+ }, xt = async (e, t) => {
844
+ let n = e.manifestItems.find(vt);
474
845
  if (n?.href) {
475
846
  let e = t.records.find((e) => e.uri.endsWith(n.href));
476
- if (e && !e.dir) return Ee(new i(await b(e)), { basePath: u(e.uri) });
847
+ if (e && !e.dir) return bt(new a(await x(e)), { basePath: d(e.uri) });
477
848
  }
478
- }, $ = (e, { opfBasePath: t, prefix: n }) => {
479
- let r = p(t, e?.childNamed(`${n}content`)?.attr.src || ""), i = {
849
+ }, St = (e, { opfBasePath: t, prefix: n }) => {
850
+ let r = _(t, e?.childNamed(`${n}content`)?.attr.src || ""), i = {
480
851
  title: e?.descendantWithPath(`${n}navLabel.${n}text`)?.val || "",
481
852
  path: r,
482
853
  containerHref: r,
483
854
  contents: []
484
855
  }, a = e.childrenNamed(`${n}navPoint`);
485
- return a && a.length > 0 && (i.contents = a.map((e) => $(e, {
856
+ return a && a.length > 0 && (i.contents = a.map((e) => St(e, {
486
857
  opfBasePath: t,
487
858
  prefix: n
488
859
  }))), i;
489
- }, Oe = (e, { opfBasePath: t }) => {
860
+ }, Ct = (e, { opfBasePath: t }) => {
490
861
  let n = [], r = e.name, i = "";
491
862
  return r.indexOf(":") !== -1 && (i = `${r.split(":")[0]}:`), e.childNamed(`${i}navMap`)?.childrenNamed(`${i}navPoint`).forEach((e) => {
492
- n.push($(e, {
863
+ n.push(St(e, {
493
864
  opfBasePath: t,
494
865
  prefix: i
495
866
  }));
496
867
  }), n;
497
- }, ke = async ({ opf: e, opfBasePath: t, archive: n }) => {
868
+ }, wt = async ({ opf: e, opfBasePath: t, archive: n }) => {
498
869
  let r = e.spineTocIdref;
499
870
  if (r) {
500
- let a = e.manifestItems.find((e) => e.id === r);
501
- if (a) {
502
- let e = `${t}${t === "" ? "" : "/"}${a.href}`, r = n.records.find((t) => t.uri.endsWith(e));
503
- if (r && !r.dir) return Oe(new i(await b(r)), { opfBasePath: t });
871
+ let i = e.manifestItems.find((e) => e.id === r);
872
+ if (i) {
873
+ let e = `${t}${t === "" ? "" : "/"}${i.href}`, r = n.records.find((t) => t.uri.endsWith(e));
874
+ if (r && !r.dir) return Ct(new a(await x(r)), { opfBasePath: t });
504
875
  }
505
876
  }
506
- }, Ae = async (e, { opf: t } = {}) => {
507
- let n = t ?? await W(e);
508
- if (n) return await De(n.opf, e) || await ke({
877
+ }, Q = async (e, { opf: t } = {}) => {
878
+ let n = t ?? await X(e);
879
+ if (n) return await xt(n.opf, e) || await wt({
509
880
  opf: n.opf,
510
881
  opfBasePath: n.basePath,
511
882
  archive: e
512
883
  }) || [];
513
- let r = we(e);
884
+ let r = gt(e);
514
885
  return r.length === 0 ? void 0 : r;
886
+ }, Tt = [
887
+ "metadata",
888
+ "readingOrder",
889
+ "toc"
890
+ ], $ = async (e, n) => {
891
+ try {
892
+ return await e();
893
+ } catch (e) {
894
+ t.error(`resolveArchive: unable to read ${n}`, e);
895
+ return;
896
+ }
897
+ }, Et = 1, Dt = async (e, t = {}) => {
898
+ let n = new Set(t.include ?? Tt), r = n.has("metadata"), i = n.has("sources"), a = n.has("readingOrder"), o = n.has("toc"), s = t.layoutScan === !0 && (r || a), c = r || i || a || o ? await $(() => X(e), "opf") : void 0, l = r || i || s, u = l ? await $(() => me(e), "comicInfo") : void 0, d = l ? await $(() => E(e), "apple") : void 0, f = l ? await $(() => z(e), "kobo") : void 0, p = r || s ? ht({
899
+ opf: c?.opf,
900
+ comicInfo: u,
901
+ apple: d,
902
+ kobo: f
903
+ }) : void 0, m = a || s ? await Z(e, { opf: c }) : void 0;
904
+ s && p !== void 0 && m !== void 0 && p.renditionLayout === "reflowable" && m.every((e) => e.renditionLayout === "reflowable") && await V(e, m) && (p = {
905
+ ...p,
906
+ renditionLayout: "pre-paginated"
907
+ }, m = m.map((e) => ({
908
+ ...e,
909
+ renditionLayout: "pre-paginated"
910
+ })));
911
+ let h = o ? await $(() => Q(e, { opf: c }), "toc") : void 0, g = { version: Et };
912
+ return r && p !== void 0 && (g.metadata = p), a && m !== void 0 && (g.readingOrder = m), o && h !== void 0 && (g.toc = h), i && (g.sources = D({
913
+ opf: c,
914
+ comicInfo: u,
915
+ apple: d,
916
+ kobo: f
917
+ })), g;
515
918
  };
516
919
  //#endregion
517
- export { m as APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME, w as COMIC_INFO_FILENAME, T as COMIC_INFO_MANGA_VALUES, oe as KOBO_DISPLAY_OPTIONS_FILENAME, r as arrayBufferFileAccessors, n as blobFileAccessors, e as createArchive, _ as createArchiveFromArrayBufferList, t as createArchiveFromEntries, v as createArchiveFromText, y as createArchiveFromUrls, C as getArchiveFileRecordByUri, ae as getArchiveHasComicInfo, D as getArchiveOpfInfo, le as getSpineItemFilesFromArchive, ue as isArchiveEpub, E as isComicInfoManga, S as isDirectoryRecord, x as isFileRecord, G as normalizeGtin, K as normalizeIsbn, g as parseAppleDisplayOptionsXml, re as parseComicInfo, ce as parseKoboXml, U as parseOpf, X as parseW3cDtfDate, W as readArchiveOpf, b as readRecordAsText, Ce as resolveArchiveMetadata, Ae as resolveArchiveToc, k as tokenizeXmlSpaceSeparatedList };
920
+ export { v as APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME, O as COMIC_INFO_FILENAME, ae as COMIC_INFO_KNOWN_FIELDS, fe as COMIC_INFO_MANGA_VALUES, L as KOBO_DISPLAY_OPTIONS_FILENAME, ee as appleMetadataHomes, i as arrayBufferFileAccessors, r as blobFileAccessors, _e as comicInfoMetadataHomes, e as createArchive, ne as createArchiveFromArrayBufferList, n as createArchiveFromEntries, re as createArchiveFromText, ie as createArchiveFromUrls, w as getArchiveFileRecordByUri, de as getArchiveHasComicInfo, Me as getArchiveOpfInfo, Ne as getSpineItemFilesFromArchive, Fe as isArchiveEpub, pe as isComicInfoManga, C as isDirectoryRecord, S as isFileRecord, Ae as koboMetadataHomes, k as normalizeGtin, A as normalizeIsbn, Ze as opfMetadataHomes, b as parseAppleDisplayOptionsXml, le as parseComicInfo, R as parseKoboXml, Ye as parseOpf, Xe as parseW3cDtfDate, E as readArchiveApple, me as readArchiveComicInfo, z as readArchiveKobo, X as readArchiveOpf, x as readRecordAsText, V as readingOrderDocumentsAllHaveViewport, Dt as resolveArchive, mt as resolveArchiveMetadata, Z as resolveArchiveReadingOrder, Q as resolveArchiveToc, ht as resolveMetadata, H as tokenizeXmlSpaceSeparatedList };
518
921
 
519
922
  //# sourceMappingURL=index.js.map