vue-book-reader 1.2.0 → 1.2.2

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,4 +1,4 @@
1
- import { f as fromElements, p as parse, t as toElement, a as toRange } from "./view-CYFf95aY.js";
1
+ import { f as fromElements, p as parse, t as toElement, a as toRange } from "./view-T2ghn1aG.js";
2
2
  const NS = {
3
3
  CONTAINER: "urn:oasis:names:tc:opendocument:xmlns:container",
4
4
  XHTML: "http://www.w3.org/1999/xhtml",
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const view = require("./view-BnLmYRtr.cjs");
3
+ const view = require("./view--95lChht.cjs");
4
4
  const NS$2 = {
5
5
  CONTAINER: "urn:oasis:names:tc:opendocument:xmlns:container",
6
6
  XHTML: "http://www.w3.org/1999/xhtml",
package/lib/index.css CHANGED
@@ -1,14 +1,14 @@
1
1
 
2
- .reader[data-v-84542497] {
2
+ .reader[data-v-1350176b] {
3
3
  position: absolute;
4
4
  inset: 50px 50px 20px;
5
5
  }
6
- .viewHolder[data-v-84542497] {
6
+ .viewHolder[data-v-1350176b] {
7
7
  height: 100%;
8
8
  width: 100%;
9
9
  position: relative;
10
10
  }
11
- #viewer[data-v-84542497] {
11
+ #viewer[data-v-1350176b] {
12
12
  height: 100%;
13
13
  }
14
14
 
@@ -0,0 +1,137 @@
1
+ const render = async (page, doc, zoom) => {
2
+ const scale = zoom * devicePixelRatio;
3
+ doc.documentElement.style.transform = `scale(${1 / devicePixelRatio})`;
4
+ doc.documentElement.style.transformOrigin = "top left";
5
+ doc.documentElement.style.setProperty("--scale-factor", scale);
6
+ const viewport = page.getViewport({ scale });
7
+ const canvas = document.createElement("canvas");
8
+ canvas.height = viewport.height;
9
+ canvas.width = viewport.width;
10
+ const canvasContext = canvas.getContext("2d");
11
+ await page.render({ canvasContext, viewport }).promise;
12
+ doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas));
13
+ const container = doc.querySelector(".textLayer");
14
+ const textLayer = new pdfjsLib.TextLayer({
15
+ textContentSource: await page.streamTextContent(),
16
+ container,
17
+ viewport
18
+ });
19
+ await textLayer.render();
20
+ for (const canvas2 of document.querySelectorAll(".hiddenCanvasElement"))
21
+ Object.assign(canvas2.style, {
22
+ position: "absolute",
23
+ top: "0",
24
+ left: "0",
25
+ width: "0",
26
+ height: "0",
27
+ display: "none"
28
+ });
29
+ const endOfContent = document.createElement("div");
30
+ endOfContent.className = "endOfContent";
31
+ container.append(endOfContent);
32
+ container.onpointerdown = () => container.classList.add("selecting");
33
+ container.onpointerup = () => container.classList.remove("selecting");
34
+ const div = doc.querySelector(".annotationLayer");
35
+ await new pdfjsLib.AnnotationLayer({ page, viewport, div }).render({
36
+ annotations: await page.getAnnotations(),
37
+ linkService: {
38
+ goToDestination: () => {
39
+ },
40
+ getDestinationHash: (dest) => JSON.stringify(dest),
41
+ addLinkAttributes: (link, url) => link.href = url
42
+ }
43
+ });
44
+ };
45
+ const renderPage = async (page, getImageBlob) => {
46
+ const viewport = page.getViewport({ scale: 1 });
47
+ if (getImageBlob) {
48
+ const canvas = document.createElement("canvas");
49
+ canvas.height = viewport.height;
50
+ canvas.width = viewport.width;
51
+ const canvasContext = canvas.getContext("2d");
52
+ await page.render({ canvasContext, viewport }).promise;
53
+ return new Promise((resolve) => canvas.toBlob(resolve));
54
+ }
55
+ const src = URL.createObjectURL(new Blob([`
56
+ <!DOCTYPE html>
57
+ <html lang="en">
58
+ <meta charset="utf-8">
59
+ <meta name="viewport" content="width=${viewport.width}, height=${viewport.height}">
60
+ <style>
61
+ html, body {
62
+ margin: 0;
63
+ padding: 0;
64
+ }
65
+ </style>
66
+ <div id="canvas"></div>
67
+ <div class="textLayer"></div>
68
+ <div class="annotationLayer"></div>
69
+ `], { type: "text/html" }));
70
+ const onZoom = ({ doc, scale }) => render(page, doc, scale);
71
+ return { src, onZoom };
72
+ };
73
+ const makeTOCItem = (item) => ({
74
+ label: item.title,
75
+ href: JSON.stringify(item.dest),
76
+ subitems: item.items.length ? item.items.map(makeTOCItem) : null
77
+ });
78
+ const makePDF = async (file) => {
79
+ const transport = new pdfjsLib.PDFDataRangeTransport(file.size, []);
80
+ transport.requestDataRange = (begin, end) => {
81
+ file.slice(begin, end).arrayBuffer().then((chunk) => {
82
+ transport.onDataRange(begin, chunk);
83
+ });
84
+ };
85
+ const pdf = await pdfjsLib.getDocument({
86
+ range: transport,
87
+ isEvalSupported: false
88
+ }).promise;
89
+ const book = { rendition: { layout: "pre-paginated" } };
90
+ const { metadata, info } = await pdf.getMetadata() ?? {};
91
+ book.metadata = {
92
+ title: (metadata == null ? void 0 : metadata.get("dc:title")) ?? (info == null ? void 0 : info.Title),
93
+ author: (metadata == null ? void 0 : metadata.get("dc:creator")) ?? (info == null ? void 0 : info.Author),
94
+ contributor: metadata == null ? void 0 : metadata.get("dc:contributor"),
95
+ description: (metadata == null ? void 0 : metadata.get("dc:description")) ?? (info == null ? void 0 : info.Subject),
96
+ language: metadata == null ? void 0 : metadata.get("dc:language"),
97
+ publisher: metadata == null ? void 0 : metadata.get("dc:publisher"),
98
+ subject: metadata == null ? void 0 : metadata.get("dc:subject"),
99
+ identifier: metadata == null ? void 0 : metadata.get("dc:identifier"),
100
+ source: metadata == null ? void 0 : metadata.get("dc:source"),
101
+ rights: metadata == null ? void 0 : metadata.get("dc:rights")
102
+ };
103
+ const outline = await pdf.getOutline();
104
+ book.toc = outline == null ? void 0 : outline.map(makeTOCItem);
105
+ const cache = /* @__PURE__ */ new Map();
106
+ book.sections = Array.from({ length: pdf.numPages }).map((_, i) => ({
107
+ id: i,
108
+ load: async () => {
109
+ const cached = cache.get(i);
110
+ if (cached) return cached;
111
+ const url = await renderPage(await pdf.getPage(i + 1));
112
+ cache.set(i, url);
113
+ return url;
114
+ },
115
+ size: 1e3
116
+ }));
117
+ book.isExternal = (uri) => /^\w+:/i.test(uri);
118
+ book.resolveHref = async (href) => {
119
+ const parsed = JSON.parse(href);
120
+ const dest = typeof parsed === "string" ? await pdf.getDestination(parsed) : parsed;
121
+ const index = await pdf.getPageIndex(dest[0]);
122
+ return { index };
123
+ };
124
+ book.splitTOCHref = async (href) => {
125
+ const parsed = JSON.parse(href);
126
+ const dest = typeof parsed === "string" ? await pdf.getDestination(parsed) : parsed;
127
+ const index = await pdf.getPageIndex(dest[0]);
128
+ return [index, null];
129
+ };
130
+ book.getTOCFragment = (doc) => doc.documentElement;
131
+ book.getCover = async () => renderPage(await pdf.getPage(1), true);
132
+ book.destroy = () => pdf.destroy();
133
+ return book;
134
+ };
135
+ export {
136
+ makePDF
137
+ };
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const render = async (page, doc, zoom) => {
4
+ const scale = zoom * devicePixelRatio;
5
+ doc.documentElement.style.transform = `scale(${1 / devicePixelRatio})`;
6
+ doc.documentElement.style.transformOrigin = "top left";
7
+ doc.documentElement.style.setProperty("--scale-factor", scale);
8
+ const viewport = page.getViewport({ scale });
9
+ const canvas = document.createElement("canvas");
10
+ canvas.height = viewport.height;
11
+ canvas.width = viewport.width;
12
+ const canvasContext = canvas.getContext("2d");
13
+ await page.render({ canvasContext, viewport }).promise;
14
+ doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas));
15
+ const container = doc.querySelector(".textLayer");
16
+ const textLayer = new pdfjsLib.TextLayer({
17
+ textContentSource: await page.streamTextContent(),
18
+ container,
19
+ viewport
20
+ });
21
+ await textLayer.render();
22
+ for (const canvas2 of document.querySelectorAll(".hiddenCanvasElement"))
23
+ Object.assign(canvas2.style, {
24
+ position: "absolute",
25
+ top: "0",
26
+ left: "0",
27
+ width: "0",
28
+ height: "0",
29
+ display: "none"
30
+ });
31
+ const endOfContent = document.createElement("div");
32
+ endOfContent.className = "endOfContent";
33
+ container.append(endOfContent);
34
+ container.onpointerdown = () => container.classList.add("selecting");
35
+ container.onpointerup = () => container.classList.remove("selecting");
36
+ const div = doc.querySelector(".annotationLayer");
37
+ await new pdfjsLib.AnnotationLayer({ page, viewport, div }).render({
38
+ annotations: await page.getAnnotations(),
39
+ linkService: {
40
+ goToDestination: () => {
41
+ },
42
+ getDestinationHash: (dest) => JSON.stringify(dest),
43
+ addLinkAttributes: (link, url) => link.href = url
44
+ }
45
+ });
46
+ };
47
+ const renderPage = async (page, getImageBlob) => {
48
+ const viewport = page.getViewport({ scale: 1 });
49
+ if (getImageBlob) {
50
+ const canvas = document.createElement("canvas");
51
+ canvas.height = viewport.height;
52
+ canvas.width = viewport.width;
53
+ const canvasContext = canvas.getContext("2d");
54
+ await page.render({ canvasContext, viewport }).promise;
55
+ return new Promise((resolve) => canvas.toBlob(resolve));
56
+ }
57
+ const src = URL.createObjectURL(new Blob([`
58
+ <!DOCTYPE html>
59
+ <html lang="en">
60
+ <meta charset="utf-8">
61
+ <meta name="viewport" content="width=${viewport.width}, height=${viewport.height}">
62
+ <style>
63
+ html, body {
64
+ margin: 0;
65
+ padding: 0;
66
+ }
67
+ </style>
68
+ <div id="canvas"></div>
69
+ <div class="textLayer"></div>
70
+ <div class="annotationLayer"></div>
71
+ `], { type: "text/html" }));
72
+ const onZoom = ({ doc, scale }) => render(page, doc, scale);
73
+ return { src, onZoom };
74
+ };
75
+ const makeTOCItem = (item) => ({
76
+ label: item.title,
77
+ href: JSON.stringify(item.dest),
78
+ subitems: item.items.length ? item.items.map(makeTOCItem) : null
79
+ });
80
+ const makePDF = async (file) => {
81
+ const transport = new pdfjsLib.PDFDataRangeTransport(file.size, []);
82
+ transport.requestDataRange = (begin, end) => {
83
+ file.slice(begin, end).arrayBuffer().then((chunk) => {
84
+ transport.onDataRange(begin, chunk);
85
+ });
86
+ };
87
+ const pdf = await pdfjsLib.getDocument({
88
+ range: transport,
89
+ isEvalSupported: false
90
+ }).promise;
91
+ const book = { rendition: { layout: "pre-paginated" } };
92
+ const { metadata, info } = await pdf.getMetadata() ?? {};
93
+ book.metadata = {
94
+ title: (metadata == null ? void 0 : metadata.get("dc:title")) ?? (info == null ? void 0 : info.Title),
95
+ author: (metadata == null ? void 0 : metadata.get("dc:creator")) ?? (info == null ? void 0 : info.Author),
96
+ contributor: metadata == null ? void 0 : metadata.get("dc:contributor"),
97
+ description: (metadata == null ? void 0 : metadata.get("dc:description")) ?? (info == null ? void 0 : info.Subject),
98
+ language: metadata == null ? void 0 : metadata.get("dc:language"),
99
+ publisher: metadata == null ? void 0 : metadata.get("dc:publisher"),
100
+ subject: metadata == null ? void 0 : metadata.get("dc:subject"),
101
+ identifier: metadata == null ? void 0 : metadata.get("dc:identifier"),
102
+ source: metadata == null ? void 0 : metadata.get("dc:source"),
103
+ rights: metadata == null ? void 0 : metadata.get("dc:rights")
104
+ };
105
+ const outline = await pdf.getOutline();
106
+ book.toc = outline == null ? void 0 : outline.map(makeTOCItem);
107
+ const cache = /* @__PURE__ */ new Map();
108
+ book.sections = Array.from({ length: pdf.numPages }).map((_, i) => ({
109
+ id: i,
110
+ load: async () => {
111
+ const cached = cache.get(i);
112
+ if (cached) return cached;
113
+ const url = await renderPage(await pdf.getPage(i + 1));
114
+ cache.set(i, url);
115
+ return url;
116
+ },
117
+ size: 1e3
118
+ }));
119
+ book.isExternal = (uri) => /^\w+:/i.test(uri);
120
+ book.resolveHref = async (href) => {
121
+ const parsed = JSON.parse(href);
122
+ const dest = typeof parsed === "string" ? await pdf.getDestination(parsed) : parsed;
123
+ const index = await pdf.getPageIndex(dest[0]);
124
+ return { index };
125
+ };
126
+ book.splitTOCHref = async (href) => {
127
+ const parsed = JSON.parse(href);
128
+ const dest = typeof parsed === "string" ? await pdf.getDestination(parsed) : parsed;
129
+ const index = await pdf.getPageIndex(dest[0]);
130
+ return [index, null];
131
+ };
132
+ book.getTOCFragment = (doc) => doc.documentElement;
133
+ book.getCover = async () => renderPage(await pdf.getPage(1), true);
134
+ book.destroy = () => pdf.destroy();
135
+ return book;
136
+ };
137
+ exports.makePDF = makePDF;
@@ -639,7 +639,7 @@ const makeBook = async (file) => {
639
639
  let book;
640
640
  if (file.isDirectory) {
641
641
  const loader = await makeDirectoryLoader(file);
642
- const { EPUB } = await Promise.resolve().then(() => require("./epub-vdEGl08n.cjs"));
642
+ const { EPUB } = await Promise.resolve().then(() => require("./epub-CeaB7HuF.cjs"));
643
643
  book = await new EPUB(loader).init();
644
644
  } else if (!file.size) throw new NotFoundError("File not found");
645
645
  else if (await isZip(file)) {
@@ -654,11 +654,11 @@ const makeBook = async (file) => {
654
654
  const blob = await loader.loadBlob((entry ?? entries[0]).filename);
655
655
  book = await makeFB2(blob);
656
656
  } else {
657
- const { EPUB } = await Promise.resolve().then(() => require("./epub-vdEGl08n.cjs"));
657
+ const { EPUB } = await Promise.resolve().then(() => require("./epub-CeaB7HuF.cjs"));
658
658
  book = await new EPUB(loader).init();
659
659
  }
660
660
  } else if (await isPDF(file)) {
661
- const { makePDF } = await Promise.resolve().then(() => require("./pdf-DnX8DSje.cjs"));
661
+ const { makePDF } = await Promise.resolve().then(() => require("./pdf-vLpNJVyc.cjs"));
662
662
  book = await makePDF(file);
663
663
  } else {
664
664
  const { isMOBI, MOBI } = await Promise.resolve().then(() => require("./mobi-BKd5Fggk.cjs"));
@@ -638,7 +638,7 @@ const makeBook = async (file) => {
638
638
  let book;
639
639
  if (file.isDirectory) {
640
640
  const loader = await makeDirectoryLoader(file);
641
- const { EPUB } = await import("./epub-B0LRZmXL.js");
641
+ const { EPUB } = await import("./epub-2C1S8RbY.js");
642
642
  book = await new EPUB(loader).init();
643
643
  } else if (!file.size) throw new NotFoundError("File not found");
644
644
  else if (await isZip(file)) {
@@ -653,11 +653,11 @@ const makeBook = async (file) => {
653
653
  const blob = await loader.loadBlob((entry ?? entries[0]).filename);
654
654
  book = await makeFB2(blob);
655
655
  } else {
656
- const { EPUB } = await import("./epub-B0LRZmXL.js");
656
+ const { EPUB } = await import("./epub-2C1S8RbY.js");
657
657
  book = await new EPUB(loader).init();
658
658
  }
659
659
  } else if (await isPDF(file)) {
660
- const { makePDF } = await import("./pdf-DkZg4fBR.js");
660
+ const { makePDF } = await import("./pdf-DYzRHfF8.js");
661
661
  book = await makePDF(file);
662
662
  } else {
663
663
  const { isMOBI, MOBI } = await import("./mobi-M3pI3jcR.js");
@@ -1060,10 +1060,10 @@ const _sfc_main$2 = {
1060
1060
  view.close();
1061
1061
  } else {
1062
1062
  view = document.createElement("foliate-view");
1063
- getRendition(view);
1064
1063
  viewer.value.append(view);
1065
1064
  }
1066
1065
  await view.open(url.value);
1066
+ getRendition(view);
1067
1067
  initReader();
1068
1068
  }
1069
1069
  } catch (error) {
@@ -1110,7 +1110,7 @@ const _sfc_main$2 = {
1110
1110
  });
1111
1111
  vue.onMounted(async () => {
1112
1112
  if (!customElements.get("foliate-view")) {
1113
- await Promise.resolve().then(() => require("./view-BnLmYRtr.cjs")).then((n) => n.view);
1113
+ await Promise.resolve().then(() => require("./view--95lChht.cjs")).then((n) => n.view);
1114
1114
  }
1115
1115
  initBook();
1116
1116
  });
@@ -1137,7 +1137,7 @@ const _sfc_main$2 = {
1137
1137
  };
1138
1138
  }
1139
1139
  };
