@laminapdf/viewer 0.2.0-alpha.4 → 0.2.0-alpha.6
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/README.md +79 -10
- package/dist/client.d.ts +60 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +241 -22
- package/dist/client.js.map +1 -1
- package/dist/edit/session.d.ts +91 -0
- package/dist/edit/session.d.ts.map +1 -0
- package/dist/edit/session.js +179 -0
- package/dist/edit/session.js.map +1 -0
- package/dist/edit-log.d.ts +32 -0
- package/dist/edit-log.d.ts.map +1 -0
- package/dist/edit-log.js +74 -0
- package/dist/edit-log.js.map +1 -0
- package/dist/find/controller.d.ts +6 -0
- package/dist/find/controller.d.ts.map +1 -1
- package/dist/find/controller.js +69 -2
- package/dist/find/controller.js.map +1 -1
- package/dist/first-draw.d.ts +10 -0
- package/dist/first-draw.d.ts.map +1 -0
- package/dist/first-draw.js +33 -0
- package/dist/first-draw.js.map +1 -0
- package/dist/history/history.d.ts +74 -0
- package/dist/history/history.d.ts.map +1 -0
- package/dist/history/history.js +135 -0
- package/dist/history/history.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/layers/copy.d.ts +26 -0
- package/dist/layers/copy.d.ts.map +1 -0
- package/dist/layers/copy.js +150 -0
- package/dist/layers/copy.js.map +1 -0
- package/dist/layers/link-layer.d.ts +101 -0
- package/dist/layers/link-layer.d.ts.map +1 -0
- package/dist/layers/link-layer.js +527 -0
- package/dist/layers/link-layer.js.map +1 -0
- package/dist/layers/link-preview.d.ts +77 -0
- package/dist/layers/link-preview.d.ts.map +1 -0
- package/dist/layers/link-preview.js +202 -0
- package/dist/layers/link-preview.js.map +1 -0
- package/dist/layers/link-url.d.ts +19 -0
- package/dist/layers/link-url.d.ts.map +1 -0
- package/dist/layers/link-url.js +47 -0
- package/dist/layers/link-url.js.map +1 -0
- package/dist/layers/spans.d.ts +0 -6
- package/dist/layers/spans.d.ts.map +1 -1
- package/dist/layers/spans.js +2 -20
- package/dist/layers/spans.js.map +1 -1
- package/dist/layers/structure-layer.d.ts.map +1 -1
- package/dist/layers/structure-layer.js +3 -0
- package/dist/layers/structure-layer.js.map +1 -1
- package/dist/layers/text-layer.d.ts +27 -6
- package/dist/layers/text-layer.d.ts.map +1 -1
- package/dist/layers/text-layer.js +310 -28
- package/dist/layers/text-layer.js.map +1 -1
- package/dist/layout/page-layout.d.ts +7 -0
- package/dist/layout/page-layout.d.ts.map +1 -1
- package/dist/layout/page-layout.js +15 -0
- package/dist/layout/page-layout.js.map +1 -1
- package/dist/protocol.d.ts +197 -5
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +33 -6
- package/dist/protocol.js.map +1 -1
- package/dist/source/opfs.d.ts +35 -0
- package/dist/source/opfs.d.ts.map +1 -0
- package/dist/source/opfs.js +178 -0
- package/dist/source/opfs.js.map +1 -0
- package/dist/thumbnails/strip.d.ts +1 -1
- package/dist/thumbnails/strip.d.ts.map +1 -1
- package/dist/thumbnails/strip.js +48 -4
- package/dist/thumbnails/strip.js.map +1 -1
- package/dist/view/previews.d.ts +47 -0
- package/dist/view/previews.d.ts.map +1 -0
- package/dist/view/previews.js +97 -0
- package/dist/view/previews.js.map +1 -0
- package/dist/view/user-select.d.ts +3 -0
- package/dist/view/user-select.d.ts.map +1 -0
- package/dist/view/user-select.js +10 -0
- package/dist/view/user-select.js.map +1 -0
- package/dist/view/viewer.d.ts +143 -5
- package/dist/view/viewer.d.ts.map +1 -1
- package/dist/view/viewer.js +590 -50
- package/dist/view/viewer.js.map +1 -1
- package/dist/worker/document.d.ts +66 -6
- package/dist/worker/document.d.ts.map +1 -1
- package/dist/worker/document.js +139 -23
- package/dist/worker/document.js.map +1 -1
- package/dist/worker/edit.d.ts +35 -0
- package/dist/worker/edit.d.ts.map +1 -0
- package/dist/worker/edit.js +305 -0
- package/dist/worker/edit.js.map +1 -0
- package/dist/worker/find.d.ts +2 -2
- package/dist/worker/find.d.ts.map +1 -1
- package/dist/worker/find.js +8 -21
- package/dist/worker/find.js.map +1 -1
- package/dist/worker/fingerprint.d.ts +10 -0
- package/dist/worker/fingerprint.d.ts.map +1 -0
- package/dist/worker/fingerprint.js +42 -0
- package/dist/worker/fingerprint.js.map +1 -0
- package/dist/worker/methods.d.ts.map +1 -1
- package/dist/worker/methods.js +42 -4
- package/dist/worker/methods.js.map +1 -1
- package/dist/worker/navigation.d.ts +5 -1
- package/dist/worker/navigation.d.ts.map +1 -1
- package/dist/worker/navigation.js +22 -4
- package/dist/worker/navigation.js.map +1 -1
- package/dist/worker/print.d.ts +14 -0
- package/dist/worker/print.d.ts.map +1 -0
- package/dist/worker/print.js +49 -0
- package/dist/worker/print.js.map +1 -0
- package/dist/worker/recent-pages.d.ts +16 -0
- package/dist/worker/recent-pages.d.ts.map +1 -0
- package/dist/worker/recent-pages.js +68 -0
- package/dist/worker/recent-pages.js.map +1 -0
- package/dist/worker/render.d.ts.map +1 -1
- package/dist/worker/render.js +5 -2
- package/dist/worker/render.js.map +1 -1
- package/dist/worker/session.d.ts +59 -0
- package/dist/worker/session.d.ts.map +1 -0
- package/dist/worker/session.js +152 -0
- package/dist/worker/session.js.map +1 -0
- package/dist/worker/text.d.ts +11 -3
- package/dist/worker/text.d.ts.map +1 -1
- package/dist/worker/text.js +33 -25
- package/dist/worker/text.js.map +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// Where a link goes, as a picture (R07, design language §7.27): the region of the destination page
|
|
2
|
+
// a preview shows, and the scale it is drawn at. Pure numbers in ADR 0027 page space (points from
|
|
3
|
+
// the displayed page's top-left, y down), so its rules are tested in Node; the view rotation is
|
|
4
|
+
// applied when the region is rendered.
|
|
5
|
+
//
|
|
6
|
+
// A destination with a point (`XYZ` with a top, `FitH`, `FitR`) gets a region preview: a crop that
|
|
7
|
+
// starts just above and left of the point, as wide as the text column that starts there, so a
|
|
8
|
+
// citation shows its reference entry and a reference in the right column shows that column.
|
|
9
|
+
// Anything else gets R07's page preview: the top of the page at thumbnail scale.
|
|
10
|
+
import { CSS_PX_PER_PT } from "../layout/page-layout.js";
|
|
11
|
+
/** How far above and left of the destination point the crop starts, in points. */
|
|
12
|
+
export const PREVIEW_PAD = 8;
|
|
13
|
+
/** A text line belongs to the destination's column when it starts this close to its left, in points. */
|
|
14
|
+
const PREVIEW_ALIGN = 12;
|
|
15
|
+
/** The crop's width without text lines to measure (an image-only page, no text module), in points. */
|
|
16
|
+
export const PREVIEW_NO_TEXT_WIDTH = 360;
|
|
17
|
+
/** The largest crop a region preview draws, in CSS px. */
|
|
18
|
+
export const PREVIEW_MAX = { width: 480, height: 180 };
|
|
19
|
+
/** A region preview's zoom: the reader's, clamped to `min`–`max` %; lowered to fit a wide region, never below `floor` %. */
|
|
20
|
+
const PREVIEW_ZOOM = { min: 100, max: 150, floor: 75 };
|
|
21
|
+
/** R07's page preview: a crop this wide and this high (CSS px) of the page's top. */
|
|
22
|
+
export const PAGE_PREVIEW = { width: 224, height: 92 };
|
|
23
|
+
const clamp = (v, low, high) => Math.max(low, Math.min(high, v));
|
|
24
|
+
/** A finite number, or `fallback` (a malformed file's NaN or infinity, ADR 0003). */
|
|
25
|
+
const finite = (v, fallback) => (v !== undefined && Number.isFinite(v) ? v : fallback);
|
|
26
|
+
/**
|
|
27
|
+
* A page's text lines, from its runs and glyph quads (`pageText`). Runs come in reading order:
|
|
28
|
+
* a run joins the line before it when it sits on the same band and starts no further right than
|
|
29
|
+
* twice its font size past the line's end, so the two columns of a page stay two lines. Vertical
|
|
30
|
+
* and empty runs are left out.
|
|
31
|
+
*/
|
|
32
|
+
export function previewLines(runs, quads) {
|
|
33
|
+
const lines = [];
|
|
34
|
+
for (const run of runs) {
|
|
35
|
+
if (run.vertical || run.text.trim() === "")
|
|
36
|
+
continue;
|
|
37
|
+
const box = runBox(run, quads);
|
|
38
|
+
if (box === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
const last = lines.at(-1);
|
|
41
|
+
if (last !== undefined && joins(last, box, run.size)) {
|
|
42
|
+
last.left = Math.min(last.left, box.left);
|
|
43
|
+
last.right = Math.max(last.right, box.right);
|
|
44
|
+
last.top = Math.min(last.top, box.top);
|
|
45
|
+
last.bottom = Math.max(last.bottom, box.bottom);
|
|
46
|
+
last.parts.push(run.text);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
lines.push({ ...box, parts: [run.text] });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return lines.map(({ parts, ...box }) => ({ ...box, text: parts.join(" ").replace(/\s+/g, " ").trim() }));
|
|
53
|
+
}
|
|
54
|
+
/** The box around a run's glyph quads; `undefined` without a finite corner. */
|
|
55
|
+
function runBox(run, quads) {
|
|
56
|
+
const [start, end] = run.glyphRange;
|
|
57
|
+
const box = { left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity };
|
|
58
|
+
for (let k = start * 8; k < end * 8; k += 2) {
|
|
59
|
+
const x = quads[k];
|
|
60
|
+
const y = quads[k + 1];
|
|
61
|
+
if (x === undefined || y === undefined || !Number.isFinite(x) || !Number.isFinite(y))
|
|
62
|
+
continue;
|
|
63
|
+
box.left = Math.min(box.left, x);
|
|
64
|
+
box.right = Math.max(box.right, x);
|
|
65
|
+
box.top = Math.min(box.top, y);
|
|
66
|
+
box.bottom = Math.max(box.bottom, y);
|
|
67
|
+
}
|
|
68
|
+
return box.left <= box.right && box.top <= box.bottom ? box : undefined;
|
|
69
|
+
}
|
|
70
|
+
/** Whether a run at `box` continues `line`: on its band, and no further than twice its size away. */
|
|
71
|
+
function joins(line, box, size) {
|
|
72
|
+
const middle = (box.top + box.bottom) / 2;
|
|
73
|
+
const reach = Math.max(2 * size, PREVIEW_ALIGN);
|
|
74
|
+
return middle >= line.top && middle <= line.bottom && box.left - line.right <= reach && box.left >= line.left - reach;
|
|
75
|
+
}
|
|
76
|
+
/** CSS px per point at the reader's `percent`, clamped as a region preview draws. */
|
|
77
|
+
function zoomScale(percent) {
|
|
78
|
+
return (clamp(finite(percent, 100), PREVIEW_ZOOM.min, PREVIEW_ZOOM.max) / 100) * CSS_PX_PER_PT;
|
|
79
|
+
}
|
|
80
|
+
/** The page's top, at thumbnail scale: R07's page preview. */
|
|
81
|
+
function pagePreview(page, size) {
|
|
82
|
+
const width = Math.max(1, finite(size.width, 1));
|
|
83
|
+
const height = Math.max(1, finite(size.height, 1));
|
|
84
|
+
const scale = PAGE_PREVIEW.width / width;
|
|
85
|
+
return {
|
|
86
|
+
kind: "page",
|
|
87
|
+
page,
|
|
88
|
+
clip: { x: 0, y: 0, width, height: Math.min(height, PAGE_PREVIEW.height / scale) },
|
|
89
|
+
scale,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* What a preview of `target` shows. `size` is the destination page's displayed size, `lines` its
|
|
94
|
+
* text lines (`undefined` without text), `percent` the reader's zoom. Bad values (a top above the
|
|
95
|
+
* page, a rectangle outside it, NaN) are clamped onto the page and never throw.
|
|
96
|
+
*/
|
|
97
|
+
export function previewRegion(target, size, lines, percent) {
|
|
98
|
+
const page = target.page;
|
|
99
|
+
const width = Math.max(1, finite(size.width, 1));
|
|
100
|
+
const height = Math.max(1, finite(size.height, 1));
|
|
101
|
+
const view = target.view;
|
|
102
|
+
switch (view.kind) {
|
|
103
|
+
case "fit-rect":
|
|
104
|
+
return rectPreview(page, width, height, view);
|
|
105
|
+
case "at":
|
|
106
|
+
case "fit-width":
|
|
107
|
+
if (view.y === undefined || !Number.isFinite(view.y))
|
|
108
|
+
return pagePreview(page, size);
|
|
109
|
+
return pointPreview(page, width, height, view.kind === "at" ? view.x : undefined, view.y, lines, percent);
|
|
110
|
+
default:
|
|
111
|
+
return pagePreview(page, size);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** A `FitR` destination: the rectangle, scaled to fit the card. */
|
|
115
|
+
function rectPreview(page, width, height, rect) {
|
|
116
|
+
const xs = [clamp(finite(rect.x0, 0), 0, width), clamp(finite(rect.x1, width), 0, width)];
|
|
117
|
+
const ys = [clamp(finite(rect.y0, 0), 0, height), clamp(finite(rect.y1, height), 0, height)];
|
|
118
|
+
const x = Math.min(...xs);
|
|
119
|
+
const y = Math.min(...ys);
|
|
120
|
+
const w = Math.max(1, Math.max(...xs) - x);
|
|
121
|
+
const h = Math.max(1, Math.max(...ys) - y);
|
|
122
|
+
const scale = Math.min(PREVIEW_MAX.width / w, PREVIEW_MAX.height / h, zoomScale(PREVIEW_ZOOM.max));
|
|
123
|
+
return {
|
|
124
|
+
kind: "region",
|
|
125
|
+
page,
|
|
126
|
+
clip: { x, y, width: Math.min(w, PREVIEW_MAX.width / scale), height: Math.min(h, PREVIEW_MAX.height / scale) },
|
|
127
|
+
scale,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** A destination point: the crop from just above and left of it, as wide as its text column. */
|
|
131
|
+
function pointPreview(page, width, height, left, top, lines, percent) {
|
|
132
|
+
let scale = zoomScale(percent);
|
|
133
|
+
const y = clamp(top - PREVIEW_PAD, 0, height - 1);
|
|
134
|
+
const band = (line) => line.top >= y && line.top <= y + PREVIEW_MAX.height / scale;
|
|
135
|
+
const inBand = (lines ?? []).filter(band);
|
|
136
|
+
// No left (`FitH`, an `XYZ` without one): the column of the first line at or below the
|
|
137
|
+
// destination, top then left (a line of the other column in the pad above it doesn't count).
|
|
138
|
+
const below = inBand.filter((line) => line.top >= top - 1);
|
|
139
|
+
const first = [...(below.length > 0 ? below : inBand)].sort((a, b) => a.top - b.top || a.left - b.left)[0];
|
|
140
|
+
const at = left !== undefined && Number.isFinite(left) ? clamp(left, 0, width) : (first?.left ?? 0);
|
|
141
|
+
const x = clamp(at - PREVIEW_PAD, 0, width - 1);
|
|
142
|
+
const column = inBand.filter((line) => Math.abs(line.left - at) <= PREVIEW_ALIGN);
|
|
143
|
+
const right = column.length === 0 ? undefined : Math.max(...column.map((l) => l.right));
|
|
144
|
+
let w = clamp((right ?? x + PREVIEW_NO_TEXT_WIDTH) + PREVIEW_PAD - x, 1, width - x);
|
|
145
|
+
if (w * scale > PREVIEW_MAX.width) {
|
|
146
|
+
scale = Math.max((PREVIEW_ZOOM.floor / 100) * CSS_PX_PER_PT, PREVIEW_MAX.width / w);
|
|
147
|
+
w = Math.min(w, PREVIEW_MAX.width / scale);
|
|
148
|
+
}
|
|
149
|
+
const h = Math.max(1, Math.min(PREVIEW_MAX.height / scale, height - y));
|
|
150
|
+
return { kind: "region", page, clip: { x, y, width: w, height: h }, scale };
|
|
151
|
+
}
|
|
152
|
+
/** The text of the lines inside `clip`, in reading order, joined and cut at `max` characters. */
|
|
153
|
+
export function previewText(lines, clip, max = 300) {
|
|
154
|
+
const inside = lines.filter((l) => l.right > clip.x &&
|
|
155
|
+
l.left < clip.x + clip.width &&
|
|
156
|
+
(l.top + l.bottom) / 2 >= clip.y &&
|
|
157
|
+
(l.top + l.bottom) / 2 <= clip.y + clip.height);
|
|
158
|
+
const text = inside
|
|
159
|
+
.map((l) => l.text)
|
|
160
|
+
.join(" ")
|
|
161
|
+
.trim();
|
|
162
|
+
return text.length <= max ? text : `${text.slice(0, max - 1).trimEnd()}…`;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The render request for `region` of a page of `size`, turned `rotation` degrees clockwise as the
|
|
166
|
+
* view is, at `dpr` device pixels per CSS px. The clip is in the rotated page's device pixels, as
|
|
167
|
+
* the renderer takes it, rounded out to whole pixels and kept on the page.
|
|
168
|
+
*/
|
|
169
|
+
export function previewRender(region, size, rotation, dpr) {
|
|
170
|
+
const scale = region.scale * Math.max(0.5, finite(dpr, 1));
|
|
171
|
+
const { x, y, width, height } = region.clip;
|
|
172
|
+
// The clip's corners as fractions of the page, turned as the view turns the page.
|
|
173
|
+
const corners = [
|
|
174
|
+
[x / size.width, y / size.height],
|
|
175
|
+
[(x + width) / size.width, (y + height) / size.height],
|
|
176
|
+
];
|
|
177
|
+
const turned = corners.map(([fx, fy]) => {
|
|
178
|
+
switch (rotation) {
|
|
179
|
+
case 90:
|
|
180
|
+
return [1 - fy, fx];
|
|
181
|
+
case 180:
|
|
182
|
+
return [1 - fx, 1 - fy];
|
|
183
|
+
case 270:
|
|
184
|
+
return [fy, 1 - fx];
|
|
185
|
+
default:
|
|
186
|
+
return [fx, fy];
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
const quarter = rotation === 90 || rotation === 270;
|
|
190
|
+
const pageW = (quarter ? size.height : size.width) * scale;
|
|
191
|
+
const pageH = (quarter ? size.width : size.height) * scale;
|
|
192
|
+
const xs = turned.map(([fx]) => (fx ?? 0) * pageW);
|
|
193
|
+
const ys = turned.map(([, fy]) => (fy ?? 0) * pageH);
|
|
194
|
+
const x0 = clamp(Math.floor(Math.min(...xs)), 0, Math.max(0, Math.floor(pageW) - 1));
|
|
195
|
+
const y0 = clamp(Math.floor(Math.min(...ys)), 0, Math.max(0, Math.floor(pageH) - 1));
|
|
196
|
+
const x1 = clamp(Math.ceil(Math.max(...xs)), x0 + 1, Math.max(x0 + 1, Math.floor(pageW)));
|
|
197
|
+
const y1 = clamp(Math.ceil(Math.max(...ys)), y0 + 1, Math.max(y0 + 1, Math.floor(pageH)));
|
|
198
|
+
const cssW = quarter ? height * region.scale : width * region.scale;
|
|
199
|
+
const cssH = quarter ? width * region.scale : height * region.scale;
|
|
200
|
+
return { scale, clip: { x: x0, y: y0, width: x1 - x0, height: y1 - y0 }, css: { width: cssW, height: cssH } };
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=link-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-preview.js","sourceRoot":"","sources":["../../src/layers/link-preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A link address as a reader treats it. */
|
|
2
|
+
export type ExternalLink = OpenableLink | {
|
|
3
|
+
readonly kind: "refused";
|
|
4
|
+
readonly uri: string;
|
|
5
|
+
};
|
|
6
|
+
/** A link address that may open after the reader confirms. */
|
|
7
|
+
export type OpenableLink = {
|
|
8
|
+
readonly kind: "open";
|
|
9
|
+
readonly href: string;
|
|
10
|
+
/** The address in three parts, the host (or a mailto address's domain) emphasised. */
|
|
11
|
+
readonly parts: {
|
|
12
|
+
readonly before: string;
|
|
13
|
+
readonly host: string;
|
|
14
|
+
readonly after: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
/** What a reader does with the link address `uri`. */
|
|
18
|
+
export declare function externalLink(uri: string): ExternalLink;
|
|
19
|
+
//# sourceMappingURL=link-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-url.d.ts","sourceRoot":"","sources":["../../src/layers/link-url.ts"],"names":[],"mappings":"AASA,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F,8DAA8D;AAC9D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5F,CAAC;AAEF,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAkCtD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Which link addresses a reader may open (web-app §2: external links confirm before leaving; R07:
|
|
2
|
+
// only `http(s):` and `mailto:` open), and how one is shown so it can't pass for another. The
|
|
3
|
+
// address comes from the file and is never trusted: `javascript:`, `file:`, `data:` and every other
|
|
4
|
+
// scheme are refused, as is anything `URL` can't parse. A host is shown as `URL` gives it: an
|
|
5
|
+
// international name in punycode (`xn--…`), so a look-alike host reads as what it is.
|
|
6
|
+
/** The schemes a link may open. */
|
|
7
|
+
const OPENABLE = new Set(["http:", "https:", "mailto:"]);
|
|
8
|
+
/** What a reader does with the link address `uri`. */
|
|
9
|
+
export function externalLink(uri) {
|
|
10
|
+
let url;
|
|
11
|
+
try {
|
|
12
|
+
url = new URL(uri.trim());
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return { kind: "refused", uri };
|
|
16
|
+
}
|
|
17
|
+
if (!OPENABLE.has(url.protocol))
|
|
18
|
+
return { kind: "refused", uri };
|
|
19
|
+
const { href } = url;
|
|
20
|
+
if (url.protocol === "mailto:") {
|
|
21
|
+
// `mailto:` has no host: the domain after the last `@` is what a reader checks.
|
|
22
|
+
const at = href.lastIndexOf("@");
|
|
23
|
+
const end = href.search(/[?#]/);
|
|
24
|
+
const stop = end < 0 ? href.length : end;
|
|
25
|
+
if (at < 0 || at > stop)
|
|
26
|
+
return { kind: "open", href, parts: { before: href, host: "", after: "" } };
|
|
27
|
+
return {
|
|
28
|
+
kind: "open",
|
|
29
|
+
href,
|
|
30
|
+
parts: { before: href.slice(0, at + 1), host: href.slice(at + 1, stop), after: href.slice(stop) },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// The host follows `//` and any credentials (`user:password@`), which may hold the host's own
|
|
34
|
+
// text to pass for it: count past them rather than search.
|
|
35
|
+
const userinfo = url.username === "" && url.password === "" ? 0 : href.indexOf("@", url.protocol.length) + 1;
|
|
36
|
+
const start = userinfo > 0 ? userinfo : url.protocol.length + 2;
|
|
37
|
+
return {
|
|
38
|
+
kind: "open",
|
|
39
|
+
href,
|
|
40
|
+
parts: {
|
|
41
|
+
before: href.slice(0, start),
|
|
42
|
+
host: url.host,
|
|
43
|
+
after: href.slice(start + url.host.length),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=link-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-url.js","sourceRoot":"","sources":["../../src/layers/link-url.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,8FAA8F;AAC9F,oGAAoG;AACpG,8FAA8F;AAC9F,sFAAsF;AAEtF,mCAAmC;AACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAazD,sDAAsD;AACtD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACjE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACrB,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,gFAAgF;QAChF,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;QACrG,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI;YACJ,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;SAClG,CAAC;IACJ,CAAC;IACD,8FAA8F;IAC9F,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7G,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAChE,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI;QACJ,KAAK,EAAE;YACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;SAC3C;KACF,CAAC;AACJ,CAAC"}
|
package/dist/layers/spans.d.ts
CHANGED
|
@@ -31,12 +31,6 @@ export interface Piece {
|
|
|
31
31
|
readonly text: string;
|
|
32
32
|
readonly span: SpanSpec;
|
|
33
33
|
}
|
|
34
|
-
/**
|
|
35
|
-
* The copied text of `pieces`, in page and reading order: a new line between pages and where the
|
|
36
|
-
* next span starts a new line (its baseline moved by more than half a line), a space where it
|
|
37
|
-
* starts past a gap on the same line. Soft hyphens, which mark where a line may break, go.
|
|
38
|
-
*/
|
|
39
|
-
export declare function joinPieces(pieces: readonly Piece[]): string;
|
|
40
34
|
/** What goes between two pieces as copy writes them: a new line, a space or nothing. */
|
|
41
35
|
export declare function separator(a: Piece, b: Piece): string;
|
|
42
36
|
//# sourceMappingURL=spans.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../../src/layers/spans.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,yDAAyD;AACzD,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAsCD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,QAAQ,EAAE,CAKzF;
|
|
1
|
+
{"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../../src/layers/spans.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,yDAAyD;AACzD,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAsCD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,QAAQ,EAAE,CAKzF;AA2CD,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAgBpD"}
|
package/dist/layers/spans.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// The text layer's geometry, pure: one span per text run, placed from its glyphs' quads (Lamina
|
|
2
2
|
// PDF's, never the renderer's: ADR 0004's two-parsers rule) in page space, points from the
|
|
3
3
|
// displayed page's top-left, y down. The span's own frame follows the run's baseline, so a rotated
|
|
4
|
-
// or vertical run gets a rotated span, and a right-to-left run reads right to left. Also
|
|
5
|
-
//
|
|
4
|
+
// or vertical run gets a rotated span, and a right-to-left run reads right to left. Also where one
|
|
5
|
+
// piece of a selection's text ends a line or a word (copy.ts joins them).
|
|
6
6
|
const dot = (a, b) => a.x * b.x + a.y * b.y;
|
|
7
7
|
/** A unit vector along `v`, or `fallback` for a zero vector. */
|
|
8
8
|
function unit(v, fallback) {
|
|
@@ -80,24 +80,6 @@ function extent(quads, start, end, along, up) {
|
|
|
80
80
|
}
|
|
81
81
|
return { minA, maxA, minB, maxB };
|
|
82
82
|
}
|
|
83
|
-
/** U+00AD, which marks where a word may break: written as a code, since it is invisible. */
|
|
84
|
-
const SOFT_HYPHEN = String.fromCharCode(0xad);
|
|
85
|
-
/**
|
|
86
|
-
* The copied text of `pieces`, in page and reading order: a new line between pages and where the
|
|
87
|
-
* next span starts a new line (its baseline moved by more than half a line), a space where it
|
|
88
|
-
* starts past a gap on the same line. Soft hyphens, which mark where a line may break, go.
|
|
89
|
-
*/
|
|
90
|
-
export function joinPieces(pieces) {
|
|
91
|
-
let out = "";
|
|
92
|
-
let before;
|
|
93
|
-
for (const piece of pieces) {
|
|
94
|
-
if (before !== undefined)
|
|
95
|
-
out += separator(before, piece);
|
|
96
|
-
out += piece.text;
|
|
97
|
-
before = piece;
|
|
98
|
-
}
|
|
99
|
-
return out.replaceAll(SOFT_HYPHEN, "");
|
|
100
|
-
}
|
|
101
83
|
/** What goes between two pieces as copy writes them: a new line, a space or nothing. */
|
|
102
84
|
export function separator(a, b) {
|
|
103
85
|
if (a.page !== b.page)
|
package/dist/layers/spans.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spans.js","sourceRoot":"","sources":["../../src/layers/spans.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,2FAA2F;AAC3F,mGAAmG;AACnG,
|
|
1
|
+
{"version":3,"file":"spans.js","sourceRoot":"","sources":["../../src/layers/spans.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,2FAA2F;AAC3F,mGAAmG;AACnG,mGAAmG;AACnG,0EAA0E;AA6B1E,MAAM,GAAG,GAAG,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEtD,gEAAgE;AAChE,SAAS,IAAI,CAAC,CAAM,EAAE,QAAa;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;AACzE,CAAC;AAED,2EAA2E;AAC3E,SAAS,OAAO,CAAC,KAAmB,EAAE,CAAS;IAC7C,MAAM,EAAE,GAAG,CAAC,CAAS,EAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,MAAM,CAAC,CAAiB;IAC/B,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AACxG,CAAC;AAED,4GAA4G;AAC5G,MAAM,GAAG,GAAG,2CAA2C,CAAC;AAExD;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAA4B,EAAE,KAAmB;IAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,SAAS,MAAM,CAAC,GAAgB,EAAE,KAAa,EAAE,KAAmB;IAClE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC;IACpC,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ;QACxB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACpG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACrF,6FAA6F;IAC7F,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO;QACL,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI;QAClC,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI;QACjC,KAAK,EAAE,IAAI,GAAG,IAAI;QAClB,MAAM,EAAE,IAAI,GAAG,IAAI;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChD,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAS,MAAM,CAAC,KAAmB,EAAE,KAAa,EAAE,GAAW,EAAE,KAAU,EAAE,EAAO;IAClF,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1E,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACzB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACzB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACzB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AASD,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,CAAQ,EAAE,CAAQ;IAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACvE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACvC,6FAA6F;IAC7F,iDAAiD;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACzE,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACzE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtF,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7D,iGAAiG;IACjG,mFAAmF;IACnF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure-layer.d.ts","sourceRoot":"","sources":["../../src/layers/structure-layer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"structure-layer.d.ts","sourceRoot":"","sources":["../../src/layers/structure-layer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAkCpD,mCAAmC;AACnC,qBAAa,cAAc;;IASzB,YAAY,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAIrE;IAED,+FAA+F;IAC/F,IAAI,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAkBnC;IAED,2EAA2E;IAC3E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAMjD;IAUD,2EAA2E;IAC3E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAYzB;IAED,yCAAyC;IACzC,KAAK,IAAI,IAAI,CAIZ;CA2BF"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// page and MCID. Assistive technology then reads the document in structure order with its
|
|
5
5
|
// semantics, whichever backend renders it (the pdf.js pattern). The spans join their elements as
|
|
6
6
|
// their pages mount and leave as they unmount. A document without structure says so once.
|
|
7
|
+
import { setUserSelect } from "../view/user-select.js";
|
|
7
8
|
/** An ARIA role (and level) per standard structure type; types not here are plain groups. */
|
|
8
9
|
const ROLES = {
|
|
9
10
|
P: "paragraph",
|
|
@@ -52,6 +53,8 @@ export class StructureLayer {
|
|
|
52
53
|
const tree = document.createElement("div");
|
|
53
54
|
tree.className = "lamina-structure";
|
|
54
55
|
Object.assign(tree.style, HIDDEN);
|
|
56
|
+
// Hidden from sight, never from a drag: it takes no part in a selection.
|
|
57
|
+
setUserSelect(tree, "none");
|
|
55
58
|
const untagged = structure.tree === undefined || structure.tree.length === 0;
|
|
56
59
|
if (untagged)
|
|
57
60
|
tree.setAttribute("role", "status");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure-layer.js","sourceRoot":"","sources":["../../src/layers/structure-layer.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,iGAAiG;AACjG,gGAAgG;AAChG,0FAA0F;AAC1F,iGAAiG;AACjG,0FAA0F;
|
|
1
|
+
{"version":3,"file":"structure-layer.js","sourceRoot":"","sources":["../../src/layers/structure-layer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import type { ViewerClient } from "../client.js";
|
|
2
2
|
import type { Rotation } from "../layout/page-layout.js";
|
|
3
|
-
import type { OpenedDocument } from "../protocol.js";
|
|
4
3
|
import type { PageLayer } from "../view/viewer.js";
|
|
4
|
+
import { type CopyMode } from "./copy.js";
|
|
5
5
|
/** What the text layer needs of its viewer. */
|
|
6
6
|
export interface TextLayerHost {
|
|
7
|
-
/** The viewer's root:
|
|
7
|
+
/** The viewer's root: where selections start, and where the structure tree lives. */
|
|
8
8
|
readonly root: HTMLElement;
|
|
9
|
-
readonly client: Pick<ViewerClient, "pageText" | "structure">;
|
|
9
|
+
readonly client: Pick<ViewerClient, "pageText" | "structure" | "readingOrder">;
|
|
10
10
|
/** The view's rotation now. */
|
|
11
11
|
rotation(): Rotation;
|
|
12
|
+
/** Page `page`'s displayed size in points now. */
|
|
13
|
+
points(page: number): {
|
|
14
|
+
readonly width: number;
|
|
15
|
+
readonly height: number;
|
|
16
|
+
} | undefined;
|
|
12
17
|
/** Keeps these pages mounted (the ones the selection touches). */
|
|
13
18
|
keepMounted(pages: Iterable<number>): void;
|
|
14
19
|
}
|
|
15
20
|
/** A selection in the text layer, for the app's selection surfaces (UI/UX plan §5.3). */
|
|
16
21
|
export interface TextSelection {
|
|
17
|
-
/** The selected text, as copy writes it. */
|
|
22
|
+
/** The selected text, as copy writes it (by paragraph). */
|
|
18
23
|
readonly text: string;
|
|
19
24
|
/** Its client rects, to place a toolbar or a menu near. */
|
|
20
25
|
readonly rects: readonly DOMRect[];
|
|
@@ -22,6 +27,13 @@ export interface TextSelection {
|
|
|
22
27
|
readonly pages: readonly number[];
|
|
23
28
|
/** The pointer that made it: `mouse`, `pen`, `touch`, or `""` for the keyboard. */
|
|
24
29
|
readonly pointerType: string;
|
|
30
|
+
/**
|
|
31
|
+
* The selection is done: the pointer that makes it is up (false during a drag, when a toolbar
|
|
32
|
+
* would get in the way). A keyboard selection is always settled.
|
|
33
|
+
*/
|
|
34
|
+
readonly settled: boolean;
|
|
35
|
+
/** A rectangle's runs (column selection), rather than the browser's selection. */
|
|
36
|
+
readonly column: boolean;
|
|
25
37
|
}
|
|
26
38
|
/** The text layer's options (`createViewer`'s `text`). */
|
|
27
39
|
export interface TextLayerOptions {
|
|
@@ -37,8 +49,17 @@ export declare class TextLayer implements PageLayer {
|
|
|
37
49
|
#private;
|
|
38
50
|
readonly name = "text";
|
|
39
51
|
constructor(host: TextLayerHost, options?: TextLayerOptions);
|
|
40
|
-
/**
|
|
41
|
-
|
|
52
|
+
/** Whether a plain drag selects a rectangle (column mode). */
|
|
53
|
+
get columnMode(): boolean;
|
|
54
|
+
set columnMode(on: boolean);
|
|
55
|
+
/**
|
|
56
|
+
* Copies the selection in `mode` to the clipboard, as the copy event would (for a command or a
|
|
57
|
+
* toolbar button; it must run in a user gesture). Resolves false when nothing is selected or
|
|
58
|
+
* the clipboard refused.
|
|
59
|
+
*/
|
|
60
|
+
copy(mode?: CopyMode): Promise<boolean>;
|
|
61
|
+
/** A new document: its structure tree, read once. */
|
|
62
|
+
open(): void;
|
|
42
63
|
onMount(page: number, slot: HTMLElement): void;
|
|
43
64
|
onUnmount(page: number): void;
|
|
44
65
|
onZoom(page: number, _slot: HTMLElement, size: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-layer.d.ts","sourceRoot":"","sources":["../../src/layers/text-layer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-layer.d.ts","sourceRoot":"","sources":["../../src/layers/text-layer.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAIzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,WAAW,CAAC;AAIzD,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,CAAC,CAAC;IAC/E,+BAA+B;IAC/B,QAAQ,IAAI,QAAQ,CAAC;IACrB,kDAAkD;IAClD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACtF,kEAAkE;IAClE,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC5C;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,mFAAmF;IACnF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,oFAAoF;IACpF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,sGAAsG;IACtG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,GAAG,SAAS,KAAK,IAAI,CAAC;CACvE;AAYD,oCAAoC;AACpC,qBAAa,SAAU,YAAW,SAAS;;IACzC,QAAQ,CAAC,IAAI,UAAU;IA6BvB,YAAY,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,gBAAqB,EAiB9D;IAED,8DAA8D;IAC9D,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,UAAU,CAAC,EAAE,EAAE,OAAO,EAEzB;IAED;;;;OAIG;IACG,IAAI,CAAC,IAAI,GAAE,QAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BzD;IAED,qDAAqD;IACrD,IAAI,IAAI,IAAI,CAgBX;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAyB7C;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU5B;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAGxG;IAED,sDAAsD;IACtD,OAAO,IAAI,IAAI,CAEd;IAUD,uDAAuD;IACvD,OAAO,IAAI,IAAI,CAId;CAgVF"}
|