@soomo/text-annotator 4.3.0-staging.0 → 4.4.0-staging.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/state/spatial-tree.d.ts +5 -5
- package/dist/text-annotator-options.d.ts +1 -1
- package/dist/text-annotator.es.js +393 -397
- package/dist/text-annotator.es.js.map +1 -1
- package/dist/text-annotator.umd.js +2 -2
- package/dist/text-annotator.umd.js.map +1 -1
- package/dist/utils/annotation/revive-annotation.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { v4 as dt } from "uuid";
|
|
2
|
-
import { parseW3CBodies as
|
|
2
|
+
import { parseW3CBodies as Ct, serializeW3CBodies as vt, parseW3CUser as Tt, UserSelectAction as At, createStore as Rt, createSelectionState as wt, createHoverState as xt, createViewportState as Lt, Origin as F, createAnonymousGuest as Nt, createUndoStack as Ot, createLifecycleObserver as kt, createBaseAnnotator as Mt } from "@annotorious/core";
|
|
3
3
|
import { Origin as De, UserSelectAction as Pe, createBody as He } from "@annotorious/core";
|
|
4
4
|
import { createNanoEvents as ut } from "nanoevents";
|
|
5
5
|
import { colord as nt } from "colord";
|
|
6
|
-
import { dequal as
|
|
7
|
-
import
|
|
8
|
-
import
|
|
6
|
+
import { dequal as _t } from "dequal/lite";
|
|
7
|
+
import Bt from "rbush";
|
|
8
|
+
import It from "debounce";
|
|
9
9
|
import G from "hotkeys-js";
|
|
10
|
-
import { poll as
|
|
10
|
+
import { poll as Dt } from "poll";
|
|
11
11
|
const xe = (t) => t.target.selector.every(H), Le = (t) => t.selector.every(H);
|
|
12
12
|
function H(t) {
|
|
13
13
|
return Array.isArray(t) ? t.every((e) => "range" in e && e.range instanceof Range && !e.range.collapsed) : "range" in t && t.range instanceof Range && !t.range.collapsed;
|
|
14
14
|
}
|
|
15
|
-
const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt = "not-annotatable",
|
|
15
|
+
const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt = "not-annotatable", K = `.${gt}`, Z = (t, e) => t.contains(e) ? !!(e instanceof HTMLElement ? e.closest(K) : e.parentElement?.closest(K)) : !0, mt = (t, e) => {
|
|
16
16
|
const o = e.commonAncestorContainer;
|
|
17
17
|
return !Z(t, o);
|
|
18
|
-
}, pt = /^\s*$/,
|
|
18
|
+
}, pt = /^\s*$/, Pt = (t) => pt.test(t.toString()), Ne = (t) => pt.test(t.textContent || ""), Ht = (t) => {
|
|
19
19
|
if (t.length === 0) return [];
|
|
20
20
|
if (t.length === 1) return [t[0]];
|
|
21
21
|
t.sort((s, n) => {
|
|
@@ -24,22 +24,22 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
24
24
|
});
|
|
25
25
|
const [e, ...o] = t, i = o.reduce((s, n) => s.current.compareBoundaryPoints(Range.START_TO_END, n) >= 0 ? (s.current.compareBoundaryPoints(Range.END_TO_END, n) < 0 && s.current.setEnd(n.endContainer, n.endOffset), s) : (s.merged.push(s.current), s.current = n.cloneRange(), s), { merged: [], current: e.cloneRange() });
|
|
26
26
|
return [...i.merged, i.current];
|
|
27
|
-
},
|
|
27
|
+
}, Ut = (t) => {
|
|
28
28
|
(!t.hasAttribute("tabindex") || t.tabIndex < -1) && t.setAttribute("tabindex", "-1"), t.classList.add("no-focus-outline");
|
|
29
|
-
},
|
|
29
|
+
}, Ft = function* (t) {
|
|
30
30
|
const e = document.createTreeWalker(
|
|
31
31
|
t.commonAncestorContainer,
|
|
32
32
|
NodeFilter.SHOW_ELEMENT,
|
|
33
|
-
(i) => i instanceof HTMLElement && i.classList.contains(gt) && !i.parentElement?.closest(
|
|
33
|
+
(i) => i instanceof HTMLElement && i.classList.contains(gt) && !i.parentElement?.closest(K) && t.intersectsNode(i) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
|
|
34
34
|
);
|
|
35
35
|
let o;
|
|
36
36
|
for (; o = e.nextNode(); )
|
|
37
37
|
o instanceof HTMLElement && (yield o);
|
|
38
|
-
},
|
|
38
|
+
}, Kt = (t, e) => {
|
|
39
39
|
if (!mt(t, e)) return [];
|
|
40
40
|
const o = [];
|
|
41
41
|
let i = null;
|
|
42
|
-
for (const s of
|
|
42
|
+
for (const s of Ft(e)) {
|
|
43
43
|
let n;
|
|
44
44
|
i ? (n = document.createRange(), n.setStartAfter(i), n.setEndBefore(s)) : (n = e.cloneRange(), n.setEndBefore(s)), n.collapsed || o.push(n), i = s;
|
|
45
45
|
}
|
|
@@ -50,76 +50,76 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
50
50
|
return o.length > 0 ? o : [e];
|
|
51
51
|
}, ot = (t) => {
|
|
52
52
|
const e = t.cloneContents();
|
|
53
|
-
return e.querySelectorAll(
|
|
54
|
-
},
|
|
53
|
+
return e.querySelectorAll(K).forEach((o) => o.remove()), e;
|
|
54
|
+
}, Wt = (t, e) => {
|
|
55
55
|
const o = t.cloneRange();
|
|
56
56
|
return e.contains(o.startContainer) || o.setStart(e, 0), e.contains(o.endContainer) || o.setEnd(e, e.childNodes.length), o;
|
|
57
|
-
}, rt = new Intl.Segmenter(void 0, { granularity: "grapheme" }),
|
|
57
|
+
}, rt = new Intl.Segmenter(void 0, { granularity: "grapheme" }), $t = (t, e, o = 10, i) => {
|
|
58
58
|
const s = i ? t.startContainer.parentElement.closest(i) : e, n = document.createRange();
|
|
59
59
|
n.setStart(s, 0), n.setEnd(t.startContainer, t.startOffset);
|
|
60
60
|
const r = ot(n).textContent, a = document.createRange();
|
|
61
61
|
a.setStart(t.endContainer, t.endOffset), s === document.body ? a.setEnd(s, s.childNodes.length) : a.setEndAfter(s);
|
|
62
|
-
const
|
|
62
|
+
const l = ot(a).textContent, h = [...rt.segment(r)], g = [...rt.segment(l)];
|
|
63
63
|
return {
|
|
64
|
-
prefix:
|
|
65
|
-
suffix: g.slice(0, o).map((
|
|
64
|
+
prefix: h.slice(-o).map((S) => S.segment).join(""),
|
|
65
|
+
suffix: g.slice(0, o).map((S) => S.segment).join("")
|
|
66
66
|
};
|
|
67
|
-
},
|
|
67
|
+
}, Yt = (t, e, o) => {
|
|
68
68
|
const i = document.createRange(), s = o ? t.startContainer.parentElement.closest(o) : e;
|
|
69
69
|
i.setStart(s, 0), i.setEnd(t.startContainer, t.startOffset);
|
|
70
|
-
const n = ot(i).textContent, r = t.toString(), a = n.length || 0,
|
|
71
|
-
return o ? { quote: r, start: a, end:
|
|
72
|
-
},
|
|
70
|
+
const n = ot(i).textContent, r = t.toString(), a = n.length || 0, l = a + r.length;
|
|
71
|
+
return o ? { quote: r, start: a, end: l, range: t, offsetReference: s } : { quote: r, start: a, end: l, range: t };
|
|
72
|
+
}, Xt = (t, e) => {
|
|
73
73
|
if (H(t)) return t;
|
|
74
74
|
const { start: o, end: i } = t, s = t.offsetReference || e, n = document.createTreeWalker(
|
|
75
75
|
e,
|
|
76
76
|
NodeFilter.SHOW_TEXT,
|
|
77
|
-
(g) => g.parentElement?.closest(
|
|
77
|
+
(g) => g.parentElement?.closest(K) ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT
|
|
78
78
|
);
|
|
79
79
|
let r = 0;
|
|
80
80
|
const a = document.createRange();
|
|
81
|
-
let
|
|
82
|
-
|
|
83
|
-
let
|
|
84
|
-
for (;
|
|
85
|
-
if (
|
|
86
|
-
const g =
|
|
81
|
+
let l = n.nextNode();
|
|
82
|
+
l === null && console.error("Could not revive annotation target. Content missing.");
|
|
83
|
+
let h = !s;
|
|
84
|
+
for (; l !== null; ) {
|
|
85
|
+
if (h ||= typeof s?.contains == "function" ? s.contains(l) : !1, h) {
|
|
86
|
+
const g = l.textContent?.length || 0;
|
|
87
87
|
if (r + g > o) {
|
|
88
|
-
a.setStart(
|
|
88
|
+
a.setStart(l, o - r);
|
|
89
89
|
break;
|
|
90
90
|
}
|
|
91
91
|
r += g;
|
|
92
92
|
}
|
|
93
|
-
|
|
93
|
+
l = n.nextNode();
|
|
94
94
|
}
|
|
95
|
-
for (;
|
|
96
|
-
const g =
|
|
95
|
+
for (; l !== null; ) {
|
|
96
|
+
const g = l.textContent?.length || 0;
|
|
97
97
|
if (r + g >= i) {
|
|
98
|
-
a.setEnd(
|
|
98
|
+
a.setEnd(l, i - r);
|
|
99
99
|
break;
|
|
100
100
|
}
|
|
101
|
-
r += g,
|
|
101
|
+
r += g, l = n.nextNode();
|
|
102
102
|
}
|
|
103
103
|
return {
|
|
104
104
|
...t,
|
|
105
105
|
range: a
|
|
106
106
|
};
|
|
107
|
-
}, J = (t, e, o = (i, s) =>
|
|
107
|
+
}, J = (t, e, o = (i, s) => Xt(i, s)) => ({
|
|
108
108
|
...t,
|
|
109
|
-
selector: t.selector.
|
|
109
|
+
selector: t.selector.flatMap((i) => o(i, e))
|
|
110
110
|
}), it = (t, e, o) => ({
|
|
111
111
|
...t,
|
|
112
112
|
target: J(t.target, e, o)
|
|
113
|
-
}),
|
|
113
|
+
}), ht = (t) => {
|
|
114
114
|
if (!t)
|
|
115
115
|
return document.scrollingElement;
|
|
116
116
|
const { overflowY: e } = window.getComputedStyle(t);
|
|
117
|
-
return e !== "visible" && e !== "hidden" && t.scrollHeight > t.clientHeight ? t :
|
|
117
|
+
return e !== "visible" && e !== "hidden" && t.scrollHeight > t.clientHeight ? t : ht(t.parentElement);
|
|
118
118
|
}, at = (t, e, o) => {
|
|
119
|
-
const i = o.getBoundingClientRect(), s = o.clientHeight, n = o.clientWidth, r = e.selector[0].range.getBoundingClientRect(), { width: a, height:
|
|
120
|
-
o.scroll({ top:
|
|
119
|
+
const i = o.getBoundingClientRect(), s = o.clientHeight, n = o.clientWidth, r = e.selector[0].range.getBoundingClientRect(), { width: a, height: l } = t.getAnnotationBounds(e.annotation), h = r.top - i.top, g = r.left - i.left, S = o.parentElement ? o.scrollTop : 0, m = o.parentElement ? o.scrollLeft : 0, T = h + S - (s - l) / 2, d = g + m - (n - a) / 2;
|
|
120
|
+
o.scroll({ top: T, left: d, behavior: "smooth" });
|
|
121
121
|
}, Vt = (t, e) => (o, i) => {
|
|
122
|
-
const s = typeof o == "string" ? o : o.id, n = i ? typeof i == "string" ? document.getElementById(i) : i :
|
|
122
|
+
const s = typeof o == "string" ? o : o.id, n = i ? typeof i == "string" ? document.getElementById(i) : i : ht(t);
|
|
123
123
|
if (!n)
|
|
124
124
|
return console.warn(`The scroll parent is missing for the annotation: ${s}`, { container: t }), !1;
|
|
125
125
|
const r = e.getAnnotation(s);
|
|
@@ -128,8 +128,8 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
128
128
|
const { range: a } = r.target.selector[0];
|
|
129
129
|
if (a && !a.collapsed)
|
|
130
130
|
return at(e, r.target, n), !0;
|
|
131
|
-
const
|
|
132
|
-
return
|
|
131
|
+
const l = J(r.target, t), { range: h } = l.selector[0];
|
|
132
|
+
return h && !h.collapsed ? (at(e, l, n), !0) : !1;
|
|
133
133
|
}, Oe = (t, e) => ({
|
|
134
134
|
parse: (o) => jt(o),
|
|
135
135
|
serialize: (o) => Gt(o, t, e)
|
|
@@ -144,7 +144,7 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
144
144
|
if (r.length === 0)
|
|
145
145
|
return { error: Error(`No targets found for annotation: ${t.id}`) };
|
|
146
146
|
const a = {
|
|
147
|
-
creator:
|
|
147
|
+
creator: Tt(o),
|
|
148
148
|
created: i ? new Date(i) : void 0,
|
|
149
149
|
updated: s ? new Date(s) : void 0,
|
|
150
150
|
annotation: e,
|
|
@@ -152,33 +152,33 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
152
152
|
// @ts-expect-error: `styleClass` is not part of the core `TextAnnotationTarget` type
|
|
153
153
|
styleClass: "styleClass" in r[0] ? r[0].styleClass : void 0
|
|
154
154
|
};
|
|
155
|
-
for (const
|
|
156
|
-
const g = (Array.isArray(
|
|
155
|
+
for (const l of r) {
|
|
156
|
+
const g = (Array.isArray(l.selector) ? l.selector : [l.selector]).reduce((S, m) => {
|
|
157
157
|
switch (m.type) {
|
|
158
158
|
case "TextQuoteSelector":
|
|
159
|
-
|
|
159
|
+
S.quote = m.exact;
|
|
160
160
|
break;
|
|
161
161
|
case "TextPositionSelector":
|
|
162
|
-
|
|
162
|
+
S.start = m.start, S.end = m.end;
|
|
163
163
|
break;
|
|
164
164
|
}
|
|
165
|
-
return
|
|
165
|
+
return S;
|
|
166
166
|
}, {});
|
|
167
|
-
if (a.outdated ||= "outdated" in
|
|
167
|
+
if (a.outdated ||= "outdated" in l ? l.outdated : void 0, a.migrationPending ||= "migrationPending" in l ? l.migrationPending : void 0, zt(g))
|
|
168
168
|
a.selector.push(
|
|
169
169
|
{
|
|
170
170
|
...g,
|
|
171
|
-
id:
|
|
171
|
+
id: l.id,
|
|
172
172
|
// @ts-expect-error: `scope` is not part of the core `TextSelector` type
|
|
173
|
-
scope:
|
|
173
|
+
scope: l.scope
|
|
174
174
|
}
|
|
175
175
|
);
|
|
176
176
|
else {
|
|
177
|
-
const
|
|
177
|
+
const S = [
|
|
178
178
|
g.start ? void 0 : "TextPositionSelector",
|
|
179
179
|
g.quote ? void 0 : "TextQuoteSelector"
|
|
180
180
|
].filter(Boolean);
|
|
181
|
-
return { error: Error(`Missing selector types: ${
|
|
181
|
+
return { error: Error(`Missing selector types: ${S.join(" and ")} for annotation: ${t.id}`) };
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
return { parsed: a };
|
|
@@ -189,45 +189,45 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
189
189
|
modified: s,
|
|
190
190
|
body: n,
|
|
191
191
|
...r
|
|
192
|
-
} = t, a =
|
|
193
|
-
return "error" in
|
|
192
|
+
} = t, a = Ct(n, e), l = qt(t);
|
|
193
|
+
return "error" in l ? { error: l.error } : {
|
|
194
194
|
parsed: {
|
|
195
195
|
...r,
|
|
196
196
|
id: e,
|
|
197
197
|
bodies: a,
|
|
198
|
-
target:
|
|
198
|
+
target: l.parsed
|
|
199
199
|
}
|
|
200
200
|
};
|
|
201
201
|
}, Gt = (t, e, o) => {
|
|
202
202
|
const { bodies: i, target: s, ...n } = t, {
|
|
203
203
|
selector: r,
|
|
204
204
|
creator: a,
|
|
205
|
-
created:
|
|
206
|
-
updated:
|
|
205
|
+
created: l,
|
|
206
|
+
updated: h,
|
|
207
207
|
...g
|
|
208
|
-
} = s,
|
|
209
|
-
const { id:
|
|
208
|
+
} = s, S = r.map((m) => {
|
|
209
|
+
const { id: T, quote: d } = m, R = {
|
|
210
210
|
type: "TextQuoteSelector",
|
|
211
|
-
exact:
|
|
211
|
+
exact: d
|
|
212
212
|
};
|
|
213
213
|
if (o && "range" in m) {
|
|
214
|
-
const { prefix:
|
|
215
|
-
|
|
214
|
+
const { prefix: x, suffix: b } = $t(m.range, o);
|
|
215
|
+
R.prefix = x, R.suffix = b;
|
|
216
216
|
}
|
|
217
217
|
if (!("start" in m))
|
|
218
218
|
throw new Error("W3C serialization requires TextSelector with start/end");
|
|
219
|
-
const { start:
|
|
219
|
+
const { start: w, end: A } = m, N = {
|
|
220
220
|
type: "TextPositionSelector",
|
|
221
|
-
start:
|
|
222
|
-
end:
|
|
221
|
+
start: w,
|
|
222
|
+
end: A
|
|
223
223
|
};
|
|
224
224
|
return {
|
|
225
225
|
...g,
|
|
226
|
-
id:
|
|
226
|
+
id: T,
|
|
227
227
|
// @ts-expect-error: `scope` is not part of the core `TextSelector` type
|
|
228
228
|
scope: "scope" in m ? m.scope : void 0,
|
|
229
229
|
source: e,
|
|
230
|
-
selector: [
|
|
230
|
+
selector: [R, N]
|
|
231
231
|
};
|
|
232
232
|
});
|
|
233
233
|
return {
|
|
@@ -235,15 +235,15 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
235
235
|
"@context": "http://www.w3.org/ns/anno.jsonld",
|
|
236
236
|
id: t.id,
|
|
237
237
|
type: "Annotation",
|
|
238
|
-
body:
|
|
238
|
+
body: vt(t.bodies),
|
|
239
239
|
creator: a,
|
|
240
|
-
created:
|
|
241
|
-
modified:
|
|
242
|
-
target:
|
|
240
|
+
created: l?.toISOString(),
|
|
241
|
+
modified: h?.toISOString(),
|
|
242
|
+
target: S
|
|
243
243
|
};
|
|
244
244
|
}, Qt = (t) => t.addEventListener("click", (e) => {
|
|
245
245
|
// Allow clicks within not-annotatable elements
|
|
246
|
-
!e.target.closest(
|
|
246
|
+
!e.target.closest(K) && !e.target.closest("a") && e.preventDefault();
|
|
247
247
|
}), tt = (t) => ({
|
|
248
248
|
...t,
|
|
249
249
|
type: t.type,
|
|
@@ -291,61 +291,61 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
291
291
|
return ((...i) => {
|
|
292
292
|
clearTimeout(o), o = setTimeout(() => t.apply(void 0, i), e);
|
|
293
293
|
});
|
|
294
|
-
},
|
|
294
|
+
}, yt = (t, e, o, i) => {
|
|
295
295
|
const { store: s, selection: n, hover: r } = o, a = ut();
|
|
296
|
-
let
|
|
297
|
-
const
|
|
296
|
+
let l;
|
|
297
|
+
const h = /* @__PURE__ */ new Map();
|
|
298
298
|
let g;
|
|
299
|
-
const
|
|
300
|
-
const { x:
|
|
301
|
-
|
|
299
|
+
const S = ce(i), m = (y) => {
|
|
300
|
+
const { x: v, y: O } = e.getBoundingClientRect(), _ = s.getAt(y.clientX - v, y.clientY - O, !1, g);
|
|
301
|
+
_ && o.selection.evalSelectAction(_) !== At.NONE ? r.current !== _.id && (e.classList.add("hovered"), r.set(_.id)) : r.current && (e.classList.remove("hovered"), r.set(null));
|
|
302
302
|
};
|
|
303
303
|
e.addEventListener("pointermove", m);
|
|
304
|
-
const
|
|
305
|
-
const
|
|
306
|
-
const M =
|
|
304
|
+
const T = et((y = !1) => requestAnimationFrame(() => {
|
|
305
|
+
const v = ae(e), { minX: O, minY: _, maxX: V, maxY: z } = v, q = g ? s.getIntersecting(O, _, V, z).filter(({ annotation: f }) => g?.(f)) : s.getIntersecting(O, _, V, z), W = n.selected.map(({ id: f }) => f), $ = q.map(({ annotation: f, rects: C }) => {
|
|
306
|
+
const M = W.includes(f.id), I = f.id === r.current;
|
|
307
307
|
return {
|
|
308
308
|
annotation: f,
|
|
309
|
-
rects:
|
|
309
|
+
rects: C,
|
|
310
310
|
state: { selected: M, hovered: I }
|
|
311
311
|
};
|
|
312
312
|
});
|
|
313
|
-
t.redraw(
|
|
314
|
-
|
|
313
|
+
t.redraw($, v, l, h, y), setTimeout(() => {
|
|
314
|
+
S(q.map(({ annotation: f }) => f)), a.emit("onRedraw");
|
|
315
315
|
}, 1);
|
|
316
|
-
}), 10),
|
|
317
|
-
|
|
318
|
-
},
|
|
319
|
-
g =
|
|
320
|
-
},
|
|
321
|
-
|
|
316
|
+
}), 10), d = (y, v) => {
|
|
317
|
+
v ? y ? h.set(v, y) : h.delete(v) : l = y, T(!0);
|
|
318
|
+
}, R = (y) => {
|
|
319
|
+
g = y, T(!1);
|
|
320
|
+
}, w = (y, v) => a.on(y, v), A = () => {
|
|
321
|
+
T();
|
|
322
322
|
};
|
|
323
|
-
s.observe(
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
}),
|
|
327
|
-
|
|
328
|
-
}),
|
|
329
|
-
|
|
323
|
+
s.observe(A);
|
|
324
|
+
const N = n.subscribe(() => {
|
|
325
|
+
T();
|
|
326
|
+
}), x = r.subscribe(() => {
|
|
327
|
+
T();
|
|
328
|
+
}), b = () => {
|
|
329
|
+
T(!0);
|
|
330
330
|
};
|
|
331
|
-
document.addEventListener("scroll",
|
|
332
|
-
const
|
|
333
|
-
s.recalculatePositions(),
|
|
331
|
+
document.addEventListener("scroll", b, { capture: !0, passive: !0 });
|
|
332
|
+
const c = et(() => {
|
|
333
|
+
s.recalculatePositions(), T();
|
|
334
334
|
}, 10);
|
|
335
|
-
window.addEventListener("resize",
|
|
336
|
-
const u = new ResizeObserver(
|
|
335
|
+
window.addEventListener("resize", c);
|
|
336
|
+
const u = new ResizeObserver(c);
|
|
337
337
|
u.observe(e);
|
|
338
|
-
const
|
|
339
|
-
|
|
338
|
+
const p = { attributes: !0, childList: !0, subtree: !0 }, E = new MutationObserver(et((y) => {
|
|
339
|
+
y.every((O) => O.target === e || e.contains(O.target)) || T(!0);
|
|
340
340
|
}, 150));
|
|
341
|
-
return
|
|
341
|
+
return E.observe(document.body, p), {
|
|
342
342
|
destroy: () => {
|
|
343
|
-
e.removeEventListener("pointermove", m), t.destroy(), s.unobserve(
|
|
343
|
+
e.removeEventListener("pointermove", m), t.destroy(), s.unobserve(A), N(), x(), document.removeEventListener("scroll", b), window.removeEventListener("resize", c), u.disconnect(), E.disconnect();
|
|
344
344
|
},
|
|
345
|
-
on:
|
|
346
|
-
redraw:
|
|
347
|
-
setStyle:
|
|
348
|
-
setFilter:
|
|
345
|
+
on: w,
|
|
346
|
+
redraw: T,
|
|
347
|
+
setStyle: d,
|
|
348
|
+
setFilter: R,
|
|
349
349
|
setVisible: t.setVisible.bind(t)
|
|
350
350
|
};
|
|
351
351
|
}, U = {
|
|
@@ -354,7 +354,7 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
354
354
|
}, st = {
|
|
355
355
|
fill: "rgb(0, 128, 255)",
|
|
356
356
|
fillOpacity: 0.45
|
|
357
|
-
}, Zt = (t) => t?.fillOpacity !== void 0 ? nt(t?.fill || U.fill).alpha(t.fillOpacity).toHex() : t?.fill ? t.fill : nt(U.fill).alpha(U.fillOpacity).toHex(),
|
|
357
|
+
}, Zt = (t) => t?.fillOpacity !== void 0 ? nt(t?.fill || U.fill).alpha(t.fillOpacity).toHex() : t?.fill ? t.fill : nt(U.fill).alpha(U.fillOpacity).toHex(), St = (t, e, o) => e ? typeof e == "function" ? e(t.annotation, t.state, o) || (t.state?.selected ? st : U) : e : t.state?.selected ? st : U, Jt = (t, e) => {
|
|
358
358
|
const o = (n, r) => n.x <= r.x + r.width && n.x + n.width >= r.x && n.y <= r.y + r.height && n.y + n.height >= r.y, i = (n) => n.rects.reduce((r, a) => r + a.width, 0), s = e.filter(({ rects: n }) => n.some((r) => o(t, r)));
|
|
359
359
|
return s.sort((n, r) => i(r) - i(n)), s.findIndex((n) => n.rects.includes(t));
|
|
360
360
|
}, te = (t) => {
|
|
@@ -379,21 +379,21 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
379
379
|
const g = t.startContainer.childNodes[t.startOffset];
|
|
380
380
|
g ? a.setStartBefore(g) : a.setStartAfter(t.startContainer);
|
|
381
381
|
}
|
|
382
|
-
const
|
|
383
|
-
if (
|
|
384
|
-
|
|
382
|
+
const l = document.createRange();
|
|
383
|
+
if (l.selectNode(r), t.endContainer.nodeType === Node.TEXT_NODE)
|
|
384
|
+
l.setEnd(r, t.endOffset);
|
|
385
385
|
else {
|
|
386
386
|
const g = t.endContainer.childNodes[t.endOffset];
|
|
387
|
-
g ?
|
|
387
|
+
g ? l.setEndBefore(g) : l.setEndAfter(t.endContainer);
|
|
388
388
|
}
|
|
389
|
-
const
|
|
390
|
-
const
|
|
391
|
-
return
|
|
389
|
+
const h = (g) => {
|
|
390
|
+
const S = document.createRange();
|
|
391
|
+
return S.selectNode(g), Array.from(S.getClientRects());
|
|
392
392
|
};
|
|
393
393
|
return [
|
|
394
394
|
...Array.from(a.getClientRects()),
|
|
395
|
-
...e.slice(1, -1).flatMap(
|
|
396
|
-
...Array.from(
|
|
395
|
+
...e.slice(1, -1).flatMap(h),
|
|
396
|
+
...Array.from(l.getClientRects())
|
|
397
397
|
];
|
|
398
398
|
}
|
|
399
399
|
}, ee = (t, e, o, i) => {
|
|
@@ -428,18 +428,18 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
428
428
|
return i;
|
|
429
429
|
let n = [...i], r = !1;
|
|
430
430
|
for (const a of i) {
|
|
431
|
-
const
|
|
432
|
-
if (
|
|
433
|
-
n = n.map((
|
|
431
|
+
const l = ee(s, a, e, o);
|
|
432
|
+
if (l === "inline-adjacent") {
|
|
433
|
+
n = n.map((h) => h === a ? ne(s, a) : h), r = !0;
|
|
434
434
|
break;
|
|
435
|
-
} else if (
|
|
436
|
-
n = n.map((
|
|
435
|
+
} else if (l === "inline-contains") {
|
|
436
|
+
n = n.map((h) => h === a ? s : h), r = !0;
|
|
437
437
|
break;
|
|
438
|
-
} else if (
|
|
438
|
+
} else if (l === "inline-is-contained") {
|
|
439
439
|
r = !0;
|
|
440
440
|
break;
|
|
441
|
-
} else if (
|
|
442
|
-
s.width < a.width && (n = n.map((
|
|
441
|
+
} else if (l === "block-contains" || l === "block-is-contained") {
|
|
442
|
+
s.width < a.width && (n = n.map((h) => h === a ? s : h)), s.width === a.width && s.height < a.width && (n = n.map((h) => h === a ? s : h)), r = !0;
|
|
443
443
|
break;
|
|
444
444
|
}
|
|
445
445
|
}
|
|
@@ -454,7 +454,7 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
454
454
|
}), se = (t, e) => {
|
|
455
455
|
const { left: o, top: i, right: s, bottom: n } = t;
|
|
456
456
|
return new DOMRect(o - e.left, i - e.top, s - o, n - i);
|
|
457
|
-
},
|
|
457
|
+
}, Me = (t, e) => {
|
|
458
458
|
const { left: o, top: i, right: s, bottom: n } = t;
|
|
459
459
|
return new DOMRect(o + e.left, i + e.top, s - o, n - i);
|
|
460
460
|
}, re = (t) => {
|
|
@@ -466,16 +466,16 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
466
466
|
destroy: () => {
|
|
467
467
|
e.remove();
|
|
468
468
|
},
|
|
469
|
-
redraw: (r, a,
|
|
470
|
-
if (!(!
|
|
471
|
-
e.innerHTML = "", [...r].sort((
|
|
472
|
-
const { annotation: { target: { created:
|
|
473
|
-
return
|
|
474
|
-
}).forEach((
|
|
475
|
-
const
|
|
476
|
-
|
|
477
|
-
const
|
|
478
|
-
|
|
469
|
+
redraw: (r, a, l, h, g) => {
|
|
470
|
+
if (!(!_t(o, r) || g)) return;
|
|
471
|
+
e.innerHTML = "", [...r].sort((d, R) => {
|
|
472
|
+
const { annotation: { target: { created: w } } } = d, { annotation: { target: { created: A } } } = R;
|
|
473
|
+
return w && A ? w.getTime() - A.getTime() : 0;
|
|
474
|
+
}).forEach((d) => {
|
|
475
|
+
const R = h?.get(d.annotation.id) || l;
|
|
476
|
+
d.rects.map((w) => {
|
|
477
|
+
const A = Jt(w, r), N = St(d, R, A), x = document.createElement("span");
|
|
478
|
+
x.className = "r6o-annotation", x.dataset.annotation = d.annotation.id, x.style.left = `${w.x}px`, x.style.top = `${w.y}px`, x.style.width = `${w.width}px`, x.style.height = `${w.height}px`, x.style.backgroundColor = Zt(N), N.underlineStyle && (x.style.borderStyle = N.underlineStyle), N.underlineColor && (x.style.borderColor = N.underlineColor), N.underlineThickness && (x.style.borderBottomWidth = `${N.underlineThickness}px`), N.underlineOffset && (x.style.paddingBottom = `${N.underlineOffset}px`), e.appendChild(x);
|
|
479
479
|
});
|
|
480
480
|
}), o = r;
|
|
481
481
|
},
|
|
@@ -483,313 +483,309 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
483
483
|
r ? e.classList.remove("hidden") : e.classList.add("hidden");
|
|
484
484
|
}
|
|
485
485
|
};
|
|
486
|
-
}, ie = (t, e, o) =>
|
|
487
|
-
const { top: e, left: o } = t.getBoundingClientRect(), { innerWidth: i, innerHeight: s } = window, n = -o, r = -e, a = i - o,
|
|
488
|
-
return { top: e, left: o, minX: n, minY: r, maxX: a, maxY:
|
|
486
|
+
}, ie = (t, e, o) => yt(re(t), t, e, o), ae = (t) => {
|
|
487
|
+
const { top: e, left: o } = t.getBoundingClientRect(), { innerWidth: i, innerHeight: s } = window, n = -o, r = -e, a = i - o, l = s - e;
|
|
488
|
+
return { top: e, left: o, minX: n, minY: r, maxX: a, maxY: l };
|
|
489
489
|
}, ce = (t) => {
|
|
490
490
|
let e = /* @__PURE__ */ new Set();
|
|
491
491
|
return (i) => {
|
|
492
492
|
const s = i.map((n) => n.id);
|
|
493
493
|
(e.size !== s.length || s.some((n) => !e.has(n))) && t.set(s), e = new Set(s);
|
|
494
494
|
};
|
|
495
|
-
}, le = (t, e, o, i
|
|
496
|
-
const
|
|
497
|
-
const
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
}), L = oe(S, o, i).map((E) => se(E, d));
|
|
501
|
-
return L.map((E) => {
|
|
502
|
-
const { x: b, y: A, width: k, height: K } = E;
|
|
495
|
+
}, le = (t, e, o, i) => {
|
|
496
|
+
const s = new Bt(), n = /* @__PURE__ */ new Map(), r = ut(), a = (c, u) => {
|
|
497
|
+
const p = c.selector.flatMap((L) => te(L.range)), E = oe(p, o, i).map((L) => se(L, u));
|
|
498
|
+
return E.map((L) => {
|
|
499
|
+
const { x: y, y: v, width: O, height: _ } = L;
|
|
503
500
|
return {
|
|
504
|
-
minX:
|
|
505
|
-
minY:
|
|
506
|
-
maxX:
|
|
507
|
-
maxY:
|
|
501
|
+
minX: y,
|
|
502
|
+
minY: v,
|
|
503
|
+
maxX: y + O,
|
|
504
|
+
maxY: v + _,
|
|
508
505
|
annotation: {
|
|
509
|
-
id:
|
|
510
|
-
rects:
|
|
506
|
+
id: c.annotation,
|
|
507
|
+
rects: E
|
|
511
508
|
}
|
|
512
509
|
};
|
|
513
510
|
});
|
|
514
|
-
},
|
|
515
|
-
|
|
516
|
-
},
|
|
517
|
-
const
|
|
518
|
-
|
|
519
|
-
},
|
|
520
|
-
const
|
|
521
|
-
|
|
522
|
-
},
|
|
523
|
-
|
|
524
|
-
},
|
|
525
|
-
|
|
526
|
-
const
|
|
527
|
-
|
|
528
|
-
|
|
511
|
+
}, l = () => [...n.values()], h = () => {
|
|
512
|
+
s.clear(), n.clear();
|
|
513
|
+
}, g = (c) => {
|
|
514
|
+
const u = a(c, e.getBoundingClientRect());
|
|
515
|
+
u.length !== 0 && (u.forEach((p) => s.insert(p)), n.set(c.annotation, u));
|
|
516
|
+
}, S = (c) => {
|
|
517
|
+
const u = n.get(c.annotation);
|
|
518
|
+
u && (u.forEach((p) => s.remove(p)), n.delete(c.annotation));
|
|
519
|
+
}, m = (c) => {
|
|
520
|
+
S(c), g(c);
|
|
521
|
+
}, T = (c, u = !0) => {
|
|
522
|
+
u && h();
|
|
523
|
+
const p = e.getBoundingClientRect(), E = c.map((y) => ({ target: y, rects: a(y, p) }));
|
|
524
|
+
E.forEach(({ target: y, rects: v }) => {
|
|
525
|
+
v.length > 0 && n.set(y.annotation, v);
|
|
529
526
|
});
|
|
530
|
-
const
|
|
531
|
-
|
|
532
|
-
},
|
|
533
|
-
const
|
|
534
|
-
minX:
|
|
535
|
-
minY:
|
|
536
|
-
maxX:
|
|
537
|
-
maxY:
|
|
538
|
-
}),
|
|
539
|
-
return
|
|
540
|
-
},
|
|
541
|
-
const
|
|
542
|
-
if (
|
|
527
|
+
const L = E.flatMap(({ rects: y }) => y);
|
|
528
|
+
s.load(L);
|
|
529
|
+
}, d = (c, u, p = !1) => {
|
|
530
|
+
const E = s.search({
|
|
531
|
+
minX: c,
|
|
532
|
+
minY: u,
|
|
533
|
+
maxX: c,
|
|
534
|
+
maxY: u
|
|
535
|
+
}), L = (y) => y.annotation.rects.reduce((v, O) => v + O.width * O.height, 0);
|
|
536
|
+
return E.length > 0 ? (E.sort((y, v) => L(y) - L(v)), p ? E.map((y) => y.annotation.id) : [E[0].annotation.id]) : [];
|
|
537
|
+
}, R = (c) => {
|
|
538
|
+
const u = w(c);
|
|
539
|
+
if (u.length === 0)
|
|
543
540
|
return;
|
|
544
|
-
let
|
|
545
|
-
for (let
|
|
546
|
-
const
|
|
547
|
-
|
|
541
|
+
let p = u[0].left, E = u[0].top, L = u[0].right, y = u[0].bottom;
|
|
542
|
+
for (let v = 1; v < u.length; v++) {
|
|
543
|
+
const O = u[v];
|
|
544
|
+
p = Math.min(p, O.left), E = Math.min(E, O.top), L = Math.max(L, O.right), y = Math.max(y, O.bottom);
|
|
548
545
|
}
|
|
549
|
-
return new DOMRect(
|
|
550
|
-
},
|
|
551
|
-
const
|
|
552
|
-
return
|
|
546
|
+
return new DOMRect(p, E, L - p, y - E);
|
|
547
|
+
}, w = (c) => {
|
|
548
|
+
const u = n.get(c);
|
|
549
|
+
return u ? u[0].annotation.rects : [];
|
|
553
550
|
};
|
|
554
551
|
return {
|
|
555
|
-
all:
|
|
556
|
-
clear:
|
|
557
|
-
getAt:
|
|
558
|
-
getAnnotationBounds:
|
|
559
|
-
getAnnotationRects:
|
|
560
|
-
getIntersecting: (
|
|
561
|
-
const
|
|
562
|
-
return Array.from(
|
|
563
|
-
annotation: t.getAnnotation(
|
|
564
|
-
rects:
|
|
565
|
-
})).filter((
|
|
552
|
+
all: l,
|
|
553
|
+
clear: h,
|
|
554
|
+
getAt: d,
|
|
555
|
+
getAnnotationBounds: R,
|
|
556
|
+
getAnnotationRects: w,
|
|
557
|
+
getIntersecting: (c, u, p, E) => {
|
|
558
|
+
const L = s.search({ minX: c, minY: u, maxX: p, maxY: E }), y = new Set(L.map((v) => v.annotation.id));
|
|
559
|
+
return Array.from(y).map((v) => ({
|
|
560
|
+
annotation: t.getAnnotation(v),
|
|
561
|
+
rects: w(v)
|
|
562
|
+
})).filter((v) => !!v.annotation);
|
|
566
563
|
},
|
|
567
|
-
insert:
|
|
564
|
+
insert: g,
|
|
568
565
|
recalculate: () => {
|
|
569
|
-
|
|
566
|
+
T(t.all().map((c) => c.target), !0), r.emit("recalculate");
|
|
570
567
|
},
|
|
571
|
-
remove:
|
|
572
|
-
set:
|
|
573
|
-
size: () =>
|
|
574
|
-
update:
|
|
575
|
-
on: (
|
|
568
|
+
remove: S,
|
|
569
|
+
set: T,
|
|
570
|
+
size: () => s.all().length,
|
|
571
|
+
update: m,
|
|
572
|
+
on: (c, u) => r.on(c, u)
|
|
576
573
|
};
|
|
577
574
|
}, de = (t, e) => {
|
|
578
|
-
const o =
|
|
575
|
+
const o = Rt(), i = le(
|
|
579
576
|
o,
|
|
580
577
|
t,
|
|
581
578
|
e.mergeHighlights?.horizontalTolerance,
|
|
582
|
-
e.mergeHighlights?.verticalTolerance
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
o.bulkUpdateTargets(u, h);
|
|
579
|
+
e.mergeHighlights?.verticalTolerance
|
|
580
|
+
), s = wt(o, e.userSelectAction, e.adapter), n = xt(o), r = Lt(), a = (b, c = F.LOCAL) => {
|
|
581
|
+
const u = it(b, t, e.selectorReviveFn), p = H(u.target.selector);
|
|
582
|
+
return p && o.addAnnotation(u, c), p;
|
|
583
|
+
}, l = (b) => {
|
|
584
|
+
const c = b.map((p) => it(p, t, e.selectorReviveFn)), u = c.filter((p) => !H(p.target.selector));
|
|
585
|
+
return { revived: c, couldNotRevive: u };
|
|
586
|
+
}, h = (b, c = F.LOCAL) => {
|
|
587
|
+
const { revived: u, couldNotRevive: p } = l(b);
|
|
588
|
+
return o.syncAnnotations(u, c), p;
|
|
589
|
+
}, g = (b, c = F.LOCAL) => {
|
|
590
|
+
const { revived: u, couldNotRevive: p } = l(b);
|
|
591
|
+
return o.bulkUpsertAnnotations(u, c), p;
|
|
592
|
+
}, S = (b, c = !0, u = F.LOCAL) => c ? h(b, u) : g(b, u), m = (b, c = F.LOCAL) => {
|
|
593
|
+
const u = J(b, t);
|
|
594
|
+
o.updateTarget(u, c);
|
|
595
|
+
}, T = (b, c = F.LOCAL) => {
|
|
596
|
+
const u = b.map((p) => J(p, t));
|
|
597
|
+
o.bulkUpdateTargets(u, c);
|
|
602
598
|
};
|
|
603
|
-
function
|
|
604
|
-
const
|
|
605
|
-
if (
|
|
606
|
-
return u ?
|
|
599
|
+
function d(b, c, u, p) {
|
|
600
|
+
const E = u || !!p, L = i.getAt(b, c, E).map((v) => o.getAnnotation(v)).filter(Boolean), y = p ? L.filter(p) : L;
|
|
601
|
+
if (y.length !== 0)
|
|
602
|
+
return u ? y : y[0];
|
|
607
603
|
}
|
|
608
|
-
const
|
|
609
|
-
return o.observe(({ changes:
|
|
610
|
-
const
|
|
611
|
-
|
|
604
|
+
const R = (b) => i.getAnnotationRects(b).length > 0 ? i.getAnnotationBounds(b) : void 0, w = (b, c, u, p) => i.getIntersecting(b, c, u, p), A = (b) => i.getAnnotationRects(b), N = () => i.recalculate(), x = (b) => i.on("recalculate", b);
|
|
605
|
+
return o.observe(({ changes: b }) => {
|
|
606
|
+
const c = (b.deleted || []).filter((E) => H(E.target.selector)), u = (b.created || []).filter((E) => H(E.target.selector)), p = (b.updated || []).filter((E) => H(E.newValue.target.selector));
|
|
607
|
+
c?.length > 0 && c.forEach((E) => i.remove(E.target)), u.length > 0 && i.set(u.map((E) => E.target), !1), p?.length > 0 && p.forEach(({ newValue: E }) => i.update(E.target));
|
|
612
608
|
}), {
|
|
613
609
|
store: {
|
|
614
610
|
...o,
|
|
615
611
|
addAnnotation: a,
|
|
616
|
-
bulkAddAnnotations:
|
|
617
|
-
bulkUpdateTargets:
|
|
612
|
+
bulkAddAnnotations: S,
|
|
613
|
+
bulkUpdateTargets: T,
|
|
618
614
|
bulkUpsertAnnotations: g,
|
|
619
|
-
getAnnotationBounds:
|
|
620
|
-
getAnnotationRects:
|
|
621
|
-
getIntersecting:
|
|
622
|
-
getAt:
|
|
623
|
-
recalculatePositions:
|
|
624
|
-
onRecalculatePositions:
|
|
625
|
-
syncAnnotations:
|
|
615
|
+
getAnnotationBounds: R,
|
|
616
|
+
getAnnotationRects: A,
|
|
617
|
+
getIntersecting: w,
|
|
618
|
+
getAt: d,
|
|
619
|
+
recalculatePositions: N,
|
|
620
|
+
onRecalculatePositions: x,
|
|
621
|
+
syncAnnotations: h,
|
|
626
622
|
updateTarget: m
|
|
627
623
|
},
|
|
628
624
|
selection: s,
|
|
629
625
|
hover: n,
|
|
630
626
|
viewport: r
|
|
631
627
|
};
|
|
632
|
-
}, ct = 300,
|
|
633
|
-
...
|
|
634
|
-
|
|
628
|
+
}, ct = 300, Et = ["up", "down", "left", "right"], bt = ft ? "⌘+a" : "ctrl+a", ue = [
|
|
629
|
+
...Et.map((t) => `shift+${t}`),
|
|
630
|
+
bt
|
|
635
631
|
], fe = (t, e, o, i) => {
|
|
636
632
|
const { store: s, selection: n } = e;
|
|
637
633
|
let r;
|
|
638
634
|
const {
|
|
639
635
|
annotatingEnabled: a,
|
|
640
|
-
offsetReferenceSelector:
|
|
641
|
-
selectionMode:
|
|
636
|
+
offsetReferenceSelector: l,
|
|
637
|
+
selectionMode: h,
|
|
642
638
|
dismissOnNotAnnotatable: g = "NEVER"
|
|
643
639
|
} = i;
|
|
644
|
-
let
|
|
645
|
-
const
|
|
646
|
-
m = f,
|
|
647
|
-
},
|
|
648
|
-
if (
|
|
640
|
+
let S, m = a, T = "CREATE_NEW", d, R, w, A;
|
|
641
|
+
const N = (f) => {
|
|
642
|
+
m = f, E.clear(), f || (R = void 0, d = void 0, w = void 0, A = void 0);
|
|
643
|
+
}, x = (f) => T = f || "CREATE_NEW", b = (f) => S = f, c = (f) => r = f, u = (f) => {
|
|
644
|
+
if (T === "ADD_TO_CURRENT")
|
|
649
645
|
return !0;
|
|
650
646
|
if (i.allowModifierSelect) {
|
|
651
|
-
const
|
|
652
|
-
return ft ?
|
|
647
|
+
const C = f;
|
|
648
|
+
return ft ? C.metaKey : C.ctrlKey;
|
|
653
649
|
} else
|
|
654
650
|
return !1;
|
|
655
|
-
},
|
|
656
|
-
if (!m ||
|
|
651
|
+
}, p = () => {
|
|
652
|
+
if (!m || w === !1) return;
|
|
657
653
|
const { selected: f } = n;
|
|
658
|
-
if ((u(
|
|
654
|
+
if ((u(A) || T === "REPLACE_CURRENT") && f.length === 1 && f[0].editable) {
|
|
659
655
|
const M = s.getAnnotation(f[0].id);
|
|
660
656
|
if (M?.target) {
|
|
661
|
-
|
|
657
|
+
R = M.target, d = {
|
|
662
658
|
annotation: M.id,
|
|
663
659
|
selector: [],
|
|
664
|
-
created:
|
|
665
|
-
creator:
|
|
660
|
+
created: R.created,
|
|
661
|
+
creator: R.creator,
|
|
666
662
|
updated: /* @__PURE__ */ new Date(),
|
|
667
663
|
updatedBy: r
|
|
668
664
|
};
|
|
669
665
|
return;
|
|
670
666
|
}
|
|
671
667
|
}
|
|
672
|
-
|
|
668
|
+
R = void 0, d = {
|
|
673
669
|
annotation: dt(),
|
|
674
670
|
selector: [],
|
|
675
671
|
created: /* @__PURE__ */ new Date(),
|
|
676
672
|
creator: r
|
|
677
673
|
};
|
|
678
|
-
},
|
|
674
|
+
}, E = It((f) => {
|
|
679
675
|
if (!m) return;
|
|
680
|
-
const
|
|
681
|
-
if (!
|
|
682
|
-
const I =
|
|
683
|
-
if (I.every((
|
|
684
|
-
|
|
676
|
+
const C = document.getSelection();
|
|
677
|
+
if (!C?.anchorNode) return;
|
|
678
|
+
const I = W().map((k) => Wt(k, t));
|
|
679
|
+
if (I.every((k) => !mt(t, k))) {
|
|
680
|
+
d = void 0;
|
|
685
681
|
return;
|
|
686
682
|
}
|
|
687
|
-
const D = f.timeStamp - (
|
|
688
|
-
if (
|
|
683
|
+
const D = f.timeStamp - (A?.timeStamp || f.timeStamp);
|
|
684
|
+
if (A?.type === "pointerdown" && (D < 1e3 && !d || C.isCollapsed && D < ct) && p(), !d && (p(), !d))
|
|
689
685
|
return;
|
|
690
|
-
if (
|
|
691
|
-
s.getAnnotation(
|
|
686
|
+
if (C.isCollapsed) {
|
|
687
|
+
s.getAnnotation(d.annotation) && !(u(A) || T === "REPLACE_CURRENT") && (n.clear(), s.deleteAnnotation(d.annotation));
|
|
692
688
|
return;
|
|
693
689
|
}
|
|
694
|
-
if (I.every((
|
|
695
|
-
const B = I.flatMap((
|
|
696
|
-
if (!(B.length > 0 && !
|
|
697
|
-
const j = u(
|
|
698
|
-
...
|
|
690
|
+
if (I.every((k) => Pt(k))) return;
|
|
691
|
+
const B = I.flatMap((k) => Kt(t, k.cloneRange()));
|
|
692
|
+
if (!(B.length > 0 && !d || B.length !== d.selector.length || B.some((k, Y) => k.toString() !== d?.selector[Y]?.quote))) return;
|
|
693
|
+
const j = u(A) && R ? Ht([
|
|
694
|
+
...R.selector.map((k) => k.range),
|
|
699
695
|
...B
|
|
700
696
|
]) : B;
|
|
701
|
-
|
|
702
|
-
...
|
|
703
|
-
selector: j.map((
|
|
697
|
+
d = {
|
|
698
|
+
...d,
|
|
699
|
+
selector: j.map((k) => Yt(k, t, l)),
|
|
704
700
|
updated: /* @__PURE__ */ new Date()
|
|
705
|
-
}, !(u(
|
|
701
|
+
}, !(u(A) || T === "REPLACE_CURRENT") && (s.getAnnotation(d.annotation) ? s.updateTarget(d, F.LOCAL) : n.clear());
|
|
706
702
|
}, 10), L = (f) => {
|
|
707
|
-
|
|
708
|
-
},
|
|
709
|
-
if (!
|
|
710
|
-
const
|
|
703
|
+
A = tt(f), w = A.button === 0;
|
|
704
|
+
}, y = async (f) => {
|
|
705
|
+
if (!w) return;
|
|
706
|
+
const C = tt(f), M = () => {
|
|
711
707
|
const { x: D, y: B } = t.getBoundingClientRect();
|
|
712
|
-
if (Z(t,
|
|
713
|
-
(typeof g == "function" ? g(
|
|
708
|
+
if (Z(t, C.target)) {
|
|
709
|
+
(typeof g == "function" ? g(C, t) : g === "ALWAYS") && n.clear();
|
|
714
710
|
return;
|
|
715
711
|
}
|
|
716
|
-
const P =
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
712
|
+
const P = C.target instanceof Node && t.contains(C.target) && s.getAt(
|
|
713
|
+
C.clientX - D,
|
|
714
|
+
C.clientY - B,
|
|
715
|
+
h === "all",
|
|
716
|
+
S
|
|
721
717
|
);
|
|
722
718
|
if (P) {
|
|
723
|
-
const { selected: j } = n,
|
|
724
|
-
(
|
|
719
|
+
const { selected: j } = n, k = new Set(j.map((X) => X.id)), Y = Array.isArray(P) ? P.map((X) => X.id) : [P.id];
|
|
720
|
+
(k.size !== Y.length || !Y.every((X) => k.has(X))) && (o.emit("clickAnnotation", P), n.userSelect(Y, C));
|
|
725
721
|
} else
|
|
726
722
|
n.clear();
|
|
727
723
|
};
|
|
728
|
-
if (
|
|
729
|
-
await
|
|
730
|
-
const D = document.getSelection(), B = Z(t,
|
|
724
|
+
if (C.timeStamp - (A?.timeStamp || 0) < ct) {
|
|
725
|
+
await v();
|
|
726
|
+
const D = document.getSelection(), B = Z(t, A?.target), P = Z(t, C.target);
|
|
731
727
|
if (D?.isCollapsed || B && P) {
|
|
732
|
-
|
|
728
|
+
d = void 0, M();
|
|
733
729
|
return;
|
|
734
730
|
}
|
|
735
731
|
}
|
|
736
|
-
|
|
737
|
-
},
|
|
732
|
+
d && d.selector.length > 0 && ($(), n.userSelect(d.annotation, C));
|
|
733
|
+
}, v = async () => {
|
|
738
734
|
const f = document.getSelection();
|
|
739
|
-
let
|
|
740
|
-
const I = () => M ||
|
|
741
|
-
return setTimeout(() =>
|
|
742
|
-
},
|
|
743
|
-
document.getSelection()?.isCollapsed || ((!
|
|
744
|
-
},
|
|
745
|
-
if (m && !f.repeat &&
|
|
746
|
-
const
|
|
747
|
-
|
|
735
|
+
let C = !1, M = f?.isCollapsed;
|
|
736
|
+
const I = () => M || C, D = 1;
|
|
737
|
+
return setTimeout(() => C = !0, 50), Dt(() => M = f?.isCollapsed, D, I);
|
|
738
|
+
}, O = (f) => {
|
|
739
|
+
document.getSelection()?.isCollapsed || ((!d || d.selector.length === 0) && E(f), d && ($(), n.userSelect(d.annotation, tt(f))));
|
|
740
|
+
}, _ = (f) => {
|
|
741
|
+
if (m && !f.repeat && W().length !== 0 && f.key === "Shift" && d) {
|
|
742
|
+
const C = document.getSelection();
|
|
743
|
+
C && !C.isCollapsed && ($(), n.userSelect(d.annotation, Q(f)));
|
|
748
744
|
}
|
|
749
|
-
},
|
|
750
|
-
const
|
|
751
|
-
|
|
752
|
-
id:
|
|
745
|
+
}, V = (f) => {
|
|
746
|
+
const C = () => setTimeout(() => {
|
|
747
|
+
d && (d.selector.length > 0 && (n.clear(), s.addAnnotation({
|
|
748
|
+
id: d.annotation,
|
|
753
749
|
bodies: [],
|
|
754
|
-
target:
|
|
755
|
-
}), n.userSelect(
|
|
750
|
+
target: d
|
|
751
|
+
}), n.userSelect(d.annotation, Q(f))), document.removeEventListener("selectionchange", C));
|
|
756
752
|
}, 100);
|
|
757
|
-
document.addEventListener("selectionchange",
|
|
753
|
+
document.addEventListener("selectionchange", C), p();
|
|
758
754
|
};
|
|
759
755
|
G(ue.join(","), { element: t, keydown: !0, keyup: !1 }, (f) => {
|
|
760
|
-
f.repeat || (
|
|
761
|
-
}), G(
|
|
762
|
-
|
|
756
|
+
f.repeat || (A = Q(f));
|
|
757
|
+
}), G(bt, { keydown: !0, keyup: !1 }, (f) => {
|
|
758
|
+
A = Q(f), V(f);
|
|
763
759
|
});
|
|
764
760
|
const z = (f) => {
|
|
765
|
-
f.repeat ||
|
|
761
|
+
f.repeat || W().length !== 0 && (d = void 0, n.clear());
|
|
766
762
|
};
|
|
767
|
-
G(
|
|
763
|
+
G(Et.join(","), { keydown: !0, keyup: !1 }, z), document.addEventListener("pointerdown", L), document.addEventListener("pointerup", y), document.addEventListener("contextmenu", O), document.addEventListener("keyup", _), t.addEventListener("selectstart", p), document.addEventListener("selectionchange", E);
|
|
768
764
|
const q = () => {
|
|
769
|
-
|
|
770
|
-
},
|
|
765
|
+
d = void 0, R = void 0, w = void 0, A = void 0, E.clear(), document.removeEventListener("pointerdown", L), document.removeEventListener("pointerup", y), document.removeEventListener("contextmenu", O), document.removeEventListener("keyup", _), t.removeEventListener("selectstart", p), document.removeEventListener("selectionchange", E), G.unbind();
|
|
766
|
+
}, W = () => {
|
|
771
767
|
const f = document.getSelection();
|
|
772
|
-
return f ? Array.from(Array(f.rangeCount).keys()).map((
|
|
773
|
-
},
|
|
774
|
-
if (!
|
|
775
|
-
const f = s.getAnnotation(
|
|
768
|
+
return f ? Array.from(Array(f.rangeCount).keys()).map((C) => f.getRangeAt(C)).filter((C) => C.intersectsNode(t)) : [];
|
|
769
|
+
}, $ = () => {
|
|
770
|
+
if (!d) return;
|
|
771
|
+
const f = s.getAnnotation(d.annotation);
|
|
776
772
|
if (!f)
|
|
777
773
|
s.addAnnotation({
|
|
778
|
-
id:
|
|
774
|
+
id: d.annotation,
|
|
779
775
|
bodies: [],
|
|
780
|
-
target:
|
|
776
|
+
target: d
|
|
781
777
|
});
|
|
782
778
|
else {
|
|
783
|
-
const { target: { updated:
|
|
784
|
-
(!
|
|
779
|
+
const { target: { updated: C } } = f, { updated: M } = d;
|
|
780
|
+
(!C || !M || C < M) && s.updateTarget(d);
|
|
785
781
|
}
|
|
786
782
|
};
|
|
787
783
|
return {
|
|
788
784
|
destroy: q,
|
|
789
|
-
setFilter:
|
|
790
|
-
setUser:
|
|
791
|
-
setAnnotatingEnabled:
|
|
792
|
-
setAnnotatingMode:
|
|
785
|
+
setFilter: b,
|
|
786
|
+
setUser: c,
|
|
787
|
+
setAnnotatingEnabled: N,
|
|
788
|
+
setAnnotatingMode: x
|
|
793
789
|
};
|
|
794
790
|
}, ge = (t) => [
|
|
795
791
|
`background-color:${nt(t?.fill || U.fill).alpha(t?.fillOpacity === void 0 ? U.fillOpacity : t.fillOpacity).toHex()}`,
|
|
@@ -808,33 +804,33 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
808
804
|
setVisible: (n) => {
|
|
809
805
|
console.log("setVisible not implemented on CSS Custom Highlights renderer");
|
|
810
806
|
},
|
|
811
|
-
redraw: (n, r, a,
|
|
807
|
+
redraw: (n, r, a, l, h) => {
|
|
812
808
|
const g = new Set(n.map((m) => m.annotation.id));
|
|
813
809
|
Array.from(e).filter((m) => !g.has(m));
|
|
814
|
-
const
|
|
810
|
+
const S = n.map((m) => {
|
|
815
811
|
a ? typeof a == "function" && a(m.annotation, m.state) : m.state?.selected;
|
|
816
|
-
const
|
|
817
|
-
return `::highlight(_${m.annotation.id}) { ${ge(
|
|
812
|
+
const T = St(m, a);
|
|
813
|
+
return `::highlight(_${m.annotation.id}) { ${ge(T)} }`;
|
|
818
814
|
});
|
|
819
|
-
t.innerHTML =
|
|
815
|
+
t.innerHTML = S.join(`
|
|
820
816
|
`), CSS.highlights.clear(), n.forEach(({ annotation: m }) => {
|
|
821
|
-
const
|
|
822
|
-
CSS.highlights.set(`_${m.id}`,
|
|
817
|
+
const T = m.target.selector.map((R) => R.range), d = new Highlight(...T);
|
|
818
|
+
CSS.highlights.set(`_${m.id}`, d);
|
|
823
819
|
}), e = g;
|
|
824
820
|
}
|
|
825
821
|
};
|
|
826
|
-
}, pe = (t, e, o) =>
|
|
822
|
+
}, pe = (t, e, o) => yt(me(), t, e, o), he = (t, e) => ({
|
|
827
823
|
...t,
|
|
828
824
|
annotatingEnabled: t.annotatingEnabled ?? e.annotatingEnabled,
|
|
829
825
|
user: t.user || e.user
|
|
830
|
-
}), lt = "SPANS",
|
|
831
|
-
Qt(t),
|
|
826
|
+
}), lt = "SPANS", _e = (t, e = {}) => {
|
|
827
|
+
Qt(t), Ut(t);
|
|
832
828
|
const o = he(e, {
|
|
833
829
|
annotatingEnabled: !0,
|
|
834
|
-
user:
|
|
835
|
-
}), i = de(t, o), { selection: s, viewport: n } = i, r = i.store, a =
|
|
836
|
-
let
|
|
837
|
-
const g = typeof o.renderer != "function" ? o.renderer === "CSS_HIGHLIGHTS" ? CSS.highlights ? "CSS_HIGHLIGHTS" : lt : o.renderer || lt : null,
|
|
830
|
+
user: Nt()
|
|
831
|
+
}), i = de(t, o), { selection: s, viewport: n } = i, r = i.store, a = Ot(r), l = kt(i, a, o.adapter);
|
|
832
|
+
let h = o.user;
|
|
833
|
+
const g = typeof o.renderer != "function" ? o.renderer === "CSS_HIGHLIGHTS" ? CSS.highlights ? "CSS_HIGHLIGHTS" : lt : o.renderer || lt : null, S = g === null ? o.renderer(
|
|
838
834
|
t,
|
|
839
835
|
i,
|
|
840
836
|
n
|
|
@@ -847,46 +843,46 @@ const ft = typeof navigator < "u" && navigator.platform.startsWith("Mac"), gt =
|
|
|
847
843
|
i,
|
|
848
844
|
n
|
|
849
845
|
) : void 0;
|
|
850
|
-
if (!
|
|
846
|
+
if (!S)
|
|
851
847
|
throw `Unknown renderer implementation: ${o.renderer}`;
|
|
852
|
-
console.debug(g ? `Using ${g} renderer` : "Using custom renderer implementation"), o.style &&
|
|
848
|
+
console.debug(g ? `Using ${g} renderer` : "Using custom renderer implementation"), o.style && S.setStyle(o.style);
|
|
853
849
|
const m = fe(
|
|
854
850
|
t,
|
|
855
851
|
i,
|
|
856
|
-
|
|
852
|
+
l,
|
|
857
853
|
o
|
|
858
854
|
);
|
|
859
|
-
m.setUser(
|
|
860
|
-
const
|
|
855
|
+
m.setUser(h);
|
|
856
|
+
const T = Mt(i, a, o.adapter), d = () => h, R = (c) => {
|
|
861
857
|
m.setAnnotatingEnabled(
|
|
862
|
-
|
|
858
|
+
c === void 0 ? !0 : c
|
|
863
859
|
);
|
|
864
|
-
},
|
|
865
|
-
m.setAnnotatingMode(
|
|
866
|
-
},
|
|
867
|
-
|
|
868
|
-
},
|
|
869
|
-
|
|
870
|
-
},
|
|
871
|
-
|
|
860
|
+
}, w = (c) => {
|
|
861
|
+
m.setAnnotatingMode(c);
|
|
862
|
+
}, A = (c) => {
|
|
863
|
+
S.setFilter(c), m.setFilter(c);
|
|
864
|
+
}, N = (c) => {
|
|
865
|
+
h = c, m.setUser(c);
|
|
866
|
+
}, x = (c) => {
|
|
867
|
+
c ? s.setSelected(c) : s.clear();
|
|
872
868
|
};
|
|
873
869
|
return {
|
|
874
|
-
...
|
|
870
|
+
...T,
|
|
875
871
|
destroy: () => {
|
|
876
|
-
|
|
872
|
+
S.destroy(), m.destroy(), a.destroy();
|
|
877
873
|
},
|
|
878
874
|
element: t,
|
|
879
|
-
getUser:
|
|
880
|
-
renderer:
|
|
881
|
-
setAnnotatingEnabled:
|
|
882
|
-
setAnnotatingMode:
|
|
883
|
-
setFilter:
|
|
884
|
-
setStyle:
|
|
885
|
-
setUser:
|
|
886
|
-
setSelected:
|
|
887
|
-
setVisible:
|
|
888
|
-
on:
|
|
889
|
-
off:
|
|
875
|
+
getUser: d,
|
|
876
|
+
renderer: S,
|
|
877
|
+
setAnnotatingEnabled: R,
|
|
878
|
+
setAnnotatingMode: w,
|
|
879
|
+
setFilter: A,
|
|
880
|
+
setStyle: S.setStyle.bind(S),
|
|
881
|
+
setUser: N,
|
|
882
|
+
setSelected: x,
|
|
883
|
+
setVisible: S.setVisible.bind(S),
|
|
884
|
+
on: l.on,
|
|
885
|
+
off: l.off,
|
|
890
886
|
scrollIntoView: Vt(t, r),
|
|
891
887
|
state: i
|
|
892
888
|
};
|
|
@@ -895,52 +891,52 @@ export {
|
|
|
895
891
|
st as DEFAULT_SELECTED_STYLE,
|
|
896
892
|
U as DEFAULT_STYLE,
|
|
897
893
|
gt as NOT_ANNOTATABLE_CLASS,
|
|
898
|
-
|
|
894
|
+
K as NOT_ANNOTATABLE_SELECTOR,
|
|
899
895
|
De as Origin,
|
|
900
896
|
Pe as UserSelectAction,
|
|
901
897
|
Oe as W3CTextFormat,
|
|
902
898
|
Qt as cancelSingleClickEvents,
|
|
903
899
|
Q as cloneKeyboardEvent,
|
|
904
900
|
tt as clonePointerEvent,
|
|
905
|
-
|
|
901
|
+
St as computeStyle,
|
|
906
902
|
Jt as computeZIndex,
|
|
907
903
|
He as createBody,
|
|
908
|
-
|
|
904
|
+
yt as createRenderer,
|
|
909
905
|
fe as createSelectionHandler,
|
|
910
906
|
ie as createSpansRenderer,
|
|
911
|
-
|
|
907
|
+
_e as createTextAnnotator,
|
|
912
908
|
de as createTextAnnotatorState,
|
|
913
909
|
et as debounce,
|
|
914
910
|
he as fillDefaults,
|
|
915
911
|
Zt as getBackgroundColor,
|
|
916
912
|
te as getHighlightClientRects,
|
|
917
|
-
|
|
913
|
+
$t as getQuoteContext,
|
|
918
914
|
ot as getRangeAnnotatableContents,
|
|
919
915
|
ae as getViewportBounds,
|
|
920
916
|
ft as isMac,
|
|
921
917
|
Ne as isNodeWhitespaceOrEmpty,
|
|
922
918
|
Z as isNotAnnotatable,
|
|
923
919
|
mt as isRangeAnnotatable,
|
|
924
|
-
|
|
920
|
+
Pt as isRangeWhitespaceOrEmpty,
|
|
925
921
|
H as isRevived,
|
|
926
922
|
xe as isRevivedAnnotation,
|
|
927
923
|
Le as isRevivedTarget,
|
|
928
924
|
oe as mergeClientRects,
|
|
929
|
-
|
|
925
|
+
Ht as mergeRanges,
|
|
930
926
|
jt as parseW3CTextAnnotation,
|
|
931
|
-
|
|
932
|
-
|
|
927
|
+
Ut as programmaticallyFocusable,
|
|
928
|
+
Yt as rangeToSelector,
|
|
933
929
|
it as reviveAnnotation,
|
|
934
930
|
J as reviveTarget,
|
|
935
|
-
|
|
931
|
+
Xt as reviveTextSelector,
|
|
936
932
|
Vt as scrollIntoView,
|
|
937
933
|
Gt as serializeW3CTextAnnotation,
|
|
938
|
-
|
|
934
|
+
Kt as splitAnnotatableRanges,
|
|
939
935
|
ke as toDomRectList,
|
|
940
936
|
se as toParentBounds,
|
|
941
|
-
|
|
937
|
+
Me as toViewportBounds,
|
|
942
938
|
ce as trackViewport,
|
|
943
|
-
|
|
939
|
+
Wt as trimRangeToContainer,
|
|
944
940
|
pt as whitespaceOrEmptyRegex
|
|
945
941
|
};
|
|
946
942
|
//# sourceMappingURL=text-annotator.es.js.map
|