1140
- const BookView = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-84542497"]]);
1140
+ const BookView = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-1350176b"]]);
1141
1141
  const _hoisted_1$1 = ["onClick"];
1142
1142
  const _hoisted_2$1 = { key: 0 };
1143
1143
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
@@ -1058,10 +1058,10 @@ const _sfc_main$2 = {
1058
1058
  view.close();
1059
1059
  } else {
1060
1060
  view = document.createElement("foliate-view");
1061
- getRendition(view);
1062
1061
  viewer.value.append(view);
1063
1062
  }
1064
1063
  await view.open(url.value);
1064
+ getRendition(view);
1065
1065
  initReader();
1066
1066
  }
1067
1067
  } catch (error) {
@@ -1108,7 +1108,7 @@ const _sfc_main$2 = {
1108
1108
  });
1109
1109
  onMounted(async () => {
1110
1110
  if (!customElements.get("foliate-view")) {
1111
- await import("./view-CYFf95aY.js").then((n) => n.v);
1111
+ await import("./view-T2ghn1aG.js").then((n) => n.v);
1112
1112
  }
1113
1113
  initBook();
1114
1114
  });
@@ -1135,7 +1135,7 @@ const _sfc_main$2 = {
1135
1135
  };
1136
1136
  }
1137
1137
  };
1138
- const BookView = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-84542497"]]);
1138
+ const BookView = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-1350176b"]]);
1139
1139
  const _hoisted_1$1 = ["onClick"];
1140
1140
  const _hoisted_2$1 = { key: 0 };
1141
1141
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({