@nxgt/material-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +335 -0
  3. package/dist/chunks/index-0xc5q9tp.js +81 -0
  4. package/dist/chunks/index-0xc5q9tp.js.map +10 -0
  5. package/dist/chunks/index-2gcgcmc0.js +36 -0
  6. package/dist/chunks/index-2gcgcmc0.js.map +10 -0
  7. package/dist/chunks/index-3ca6xe71.js +36 -0
  8. package/dist/chunks/index-3ca6xe71.js.map +10 -0
  9. package/dist/chunks/index-5r6rzp43.js +90 -0
  10. package/dist/chunks/index-5r6rzp43.js.map +10 -0
  11. package/dist/chunks/index-6tn0wjsb.js +13 -0
  12. package/dist/chunks/index-6tn0wjsb.js.map +10 -0
  13. package/dist/chunks/index-8gf9e2d4.js +76 -0
  14. package/dist/chunks/index-8gf9e2d4.js.map +11 -0
  15. package/dist/chunks/index-eh0e5ex7.js +61 -0
  16. package/dist/chunks/index-eh0e5ex7.js.map +10 -0
  17. package/dist/chunks/index-g7rh8fpv.js +57 -0
  18. package/dist/chunks/index-g7rh8fpv.js.map +10 -0
  19. package/dist/chunks/index-h3vjydz7.js +113 -0
  20. package/dist/chunks/index-h3vjydz7.js.map +10 -0
  21. package/dist/chunks/index-paaaedrm.js +37 -0
  22. package/dist/chunks/index-paaaedrm.js.map +10 -0
  23. package/dist/chunks/index-w3ajz57t.js +72 -0
  24. package/dist/chunks/index-w3ajz57t.js.map +10 -0
  25. package/dist/chunks/index-z3yjh0a8.js +642 -0
  26. package/dist/chunks/index-z3yjh0a8.js.map +18 -0
  27. package/dist/index.d.ts +21 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +133 -0
  30. package/dist/index.js.map +9 -0
  31. package/dist/lib/currency-digits.d.ts +8 -0
  32. package/dist/lib/currency-digits.d.ts.map +1 -0
  33. package/dist/lib/currency-digits.js +24 -0
  34. package/dist/lib/currency-digits.js.map +10 -0
  35. package/dist/lib/field-blur-layers.d.ts +35 -0
  36. package/dist/lib/field-blur-layers.d.ts.map +1 -0
  37. package/dist/lib/field-blur-layers.js +52 -0
  38. package/dist/lib/field-blur-layers.js.map +10 -0
  39. package/dist/lib/pdf-download.d.ts +36 -0
  40. package/dist/lib/pdf-download.d.ts.map +1 -0
  41. package/dist/lib/pdf-download.js +15 -0
  42. package/dist/lib/pdf-download.js.map +9 -0
  43. package/dist/lib/pdf-file-name.d.ts +10 -0
  44. package/dist/lib/pdf-file-name.d.ts.map +1 -0
  45. package/dist/lib/pdf-file-name.js +12 -0
  46. package/dist/lib/pdf-file-name.js.map +9 -0
  47. package/dist/lib/pdf-source.d.ts +58 -0
  48. package/dist/lib/pdf-source.d.ts.map +1 -0
  49. package/dist/lib/pdf-source.js +21 -0
  50. package/dist/lib/pdf-source.js.map +9 -0
  51. package/dist/lib/print-format.utils.d.ts +72 -0
  52. package/dist/lib/print-format.utils.d.ts.map +1 -0
  53. package/dist/lib/print-format.utils.js +14 -0
  54. package/dist/lib/print-format.utils.js.map +9 -0
  55. package/dist/lib/print-fraction-digits.d.ts +13 -0
  56. package/dist/lib/print-fraction-digits.d.ts.map +1 -0
  57. package/dist/lib/print-fraction-digits.js +11 -0
  58. package/dist/lib/print-fraction-digits.js.map +9 -0
  59. package/dist/lib/print-table.utils.d.ts +69 -0
  60. package/dist/lib/print-table.utils.d.ts.map +1 -0
  61. package/dist/lib/print-table.utils.js +15 -0
  62. package/dist/lib/print-table.utils.js.map +9 -0
  63. package/dist/lib/print-value.utils.d.ts +41 -0
  64. package/dist/lib/print-value.utils.d.ts.map +1 -0
  65. package/dist/lib/print-value.utils.js +13 -0
  66. package/dist/lib/print-value.utils.js.map +9 -0
  67. package/dist/pdf/file-loader.d.ts +19 -0
  68. package/dist/pdf/file-loader.d.ts.map +1 -0
  69. package/dist/pdf/file-loader.js +11 -0
  70. package/dist/pdf/file-loader.js.map +9 -0
  71. package/dist/pdf/http.d.ts +23 -0
  72. package/dist/pdf/http.d.ts.map +1 -0
  73. package/dist/pdf/http.js +13 -0
  74. package/dist/pdf/http.js.map +9 -0
  75. package/dist/pdf/index.d.ts +12 -0
  76. package/dist/pdf/index.d.ts.map +1 -0
  77. package/dist/pdf/index.js +99 -0
  78. package/dist/pdf/index.js.map +9 -0
  79. package/dist/pdf/model/builders.d.ts +59 -0
  80. package/dist/pdf/model/builders.d.ts.map +1 -0
  81. package/dist/pdf/model/data-table.d.ts +25 -0
  82. package/dist/pdf/model/data-table.d.ts.map +1 -0
  83. package/dist/pdf/model/index.d.ts +5 -0
  84. package/dist/pdf/model/index.d.ts.map +1 -0
  85. package/dist/pdf/model/index.js +60 -0
  86. package/dist/pdf/model/index.js.map +9 -0
  87. package/dist/pdf/model/nodes.d.ts +135 -0
  88. package/dist/pdf/model/nodes.d.ts.map +1 -0
  89. package/dist/pdf/model/theme.d.ts +17 -0
  90. package/dist/pdf/model/theme.d.ts.map +1 -0
  91. package/dist/pdf/model/types.d.ts +124 -0
  92. package/dist/pdf/model/types.d.ts.map +1 -0
  93. package/dist/pdf/render/context.d.ts +51 -0
  94. package/dist/pdf/render/context.d.ts.map +1 -0
  95. package/dist/pdf/render/document.d.ts +22 -0
  96. package/dist/pdf/render/document.d.ts.map +1 -0
  97. package/dist/pdf/render/index.d.ts +9 -0
  98. package/dist/pdf/render/index.d.ts.map +1 -0
  99. package/dist/pdf/render/index.js +44 -0
  100. package/dist/pdf/render/index.js.map +9 -0
  101. package/dist/pdf/render/nodes/blocks.d.ts +20 -0
  102. package/dist/pdf/render/nodes/blocks.d.ts.map +1 -0
  103. package/dist/pdf/render/nodes/header.d.ts +15 -0
  104. package/dist/pdf/render/nodes/header.d.ts.map +1 -0
  105. package/dist/pdf/render/nodes/layout.d.ts +45 -0
  106. package/dist/pdf/render/nodes/layout.d.ts.map +1 -0
  107. package/dist/pdf/render/nodes/table.d.ts +15 -0
  108. package/dist/pdf/render/nodes/table.d.ts.map +1 -0
  109. package/dist/pdf/render/page.d.ts +31 -0
  110. package/dist/pdf/render/page.d.ts.map +1 -0
  111. package/dist/pdf/render/render-node.d.ts +11 -0
  112. package/dist/pdf/render/render-node.d.ts.map +1 -0
  113. package/dist/pdf/render/styles.d.ts +304 -0
  114. package/dist/pdf/render/styles.d.ts.map +1 -0
  115. package/dist/pdf-viewer/index.d.ts +14 -0
  116. package/dist/pdf-viewer/index.d.ts.map +1 -0
  117. package/dist/pdf-viewer/index.js +380 -0
  118. package/dist/pdf-viewer/index.js.map +15 -0
  119. package/dist/pdf-viewer/pdf-document-search.d.ts +44 -0
  120. package/dist/pdf-viewer/pdf-document-search.d.ts.map +1 -0
  121. package/dist/pdf-viewer/pdf-escape.d.ts +7 -0
  122. package/dist/pdf-viewer/pdf-escape.d.ts.map +1 -0
  123. package/dist/pdf-viewer/pdf-page-geometry.d.ts +62 -0
  124. package/dist/pdf-viewer/pdf-page-geometry.d.ts.map +1 -0
  125. package/dist/pdf-viewer/pdf-page-sizes.d.ts +38 -0
  126. package/dist/pdf-viewer/pdf-page-sizes.d.ts.map +1 -0
  127. package/dist/pdf-viewer/pdf-scroll-spy.d.ts +43 -0
  128. package/dist/pdf-viewer/pdf-scroll-spy.d.ts.map +1 -0
  129. package/dist/pdf-viewer/pdf-text-search.d.ts +26 -0
  130. package/dist/pdf-viewer/pdf-text-search.d.ts.map +1 -0
  131. package/dist/vite/index.d.ts +81 -0
  132. package/dist/vite/index.d.ts.map +1 -0
  133. package/dist/vite/index.js +31 -0
  134. package/dist/vite/index.js.map +10 -0
  135. package/docs/README.md +9 -0
  136. package/docs/roadmap.md +35 -0
  137. package/docs/troubleshooting.md +105 -0
  138. package/package.json +187 -0
