vue-book-reader 1.2.2 → 1.2.4

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,137 +0,0 @@
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
- };
@@ -1,137 +0,0 @@
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;
@@ -1,115 +0,0 @@
1
- const CONTEXT_LENGTH = 50;
2
- const normalizeWhitespace = (str) => str.replace(/\s+/g, " ");
3
- const makeExcerpt = (strs, { startIndex, startOffset, endIndex, endOffset }) => {
4
- const start = strs[startIndex];
5
- const end = strs[endIndex];
6
- const match = start === end ? start.slice(startOffset, endOffset) : start.slice(startOffset) + strs.slice(start + 1, end).join("") + end.slice(0, endOffset);
7
- const trimmedStart = normalizeWhitespace(start.slice(0, startOffset)).trimStart();
8
- const trimmedEnd = normalizeWhitespace(end.slice(endOffset)).trimEnd();
9
- const ellipsisPre = trimmedStart.length < CONTEXT_LENGTH ? "" : "…";
10
- const ellipsisPost = trimmedEnd.length < CONTEXT_LENGTH ? "" : "…";
11
- const pre = `${ellipsisPre}${trimmedStart.slice(-CONTEXT_LENGTH)}`;
12
- const post = `${trimmedEnd.slice(0, CONTEXT_LENGTH)}${ellipsisPost}`;
13
- return { pre, match, post };
14
- };
15
- const simpleSearch = function* (strs, query, options = {}) {
16
- const { locales = "en", sensitivity } = options;
17
- const matchCase = sensitivity === "variant";
18
- const haystack = strs.join("");
19
- const lowerHaystack = matchCase ? haystack : haystack.toLocaleLowerCase(locales);
20
- const needle = matchCase ? query : query.toLocaleLowerCase(locales);
21
- const needleLength = needle.length;
22
- let index = -1;
23
- let strIndex = -1;
24
- let sum = 0;
25
- do {
26
- index = lowerHaystack.indexOf(needle, index + 1);
27
- if (index > -1) {
28
- while (sum <= index) sum += strs[++strIndex].length;
29
- const startIndex = strIndex;
30
- const startOffset = index - (sum - strs[strIndex].length);
31
- const end = index + needleLength;
32
- while (sum <= end) sum += strs[++strIndex].length;
33
- const endIndex = strIndex;
34
- const endOffset = end - (sum - strs[strIndex].length);
35
- const range = { startIndex, startOffset, endIndex, endOffset };
36
- yield { range, excerpt: makeExcerpt(strs, range) };
37
- }
38
- } while (index > -1);
39
- };
40
- const segmenterSearch = function* (strs, query, options = {}) {
41
- var _a;
42
- const { locales = "en", granularity = "word", sensitivity = "base" } = options;
43
- let segmenter, collator;
44
- try {
45
- segmenter = new Intl.Segmenter(locales, { usage: "search", granularity });
46
- collator = new Intl.Collator(locales, { sensitivity });
47
- } catch (e) {
48
- console.warn(e);
49
- segmenter = new Intl.Segmenter("en", { usage: "search", granularity });
50
- collator = new Intl.Collator("en", { sensitivity });
51
- }
52
- const queryLength = Array.from(segmenter.segment(query)).length;
53
- const substrArr = [];
54
- let strIndex = 0;
55
- let segments = segmenter.segment(strs[strIndex])[Symbol.iterator]();
56
- main: while (strIndex < strs.length) {
57
- while (substrArr.length < queryLength) {
58
- const { done, value } = segments.next();
59
- if (done) {
60
- strIndex++;
61
- if (strIndex < strs.length) {
62
- segments = segmenter.segment(strs[strIndex])[Symbol.iterator]();
63
- continue;
64
- } else break main;
65
- }
66
- const { index, segment } = value;
67
- if (!/[^\p{Format}]/u.test(segment)) continue;
68
- if (/\s/u.test(segment)) {
69
- if (!/\s/u.test((_a = substrArr[substrArr.length - 1]) == null ? void 0 : _a.segment))
70
- substrArr.push({ strIndex, index, segment: " " });
71
- continue;
72
- }
73
- value.strIndex = strIndex;
74
- substrArr.push(value);
75
- }
76
- const substr = substrArr.map((x) => x.segment).join("");
77
- if (collator.compare(query, substr) === 0) {
78
- const endIndex = strIndex;
79
- const lastSeg = substrArr[substrArr.length - 1];
80
- const endOffset = lastSeg.index + lastSeg.segment.length;
81
- const startIndex = substrArr[0].strIndex;
82
- const startOffset = substrArr[0].index;
83
- const range = { startIndex, startOffset, endIndex, endOffset };
84
- yield { range, excerpt: makeExcerpt(strs, range) };
85
- }
86
- substrArr.shift();
87
- }
88
- };
89
- const search = (strs, query, options) => {
90
- const { granularity = "grapheme", sensitivity = "base" } = options;
91
- if (!(Intl == null ? void 0 : Intl.Segmenter) || granularity === "grapheme" && (sensitivity === "variant" || sensitivity === "accent"))
92
- return simpleSearch(strs, query, options);
93
- return segmenterSearch(strs, query, options);
94
- };
95
- const searchMatcher = (textWalker, opts) => {
96
- const { defaultLocale, matchCase, matchDiacritics, matchWholeWords, acceptNode } = opts;
97
- return function* (doc, query) {
98
- const iter = textWalker(doc, function* (strs, makeRange) {
99
- for (const result of search(strs, query, {
100
- locales: doc.body.lang || doc.documentElement.lang || defaultLocale || "en",
101
- granularity: matchWholeWords ? "word" : "grapheme",
102
- sensitivity: matchDiacritics && matchCase ? "variant" : matchDiacritics && !matchCase ? "accent" : !matchDiacritics && matchCase ? "case" : "base"
103
- })) {
104
- const { startIndex, startOffset, endIndex, endOffset } = result.range;
105
- result.range = makeRange(startIndex, startOffset, endIndex, endOffset);
106
- yield result;
107
- }
108
- }, acceptNode);
109
- for (const result of iter) yield result;
110
- };
111
- };
112
- export {
113
- search,
114
- searchMatcher
115
- };
@@ -1,115 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const CONTEXT_LENGTH = 50;
4
- const normalizeWhitespace = (str) => str.replace(/\s+/g, " ");
5
- const makeExcerpt = (strs, { startIndex, startOffset, endIndex, endOffset }) => {
6
- const start = strs[startIndex];
7
- const end = strs[endIndex];
8
- const match = start === end ? start.slice(startOffset, endOffset) : start.slice(startOffset) + strs.slice(start + 1, end).join("") + end.slice(0, endOffset);
9
- const trimmedStart = normalizeWhitespace(start.slice(0, startOffset)).trimStart();
10
- const trimmedEnd = normalizeWhitespace(end.slice(endOffset)).trimEnd();
11
- const ellipsisPre = trimmedStart.length < CONTEXT_LENGTH ? "" : "…";
12
- const ellipsisPost = trimmedEnd.length < CONTEXT_LENGTH ? "" : "…";
13
- const pre = `${ellipsisPre}${trimmedStart.slice(-CONTEXT_LENGTH)}`;
14
- const post = `${trimmedEnd.slice(0, CONTEXT_LENGTH)}${ellipsisPost}`;
15
- return { pre, match, post };
16
- };
17
- const simpleSearch = function* (strs, query, options = {}) {
18
- const { locales = "en", sensitivity } = options;
19
- const matchCase = sensitivity === "variant";
20
- const haystack = strs.join("");
21
- const lowerHaystack = matchCase ? haystack : haystack.toLocaleLowerCase(locales);
22
- const needle = matchCase ? query : query.toLocaleLowerCase(locales);
23
- const needleLength = needle.length;
24
- let index = -1;
25
- let strIndex = -1;
26
- let sum = 0;
27
- do {
28
- index = lowerHaystack.indexOf(needle, index + 1);
29
- if (index > -1) {
30
- while (sum <= index) sum += strs[++strIndex].length;
31
- const startIndex = strIndex;
32
- const startOffset = index - (sum - strs[strIndex].length);
33
- const end = index + needleLength;
34
- while (sum <= end) sum += strs[++strIndex].length;
35
- const endIndex = strIndex;
36
- const endOffset = end - (sum - strs[strIndex].length);
37
- const range = { startIndex, startOffset, endIndex, endOffset };
38
- yield { range, excerpt: makeExcerpt(strs, range) };
39
- }
40
- } while (index > -1);
41
- };
42
- const segmenterSearch = function* (strs, query, options = {}) {
43
- var _a;
44
- const { locales = "en", granularity = "word", sensitivity = "base" } = options;
45
- let segmenter, collator;
46
- try {
47
- segmenter = new Intl.Segmenter(locales, { usage: "search", granularity });
48
- collator = new Intl.Collator(locales, { sensitivity });
49
- } catch (e) {
50
- console.warn(e);
51
- segmenter = new Intl.Segmenter("en", { usage: "search", granularity });
52
- collator = new Intl.Collator("en", { sensitivity });
53
- }
54
- const queryLength = Array.from(segmenter.segment(query)).length;
55
- const substrArr = [];
56
- let strIndex = 0;
57
- let segments = segmenter.segment(strs[strIndex])[Symbol.iterator]();
58
- main: while (strIndex < strs.length) {
59
- while (substrArr.length < queryLength) {
60
- const { done, value } = segments.next();
61
- if (done) {
62
- strIndex++;
63
- if (strIndex < strs.length) {
64
- segments = segmenter.segment(strs[strIndex])[Symbol.iterator]();
65
- continue;
66
- } else break main;
67
- }
68
- const { index, segment } = value;
69
- if (!/[^\p{Format}]/u.test(segment)) continue;
70
- if (/\s/u.test(segment)) {
71
- if (!/\s/u.test((_a = substrArr[substrArr.length - 1]) == null ? void 0 : _a.segment))
72
- substrArr.push({ strIndex, index, segment: " " });
73
- continue;
74
- }
75
- value.strIndex = strIndex;
76
- substrArr.push(value);
77
- }
78
- const substr = substrArr.map((x) => x.segment).join("");
79
- if (collator.compare(query, substr) === 0) {
80
- const endIndex = strIndex;
81
- const lastSeg = substrArr[substrArr.length - 1];
82
- const endOffset = lastSeg.index + lastSeg.segment.length;
83
- const startIndex = substrArr[0].strIndex;
84
- const startOffset = substrArr[0].index;
85
- const range = { startIndex, startOffset, endIndex, endOffset };
86
- yield { range, excerpt: makeExcerpt(strs, range) };
87
- }
88
- substrArr.shift();
89
- }
90
- };
91
- const search = (strs, query, options) => {
92
- const { granularity = "grapheme", sensitivity = "base" } = options;
93
- if (!(Intl == null ? void 0 : Intl.Segmenter) || granularity === "grapheme" && (sensitivity === "variant" || sensitivity === "accent"))
94
- return simpleSearch(strs, query, options);
95
- return segmenterSearch(strs, query, options);
96
- };
97
- const searchMatcher = (textWalker, opts) => {
98
- const { defaultLocale, matchCase, matchDiacritics, matchWholeWords, acceptNode } = opts;
99
- return function* (doc, query) {
100
- const iter = textWalker(doc, function* (strs, makeRange) {
101
- for (const result of search(strs, query, {
102
- locales: doc.body.lang || doc.documentElement.lang || defaultLocale || "en",
103
- granularity: matchWholeWords ? "word" : "grapheme",
104
- sensitivity: matchDiacritics && matchCase ? "variant" : matchDiacritics && !matchCase ? "accent" : !matchDiacritics && matchCase ? "case" : "base"
105
- })) {
106
- const { startIndex, startOffset, endIndex, endOffset } = result.range;
107
- result.range = makeRange(startIndex, startOffset, endIndex, endOffset);
108
- yield result;
109
- }
110
- }, acceptNode);
111
- for (const result of iter) yield result;
112
- };
113
- };
114
- exports.search = search;
115
- exports.searchMatcher = searchMatcher;