@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.
- package/dist/adapter.d.ts +27 -2
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +5 -0
- package/dist/adapter.js.map +1 -1
- package/dist/anchoring/canvas.d.ts +33 -0
- package/dist/anchoring/canvas.d.ts.map +1 -0
- package/dist/anchoring/canvas.js +112 -0
- package/dist/anchoring/canvas.js.map +1 -0
- package/dist/anchoring/context-provider.d.ts +63 -0
- package/dist/anchoring/context-provider.d.ts.map +1 -0
- package/dist/anchoring/context-provider.js +78 -0
- package/dist/anchoring/context-provider.js.map +1 -0
- package/dist/anchoring/describe.d.ts +36 -2
- package/dist/anchoring/describe.d.ts.map +1 -1
- package/dist/anchoring/describe.js +102 -20
- package/dist/anchoring/describe.js.map +1 -1
- package/dist/anchoring/fingerprint.d.ts +47 -13
- package/dist/anchoring/fingerprint.d.ts.map +1 -1
- package/dist/anchoring/fingerprint.js +58 -68
- package/dist/anchoring/fingerprint.js.map +1 -1
- package/dist/anchoring/index.d.ts +5 -0
- package/dist/anchoring/index.d.ts.map +1 -1
- package/dist/anchoring/index.js +5 -0
- package/dist/anchoring/index.js.map +1 -1
- package/dist/anchoring/media.d.ts +2 -1
- package/dist/anchoring/media.d.ts.map +1 -1
- package/dist/anchoring/media.js +7 -2
- package/dist/anchoring/media.js.map +1 -1
- package/dist/anchoring/pdf.d.ts +204 -0
- package/dist/anchoring/pdf.d.ts.map +1 -0
- package/dist/anchoring/pdf.js +608 -0
- package/dist/anchoring/pdf.js.map +1 -0
- package/dist/anchoring/profiles.d.ts +140 -0
- package/dist/anchoring/profiles.d.ts.map +1 -0
- package/dist/anchoring/profiles.js +682 -0
- package/dist/anchoring/profiles.js.map +1 -0
- package/dist/anchoring/providers.d.ts +16 -1
- package/dist/anchoring/providers.d.ts.map +1 -1
- package/dist/anchoring/providers.js +15 -0
- package/dist/anchoring/providers.js.map +1 -1
- package/dist/anchoring/resolver.d.ts +23 -5
- package/dist/anchoring/resolver.d.ts.map +1 -1
- package/dist/anchoring/resolver.js +32 -13
- package/dist/anchoring/resolver.js.map +1 -1
- package/dist/anchoring/site-profiles.d.ts +31 -0
- package/dist/anchoring/site-profiles.d.ts.map +1 -0
- package/dist/anchoring/site-profiles.js +27 -0
- package/dist/anchoring/site-profiles.js.map +1 -0
- package/dist/body-prepare.d.ts +33 -0
- package/dist/body-prepare.d.ts.map +1 -0
- package/dist/body-prepare.js +88 -0
- package/dist/body-prepare.js.map +1 -0
- package/dist/body-size.d.ts +20 -0
- package/dist/body-size.d.ts.map +1 -0
- package/dist/body-size.js +137 -0
- package/dist/body-size.js.map +1 -0
- package/dist/body.d.ts +9 -42
- package/dist/body.d.ts.map +1 -1
- package/dist/body.js +6 -207
- package/dist/body.js.map +1 -1
- package/dist/composite.d.ts +17 -1
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +27 -2
- package/dist/composite.js.map +1 -1
- package/dist/document-key.d.ts +36 -0
- package/dist/document-key.d.ts.map +1 -0
- package/dist/document-key.js +40 -0
- package/dist/document-key.js.map +1 -0
- package/dist/document-url.d.ts +9 -0
- package/dist/document-url.d.ts.map +1 -1
- package/dist/document-url.js +9 -0
- package/dist/document-url.js.map +1 -1
- package/dist/ids.d.ts +4 -4
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +4 -4
- package/dist/ids.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/kinds.d.ts +7 -2
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +12 -3
- package/dist/kinds.js.map +1 -1
- package/dist/model.d.ts +36 -5
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -1
- package/dist/model.js.map +1 -1
- package/dist/page-placement.d.ts +2 -2
- package/dist/page-placement.js +3 -2
- package/dist/page-placement.js.map +1 -1
- package/dist/pdf-key.d.ts +10 -0
- package/dist/pdf-key.d.ts.map +1 -0
- package/dist/pdf-key.js +22 -0
- package/dist/pdf-key.js.map +1 -0
- package/dist/placement.d.ts +20 -4
- package/dist/placement.d.ts.map +1 -1
- package/dist/placement.js +41 -5
- package/dist/placement.js.map +1 -1
- package/dist/region-image.d.ts +45 -0
- package/dist/region-image.d.ts.map +1 -0
- package/dist/region-image.js +76 -0
- package/dist/region-image.js.map +1 -0
- package/dist/scope.d.ts +17 -2
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +28 -4
- package/dist/scope.js.map +1 -1
- package/dist/store/store.d.ts +1 -1
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +11 -8
- package/dist/store/store.js.map +1 -1
- package/dist/testing/anchor-provider-contract.d.ts +3 -2
- package/dist/testing/anchor-provider-contract.d.ts.map +1 -1
- package/dist/testing/anchor-provider-contract.js +75 -22
- package/dist/testing/anchor-provider-contract.js.map +1 -1
- package/dist/testing/contract.d.ts +6 -0
- package/dist/testing/contract.d.ts.map +1 -1
- package/dist/testing/contract.js +22 -0
- package/dist/testing/contract.js.map +1 -1
- package/dist/testing/thread-contract.d.ts.map +1 -1
- package/dist/testing/thread-contract.js +2 -1
- package/dist/testing/thread-contract.js.map +1 -1
- package/dist/thread-write.d.ts +35 -0
- package/dist/thread-write.d.ts.map +1 -0
- package/dist/thread-write.js +69 -0
- package/dist/thread-write.js.map +1 -0
- package/dist/thread.d.ts +0 -21
- package/dist/thread.d.ts.map +1 -1
- package/dist/thread.js +2 -53
- package/dist/thread.js.map +1 -1
- package/dist/w3c.d.ts.map +1 -1
- package/dist/w3c.js +35 -6
- package/dist/w3c.js.map +1 -1
- 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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"}
|