@@ -0,0 +1,380 @@
1
+ // src/pdf-viewer/pdf-escape.ts
2
+ function escapeHtml(text) {
3
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
4
+ }
5
+ function mapPdfOutline(items) {
6
+ if (!Array.isArray(items))
7
+ return [];
8
+ return items.map((item) => {
9
+ const node = item;
10
+ return {
11
+ title: String(node.title ?? ""),
12
+ dest: node.dest ?? null,
13
+ items: mapPdfOutline(node.items)
14
+ };
15
+ });
16
+ }
17
+
18
+ // src/pdf-viewer/pdf-text-search.ts
19
+ function pageTextFromItems(items) {
20
+ let text = "";
21
+ const starts = [];
22
+ for (const item of items) {
23
+ starts.push(text.length);
24
+ text += item.str ?? "";
25
+ if (item.hasEOL)
26
+ text += `
27
+ `;
28
+ }
29
+ return { text, starts };
30
+ }
31
+ function fold(text) {
32
+ let folded = "";
33
+ const origin = [];
34
+ let space = false;
35
+ for (let index = 0;index < text.length; index += 1) {
36
+ const char = text.charAt(index);
37
+ if (/\s/.test(char)) {
38
+ if (!space) {
39
+ folded += " ";
40
+ origin.push(index);
41
+ }
42
+ space = true;
43
+ continue;
44
+ }
45
+ space = false;
46
+ for (const part of char.normalize("NFKD").replace(/\p{M}/gu, "").toLowerCase()) {
47
+ folded += part;
48
+ origin.push(index);
49
+ }
50
+ }
51
+ return { folded, origin };
52
+ }
53
+ function findTextMatches(text, query) {
54
+ const needle = fold(query.trim()).folded;
55
+ if (!needle)
56
+ return [];
57
+ const { folded, origin } = fold(text);
58
+ const matches = [];
59
+ let from = 0;
60
+ for (;; ) {
61
+ const at = folded.indexOf(needle, from);
62
+ if (at < 0)
63
+ return matches;
64
+ const last = origin[at + needle.length - 1] ?? 0;
65
+ matches.push({ start: origin[at] ?? 0, end: last + 1 });
66
+ from = at + needle.length;
67
+ }
68
+ }
69
+ function highlightItemHtml(str, itemStart, matches, current = -1) {
70
+ const itemEnd = itemStart + str.length;
71
+ let html = "";
72
+ let at = itemStart;
73
+ matches.forEach((match, hit) => {
74
+ if (match.end <= at || match.start >= itemEnd)
75
+ return;
76
+ const start = Math.max(match.start, at);
77
+ const end = Math.min(match.end, itemEnd);
78
+ const mark = hit === current ? ' data-current="true"' : "";
79
+ html += escapeHtml(str.slice(at - itemStart, start - itemStart));
80
+ html += `<mark class="pdf-highlight" data-hit="${hit}"${mark}>`;
81
+ html += `${escapeHtml(str.slice(start - itemStart, end - itemStart))}</mark>`;
82
+ at = end;
83
+ });
84
+ return html + escapeHtml(str.slice(at - itemStart));
85
+ }
86
+
87
+ // src/pdf-viewer/pdf-document-search.ts
88
+ var texts = new WeakMap;
89
+ function loadPageText(pdf, pageNumber) {
90
+ let pages = texts.get(pdf);
91
+ if (!pages) {
92
+ pages = new Map;
93
+ texts.set(pdf, pages);
94
+ }
95
+ let text = pages.get(pageNumber);
96
+ if (!text) {
97
+ const cache = pages;
98
+ text = pdf.getPage(pageNumber).then((page) => page.getTextContent()).then(({ items }) => pageTextFromItems(items));
99
+ text.catch(() => cache.delete(pageNumber));
100
+ pages.set(pageNumber, text);
101
+ }
102
+ return text;
103
+ }
104
+ async function searchDocument(pdf, query, onPages, isCancelled = () => false, chunk = 25) {
105
+ let found = [];
106
+ for (let page = 1;page <= pdf.numPages; page += 1) {
107
+ const text = await loadPageText(pdf, page);
108
+ if (isCancelled())
109
+ return;
110
+ found.push({ page, text, matches: findTextMatches(text.text, query) });
111
+ if (page === 1 || found.length >= chunk || page === pdf.numPages) {
112
+ onPages(found);
113
+ found = [];
114
+ }
115
+ }
116
+ }
117
+ function withPageMatches(found, pages) {
118
+ const texts = [...found.texts];
119
+ const matches = [...found.matches];
120
+ for (const { page, text, matches: inPage } of pages) {
121
+ texts[page - 1] = text;
122
+ matches[page - 1] = inPage;
123
+ }
124
+ return { texts, matches };
125
+ }
126
+ function stepHit(from, delta, count) {
127
+ if (count <= 0)
128
+ return -1;
129
+ if (from < 0)
130
+ return delta > 0 ? 0 : count - 1;
131
+ return ((from + delta) % count + count) % count;
132
+ }
133
+ function hitAt(counts, index) {
134
+ let rest = index;
135
+ for (let page = 0;page < counts.length; page += 1) {
136
+ const count = counts[page] ?? 0;
137
+ if (rest < count)
138
+ return { page: page + 1, hit: rest };
139
+ rest -= count;
140
+ }
141
+ return null;
142
+ }
143
+ // src/pdf-viewer/pdf-page-geometry.ts
144
+ var DEFAULT_PAGE_SIZE = { width: 612, height: 792 };
145
+ var FIT_PAGES = 25;
146
+ var PAGE_PADDING = 32;
147
+ var MIN_FIT_SCALE = 0.25;
148
+ var MAX_FIT_SCALE = 5;
149
+ function pageRotation(size, rotation) {
150
+ if (!size && !rotation)
151
+ return;
152
+ const turn = (size?.rotate ?? 0) + rotation;
153
+ return (turn % 360 + 360) % 360;
154
+ }
155
+ function rotatedSize(size, rotation) {
156
+ const turn = (size.rotate ?? 0) + rotation;
157
+ const quarter = (turn % 180 + 180) % 180 === 90;
158
+ return quarter ? { width: size.height, height: size.width } : { width: size.width, height: size.height };
159
+ }
160
+ function largestPage(sizes, rotation) {
161
+ let width = 0;
162
+ let height = 0;
163
+ for (const size of sizes) {
164
+ if (!size)
165
+ continue;
166
+ const turned = rotatedSize(size, rotation);
167
+ width = Math.max(width, turned.width);
168
+ height = Math.max(height, turned.height);
169
+ }
170
+ return width && height ? { width, height } : rotatedSize(DEFAULT_PAGE_SIZE, rotation);
171
+ }
172
+ function fitScale(mode, largest, box, padding = PAGE_PADDING) {
173
+ const byWidth = (box.width - padding) / largest.width;
174
+ const scale = mode === "width" ? byWidth : Math.min(byWidth, (box.height - padding) / largest.height);
175
+ return Math.min(MAX_FIT_SCALE, Math.max(MIN_FIT_SCALE, scale));
176
+ }
177
+ function readerFitScale(mode, sizes, rotation, box) {
178
+ return fitScale(mode, largestPage(sizes.slice(0, FIT_PAGES), rotation), box);
179
+ }
180
+ function placeholderSize(size, scale, rotation) {
181
+ const turned = rotatedSize(size ?? DEFAULT_PAGE_SIZE, rotation);
182
+ return {
183
+ width: Math.round(turned.width * scale),
184
+ height: Math.round(turned.height * scale)
185
+ };
186
+ }
187
+ // src/pdf-viewer/pdf-page-sizes.ts
188
+ async function readPageSizes(pdf, onSizes, isCancelled = () => false, chunk = FIT_PAGES) {
189
+ const sizes = [];
190
+ for (let next = 1;next <= pdf.numPages; next += chunk) {
191
+ const last = Math.min(pdf.numPages, next + chunk - 1);
192
+ const pages = await Promise.all(Array.from({ length: last - next + 1 }, (_, index) => pdf.getPage(next + index)));
193
+ if (isCancelled())
194
+ return;
195
+ for (const page of pages) {
196
+ const { width, height } = page.getViewport({ scale: 1, rotation: 0 });
197
+ const rotate = ((page.rotate ?? 0) % 360 + 360) % 360;
198
+ sizes.push(rotate ? { width, height, rotate } : { width, height });
199
+ }
200
+ onSizes([...sizes]);
201
+ }
202
+ }
203
+ function createPageSizesLoader(onSizes) {
204
+ let generation = 0;
205
+ return {
206
+ reset() {
207
+ generation += 1;
208
+ },
209
+ load(pdf) {
210
+ generation += 1;
211
+ if (!pdf.getPage)
212
+ return Promise.resolve();
213
+ const current = generation;
214
+ return readPageSizes(pdf, onSizes, () => current !== generation).catch(() => {});
215
+ }
216
+ };
217
+ }
218
+ // src/pdf-viewer/pdf-scroll-spy.ts
219
+ function mostVisiblePage(view, pages) {
220
+ let best = null;
221
+ let bestSeen = 0;
222
+ let last = null;
223
+ for (const [page, box] of pages) {
224
+ const seen = Math.min(box.bottom, view.bottom) - Math.max(box.top, view.top);
225
+ if (seen <= 0)
226
+ continue;
227
+ if (last === null || page > last)
228
+ last = page;
229
+ if (seen > bestSeen || seen === bestSeen && best !== null && page < best) {
230
+ best = page;
231
+ bestSeen = seen;
232
+ }
233
+ }
234
+ return view.atEnd && last !== null ? last : best;
235
+ }
236
+ function scrollIntoArea(node, block, behavior = "smooth") {
237
+ const area = node.closest('[data-slot="scroll-area-viewport"]');
238
+ if (!area)
239
+ return;
240
+ const box = node.getBoundingClientRect();
241
+ const view = area.getBoundingClientRect();
242
+ let top = area.scrollTop + box.top - view.top;
243
+ if (block === "center")
244
+ top -= (view.height - box.height) / 2;
245
+ area.scrollTo({ top: Math.max(0, top), behavior });
246
+ }
247
+ var USER_SCROLL_EVENTS = [
248
+ "wheel",
249
+ "touchstart",
250
+ "pointerdown",
251
+ "keydown"
252
+ ];
253
+ function pinToPage(node, beforeScroll) {
254
+ const area = node()?.closest('[data-slot="scroll-area-viewport"]');
255
+ const content = area?.firstElementChild;
256
+ if (!area || !content || typeof ResizeObserver === "undefined") {
257
+ return () => {};
258
+ }
259
+ const surface = area.closest('[data-slot="scroll-area"]') ?? area;
260
+ const observer = new ResizeObserver(() => {
261
+ const target = node();
262
+ if (!target)
263
+ return;
264
+ beforeScroll();
265
+ scrollIntoArea(target, "start", "auto");
266
+ });
267
+ observer.observe(content);
268
+ const unpin = () => {
269
+ observer.disconnect();
270
+ for (const type of USER_SCROLL_EVENTS) {
271
+ surface.removeEventListener(type, unpin, true);
272
+ }
273
+ };
274
+ for (const type of USER_SCROLL_EVENTS) {
275
+ surface.addEventListener(type, unpin, { capture: true, passive: true });
276
+ }
277
+ return unpin;
278
+ }
279
+ function createScrollSpy(root, pages, onPage, idleMs = 150) {
280
+ let frame = 0;
281
+ let held = false;
282
+ let idle;
283
+ let scroller = null;
284
+ const release = () => {
285
+ clearTimeout(idle);
286
+ idle = setTimeout(() => {
287
+ held = false;
288
+ }, idleMs);
289
+ };
290
+ const measure = () => {
291
+ frame = 0;
292
+ if (!scroller)
293
+ return;
294
+ const view = scroller.getBoundingClientRect();
295
+ const atEnd = scroller.scrollTop + scroller.clientHeight >= scroller.scrollHeight - 2;
296
+ const boxes = Array.from(pages(), ([page, node]) => {
297
+ const { top, bottom } = node.getBoundingClientRect();
298
+ return [page, { top, bottom }];
299
+ });
300
+ const page = mostVisiblePage({ top: view.top, bottom: view.bottom, atEnd }, boxes);
301
+ if (page !== null)
302
+ onPage(page);
303
+ };
304
+ const onScroll = (event) => {
305
+ const target = event.target;
306
+ if (!(target instanceof HTMLElement) || !root()?.contains(target))
307
+ return;
308
+ if (held) {
309
+ release();
310
+ return;
311
+ }
312
+ scroller = target;
313
+ if (!frame)
314
+ frame = requestAnimationFrame(measure);
315
+ };
316
+ document.addEventListener("scroll", onScroll, {
317
+ capture: true,
318
+ passive: true
319
+ });
320
+ return {
321
+ hold() {
322
+ held = true;
323
+ cancelAnimationFrame(frame);
324
+ frame = 0;
325
+ release();
326
+ },
327
+ stop() {
328
+ document.removeEventListener("scroll", onScroll, { capture: true });
329
+ cancelAnimationFrame(frame);
330
+ clearTimeout(idle);
331
+ }
332
+ };
333
+ }
334
+ function revealHit(findPage, hit, beforeScroll = () => {}, timeout = 5000) {
335
+ const until = Date.now() + timeout;
336
+ let frame = 0;
337
+ const look = () => {
338
+ const mark = findPage()?.querySelector(`mark[data-hit="${hit}"]`);
339
+ if (mark) {
340
+ beforeScroll();
341
+ scrollIntoArea(mark, "center");
342
+ return;
343
+ }
344
+ if (Date.now() < until)
345
+ frame = requestAnimationFrame(look);
346
+ };
347
+ frame = requestAnimationFrame(look);
348
+ return () => cancelAnimationFrame(frame);
349
+ }
350
+ export {
351
+ DEFAULT_PAGE_SIZE,
352
+ FIT_PAGES,
353
+ PAGE_PADDING,
354
+ createPageSizesLoader,
355
+ createScrollSpy,
356
+ escapeHtml,
357
+ findTextMatches,
358
+ fitScale,
359
+ highlightItemHtml,
360
+ hitAt,
361
+ largestPage,
362
+ loadPageText,
363
+ mapPdfOutline,
364
+ mostVisiblePage,
365
+ pageRotation,
366
+ pageTextFromItems,
367
+ pinToPage,
368
+ placeholderSize,
369
+ readPageSizes,
370
+ readerFitScale,
371
+ revealHit,
372
+ rotatedSize,
373
+ scrollIntoArea,
374
+ searchDocument,
375
+ stepHit,
376
+ withPageMatches
377
+ };
378
+
379
+ //# debugId=5A356F61366FB1EB64756E2164756E21
380
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/pdf-viewer/pdf-escape.ts", "../src/pdf-viewer/pdf-text-search.ts", "../src/pdf-viewer/pdf-document-search.ts", "../src/pdf-viewer/pdf-page-geometry.ts", "../src/pdf-viewer/pdf-page-sizes.ts", "../src/pdf-viewer/pdf-scroll-spy.ts"],
4
+ "sourcesContent": [
5
+ "export function escapeHtml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;')\n\t\t.replace(/'/g, '&#39;');\n}\n\nexport function mapPdfOutline(items: unknown): {\n\ttitle: string;\n\tdest: unknown;\n\titems: ReturnType<typeof mapPdfOutline>;\n}[] {\n\tif (!Array.isArray(items)) return [];\n\treturn items.map((item) => {\n\t\tconst node = item as {\n\t\t\ttitle?: string;\n\t\t\tdest?: unknown;\n\t\t\titems?: unknown;\n\t\t};\n\t\treturn {\n\t\t\ttitle: String(node.title ?? ''),\n\t\t\tdest: node.dest ?? null,\n\t\t\titems: mapPdfOutline(node.items),\n\t\t};\n\t});\n}\n",
6
+ "import { escapeHtml } from './pdf-escape';\n\n/** One item of `page.getTextContent()`: marked-content items have no `str`. */\nexport type PdfTextItem = { str?: string; hasEOL?: boolean };\n\n/** A page's text, and where each text item starts in it. */\nexport type PdfPageText = { text: string; starts: number[] };\n\n/** A match in a page's text: `end` is exclusive. */\nexport type PdfTextRange = { start: number; end: number };\n\n/** Joins the items' text, a line break after each item that ends a line. */\nexport function pageTextFromItems(items: readonly PdfTextItem[]): PdfPageText {\n\tlet text = '';\n\tconst starts: number[] = [];\n\tfor (const item of items) {\n\t\tstarts.push(text.length);\n\t\ttext += item.str ?? '';\n\t\tif (item.hasEOL) text += '\\n';\n\t}\n\treturn { text, starts };\n}\n\n/**\n * Lower case, accents and ligatures dropped (`Café` and `fi` match `cafe` and\n * `fi`), every run of white space one space; `origin` maps each folded\n * character back to its index in `text`.\n */\nfunction fold(text: string) {\n\tlet folded = '';\n\tconst origin: number[] = [];\n\tlet space = false;\n\tfor (let index = 0; index < text.length; index += 1) {\n\t\tconst char = text.charAt(index);\n\t\tif (/\\s/.test(char)) {\n\t\t\tif (!space) {\n\t\t\t\tfolded += ' ';\n\t\t\t\torigin.push(index);\n\t\t\t}\n\t\t\tspace = true;\n\t\t\tcontinue;\n\t\t}\n\t\tspace = false;\n\t\tfor (const part of char\n\t\t\t.normalize('NFKD')\n\t\t\t.replace(/\\p{M}/gu, '')\n\t\t\t.toLowerCase()) {\n\t\t\tfolded += part;\n\t\t\torigin.push(index);\n\t\t}\n\t}\n\treturn { folded, origin };\n}\n\n/** Every match of `query` in `text`, ignoring case, accents and spacing. */\nexport function findTextMatches(text: string, query: string): PdfTextRange[] {\n\tconst needle = fold(query.trim()).folded;\n\tif (!needle) return [];\n\tconst { folded, origin } = fold(text);\n\tconst matches: PdfTextRange[] = [];\n\tlet from = 0;\n\tfor (;;) {\n\t\tconst at = folded.indexOf(needle, from);\n\t\tif (at < 0) return matches;\n\t\tconst last = origin[at + needle.length - 1] ?? 0;\n\t\tmatches.push({ start: origin[at] ?? 0, end: last + 1 });\n\t\tfrom = at + needle.length;\n\t}\n}\n\n/**\n * One text item's HTML, its part of each match wrapped in\n * `<mark class=\"pdf-highlight\" data-hit=\"…\">`. A match across items gets a\n * mark in each; the current one also carries `data-current`.\n */\nexport function highlightItemHtml(\n\tstr: string,\n\titemStart: number,\n\tmatches: readonly PdfTextRange[],\n\tcurrent = -1,\n) {\n\tconst itemEnd = itemStart + str.length;\n\tlet html = '';\n\tlet at = itemStart;\n\tmatches.forEach((match, hit) => {\n\t\tif (match.end <= at || match.start >= itemEnd) return;\n\t\tconst start = Math.max(match.start, at);\n\t\tconst end = Math.min(match.end, itemEnd);\n\t\tconst mark = hit === current ? ' data-current=\"true\"' : '';\n\t\thtml += escapeHtml(str.slice(at - itemStart, start - itemStart));\n\t\thtml += `<mark class=\"pdf-highlight\" data-hit=\"${hit}\"${mark}>`;\n\t\thtml += `${escapeHtml(str.slice(start - itemStart, end - itemStart))}</mark>`;\n\t\tat = end;\n\t});\n\treturn html + escapeHtml(str.slice(at - itemStart));\n}\n",
7
+ "import {\n\tfindTextMatches,\n\ttype PdfPageText,\n\ttype PdfTextItem,\n\ttype PdfTextRange,\n\tpageTextFromItems,\n} from './pdf-text-search';\n\n/** Where a match sits: its page, and its rank among that page's matches. */\nexport type PdfSearchHit = { page: number; hit: number };\n\nexport type PdfTextSource = {\n\tnumPages: number;\n\tgetPage: (pageNumber: number) => Promise<{\n\t\tgetTextContent: () => Promise<{ items: readonly unknown[] }>;\n\t}>;\n};\n\nconst texts = new WeakMap<object, Map<number, Promise<PdfPageText>>>();\n\n/** A page's text, read once per document. */\nexport function loadPageText(pdf: PdfTextSource, pageNumber: number) {\n\tlet pages = texts.get(pdf);\n\tif (!pages) {\n\t\tpages = new Map();\n\t\ttexts.set(pdf, pages);\n\t}\n\tlet text = pages.get(pageNumber);\n\tif (!text) {\n\t\tconst cache = pages;\n\t\t// Without marked content, like the text layer: item i is span i.\n\t\ttext = pdf\n\t\t\t.getPage(pageNumber)\n\t\t\t.then((page) => page.getTextContent())\n\t\t\t.then(({ items }) => pageTextFromItems(items as PdfTextItem[]));\n\t\t// A failed read is tried again by the next search.\n\t\ttext.catch(() => cache.delete(pageNumber));\n\t\tpages.set(pageNumber, text);\n\t}\n\treturn text;\n}\n\n/** A page the search has read: its text and the matches in it. */\nexport type PdfPageMatches = {\n\tpage: number;\n\ttext: PdfPageText;\n\tmatches: PdfTextRange[];\n};\n\n/**\n * Searches every page in order, drawn or not, and reports the pages read: the\n * first one at once, then `chunk` at a time. A report per page would have the\n * reader draw every page again after each one read, a quadratic first search.\n * Stops once `isCancelled` says so.\n */\nexport async function searchDocument(\n\tpdf: PdfTextSource,\n\tquery: string,\n\tonPages: (pages: PdfPageMatches[]) => void,\n\tisCancelled: () => boolean = () => false,\n\tchunk = 25,\n) {\n\tlet found: PdfPageMatches[] = [];\n\tfor (let page = 1; page <= pdf.numPages; page += 1) {\n\t\tconst text = await loadPageText(pdf, page);\n\t\tif (isCancelled()) return;\n\t\tfound.push({ page, text, matches: findTextMatches(text.text, query) });\n\t\tif (page === 1 || found.length >= chunk || page === pdf.numPages) {\n\t\t\tonPages(found);\n\t\t\tfound = [];\n\t\t}\n\t}\n}\n\n/** Each page's text and matches, as far as the search has read. */\nexport type PdfDocumentMatches = {\n\ttexts: (PdfPageText | undefined)[];\n\tmatches: PdfTextRange[][];\n};\n\n/** `found` with a batch of pages read, copied once for the whole batch. */\nexport function withPageMatches(\n\tfound: PdfDocumentMatches,\n\tpages: readonly PdfPageMatches[],\n): PdfDocumentMatches {\n\tconst texts = [...found.texts];\n\tconst matches = [...found.matches];\n\tfor (const { page, text, matches: inPage } of pages) {\n\t\ttexts[page - 1] = text;\n\t\tmatches[page - 1] = inPage;\n\t}\n\treturn { texts, matches };\n}\n\n/**\n * The rank `delta` away from `from`, wrapping; from none (-1), the first\n * match forward or the last one back.\n */\nexport function stepHit(from: number, delta: number, count: number) {\n\tif (count <= 0) return -1;\n\tif (from < 0) return delta > 0 ? 0 : count - 1;\n\treturn (((from + delta) % count) + count) % count;\n}\n\n/** The hit at a document-wide rank, from each page's match count. */\nexport function hitAt(\n\tcounts: readonly (number | undefined)[],\n\tindex: number,\n): PdfSearchHit | null {\n\tlet rest = index;\n\tfor (let page = 0; page < counts.length; page += 1) {\n\t\tconst count = counts[page] ?? 0;\n\t\tif (rest < count) return { page: page + 1, hit: rest };\n\t\trest -= count;\n\t}\n\treturn null;\n}\n",
8
+ "/**\n * How the reader sizes a page: to the viewport's width, to the whole page, or\n * at a zoom the user chose.\n */\nexport type FitMode = 'width' | 'page' | 'custom';\n\n/**\n * A page's size in PDF points (1/72 inch), before any rotation, and the\n * rotation the page asks for itself (its `/Rotate`, in degrees clockwise).\n */\nexport type PdfPageSize = { width: number; height: number; rotate?: number };\n\n/** Used until a page's own size is known: US Letter. */\nexport const DEFAULT_PAGE_SIZE: PdfPageSize = { width: 612, height: 792 };\n\n/**\n * The fit zoom fits the first pages only, the ones read when the document\n * opens: pages read later never move it. A wider page further on is shown at\n * that zoom (and scrolls sideways in fit width).\n */\nexport const FIT_PAGES = 25;\n\n/** Room kept around the pages: the list's padding on each side. */\nexport const PAGE_PADDING = 32;\n\n// The reader's own MIN_SCALE and MAX_SCALE; kept here so this file stays\n// shared.\nconst MIN_FIT_SCALE = 0.25;\nconst MAX_FIT_SCALE = 5;\n\n/**\n * The rotation a page is drawn at: its own `/Rotate` plus the reader's, from\n * 0 to 270. `undefined` while the page's own is not known and the reader adds\n * none, so the renderer keeps the page's. Once the reader turns the pages, a\n * page whose size is not read yet (past the first chunk) is drawn at the\n * reader's rotation alone until its size arrives, then drawn again.\n */\nexport function pageRotation(\n\tsize: PdfPageSize | undefined,\n\trotation: number,\n): number | undefined {\n\tif (!size && !rotation) return undefined;\n\tconst turn = (size?.rotate ?? 0) + rotation;\n\treturn ((turn % 360) + 360) % 360;\n}\n\n/** The page's size on screen: turned by its own `/Rotate` and `rotation`. */\nexport function rotatedSize(size: PdfPageSize, rotation: number): PdfPageSize {\n\tconst turn = (size.rotate ?? 0) + rotation;\n\tconst quarter = ((turn % 180) + 180) % 180 === 90;\n\treturn quarter\n\t\t? { width: size.height, height: size.width }\n\t\t: { width: size.width, height: size.height };\n}\n\n/**\n * The widest and the tallest of the known pages, rotated. Fitting on it keeps\n * every page inside the box with one scale, so the zoom does not jump while\n * scrolling from an A4 page to a landscape one.\n */\nexport function largestPage(\n\tsizes: readonly (PdfPageSize | undefined)[],\n\trotation: number,\n): PdfPageSize {\n\tlet width = 0;\n\tlet height = 0;\n\tfor (const size of sizes) {\n\t\tif (!size) continue;\n\t\tconst turned = rotatedSize(size, rotation);\n\t\twidth = Math.max(width, turned.width);\n\t\theight = Math.max(height, turned.height);\n\t}\n\treturn width && height\n\t\t? { width, height }\n\t\t: rotatedSize(DEFAULT_PAGE_SIZE, rotation);\n}\n\n/**\n * The scale at which the largest page fits the box's width, or all of it,\n * within the reader's zoom range: a tiny page does not fit to 4000%.\n */\nexport function fitScale(\n\tmode: Exclude<FitMode, 'custom'>,\n\tlargest: PdfPageSize,\n\tbox: { width: number; height: number },\n\tpadding = PAGE_PADDING,\n) {\n\tconst byWidth = (box.width - padding) / largest.width;\n\tconst scale =\n\t\tmode === 'width'\n\t\t\t? byWidth\n\t\t\t: Math.min(byWidth, (box.height - padding) / largest.height);\n\treturn Math.min(MAX_FIT_SCALE, Math.max(MIN_FIT_SCALE, scale));\n}\n\n/**\n * The reader's zoom in fit width or fit page: the largest of the first\n * `FIT_PAGES` pages, rotated, fitted to the box.\n */\nexport function readerFitScale(\n\tmode: Exclude<FitMode, 'custom'>,\n\tsizes: readonly (PdfPageSize | undefined)[],\n\trotation: number,\n\tbox: { width: number; height: number },\n) {\n\treturn fitScale(mode, largestPage(sizes.slice(0, FIT_PAGES), rotation), box);\n}\n\n/** Pixel size of a page's placeholder before it renders. */\nexport function placeholderSize(\n\tsize: PdfPageSize | undefined,\n\tscale: number,\n\trotation: number,\n) {\n\tconst turned = rotatedSize(size ?? DEFAULT_PAGE_SIZE, rotation);\n\treturn {\n\t\twidth: Math.round(turned.width * scale),\n\t\theight: Math.round(turned.height * scale),\n\t};\n}\n",
9
+ "import { FIT_PAGES, type PdfPageSize } from './pdf-page-geometry';\n\ntype SizedPage = {\n\t/** The page's own `/Rotate`, in degrees (pdf.js `PDFPageProxy.rotate`). */\n\trotate?: number;\n\tgetViewport: (options: { scale: number; rotation: number }) => {\n\t\twidth: number;\n\t\theight: number;\n\t};\n};\n\nexport type PdfSizedDocument = {\n\tnumPages: number;\n\tgetPage: (pageNumber: number) => Promise<SizedPage>;\n};\n\n/** What a load handler receives: `getPage` is optional for older callers. */\nexport type PdfLoadedDocument = Pick<PdfSizedDocument, 'numPages'> &\n\tPartial<Pick<PdfSizedDocument, 'getPage'>>;\n\n/**\n * Reads every page's size, unrotated, and its own `/Rotate`, `chunk` pages\n * at a time (at most `chunk` page objects asked for at once): the first chunk\n * at once, the rest in the background. `onSizes` gets the list known so far\n * after each chunk; the first report holds the pages the fit zoom is computed\n * from (`FIT_PAGES`), so later chunks never move it. `isCancelled` stops the\n * reading when the document changed.\n */\nexport async function readPageSizes(\n\tpdf: PdfSizedDocument,\n\tonSizes: (sizes: PdfPageSize[]) => void,\n\tisCancelled: () => boolean = () => false,\n\tchunk = FIT_PAGES,\n) {\n\tconst sizes: PdfPageSize[] = [];\n\tfor (let next = 1; next <= pdf.numPages; next += chunk) {\n\t\tconst last = Math.min(pdf.numPages, next + chunk - 1);\n\t\tconst pages = await Promise.all(\n\t\t\tArray.from({ length: last - next + 1 }, (_, index) =>\n\t\t\t\tpdf.getPage(next + index),\n\t\t\t),\n\t\t);\n\t\tif (isCancelled()) return;\n\t\tfor (const page of pages) {\n\t\t\tconst { width, height } = page.getViewport({ scale: 1, rotation: 0 });\n\t\t\tconst rotate = (((page.rotate ?? 0) % 360) + 360) % 360;\n\t\t\tsizes.push(rotate ? { width, height, rotate } : { width, height });\n\t\t}\n\t\tonSizes([...sizes]);\n\t}\n}\n\n/**\n * Reads the sizes of the document last loaded. `reset` forgets it when the\n * file changes, so sizes still arriving for it never land. A document\n * without `getPage` keeps the fallback size.\n */\nexport function createPageSizesLoader(onSizes: (sizes: PdfPageSize[]) => void) {\n\tlet generation = 0;\n\treturn {\n\t\treset() {\n\t\t\tgeneration += 1;\n\t\t},\n\t\tload(pdf: PdfLoadedDocument) {\n\t\t\tgeneration += 1;\n\t\t\tif (!pdf.getPage) return Promise.resolve();\n\t\t\tconst current = generation;\n\t\t\t// pdf.js reads `this` in getPage: pass the document itself.\n\t\t\treturn readPageSizes(\n\t\t\t\tpdf as PdfSizedDocument,\n\t\t\t\tonSizes,\n\t\t\t\t() => current !== generation,\n\t\t\t).catch(() => {\n\t\t\t\t/* a page failed or the document was destroyed: the rest keep the\n\t\t\t\t fallback size */\n\t\t\t});\n\t\t},\n\t};\n}\n",
10
+ "/** A vertical extent on screen, as `getBoundingClientRect` gives it. */\nexport type PdfBox = { top: number; bottom: number };\n\n/**\n * The page with the most of itself on screen, the first one on a tie; once\n * scrolled to the end, the last page on screen, however little of it shows.\n */\nexport function mostVisiblePage(\n\tview: PdfBox & { atEnd: boolean },\n\tpages: Iterable<readonly [number, PdfBox]>,\n): number | null {\n\tlet best: number | null = null;\n\tlet bestSeen = 0;\n\tlet last: number | null = null;\n\tfor (const [page, box] of pages) {\n\t\tconst seen =\n\t\t\tMath.min(box.bottom, view.bottom) - Math.max(box.top, view.top);\n\t\tif (seen <= 0) continue;\n\t\tif (last === null || page > last) last = page;\n\t\tif (\n\t\t\tseen > bestSeen ||\n\t\t\t(seen === bestSeen && best !== null && page < best)\n\t\t) {\n\t\t\tbest = page;\n\t\t\tbestSeen = seen;\n\t\t}\n\t}\n\treturn view.atEnd && last !== null ? last : best;\n}\n\n/**\n * Scrolls the page area around `node`, and nothing else: `scrollIntoView`\n * would scroll the host page too. `block` puts `node` at the area's top or\n * centre.\n */\nexport function scrollIntoArea(\n\tnode: Element,\n\tblock: 'start' | 'center',\n\tbehavior: ScrollBehavior = 'smooth',\n) {\n\tconst area = node.closest<HTMLElement>('[data-slot=\"scroll-area-viewport\"]');\n\tif (!area) return;\n\tconst box = node.getBoundingClientRect();\n\tconst view = area.getBoundingClientRect();\n\tlet top = area.scrollTop + box.top - view.top;\n\tif (block === 'center') top -= (view.height - box.height) / 2;\n\tarea.scrollTo({ top: Math.max(0, top), behavior });\n}\n\n/** What the user does to scroll a page area themselves. */\nconst USER_SCROLL_EVENTS = [\n\t'wheel',\n\t'touchstart',\n\t'pointerdown',\n\t'keydown',\n] as const;\n\n/**\n * Keeps `node` at the top of the page area while the pages above it change\n * size (the zoom fitting to page sizes still arriving), until the user\n * scrolls, taps, clicks or types in the page area, or the returned function\n * is called. `beforeScroll` runs before each correction.\n */\nexport function pinToPage(\n\tnode: () => Element | null | undefined,\n\tbeforeScroll: () => void,\n) {\n\tconst area = node()?.closest('[data-slot=\"scroll-area-viewport\"]');\n\tconst content = area?.firstElementChild;\n\tif (!area || !content || typeof ResizeObserver === 'undefined') {\n\t\treturn () => {};\n\t}\n\t// The scroll area, not only its viewport: dragging the scrollbar counts.\n\tconst surface = area.closest('[data-slot=\"scroll-area\"]') ?? area;\n\tconst observer = new ResizeObserver(() => {\n\t\tconst target = node();\n\t\tif (!target) return;\n\t\tbeforeScroll();\n\t\tscrollIntoArea(target, 'start', 'auto');\n\t});\n\tobserver.observe(content);\n\t// A scroll event cannot tell the user's scroll from a correction; what\n\t// the user does first can.\n\tconst unpin = () => {\n\t\tobserver.disconnect();\n\t\tfor (const type of USER_SCROLL_EVENTS) {\n\t\t\tsurface.removeEventListener(type, unpin, true);\n\t\t}\n\t};\n\tfor (const type of USER_SCROLL_EVENTS) {\n\t\tsurface.addEventListener(type, unpin, { capture: true, passive: true });\n\t}\n\treturn unpin;\n}\n\n/**\n * Reports the page most on screen as the reader's page area (`root`)\n * scrolls. `hold`\n * ignores scrolling until it has stopped for `idleMs`: the reader calls it\n * before scrolling to a page itself, so the pages it passes on the way are\n * not reported.\n */\nexport function createScrollSpy(\n\troot: () => HTMLElement | null | undefined,\n\tpages: () => ReadonlyMap<number, HTMLElement>,\n\tonPage: (page: number) => void,\n\tidleMs = 150,\n) {\n\tlet frame = 0;\n\tlet held = false;\n\tlet idle: ReturnType<typeof setTimeout> | undefined;\n\tlet scroller: HTMLElement | null = null;\n\n\tconst release = () => {\n\t\tclearTimeout(idle);\n\t\tidle = setTimeout(() => {\n\t\t\theld = false;\n\t\t}, idleMs);\n\t};\n\n\tconst measure = () => {\n\t\tframe = 0;\n\t\tif (!scroller) return;\n\t\tconst view = scroller.getBoundingClientRect();\n\t\tconst atEnd =\n\t\t\tscroller.scrollTop + scroller.clientHeight >= scroller.scrollHeight - 2;\n\t\tconst boxes = Array.from(pages(), ([page, node]) => {\n\t\t\tconst { top, bottom } = node.getBoundingClientRect();\n\t\t\treturn [page, { top, bottom }] as const;\n\t\t});\n\t\tconst page = mostVisiblePage(\n\t\t\t{ top: view.top, bottom: view.bottom, atEnd },\n\t\t\tboxes,\n\t\t);\n\t\tif (page !== null) onPage(page);\n\t};\n\n\tconst onScroll = (event: Event) => {\n\t\tconst target = event.target;\n\t\tif (!(target instanceof HTMLElement) || !root()?.contains(target)) return;\n\t\t// Scrolling during a hold is not measured again on release: that would\n\t\t// report the page a jump near the end scrolled past.\n\t\tif (held) {\n\t\t\trelease();\n\t\t\treturn;\n\t\t}\n\t\tscroller = target;\n\t\tif (!frame) frame = requestAnimationFrame(measure);\n\t};\n\n\t// Scroll events do not bubble: listen in the capture phase, on the\n\t// document, as the page area may be rendered again under the reader.\n\t// Plain DOM rather than react-use or VueUse: this file is shared.\n\tdocument.addEventListener('scroll', onScroll, {\n\t\tcapture: true,\n\t\tpassive: true,\n\t});\n\n\treturn {\n\t\thold() {\n\t\t\theld = true;\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = 0;\n\t\t\trelease();\n\t\t},\n\t\tstop() {\n\t\t\tdocument.removeEventListener('scroll', onScroll, { capture: true });\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tclearTimeout(idle);\n\t\t},\n\t};\n}\n\n/**\n * Scrolls a page's match to the middle of the page area once the page has\n * drawn its mark, polling each frame for up to `timeout` ms; `beforeScroll`\n * runs first. Returns a function that stops waiting.\n */\nexport function revealHit(\n\tfindPage: () => ParentNode | null | undefined,\n\thit: number,\n\tbeforeScroll: () => void = () => {},\n\ttimeout = 5000,\n) {\n\tconst until = Date.now() + timeout;\n\tlet frame = 0;\n\tconst look = () => {\n\t\tconst mark = findPage()?.querySelector(`mark[data-hit=\"${hit}\"]`);\n\t\tif (mark) {\n\t\t\tbeforeScroll();\n\t\t\tscrollIntoArea(mark, 'center');\n\t\t\treturn;\n\t\t}\n\t\tif (Date.now() < until) frame = requestAnimationFrame(look);\n\t};\n\t// The page marks the match on its next render, not now.\n\tframe = requestAnimationFrame(look);\n\treturn () => cancelAnimationFrame(frame);\n}\n"
11
+ ],
12
+ "mappings": "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",
13
+ "debugId": "5A356F61366FB1EB64756E2164756E21",
14
+ "names": []
15
+ }
@@ -0,0 +1,44 @@
1
+ import { type PdfPageText, type PdfTextRange } from './pdf-text-search';
2
+ /** Where a match sits: its page, and its rank among that page's matches. */
3
+ export type PdfSearchHit = {
4
+ page: number;
5
+ hit: number;
6
+ };
7
+ export type PdfTextSource = {
8
+ numPages: number;
9
+ getPage: (pageNumber: number) => Promise<{
10
+ getTextContent: () => Promise<{
11
+ items: readonly unknown[];
12
+ }>;
13
+ }>;
14
+ };
15
+ /** A page's text, read once per document. */
16
+ export declare function loadPageText(pdf: PdfTextSource, pageNumber: number): Promise<PdfPageText>;
17
+ /** A page the search has read: its text and the matches in it. */
18
+ export type PdfPageMatches = {
19
+ page: number;
20
+ text: PdfPageText;
21
+ matches: PdfTextRange[];
22
+ };
23
+ /**
24
+ * Searches every page in order, drawn or not, and reports the pages read: the
25
+ * first one at once, then `chunk` at a time. A report per page would have the
26
+ * reader draw every page again after each one read, a quadratic first search.
27
+ * Stops once `isCancelled` says so.
28
+ */
29
+ export declare function searchDocument(pdf: PdfTextSource, query: string, onPages: (pages: PdfPageMatches[]) => void, isCancelled?: () => boolean, chunk?: number): Promise<void>;
30
+ /** Each page's text and matches, as far as the search has read. */
31
+ export type PdfDocumentMatches = {
32
+ texts: (PdfPageText | undefined)[];
33
+ matches: PdfTextRange[][];
34
+ };
35
+ /** `found` with a batch of pages read, copied once for the whole batch. */
36
+ export declare function withPageMatches(found: PdfDocumentMatches, pages: readonly PdfPageMatches[]): PdfDocumentMatches;
37
+ /**
38
+ * The rank `delta` away from `from`, wrapping; from none (-1), the first
39
+ * match forward or the last one back.
40
+ */
41
+ export declare function stepHit(from: number, delta: number, count: number): number;
42
+ /** The hit at a document-wide rank, from each page's match count. */
43
+ export declare function hitAt(counts: readonly (number | undefined)[], index: number): PdfSearchHit | null;
44
+ //# sourceMappingURL=pdf-document-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-document-search.d.ts","sourceRoot":"","sources":["../../src/pdf-viewer/pdf-document-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,WAAW,EAEhB,KAAK,YAAY,EAEjB,MAAM,mBAAmB,CAAC;AAE3B,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;QACxC,cAAc,EAAE,MAAM,OAAO,CAAC;YAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;SAAE,CAAC,CAAC;KAC7D,CAAC,CAAC;CACH,CAAC;AAIF,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAmBlE;AAED,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,cAAc,CACnC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,EAC1C,WAAW,GAAE,MAAM,OAAqB,EACxC,KAAK,SAAK,iBAYV;AAED,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IACnC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;CAC1B,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,eAAe,CAC9B,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,SAAS,cAAc,EAAE,GAC9B,kBAAkB,CAQpB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAIjE;AAED,qEAAqE;AACrE,wBAAgB,KAAK,CACpB,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EACvC,KAAK,EAAE,MAAM,GACX,YAAY,GAAG,IAAI,CAQrB"}
@@ -0,0 +1,7 @@
1
+ export declare function escapeHtml(text: string): string;
2
+ export declare function mapPdfOutline(items: unknown): {
3
+ title: string;
4
+ dest: unknown;
5
+ items: ReturnType<typeof mapPdfOutline>;
6
+ }[];
7
+ //# sourceMappingURL=pdf-escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-escape.d.ts","sourceRoot":"","sources":["../../src/pdf-viewer/pdf-escape.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;CACxC,EAAE,CAcF"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * How the reader sizes a page: to the viewport's width, to the whole page, or
3
+ * at a zoom the user chose.
4
+ */
5
+ export type FitMode = 'width' | 'page' | 'custom';
6
+ /**
7
+ * A page's size in PDF points (1/72 inch), before any rotation, and the
8
+ * rotation the page asks for itself (its `/Rotate`, in degrees clockwise).
9
+ */
10
+ export type PdfPageSize = {
11
+ width: number;
12
+ height: number;
13
+ rotate?: number;
14
+ };
15
+ /** Used until a page's own size is known: US Letter. */
16
+ export declare const DEFAULT_PAGE_SIZE: PdfPageSize;
17
+ /**
18
+ * The fit zoom fits the first pages only, the ones read when the document
19
+ * opens: pages read later never move it. A wider page further on is shown at
20
+ * that zoom (and scrolls sideways in fit width).
21
+ */
22
+ export declare const FIT_PAGES = 25;
23
+ /** Room kept around the pages: the list's padding on each side. */
24
+ export declare const PAGE_PADDING = 32;
25
+ /**
26
+ * The rotation a page is drawn at: its own `/Rotate` plus the reader's, from
27
+ * 0 to 270. `undefined` while the page's own is not known and the reader adds
28
+ * none, so the renderer keeps the page's. Once the reader turns the pages, a
29
+ * page whose size is not read yet (past the first chunk) is drawn at the
30
+ * reader's rotation alone until its size arrives, then drawn again.
31
+ */
32
+ export declare function pageRotation(size: PdfPageSize | undefined, rotation: number): number | undefined;
33
+ /** The page's size on screen: turned by its own `/Rotate` and `rotation`. */
34
+ export declare function rotatedSize(size: PdfPageSize, rotation: number): PdfPageSize;
35
+ /**
36
+ * The widest and the tallest of the known pages, rotated. Fitting on it keeps
37
+ * every page inside the box with one scale, so the zoom does not jump while
38
+ * scrolling from an A4 page to a landscape one.
39
+ */
40
+ export declare function largestPage(sizes: readonly (PdfPageSize | undefined)[], rotation: number): PdfPageSize;
41
+ /**
42
+ * The scale at which the largest page fits the box's width, or all of it,
43
+ * within the reader's zoom range: a tiny page does not fit to 4000%.
44
+ */
45
+ export declare function fitScale(mode: Exclude<FitMode, 'custom'>, largest: PdfPageSize, box: {
46
+ width: number;
47
+ height: number;
48
+ }, padding?: number): number;
49
+ /**
50
+ * The reader's zoom in fit width or fit page: the largest of the first
51
+ * `FIT_PAGES` pages, rotated, fitted to the box.
52
+ */
53
+ export declare function readerFitScale(mode: Exclude<FitMode, 'custom'>, sizes: readonly (PdfPageSize | undefined)[], rotation: number, box: {
54
+ width: number;
55
+ height: number;
56
+ }): number;
57
+ /** Pixel size of a page's placeholder before it renders. */
58
+ export declare function placeholderSize(size: PdfPageSize | undefined, scale: number, rotation: number): {
59
+ width: number;
60
+ height: number;
61
+ };
62
+ //# sourceMappingURL=pdf-page-geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-page-geometry.d.ts","sourceRoot":"","sources":["../../src/pdf-viewer/pdf-page-geometry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,wDAAwD;AACxD,eAAO,MAAM,iBAAiB,EAAE,WAAyC,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,mEAAmE;AACnE,eAAO,MAAM,YAAY,KAAK,CAAC;AAO/B;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAIpB;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAC1B,KAAK,EAAE,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,EAC3C,QAAQ,EAAE,MAAM,GACd,WAAW,CAYb;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACvB,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAChC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACtC,OAAO,SAAe,UAQtB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAChC,KAAK,EAAE,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,EAC3C,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,UAGtC;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAC9B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM;;;EAOhB"}
@@ -0,0 +1,38 @@
1
+ import { type PdfPageSize } from './pdf-page-geometry';
2
+ type SizedPage = {
3
+ /** The page's own `/Rotate`, in degrees (pdf.js `PDFPageProxy.rotate`). */
4
+ rotate?: number;
5
+ getViewport: (options: {
6
+ scale: number;
7
+ rotation: number;
8
+ }) => {
9
+ width: number;
10
+ height: number;
11
+ };
12
+ };
13
+ export type PdfSizedDocument = {
14
+ numPages: number;
15
+ getPage: (pageNumber: number) => Promise<SizedPage>;
16
+ };
17
+ /** What a load handler receives: `getPage` is optional for older callers. */
18
+ export type PdfLoadedDocument = Pick<PdfSizedDocument, 'numPages'> & Partial<Pick<PdfSizedDocument, 'getPage'>>;
19
+ /**
20
+ * Reads every page's size, unrotated, and its own `/Rotate`, `chunk` pages
21
+ * at a time (at most `chunk` page objects asked for at once): the first chunk
22
+ * at once, the rest in the background. `onSizes` gets the list known so far
23
+ * after each chunk; the first report holds the pages the fit zoom is computed
24
+ * from (`FIT_PAGES`), so later chunks never move it. `isCancelled` stops the
25
+ * reading when the document changed.
26
+ */
27
+ export declare function readPageSizes(pdf: PdfSizedDocument, onSizes: (sizes: PdfPageSize[]) => void, isCancelled?: () => boolean, chunk?: number): Promise<void>;
28
+ /**
29
+ * Reads the sizes of the document last loaded. `reset` forgets it when the
30
+ * file changes, so sizes still arriving for it never land. A document
31
+ * without `getPage` keeps the fallback size.
32
+ */
33
+ export declare function createPageSizesLoader(onSizes: (sizes: PdfPageSize[]) => void): {
34
+ reset(): void;
35
+ load(pdf: PdfLoadedDocument): Promise<void>;
36
+ };
37
+ export {};
38
+ //# sourceMappingURL=pdf-page-sizes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-page-sizes.d.ts","sourceRoot":"","sources":["../../src/pdf-viewer/pdf-page-sizes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElE,KAAK,SAAS,GAAG;IAChB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK;QAC9D,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KACf,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;CACpD,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GACjE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAClC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,EACvC,WAAW,GAAE,MAAM,OAAqB,EACxC,KAAK,SAAY,iBAkBjB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI;;cAMjE,iBAAiB;EAe5B"}