@acornly/core 0.1.0 → 0.3.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 (134) hide show
  1. package/dist/adapter.d.ts +27 -2
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js +5 -0
  4. package/dist/adapter.js.map +1 -1
  5. package/dist/anchoring/canvas.d.ts +33 -0
  6. package/dist/anchoring/canvas.d.ts.map +1 -0
  7. package/dist/anchoring/canvas.js +112 -0
  8. package/dist/anchoring/canvas.js.map +1 -0
  9. package/dist/anchoring/context-provider.d.ts +63 -0
  10. package/dist/anchoring/context-provider.d.ts.map +1 -0
  11. package/dist/anchoring/context-provider.js +78 -0
  12. package/dist/anchoring/context-provider.js.map +1 -0
  13. package/dist/anchoring/describe.d.ts +36 -2
  14. package/dist/anchoring/describe.d.ts.map +1 -1
  15. package/dist/anchoring/describe.js +102 -20
  16. package/dist/anchoring/describe.js.map +1 -1
  17. package/dist/anchoring/fingerprint.d.ts +47 -13
  18. package/dist/anchoring/fingerprint.d.ts.map +1 -1
  19. package/dist/anchoring/fingerprint.js +58 -68
  20. package/dist/anchoring/fingerprint.js.map +1 -1
  21. package/dist/anchoring/index.d.ts +5 -0
  22. package/dist/anchoring/index.d.ts.map +1 -1
  23. package/dist/anchoring/index.js +5 -0
  24. package/dist/anchoring/index.js.map +1 -1
  25. package/dist/anchoring/media.d.ts +2 -1
  26. package/dist/anchoring/media.d.ts.map +1 -1
  27. package/dist/anchoring/media.js +7 -2
  28. package/dist/anchoring/media.js.map +1 -1
  29. package/dist/anchoring/pdf.d.ts +204 -0
  30. package/dist/anchoring/pdf.d.ts.map +1 -0
  31. package/dist/anchoring/pdf.js +608 -0
  32. package/dist/anchoring/pdf.js.map +1 -0
  33. package/dist/anchoring/profiles.d.ts +140 -0
  34. package/dist/anchoring/profiles.d.ts.map +1 -0
  35. package/dist/anchoring/profiles.js +682 -0
  36. package/dist/anchoring/profiles.js.map +1 -0
  37. package/dist/anchoring/providers.d.ts +16 -1
  38. package/dist/anchoring/providers.d.ts.map +1 -1
  39. package/dist/anchoring/providers.js +15 -0
  40. package/dist/anchoring/providers.js.map +1 -1
  41. package/dist/anchoring/resolver.d.ts +23 -5
  42. package/dist/anchoring/resolver.d.ts.map +1 -1
  43. package/dist/anchoring/resolver.js +32 -13
  44. package/dist/anchoring/resolver.js.map +1 -1
  45. package/dist/anchoring/site-profiles.d.ts +31 -0
  46. package/dist/anchoring/site-profiles.d.ts.map +1 -0
  47. package/dist/anchoring/site-profiles.js +27 -0
  48. package/dist/anchoring/site-profiles.js.map +1 -0
  49. package/dist/body-prepare.d.ts +33 -0
  50. package/dist/body-prepare.d.ts.map +1 -0
  51. package/dist/body-prepare.js +88 -0
  52. package/dist/body-prepare.js.map +1 -0
  53. package/dist/body-size.d.ts +20 -0
  54. package/dist/body-size.d.ts.map +1 -0
  55. package/dist/body-size.js +137 -0
  56. package/dist/body-size.js.map +1 -0
  57. package/dist/body.d.ts +9 -42
  58. package/dist/body.d.ts.map +1 -1
  59. package/dist/body.js +6 -207
  60. package/dist/body.js.map +1 -1
  61. package/dist/composite.d.ts +17 -1
  62. package/dist/composite.d.ts.map +1 -1
  63. package/dist/composite.js +27 -2
  64. package/dist/composite.js.map +1 -1
  65. package/dist/document-key.d.ts +36 -0
  66. package/dist/document-key.d.ts.map +1 -0
  67. package/dist/document-key.js +40 -0
  68. package/dist/document-key.js.map +1 -0
  69. package/dist/document-url.d.ts +9 -0
  70. package/dist/document-url.d.ts.map +1 -1
  71. package/dist/document-url.js +9 -0
  72. package/dist/document-url.js.map +1 -1
  73. package/dist/ids.d.ts +4 -4
  74. package/dist/ids.d.ts.map +1 -1
  75. package/dist/ids.js +4 -4
  76. package/dist/ids.js.map +1 -1
  77. package/dist/index.d.ts +6 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +6 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/kinds.d.ts +7 -2
  82. package/dist/kinds.d.ts.map +1 -1
  83. package/dist/kinds.js +12 -3
  84. package/dist/kinds.js.map +1 -1
  85. package/dist/model.d.ts +36 -5
  86. package/dist/model.d.ts.map +1 -1
  87. package/dist/model.js +7 -1
  88. package/dist/model.js.map +1 -1
  89. package/dist/page-placement.d.ts +2 -2
  90. package/dist/page-placement.js +3 -2
  91. package/dist/page-placement.js.map +1 -1
  92. package/dist/pdf-key.d.ts +10 -0
  93. package/dist/pdf-key.d.ts.map +1 -0
  94. package/dist/pdf-key.js +22 -0
  95. package/dist/pdf-key.js.map +1 -0
  96. package/dist/placement.d.ts +20 -4
  97. package/dist/placement.d.ts.map +1 -1
  98. package/dist/placement.js +41 -5
  99. package/dist/placement.js.map +1 -1
  100. package/dist/region-image.d.ts +45 -0
  101. package/dist/region-image.d.ts.map +1 -0
  102. package/dist/region-image.js +76 -0
  103. package/dist/region-image.js.map +1 -0
  104. package/dist/scope.d.ts +17 -2
  105. package/dist/scope.d.ts.map +1 -1
  106. package/dist/scope.js +28 -4
  107. package/dist/scope.js.map +1 -1
  108. package/dist/store/store.d.ts +1 -1
  109. package/dist/store/store.d.ts.map +1 -1
  110. package/dist/store/store.js +11 -8
  111. package/dist/store/store.js.map +1 -1
  112. package/dist/testing/anchor-provider-contract.d.ts +3 -2
  113. package/dist/testing/anchor-provider-contract.d.ts.map +1 -1
  114. package/dist/testing/anchor-provider-contract.js +75 -22
  115. package/dist/testing/anchor-provider-contract.js.map +1 -1
  116. package/dist/testing/contract.d.ts +6 -0
  117. package/dist/testing/contract.d.ts.map +1 -1
  118. package/dist/testing/contract.js +22 -0
  119. package/dist/testing/contract.js.map +1 -1
  120. package/dist/testing/thread-contract.d.ts.map +1 -1
  121. package/dist/testing/thread-contract.js +2 -1
  122. package/dist/testing/thread-contract.js.map +1 -1
  123. package/dist/thread-write.d.ts +35 -0
  124. package/dist/thread-write.d.ts.map +1 -0
  125. package/dist/thread-write.js +69 -0
  126. package/dist/thread-write.js.map +1 -0
  127. package/dist/thread.d.ts +0 -21
  128. package/dist/thread.d.ts.map +1 -1
  129. package/dist/thread.js +2 -53
  130. package/dist/thread.js.map +1 -1
  131. package/dist/w3c.d.ts.map +1 -1
  132. package/dist/w3c.js +35 -6
  133. package/dist/w3c.js.map +1 -1
  134. package/package.json +6 -2
