@prose-reader/streamer 1.60.0 → 1.61.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,3 +1,3 @@
1
- export declare const configure: ({ enableReport }?: {
1
+ export declare const configure: ({ enableReport, }?: {
2
2
  enableReport?: boolean;
3
3
  }) => void;
@@ -1,6 +1,6 @@
1
1
  import { Archive } from '../archives/types';
2
2
 
3
- export declare const getSpineItemFilesFromArchive: ({ archive }: {
3
+ export declare const getSpineItemFilesFromArchive: ({ archive, }: {
4
4
  archive: Archive;
5
5
  }) => Promise<{
6
6
  dir: boolean;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { generateResourceFromArchive, generateResourceFromError } from './generators/resources';
1
+ export { generateResourceFromArchive, generateResourceFromError, } from './generators/resources';
2
2
  export { generateManifestFromArchive } from './generators/manifest';
3
3
  export { getArchiveOpfInfo } from './archives/getArchiveOpfInfo';
4
4
  export { createArchiveFromUrls } from './archives/createArchiveFromUrls';
package/dist/index.js CHANGED
@@ -25,7 +25,10 @@ const h = {
25
25
  },
26
26
  metric: (e, n = 1 / 0) => {
27
27
  const i = typeof e == "number" ? e : e.duration;
28
- b && (e.duration <= n ? console.log("[prose-reader-streamer] [metric] ", `${e.name} took ${i}ms`) : console.warn(
28
+ b && (e.duration <= n ? console.log(
29
+ "[prose-reader-streamer] [metric] ",
30
+ `${e.name} took ${i}ms`
31
+ ) : console.warn(
29
32
  "[prose-reader-streamer] [metric] ",
30
33
  `${e.name} took ${e.duration}ms which is above the ${n}ms target for this function`
31
34
  ));
@@ -47,9 +50,13 @@ const h = {
47
50
  return !!(n && n.attr.name === "calibre:cover");
48
51
  }, Q = (e) => {
49
52
  var n, i, t;
50
- return (t = (i = (n = e.descendantWithPath("body")) == null ? void 0 : n.descendantWithPath("div")) == null ? void 0 : i.childrenNamed("svg")) == null ? void 0 : t.find((a) => a.attr.width === "100%" && a.attr.preserveAspectRatio === "none");
53
+ return (t = (i = (n = e.descendantWithPath("body")) == null ? void 0 : n.descendantWithPath("div")) == null ? void 0 : i.childrenNamed("svg")) == null ? void 0 : t.find(
54
+ (a) => a.attr.width === "100%" && a.attr.preserveAspectRatio === "none"
55
+ );
51
56
  }, Z = ({ archive: e, resourcePath: n }) => async (i) => {
52
- const t = Object.values(e.files).find((a) => a.uri === n);
57
+ const t = Object.values(e.files).find(
58
+ (a) => a.uri === n
59
+ );
53
60
  if (t != null && t.basename.endsWith(".xhtml")) {
54
61
  const a = i.body ?? await t.string(), r = new Y(a);
55
62
  if (K(r)) {
@@ -62,9 +69,14 @@ const h = {
62
69
  }
63
70
  return i;
64
71
  }, E = ({ archive: e, resourcePath: n }) => async (i) => Z({ archive: e, resourcePath: n })(i), ee = ({ archive: e, resourcePath: n }) => async (i) => {
65
- const t = Object.values(e.files).find((a) => a.uri === n);
72
+ const t = Object.values(e.files).find(
73
+ (a) => a.uri === n
74
+ );
66
75
  if (t != null && t.basename.endsWith(".css")) {
67
- const r = (i.body ?? await t.string()).replaceAll("-webkit-writing-mode", "writing-mode");
76
+ const r = (i.body ?? await t.string()).replaceAll(
77
+ "-webkit-writing-mode",
78
+ "writing-mode"
79
+ );
68
80
  return {
69
81
  ...i,
70
82
  body: r
@@ -91,25 +103,35 @@ const h = {
91
103
  const o = e.childNamed("ol");
92
104
  if (o) {
93
105
  const s = o.childrenNamed("li");
94
- s && s.length > 0 && (t.contents = s.map((l) => O(l, { opfBasePath: n, baseUrl: i })));
106
+ s && s.length > 0 && (t.contents = s.map(
107
+ (l) => O(l, { opfBasePath: n, baseUrl: i })
108
+ ));
95
109
  }
96
110
  return t;
97
111
  }, te = (e, { opfBasePath: n, baseUrl: i }) => {
98
112
  var r, o;
99
113
  const t = [];
100
114
  let a;
101
- return e.descendantWithPath("body.nav.ol") ? a = (r = e.descendantWithPath("body.nav.ol")) == null ? void 0 : r.children : e.descendantWithPath("body.section.nav.ol") && (a = (o = e.descendantWithPath("body.section.nav.ol")) == null ? void 0 : o.children), a && a.length > 0 && a.filter((s) => s.name === "li").forEach((s) => t.push(O(s, { opfBasePath: n, baseUrl: i }))), t;
115
+ return e.descendantWithPath("body.nav.ol") ? a = (r = e.descendantWithPath("body.nav.ol")) == null ? void 0 : r.children : e.descendantWithPath("body.section.nav.ol") && (a = (o = e.descendantWithPath("body.section.nav.ol")) == null ? void 0 : o.children), a && a.length > 0 && a.filter((s) => s.name === "li").forEach(
116
+ (s) => t.push(O(s, { opfBasePath: n, baseUrl: i }))
117
+ ), t;
102
118
  }, ne = async (e, n, { opfBasePath: i, baseUrl: t }) => {
103
119
  var r;
104
120
  const a = (r = e.childNamed("manifest")) == null ? void 0 : r.childrenNamed("item").find((o) => o.attr.properties === "nav");
105
121
  if (a) {
106
- const o = Object.values(n.files).find((s) => s.uri.endsWith(a.attr.href || ""));
122
+ const o = Object.values(n.files).find(
123
+ (s) => s.uri.endsWith(a.attr.href || "")
124
+ );
107
125
  if (o) {
108
126
  const s = new g.XmlDocument(await o.string());
109
127
  return te(s, { opfBasePath: i, baseUrl: t });
110
128
  }
111
129
  }
112
- }, j = (e, { opfBasePath: n, baseUrl: i, prefix: t }) => {
130
+ }, j = (e, {
131
+ opfBasePath: n,
132
+ baseUrl: i,
133
+ prefix: t
134
+ }) => {
113
135
  var s, l;
114
136
  const a = ((s = e == null ? void 0 : e.childNamed(`${t}content`)) == null ? void 0 : s.attr.src) || "", r = {
115
137
  title: ((l = e == null ? void 0 : e.descendantWithPath(`${t}navLabel.${t}text`)) == null ? void 0 : l.val) || "",
@@ -117,12 +139,16 @@ const h = {
117
139
  href: v(i, n, a),
118
140
  contents: []
119
141
  }, o = e.childrenNamed(`${t}navPoint`);
120
- return o && o.length > 0 && (r.contents = o.map((p) => j(p, { opfBasePath: n, baseUrl: i, prefix: t }))), r;
142
+ return o && o.length > 0 && (r.contents = o.map(
143
+ (p) => j(p, { opfBasePath: n, baseUrl: i, prefix: t })
144
+ )), r;
121
145
  }, re = (e, { opfBasePath: n, baseUrl: i }) => {
122
146
  var o;
123
147
  const t = [], a = e.name;
124
148
  let r = "";
125
- return a.indexOf(":") !== -1 && (r = a.split(":")[0] + ":"), (o = e.childNamed(`${r}navMap`)) == null || o.childrenNamed(`${r}navPoint`).forEach((s) => t.push(j(s, { opfBasePath: n, baseUrl: i, prefix: r }))), t;
149
+ return a.indexOf(":") !== -1 && (r = a.split(":")[0] + ":"), (o = e.childNamed(`${r}navMap`)) == null || o.childrenNamed(`${r}navPoint`).forEach(
150
+ (s) => t.push(j(s, { opfBasePath: n, baseUrl: i, prefix: r }))
151
+ ), t;
126
152
  }, ae = async ({
127
153
  opfData: e,
128
154
  opfBasePath: n,
@@ -134,7 +160,9 @@ const h = {
134
160
  if (r) {
135
161
  const s = (o = e.childNamed("manifest")) == null ? void 0 : o.childrenNamed("item").find((l) => l.attr.id === r);
136
162
  if (s) {
137
- const l = `${n}${n === "" ? "" : "/"}${s.attr.href}`, p = Object.values(t.files).find((m) => m.uri.endsWith(l));
163
+ const l = `${n}${n === "" ? "" : "/"}${s.attr.href}`, p = Object.values(t.files).find(
164
+ (m) => m.uri.endsWith(l)
165
+ );
138
166
  if (p) {
139
167
  const m = new g.XmlDocument(await p.string());
140
168
  return re(m, { opfBasePath: n, baseUrl: i });
@@ -162,7 +190,9 @@ const h = {
162
190
  }
163
191
  })
164
192
  ), n;
165
- }, z = async ({ archive: e }) => {
193
+ }, z = async ({
194
+ archive: e
195
+ }) => {
166
196
  const { data: n, basePath: i } = F(e) || {}, t = await (n == null ? void 0 : n.string());
167
197
  if (!t) return [];
168
198
  const a = new g.XmlDocument(t), r = a.childNamed("manifest"), o = a.childNamed("spine"), s = o == null ? void 0 : o.childrenNamed("itemref").map((m) => m.attr.idref), l = (r == null ? void 0 : r.childrenNamed("item").filter((m) => s.includes(m.attr.id || ""))) || [];
@@ -182,7 +212,16 @@ const h = {
182
212
  return i;
183
213
  const o = await t.string();
184
214
  h.log(o, r);
185
- const s = new g.XmlDocument(o), l = await ie(s, e, { baseUrl: n }) || [], p = s.childNamed("metadata"), m = s.childNamed("manifest"), f = s.childNamed("spine"), x = s.childNamed("guide"), w = p == null ? void 0 : p.childNamed("dc:title"), $ = (p == null ? void 0 : p.childrenNamed("meta")) || [], N = $.find((d) => d.attr.property === "rendition:layout"), T = $.find((d) => d.attr.property === "rendition:flow"), I = $.find((d) => d.attr.property === "rendition:spread"), k = N == null ? void 0 : N.val, B = T == null ? void 0 : T.val, M = I == null ? void 0 : I.val, _ = (w == null ? void 0 : w.val) || ((D = e.files.find(({ dir: d }) => d)) == null ? void 0 : D.basename) || "", H = f == null ? void 0 : f.attr["page-progression-direction"], U = (await z({ archive: e })).reduce((d, c) => c.size + d, 0);
215
+ const s = new g.XmlDocument(o), l = await ie(s, e, { baseUrl: n }) || [], p = s.childNamed("metadata"), m = s.childNamed("manifest"), f = s.childNamed("spine"), x = s.childNamed("guide"), w = p == null ? void 0 : p.childNamed("dc:title"), $ = (p == null ? void 0 : p.childrenNamed("meta")) || [], N = $.find(
216
+ (d) => d.attr.property === "rendition:layout"
217
+ ), T = $.find(
218
+ (d) => d.attr.property === "rendition:flow"
219
+ ), I = $.find(
220
+ (d) => d.attr.property === "rendition:spread"
221
+ ), k = N == null ? void 0 : N.val, B = T == null ? void 0 : T.val, M = I == null ? void 0 : I.val, _ = (w == null ? void 0 : w.val) || ((D = e.files.find(({ dir: d }) => d)) == null ? void 0 : D.basename) || "", H = f == null ? void 0 : f.attr["page-progression-direction"], U = (await z({ archive: e })).reduce(
222
+ (d, c) => c.size + d,
223
+ 0
224
+ );
186
225
  return {
187
226
  filename: e.filename,
188
227
  nav: {
@@ -200,7 +239,9 @@ const h = {
200
239
  id: (c == null ? void 0 : c.attr.id) || "",
201
240
  href: (R = c == null ? void 0 : c.attr.href) != null && R.startsWith("https://") ? c == null ? void 0 : c.attr.href : a ? `${S}${a}/${c == null ? void 0 : c.attr.href}` : `${S}${c == null ? void 0 : c.attr.href}`,
202
241
  renditionLayout: k || "reflowable",
203
- ...A.find((u) => u === "rendition:layout-reflowable") && {
242
+ ...A.find(
243
+ (u) => u === "rendition:layout-reflowable"
244
+ ) && {
204
245
  renditionLayout: "reflowable"
205
246
  },
206
247
  progressionWeight: G / U,
@@ -241,7 +282,9 @@ const h = {
241
282
  if (e.endsWith(".svg"))
242
283
  return "image/svg+xml";
243
284
  }, le = ({ archive: e, resourcePath: n }) => async (i) => {
244
- const t = Object.values(e.files).find((r) => r.uri === n);
285
+ const t = Object.values(e.files).find(
286
+ (r) => r.uri === n
287
+ );
245
288
  if (!t) return i;
246
289
  const a = await ce(e, n);
247
290
  return {
@@ -260,7 +303,9 @@ const h = {
260
303
  }
261
304
  };
262
305
  }, Fe = async (e, n) => {
263
- const i = Object.values(e.files).find((r) => r.uri === n);
306
+ const i = Object.values(e.files).find(
307
+ (r) => r.uri === n
308
+ );
264
309
  if (!i)
265
310
  throw new Error("no file found");
266
311
  const t = {
@@ -327,12 +372,16 @@ const h = {
327
372
  };
328
373
  }, pe = ({ archive: e }) => async (n) => {
329
374
  var r;
330
- const i = e.files.find((o) => o.basename.toLowerCase() === "comicinfo.xml");
375
+ const i = e.files.find(
376
+ (o) => o.basename.toLowerCase() === "comicinfo.xml"
377
+ );
331
378
  if (!i)
332
379
  return n;
333
380
  const t = {
334
381
  ...n,
335
- spineItems: n.spineItems.filter((o) => !o.id.toLowerCase().endsWith("comicinfo.xml"))
382
+ spineItems: n.spineItems.filter(
383
+ (o) => !o.id.toLowerCase().endsWith("comicinfo.xml")
384
+ )
336
385
  }, a = await i.string();
337
386
  try {
338
387
  const s = ((r = new g.XmlDocument(a).childNamed("Manga")) == null ? void 0 : r.val) || "unknown";
@@ -379,7 +428,11 @@ const h = {
379
428
  return 1;
380
429
  }, ge = ({ archive: e, baseUrl: n }) => async (i) => {
381
430
  if (i.nav) return i;
382
- const t = [...e.files].sort((r, o) => C(r.uri, o.uri)), a = Object.values(t).reduce(
431
+ const t = [...e.files].sort(
432
+ (r, o) => C(r.uri, o.uri)
433
+ ), a = Object.values(
434
+ t
435
+ ).reduce(
383
436
  (r, o) => {
384
437
  const s = o.uri.split("/");
385
438
  return !o.dir && s.length > 1 && s.forEach((p, m) => {
@@ -433,7 +486,9 @@ const h = {
433
486
  ${n != null && n.useRenditionFlow ? '<meta property="rendition:flow">scrolled-continuous</meta>' : ""}
434
487
  </metadata>
435
488
  <manifest>
436
- ${e.map((r) => `<item id="${y(r)}" href="${r}" media-type="${L(r)}"/>`).join(`
489
+ ${e.map(
490
+ (r) => `<item id="${y(r)}" href="${r}" media-type="${L(r)}"/>`
491
+ ).join(`
437
492
  `)}
438
493
  </manifest>
439
494
  <spine>
@@ -549,14 +604,19 @@ const h = {
549
604
  blob: async () => new Blob([await a.data()]),
550
605
  string: async () => {
551
606
  const r = await a.data();
552
- return String.fromCharCode.apply(null, Array.from(new Uint16Array(r)));
607
+ return String.fromCharCode.apply(
608
+ null,
609
+ Array.from(new Uint16Array(r))
610
+ );
553
611
  },
554
612
  base64: async () => "",
555
613
  size: a.size
556
614
  })),
557
615
  close: () => Promise.resolve()
558
616
  };
559
- }, ke = ({ enableReport: e } = {}) => {
617
+ }, ke = ({
618
+ enableReport: e
619
+ } = {}) => {
560
620
  h.enable(!!e);
561
621
  };
562
622
  export {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find((node) => node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\")\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(`-webkit-writing-mode`, `writing-mode`)\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`)),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) => sortByTitleComparator(a.uri, b.uri))\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(filesSortedByAlpha).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (\n performanceEntry: { name: string; duration: number },\n targetDuration = Infinity,\n ) => {\n const duration =\n typeof performanceEntry === `number`\n ? performanceEntry\n : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${duration}ms`,\n )\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(\n name: string,\n targetDuration = 10,\n functionToMeasure: F,\n ) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find(\n (node) =>\n node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\",\n )\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(\n `-webkit-writing-mode`,\n `writing-mode`,\n )\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (\n li: XmlElement,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) =>\n extractNavChapter(child, { opfBasePath, baseUrl }),\n )\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (\n doc: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) =>\n toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })),\n )\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) =>\n item.uri.endsWith(navItem.attr.href || ``),\n )\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n {\n opfBasePath,\n baseUrl,\n prefix,\n }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title:\n point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) =>\n mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }),\n )\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (\n ncxData: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) =>\n toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })),\n )\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) =>\n item.uri.endsWith(ncxPath),\n )\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { baseUrl }: { baseUrl: string },\n) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc\n .childNamed(`platform`)\n ?.childNamed(`option`)\n if (\n optionElement?.attr?.name === `fixed-layout` &&\n optionElement.val === `true`\n ) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({\n archive,\n}: {\n archive: Archive\n}) => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm\n ?.childrenNamed(`itemref`)\n .map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm\n ?.childrenNamed(`item`)\n .filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties =\n | `rendition:layout-reflowable`\n | `page-spread-left`\n | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:layout`,\n )\n const metaElmWithRenditionFlow = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:flow`,\n )\n const metaElmWithRenditionSpread = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:spread`,\n )\n\n const publisherRenditionLayout = metaElmWithRendition?.val as\n | `reflowable`\n | `pre-paginated`\n | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as\n | `auto`\n | undefined\n\n const title =\n titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[\n `page-progression-direction`\n ] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce(\n (size, file) => file.size + size,\n 0,\n )\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout:\n publisherRenditionLayout ||\n koboInformation.renditionLayout ||\n `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) ||\n []) as SpineItemProperties[]\n const itemSize =\n archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find(\n (property) => property === `rendition:layout-reflowable`,\n ) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft:\n properties.some((property) => property === `page-spread-left`) ||\n undefined,\n pageSpreadRight:\n properties.some((property) => property === `page-spread-right`) ||\n undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))\n ?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (\n archive: Archive,\n resourcePath: string,\n) => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title:\n archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find(\n (file) => file.basename.toLowerCase() === `comicinfo.xml`,\n )\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems.filter(\n (item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`),\n ),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal =\n (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" &&\n manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) =>\n sortByTitleComparator(a.uri, b.uri),\n )\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(\n filesSortedByAlpha,\n ).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (\n archive: Archive,\n { baseUrl = `` }: { baseUrl?: string } = {},\n) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) =>\n uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (\n urls: string[],\n options?: { useRenditionFlow: boolean },\n): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map(\n (url) =>\n `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`,\n )\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(\n null,\n Array.from(new Uint16Array(data)),\n )\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({\n enableReport,\n}: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find((node) => node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\")\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(`-webkit-writing-mode`, `writing-mode`)\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`)),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) => sortByTitleComparator(a.uri, b.uri))\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(filesSortedByAlpha).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (\n performanceEntry: { name: string; duration: number },\n targetDuration = Infinity,\n ) => {\n const duration =\n typeof performanceEntry === `number`\n ? performanceEntry\n : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${duration}ms`,\n )\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(\n name: string,\n targetDuration = 10,\n functionToMeasure: F,\n ) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find(\n (node) =>\n node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\",\n )\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(\n `-webkit-writing-mode`,\n `writing-mode`,\n )\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (\n li: XmlElement,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) =>\n extractNavChapter(child, { opfBasePath, baseUrl }),\n )\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (\n doc: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) =>\n toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })),\n )\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) =>\n item.uri.endsWith(navItem.attr.href || ``),\n )\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n {\n opfBasePath,\n baseUrl,\n prefix,\n }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title:\n point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) =>\n mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }),\n )\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (\n ncxData: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) =>\n toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })),\n )\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) =>\n item.uri.endsWith(ncxPath),\n )\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { baseUrl }: { baseUrl: string },\n) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc\n .childNamed(`platform`)\n ?.childNamed(`option`)\n if (\n optionElement?.attr?.name === `fixed-layout` &&\n optionElement.val === `true`\n ) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({\n archive,\n}: {\n archive: Archive\n}) => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm\n ?.childrenNamed(`itemref`)\n .map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm\n ?.childrenNamed(`item`)\n .filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties =\n | `rendition:layout-reflowable`\n | `page-spread-left`\n | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:layout`,\n )\n const metaElmWithRenditionFlow = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:flow`,\n )\n const metaElmWithRenditionSpread = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:spread`,\n )\n\n const publisherRenditionLayout = metaElmWithRendition?.val as\n | `reflowable`\n | `pre-paginated`\n | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as\n | `auto`\n | undefined\n\n const title =\n titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[\n `page-progression-direction`\n ] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce(\n (size, file) => file.size + size,\n 0,\n )\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout:\n publisherRenditionLayout ||\n koboInformation.renditionLayout ||\n `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) ||\n []) as SpineItemProperties[]\n const itemSize =\n archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find(\n (property) => property === `rendition:layout-reflowable`,\n ) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft:\n properties.some((property) => property === `page-spread-left`) ||\n undefined,\n pageSpreadRight:\n properties.some((property) => property === `page-spread-right`) ||\n undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))\n ?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (\n archive: Archive,\n resourcePath: string,\n) => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title:\n archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find(\n (file) => file.basename.toLowerCase() === `comicinfo.xml`,\n )\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems.filter(\n (item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`),\n ),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal =\n (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" &&\n manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) =>\n sortByTitleComparator(a.uri, b.uri),\n )\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(\n filesSortedByAlpha,\n ).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (\n archive: Archive,\n { baseUrl = `` }: { baseUrl?: string } = {},\n) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) =>\n uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (\n urls: string[],\n options?: { useRenditionFlow: boolean },\n): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map(\n (url) =>\n `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`,\n )\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(\n null,\n Array.from(new Uint16Array(data)),\n )\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({\n enableReport,\n}: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/streamer",
3
- "version": "1.60.0",
3
+ "version": "1.61.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -24,13 +24,13 @@
24
24
  "test:watch": "vitest watch"
25
25
  },
26
26
  "dependencies": {
27
- "@prose-reader/shared": "^1.60.0"
27
+ "@prose-reader/shared": "^1.61.0"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "buffer": "^6.0.3",
31
31
  "xmldoc": "^1.1.2"
32
32
  },
33
- "gitHead": "b4ec027f088e083a6f66c77dcef3b3e585802763",
33
+ "gitHead": "3236a7970b14582c47340ed53bf307877fcab0a2",
34
34
  "devDependencies": {
35
35
  "buffer": "^6.0.3",
36
36
  "xmldoc": "^1.2.0"