@@ -0,0 +1,608 @@
1
+ /**
2
+ * Anchors on PDFs: the text PDF.js extracts from a file, the selectors a note on it stores, and the
3
+ * way back from them to the words on a rendered page. See the design doc's "Pages that are hard to
4
+ * anchor" (PDFs). A PDF note is keyed by the file (`pdfDocumentKey`), not its URL.
5
+ *
6
+ * A PDF viewer renders only the pages near the reader, so notes are not resolved against the DOM
7
+ * as on a web page: `PdfText` is built from every page's PDF.js text content
8
+ * (`PDFPageProxy.getTextContent()`), notes are described and resolved over its canonical string,
9
+ * and `pdfLayerRange` turns a match into a DOM Range once its page's text layer is rendered.
10
+ *
11
+ * A text note stores, most robust first:
12
+ * - a FragmentSelector `page=<n>` conforming to RFC 3778 (`PDF_FRAGMENTS`): the page its quote
13
+ * starts on, counted from 1;
14
+ * - a TextQuoteSelector over the canonical text (32 characters of context a side);
15
+ * - a TextPositionSelector: offsets in the canonical text of the whole document.
16
+ * A note on a region of a page (a figure) stores the page's FragmentSelector refined by a Media
17
+ * Fragments `xywh=percent:` FragmentSelector (`describePdfRegion`). A note on the whole document
18
+ * stores no selector.
19
+ *
20
+ * Canonical PDF text. These rules are part of normalization version 1 (`NORM_VERSION`): they apply
21
+ * only to text PDF.js extracted, which no web page note is measured against, so they changed no
22
+ * stored offset and needed no new version. Any later change to them is a new version.
23
+ *
24
+ * 1. Pages in order, each page's text items in PDF.js's order. An item's `str` is its text; an
25
+ * item with `hasEOL` ends a line. Items without a string `str` (marked content) add nothing.
26
+ * 2. A line end, a page end and every whitespace character (as in `normalize.ts`, rule 3) are
27
+ * whitespace. Every run of whitespace becomes one U+0020 space.
28
+ * 3. Hyphenation: a hyphen (U+002D or U+2010) right after a letter, followed by whitespace that
29
+ * includes a line or page end and then a lowercase letter, is removed with that whitespace
30
+ * ("exam-⏎ple" reads "example"). A soft hyphen (U+00AD) followed by such whitespace removes the
31
+ * whitespace too, whatever comes next. A compound split at a line end ("well-⏎known") reads
32
+ * "wellknown" both when a note is made and when it is found, so it still matches.
33
+ * 4. Ligatures U+FB00 to U+FB06 become their letters (fi reads "fi"); other characters are left
34
+ * as PDF.js gives them.
35
+ * 5. Invisible characters are removed, as in `normalize.ts`, rule 5.
36
+ * 6. Leading and trailing whitespace is trimmed.
37
+ *
38
+ * Offsets count UTF-16 code units. Text-layer offsets (`PdfPiece`) count code units of a page's
39
+ * items' `str` joined with nothing, which is the text a PDF.js text layer holds: one text node per
40
+ * item, a `<br>` (no text) after an item that ends a line.
41
+ */
42
+ import { NORM_VERSION, PDF_FRAGMENTS, } from "../model.js";
43
+ import { MEDIA_FRAGMENTS, parseRegion, textFingerprint } from "./fingerprint.js";
44
+ import { fuzzyFind } from "./fuzzy.js";
45
+ import { APPROXIMATE_BELOW, occurrences, pickHit } from "./resolver.js";
46
+ /** Characters of context stored on each side of a quote, as on web pages. */
47
+ const CONTEXT_LENGTH = 32;
48
+ /** Most pages a PDF may have here: PDF.js reads more, but notes on such files are not offered. */
49
+ export const MAX_PDF_PAGES = 100_000;
50
+ const LIGATURES = {
51
+ 0xfb00: "ff",
52
+ 0xfb01: "fi",
53
+ 0xfb02: "fl",
54
+ 0xfb03: "ffi",
55
+ 0xfb04: "ffl",
56
+ 0xfb05: "st",
57
+ 0xfb06: "st",
58
+ };
59
+ function isSpace(c) {
60
+ return ((c >= 9 && c <= 13) ||
61
+ c === 32 ||
62
+ c === 0xa0 ||
63
+ c === 0x1680 ||
64
+ (c >= 0x2000 && c <= 0x200a) ||
65
+ c === 0x2028 ||
66
+ c === 0x2029 ||
67
+ c === 0x202f ||
68
+ c === 0x205f ||
69
+ c === 0x3000);
70
+ }
71
+ function isInvisible(c) {
72
+ return c === 0xad || c === 0x200b || c === 0x2060 || c === 0xfeff;
73
+ }
74
+ const LETTER = /\p{L}/u;
75
+ const LOWER = /\p{Ll}/u;
76
+ /**
77
+ * The canonical text of a PDF (see the rules at the top), with the map from its offsets back to
78
+ * each page's text-layer offsets.
79
+ */
80
+ export class PdfText {
81
+ /** The canonical text of the whole document. */
82
+ text;
83
+ /** For each canonical character, its source: an index into every page's layer text joined. */
84
+ src;
85
+ /** Where each page's layer text starts in that joined text; one more entry for the end. */
86
+ pageStarts;
87
+ /** `textFingerprint` of each page's layer text, to tell its rendered layer from another. */
88
+ layerHashes;
89
+ hash;
90
+ constructor(text, src, pageStarts, layerHashes) {
91
+ this.text = text;
92
+ this.src = src;
93
+ this.pageStarts = pageStarts;
94
+ this.layerHashes = layerHashes;
95
+ }
96
+ /**
97
+ * The text of a PDF from each page's text items in order: `(await page.getTextContent(options))
98
+ * .items` for pages 1 to `numPages`, with the options the viewer's text layer is built with
99
+ * (PDF.js's viewer uses `{ includeMarkedContent: true, disableNormalization: true }`), so the
100
+ * offsets match that layer. Throws for more than MAX_PDF_PAGES pages.
101
+ */
102
+ static fromPages(pages) {
103
+ if (pages.length > MAX_PDF_PAGES)
104
+ throw new Error(`A PDF of ${pages.length} pages is too long`);
105
+ const out = [];
106
+ const src = [];
107
+ const pageStarts = [];
108
+ let raw = 0;
109
+ // Whitespace seen since the last character: where it began, and whether a line or page ended.
110
+ let space = -1;
111
+ let broke = false;
112
+ // A soft hyphen came after the last character, before any whitespace.
113
+ let soft = false;
114
+ const lineEnd = () => {
115
+ if (space < 0)
116
+ space = raw;
117
+ broke = true;
118
+ };
119
+ const emit = (c, at) => {
120
+ if (space >= 0 && out.length > 0) {
121
+ const hyphen = out[out.length - 1];
122
+ const joinHyphen = broke &&
123
+ (hyphen === "-" || hyphen === "‐") &&
124
+ out.length >= 2 &&
125
+ LETTER.test(out[out.length - 2]) &&
126
+ LOWER.test(String.fromCharCode(c));
127
+ if (joinHyphen) {
128
+ out.pop();
129
+ src.pop();
130
+ }
131
+ else if (!(broke && soft)) {
132
+ out.push(" ");
133
+ src.push(space);
134
+ }
135
+ }
136
+ space = -1;
137
+ broke = false;
138
+ soft = false;
139
+ const ligature = LIGATURES[c];
140
+ if (ligature) {
141
+ for (const letter of ligature) {
142
+ out.push(letter);
143
+ src.push(at);
144
+ }
145
+ }
146
+ else {
147
+ out.push(String.fromCharCode(c));
148
+ src.push(at);
149
+ }
150
+ };
151
+ const layerHashes = [];
152
+ for (const items of pages) {
153
+ pageStarts.push(raw);
154
+ const layer = [];
155
+ for (const item of items) {
156
+ const str = typeof item?.str === "string" ? item.str : null;
157
+ if (str === null)
158
+ continue;
159
+ layer.push(str);
160
+ for (let i = 0; i < str.length; i++, raw++) {
161
+ const c = str.charCodeAt(i);
162
+ if (isSpace(c)) {
163
+ if (space < 0)
164
+ space = raw;
165
+ }
166
+ else if (isInvisible(c)) {
167
+ if (c === 0xad && space < 0)
168
+ soft = true;
169
+ }
170
+ else {
171
+ emit(c, raw);
172
+ }
173
+ }
174
+ if (item.hasEOL)
175
+ lineEnd();
176
+ }
177
+ layerHashes.push(textFingerprint(layer.join("")));
178
+ lineEnd();
179
+ }
180
+ pageStarts.push(raw);
181
+ return new PdfText(out.join(""), Int32Array.from(src), pageStarts, layerHashes);
182
+ }
183
+ /** `textFingerprint` of the text, computed once: what `ext.pageFingerprint` stores. */
184
+ get fingerprint() {
185
+ return (this.hash ??= textFingerprint(this.text));
186
+ }
187
+ /** How many pages the PDF has. */
188
+ get pageCount() {
189
+ return this.pageStarts.length - 1;
190
+ }
191
+ /** The page (from 1) the canonical character at `offset` comes from, or null out of range. */
192
+ pageAt(offset) {
193
+ if (!Number.isInteger(offset) || offset < 0 || offset >= this.text.length)
194
+ return null;
195
+ return this.pageOfRaw(this.src[offset]);
196
+ }
197
+ /** The canonical span of the text on `page` (from 1); empty for a page with no text. */
198
+ pageSpan(page) {
199
+ if (!Number.isInteger(page) || page < 1 || page > this.pageCount)
200
+ return null;
201
+ return {
202
+ start: this.firstAtOrAfter(this.pageStarts[page - 1]),
203
+ end: this.firstAtOrAfter(this.pageStarts[page]),
204
+ };
205
+ }
206
+ /**
207
+ * Where the canonical span [start, end) lies in the pages' text layers: one piece per page it
208
+ * touches, in order. A piece ends after the last layer character the span reads from, so a span
209
+ * that ends inside an expanded ligature covers the whole ligature. Null for an empty or
210
+ * out-of-range span.
211
+ */
212
+ toLayer(start, end) {
213
+ if (!Number.isInteger(start) || !Number.isInteger(end))
214
+ return null;
215
+ if (start < 0 || end > this.text.length || end <= start)
216
+ return null;
217
+ const pieces = [];
218
+ let i = start;
219
+ while (i < end) {
220
+ const page = this.pageOfRaw(this.src[i]);
221
+ const base = this.pageStarts[page - 1];
222
+ const pageEnd = this.firstAtOrAfter(this.pageStarts[page]);
223
+ const last = Math.min(end, pageEnd) - 1;
224
+ // A space that stands for a page break reads from the end of the page before.
225
+ const from = Math.max(this.src[i], base);
226
+ const to = Math.min(this.src[last] + 1, this.pageStarts[page]);
227
+ if (to > from)
228
+ pieces.push({ page, start: from - base, end: to - base });
229
+ i = last + 1;
230
+ }
231
+ return pieces.length ? pieces : null;
232
+ }
233
+ /**
234
+ * The canonical span of text-layer offsets [start, end) on `page`: the canonical characters read
235
+ * from there, or null when none are (a span of only whitespace or invisible characters).
236
+ */
237
+ fromLayer(page, start, end) {
238
+ if (!Number.isInteger(page) || page < 1 || page > this.pageCount)
239
+ return null;
240
+ const base = this.pageStarts[page - 1];
241
+ const length = this.pageStarts[page] - base;
242
+ if (!Number.isInteger(start) || !Number.isInteger(end))
243
+ return null;
244
+ if (start < 0 || end > length || end <= start)
245
+ return null;
246
+ let from = this.firstAtOrAfter(base + start);
247
+ let to = this.firstAtOrAfter(base + end);
248
+ // Spaces at either edge stand for whitespace outside or at the edge of the selection.
249
+ while (from < to && this.text.charCodeAt(from) === 32)
250
+ from++;
251
+ while (to > from && this.text.charCodeAt(to - 1) === 32)
252
+ to--;
253
+ return to > from ? { start: from, end: to } : null;
254
+ }
255
+ /** Whether `layerText` (a rendered layer's text nodes joined) is `page`'s text-layer text. */
256
+ holdsLayer(page, layerText) {
257
+ return (layerText.length === this.layerLength(page) &&
258
+ textFingerprint(layerText) === this.layerHashes[page - 1]);
259
+ }
260
+ /** The length of `page`'s text-layer text: its items' `str` joined. */
261
+ layerLength(page) {
262
+ if (!Number.isInteger(page) || page < 1 || page > this.pageCount)
263
+ return null;
264
+ return this.pageStarts[page] - this.pageStarts[page - 1];
265
+ }
266
+ /** The first canonical offset whose source is at or after `raw` (sources never decrease). */
267
+ firstAtOrAfter(raw) {
268
+ let lo = 0;
269
+ let hi = this.src.length;
270
+ while (lo < hi) {
271
+ const mid = (lo + hi) >>> 1;
272
+ if (this.src[mid] < raw)
273
+ lo = mid + 1;
274
+ else
275
+ hi = mid;
276
+ }
277
+ return lo;
278
+ }
279
+ /** The page (from 1) whose layer text holds the joined index `raw`. */
280
+ pageOfRaw(raw) {
281
+ let lo = 1;
282
+ let hi = this.pageCount;
283
+ while (lo < hi) {
284
+ const mid = (lo + hi + 1) >>> 1;
285
+ if (this.pageStarts[mid - 1] <= raw)
286
+ lo = mid;
287
+ else
288
+ hi = mid - 1;
289
+ }
290
+ return lo;
291
+ }
292
+ }
293
+ /** The FragmentSelector naming page `page` (from 1). */
294
+ export function pdfPageSelector(page) {
295
+ return { type: "FragmentSelector", conformsTo: PDF_FRAGMENTS, value: `page=${page}` };
296
+ }
297
+ /**
298
+ * Describes the canonical span [start, end) of `text`, trimmed of edge spaces, or null when it
299
+ * covers no text.
300
+ */
301
+ export function describePdf(text, start, end) {
302
+ const chars = text.text;
303
+ if (!Number.isInteger(start) || !Number.isInteger(end))
304
+ return null;
305
+ let from = Math.max(0, start);
306
+ let to = Math.min(chars.length, end);
307
+ while (from < to && chars.charCodeAt(from) === 32)
308
+ from++;
309
+ while (to > from && chars.charCodeAt(to - 1) === 32)
310
+ to--;
311
+ if (to <= from)
312
+ return null;
313
+ const page = text.pageAt(from);
314
+ const quote = { type: "TextQuoteSelector", exact: chars.slice(from, to) };
315
+ const prefix = chars.slice(contextStart(chars, from), from);
316
+ const suffix = chars.slice(to, contextEnd(chars, to));
317
+ if (prefix)
318
+ quote.prefix = prefix;
319
+ if (suffix)
320
+ quote.suffix = suffix;
321
+ const position = { type: "TextPositionSelector", start: from, end: to };
322
+ return { level: "text", selector: [pdfPageSelector(page), quote, position], ext: extOf(text) };
323
+ }
324
+ /**
325
+ * Describes a region of page `page` (from 1), such as a figure, in percent of the page's width and
326
+ * height from its top left corner (rounded to two decimals), or null when the page or region is
327
+ * out of range.
328
+ */
329
+ export function describePdfRegion(text, page, region) {
330
+ if (!Number.isInteger(page) || page < 1 || page > text.pageCount)
331
+ return null;
332
+ const round = (n) => Math.round(n * 100) / 100;
333
+ const value = `xywh=percent:${round(region.x)},${round(region.y)},${round(region.width)},${round(region.height)}`;
334
+ if (!parseRegion(value))
335
+ return null;
336
+ const selector = pdfPageSelector(page);
337
+ selector.refinedBy = { type: "FragmentSelector", conformsTo: MEDIA_FRAGMENTS, value };
338
+ return { level: "region", selector: [selector], ext: extOf(text) };
339
+ }
340
+ /** Describes the whole document. */
341
+ export function describePdfDocument(text) {
342
+ return { level: "page", selector: [], ext: extOf(text) };
343
+ }
344
+ function extOf(text) {
345
+ return {
346
+ anchorKey: null,
347
+ pageFingerprint: text.fingerprint,
348
+ normVersion: NORM_VERSION,
349
+ };
350
+ }
351
+ /**
352
+ * Finds a stored PDF anchor (`{ selector: a.target.selector, ext: a.ext }`) in `text`, in the
353
+ * order: the stored position when the document text is unchanged (`ext.pageFingerprint`), the
354
+ * exact quote (one occurrence, or the one whose context agrees), then a fuzzy match of an edited
355
+ * quote; a note on a region finds its page; a note with an empty selector list is on the whole
356
+ * document (a missing list is not: such a note more likely lost its selectors). A malformed
357
+ * anchor, or one not found, is orphaned. It runs in one go: a viewer resolving many notes on a
358
+ * long PDF should spread the calls out.
359
+ */
360
+ export function resolvePdf(text, anchor) {
361
+ try {
362
+ return resolveOrThrow(text, anchor);
363
+ }
364
+ catch {
365
+ return { status: "orphaned" };
366
+ }
367
+ }
368
+ function resolveOrThrow(text, anchor) {
369
+ if (!anchor || typeof anchor !== "object")
370
+ return { status: "orphaned" };
371
+ const list = anchor.selector;
372
+ if (list !== undefined && list !== null && !Array.isArray(list))
373
+ return { status: "orphaned" };
374
+ const ext = anchor.ext && typeof anchor.ext === "object" ? anchor.ext : {};
375
+ const unchanged = ext.normVersion === NORM_VERSION &&
376
+ typeof ext.pageFingerprint === "string" &&
377
+ ext.pageFingerprint === text.fingerprint;
378
+ if (Array.isArray(list) && list.length === 0) {
379
+ return match({ level: "page", page: null, stage: "page", confidence: 1 });
380
+ }
381
+ const parsed = parse(list ?? []);
382
+ if (parsed.region !== undefined) {
383
+ if (parsed.region === null || parsed.page === undefined || parsed.page > text.pageCount) {
384
+ return { status: "orphaned" };
385
+ }
386
+ return match({
387
+ level: "region",
388
+ page: parsed.page,
389
+ region: parsed.region,
390
+ stage: "region",
391
+ confidence: unchanged ? 1 : 0.5,
392
+ approximate: !unchanged,
393
+ });
394
+ }
395
+ const quote = parsed.quote;
396
+ if (!quote?.exact)
397
+ return { status: "orphaned" };
398
+ const chars = text.text;
399
+ const current = ext.normVersion === NORM_VERSION;
400
+ const pos = parsed.position;
401
+ // Selectors of other tools (a Hypothesis RangeSelector, say) stay on a refreshed note.
402
+ const others = (list ?? []).filter((s) => !isPdfOwn(s));
403
+ if (unchanged && pos && chars.slice(pos.start, pos.end) === quote.exact) {
404
+ return textMatch(text, pos, "fingerprint", 1, null);
405
+ }
406
+ const hits = occurrences(chars, quote.exact);
407
+ const span = hits && pickHit(chars, quote, hits);
408
+ if (span) {
409
+ const hinted = current && pos?.start === span.start && pos.end === span.end;
410
+ return textMatch(text, span, hinted ? "position" : "quote", 1, others);
411
+ }
412
+ const near = fuzzyFind(chars, {
413
+ exact: quote.exact,
414
+ prefix: typeof quote.prefix === "string" ? quote.prefix : "",
415
+ suffix: typeof quote.suffix === "string" ? quote.suffix : "",
416
+ at: current ? pos?.start : undefined,
417
+ }, undefined,
418
+ // A PDF has no blocks to keep inserted text out of a match; a page is the nearest thing.
419
+ (a, b) => text.pageAt(a) === text.pageAt(b));
420
+ return near ? textMatch(text, near, "fuzzy", near.score, others) : { status: "orphaned" };
421
+ }
422
+ /** Whether `describePdf` writes selectors like `s`: a PDF page, a quote or a position, refined by
423
+ * nothing (another tool's refinement makes it that tool's). */
424
+ function isPdfOwn(s) {
425
+ if (!s || typeof s !== "object")
426
+ return true;
427
+ const refinedBy = s.refinedBy;
428
+ if (refinedBy !== undefined && refinedBy !== null)
429
+ return false;
430
+ if (s.type === "TextQuoteSelector" || s.type === "TextPositionSelector")
431
+ return true;
432
+ return s.type === "FragmentSelector" && s.conformsTo === PDF_FRAGMENTS;
433
+ }
434
+ function parse(list) {
435
+ const parsed = {};
436
+ for (const s of list) {
437
+ if (!s || typeof s !== "object")
438
+ continue;
439
+ if (s.type === "FragmentSelector" && s.conformsTo === PDF_FRAGMENTS) {
440
+ if (parsed.page !== undefined)
441
+ continue;
442
+ const m = /^page=([1-9]\d{0,5})$/.exec(String(s.value));
443
+ if (!m)
444
+ continue;
445
+ parsed.page = Number(m[1]);
446
+ const r = s.refinedBy;
447
+ // A region that cannot be read would widen the note to the whole page. Another tool's
448
+ // refinement (a quote on the page) is left to the quote stored beside it.
449
+ if (r?.type === "FragmentSelector")
450
+ parsed.region = parseRegion(r.value);
451
+ }
452
+ else if (s.type === "TextQuoteSelector" && !parsed.quote) {
453
+ const q = s;
454
+ if (typeof q.exact === "string" && !("refinedBy" in q && q.refinedBy != null))
455
+ parsed.quote = q;
456
+ }
457
+ else if (s.type === "TextPositionSelector" && !parsed.position) {
458
+ const p = s;
459
+ if (Number.isInteger(p.start) && Number.isInteger(p.end) && p.start >= 0 && p.end > p.start) {
460
+ parsed.position = { start: p.start, end: p.end };
461
+ }
462
+ }
463
+ }
464
+ return parsed;
465
+ }
466
+ function match(m) {
467
+ return { status: "anchored", approximate: false, refreshed: null, ...m };
468
+ }
469
+ function textMatch(text, found, stage, confidence,
470
+ /** The stored selectors to keep on a refresh; null for no refresh. */
471
+ keep) {
472
+ // A fuzzy match may end on a space standing for a line or page end; it highlights nothing.
473
+ const span = { ...found };
474
+ while (span.start < span.end && text.text.charCodeAt(span.start) === 32)
475
+ span.start++;
476
+ while (span.end > span.start && text.text.charCodeAt(span.end - 1) === 32)
477
+ span.end--;
478
+ const pieces = text.toLayer(span.start, span.end);
479
+ if (!pieces)
480
+ return { status: "orphaned" };
481
+ const approximate = confidence < APPROXIMATE_BELOW;
482
+ return match({
483
+ level: "text",
484
+ page: pieces[0].page,
485
+ span: { start: span.start, end: span.end },
486
+ pieces,
487
+ stage,
488
+ confidence,
489
+ approximate,
490
+ refreshed: keep && !approximate ? refreshed(text, span, keep) : null,
491
+ });
492
+ }
493
+ function refreshed(text, span, keep) {
494
+ const d = describePdf(text, span.start, span.end);
495
+ if (d)
496
+ d.selector.push(...structuredClone(keep));
497
+ return d;
498
+ }
499
+ /** Where the prefix starts, never splitting a surrogate pair. */
500
+ function contextStart(text, start) {
501
+ const at = Math.max(0, start - CONTEXT_LENGTH);
502
+ return at > 0 && isPairEnd(text, at) ? at - 1 : at;
503
+ }
504
+ /** Where the suffix ends, never splitting a surrogate pair. */
505
+ function contextEnd(text, end) {
506
+ const at = Math.min(text.length, end + CONTEXT_LENGTH);
507
+ return at < text.length && isPairEnd(text, at) ? at + 1 : at;
508
+ }
509
+ function isPairEnd(text, i) {
510
+ const low = text.charCodeAt(i);
511
+ const high = text.charCodeAt(i - 1);
512
+ return low >= 0xdc00 && low <= 0xdfff && high >= 0xd800 && high <= 0xdbff;
513
+ }
514
+ // The text layer.
515
+ /** The text nodes of a rendered text layer, in order, with where each starts. */
516
+ function layerNodes(layer) {
517
+ const doc = layer.ownerDocument;
518
+ const walker = doc.createTreeWalker(layer, 4 /* NodeFilter.SHOW_TEXT */);
519
+ const nodes = [];
520
+ let at = 0;
521
+ for (let n = walker.nextNode(); n; n = walker.nextNode()) {
522
+ nodes.push({ node: n, at });
523
+ at += n.data.length;
524
+ }
525
+ return nodes;
526
+ }
527
+ /**
528
+ * The text-layer offset of a DOM boundary point (`node`, `offset`) inside a rendered page's text
529
+ * `layer` (PDF.js's `.textLayer`), or null when it is outside it. A point between nodes counts
530
+ * from the next text node.
531
+ */
532
+ export function pdfLayerOffset(layer, node, offset) {
533
+ if (!layer.contains(node))
534
+ return null;
535
+ const nodes = layerNodes(layer);
536
+ if (node.nodeType === 3) {
537
+ const found = nodes.find((n) => n.node === node);
538
+ return found ? found.at + Math.min(offset, node.data.length) : null;
539
+ }
540
+ // An element boundary: the text before the child at `offset`.
541
+ const probe = layer.ownerDocument.createRange();
542
+ probe.setStart(node, offset);
543
+ let at = 0;
544
+ for (const n of nodes) {
545
+ if (probe.comparePoint(n.node, 0) < 0)
546
+ at = n.at + n.node.data.length;
547
+ else
548
+ break;
549
+ }
550
+ return at;
551
+ }
552
+ /**
553
+ * Describes a selection inside the rendered text layer `layer` of page `page`: its canonical span
554
+ * in `text`, or null when the layer does not hold that page's text (not yet rendered, or from
555
+ * another file) or the selection covers no text. A selection that ends past the layer is cut at
556
+ * its end.
557
+ */
558
+ export function pdfSpanOfRange(text, page, layer, range) {
559
+ const nodes = layerNodes(layer);
560
+ const layerText = nodes.map((n) => n.node.data).join("");
561
+ if (!text.holdsLayer(page, layerText))
562
+ return null;
563
+ const length = layerText.length;
564
+ const start = layer.contains(range.startContainer)
565
+ ? pdfLayerOffset(layer, range.startContainer, range.startOffset)
566
+ : range.comparePoint(layer, 0) >= 0
567
+ ? 0
568
+ : null;
569
+ const end = layer.contains(range.endContainer)
570
+ ? pdfLayerOffset(layer, range.endContainer, range.endOffset)
571
+ : range.comparePoint(layer, layer.childNodes.length) <= 0
572
+ ? length
573
+ : null;
574
+ if (start === null || end === null)
575
+ return null;
576
+ return text.fromLayer(page, start, end);
577
+ }
578
+ /**
579
+ * A DOM Range over `piece` in the rendered text `layer` of its page, or null when the layer does
580
+ * not hold that page's text (not yet rendered, built with other `getTextContent` options, or from
581
+ * another file), so a highlight never lands on other words.
582
+ */
583
+ export function pdfLayerRange(text, piece, layer) {
584
+ const { page, start, end } = piece;
585
+ if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end <= start)
586
+ return null;
587
+ const nodes = layerNodes(layer);
588
+ if (!text.holdsLayer(page, nodes.map((n) => n.node.data).join("")))
589
+ return null;
590
+ const point = (offset, isEnd) => {
591
+ for (const n of nodes) {
592
+ const len = n.node.data.length;
593
+ // An end at a node's end stays in that node; a start there moves to the next one.
594
+ if (isEnd ? offset <= n.at + len : offset < n.at + len)
595
+ return [n.node, offset - n.at];
596
+ }
597
+ return null;
598
+ };
599
+ const from = point(start, false);
600
+ const to = point(end, true);
601
+ if (!from || !to)
602
+ return null;
603
+ const range = layer.ownerDocument.createRange();
604
+ range.setStart(from[0], from[1]);
605
+ range.setEnd(to[0], to[1]);
606
+ return range;
607
+ }
608
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/anchoring/pdf.ts"],"names":[],"mappings":"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"}