@soomo/react-text-annotator 3.4.0-staging.2 → 3.4.0-staging.3
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
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Recogito React Text Annotator
|
|
2
|
+
|
|
3
|
+
## Installation
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npm install @recogito/text-annotator @annotorious/react @recogito/react-text-annotator
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Quick Start
|
|
10
|
+
|
|
11
|
+
```jsx
|
|
12
|
+
import { Annotorious } from '@annotorious/react';
|
|
13
|
+
import { TextAnnotator } from '@recogito/react-text-annotator';
|
|
14
|
+
|
|
15
|
+
export const App = () => {
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<Annotorious>
|
|
19
|
+
<TextAnnotator>
|
|
20
|
+
<p>
|
|
21
|
+
Tell me, O muse, of that ingenious hero who travelled far and wide
|
|
22
|
+
after he had sacked the famous town of Troy. Many cities did he
|
|
23
|
+
visit, and many were the nations with whose manners and customs
|
|
24
|
+
he was acquainted; moreover he suffered much by sea while trying
|
|
25
|
+
to save his own life and bring his men safely home; but do what
|
|
26
|
+
he might he could not save his men, for they perished through their
|
|
27
|
+
own sheer folly in eating the cattle of the Sun-god Hyperion; so the
|
|
28
|
+
god prevented them from ever reaching home. Tell me, too, about all
|
|
29
|
+
these things, O daughter of Jove, from whatsoever source you may know them.
|
|
30
|
+
</p>
|
|
31
|
+
</TextAnnotator>
|
|
32
|
+
</Annotorious>
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Selection Popup
|
|
39
|
+
|
|
40
|
+
You can create a custom selection popup with the `TextAnnotationPopup` helper component.
|
|
41
|
+
|
|
42
|
+
```jsx
|
|
43
|
+
import { Annotorious } from '@annotorious/react';
|
|
44
|
+
import { TextAnnotator, TextAnnotationPopup } from '@recogito/react-text-annotator';
|
|
45
|
+
|
|
46
|
+
export const App = () => {
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<Annotorious>
|
|
50
|
+
<TextAnnotator>
|
|
51
|
+
<p>
|
|
52
|
+
...
|
|
53
|
+
</p>
|
|
54
|
+
|
|
55
|
+
<TextAnnotationPopup
|
|
56
|
+
asPortal
|
|
57
|
+
popup={props => (<div>Hello World</div>)} />
|
|
58
|
+
</TextAnnotator>
|
|
59
|
+
</Annotorious>
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Hooks
|
|
66
|
+
|
|
67
|
+
The Recogito Text Annotator leverages the [Annotorious](https://annotorious.dev) framework underneath the hood. All of the [Annotorious hooks](https://annotorious.dev/react/hooks-reference/) are available:
|
|
68
|
+
|
|
69
|
+
#### useAnnotator
|
|
70
|
+
Provides access to the Text Annotator instance.
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
const anno = useAnnotator();
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
#### useAnnotatorUser
|
|
77
|
+
Provides the current annotator user set via the anno.setUser() method, if any.
|
|
78
|
+
|
|
79
|
+
```js
|
|
80
|
+
const user: User = useAnnotatorUser();
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### useSelection
|
|
84
|
+
Provides the current selection state object and, optionally, the associated pointer event.
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
const { selected, event } = useSelection();
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### useViewportState
|
|
91
|
+
Provides the annotations currently visible in the viewport. This hook will respond to scrolling and resizing the annotation area. You can optionally debounce this hook, to limit re-rendering.
|
|
92
|
+
|
|
93
|
+
```js
|
|
94
|
+
const annotations: ImageAnnotation[] = useViewportState(debounceMillis: number);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## TEI/XML
|
|
98
|
+
|
|
99
|
+
The React wrapper includes utility components for the [TEI extension](../extension-tei).
|
|
100
|
+
|
|
101
|
+
```jsx
|
|
102
|
+
import { useEffect, useState } from 'react';
|
|
103
|
+
import { Annotorious } from '@annotorious/react';
|
|
104
|
+
import { TEIAnnotator, CETEIcean } from '@recogito/react-text-annotator';
|
|
105
|
+
|
|
106
|
+
export const App = () => {
|
|
107
|
+
|
|
108
|
+
const [tei, setTEI] = useState<string | undefined>(undefined);
|
|
109
|
+
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
fetch('paradise-lost.xml')
|
|
112
|
+
.then(res => res.text())
|
|
113
|
+
.then(setTEI);
|
|
114
|
+
}, []);
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<Annotorious>
|
|
118
|
+
<TEIAnnotator>
|
|
119
|
+
<CETEIcean tei={tei} />
|
|
120
|
+
</TEIAnnotator>
|
|
121
|
+
</Annotorious>
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
}
|
|
125
|
+
```
|
|
@@ -7,6 +7,7 @@ interface TextAnnotationPopupProps {
|
|
|
7
7
|
arrow?: boolean;
|
|
8
8
|
arrowProps?: Omit<FloatingArrowProps, 'context' | 'ref'>;
|
|
9
9
|
asPortal?: boolean;
|
|
10
|
+
autoFocus?: boolean;
|
|
10
11
|
placement?: Placement;
|
|
11
12
|
popup(props: TextAnnotationPopupContentProps): ReactNode;
|
|
12
13
|
onClose?(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextAnnotationPopup.d.ts","sourceRoot":"","sources":["../../src/TextAnnotationPopup/TextAnnotationPopup.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAM,SAAS,EAAqD,MAAM,OAAO,CAAC;AAGhG,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAKL,kBAAkB,EAKlB,SAAS,
|
|
1
|
+
{"version":3,"file":"TextAnnotationPopup.d.ts","sourceRoot":"","sources":["../../src/TextAnnotationPopup/TextAnnotationPopup.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAM,SAAS,EAAqD,MAAM,OAAO,CAAC;AAGhG,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAKL,kBAAkB,EAKlB,SAAS,EAGV,MAAM,oBAAoB,CAAC;AAI5B,OAAO,2BAA2B,CAAC;AAEnC,UAAU,wBAAwB;IAEhC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,UAAU,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IAEzD,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,KAAK,CAAC,KAAK,EAAE,+BAA+B,GAAG,SAAS,CAAC;IAEzD,OAAO,CAAC,IAAI,IAAI,CAAC;CAElB;AAED,MAAM,WAAW,+BAA+B,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IAExF,UAAU,EAAE,CAAC,CAAC;IAEd,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,KAAK,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC;CAEtC;AAYD,eAAO,MAAM,mBAAmB,GAAI,OAAO,wBAAwB,4CAkKlE,CAAC;AAEF,mCAAmC;AACnC,kDAAkD;AAClD,eAAO,MAAM,kBAAkB,GAAI,OAAO,wBAAwB,4CAOjE,CAAC"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { jsx as f, Fragment as
|
|
2
|
-
import { useRef as w, useEffect as u, useContext as P, useCallback as v, Children as
|
|
3
|
-
import
|
|
4
|
-
import { AnnotoriousContext as B, useAnnotationStore as
|
|
5
|
-
import { AnnotoriousPlugin as
|
|
6
|
-
import { TEIPlugin as
|
|
7
|
-
import { serializeW3CTEIAnnotation as
|
|
8
|
-
import { createTextAnnotator as L, toViewportBounds as R, toDomRectList as
|
|
9
|
-
import { W3CTextFormat as
|
|
1
|
+
import { jsx as f, Fragment as N, jsxs as M } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as w, useEffect as u, useContext as P, useCallback as v, Children as k, cloneElement as U, useState as x, useMemo as W } from "react";
|
|
3
|
+
import _ from "CETEIcean";
|
|
4
|
+
import { AnnotoriousContext as B, useAnnotationStore as j, Origin as H, useAnnotator as Q, useSelection as z } from "@annotorious/react";
|
|
5
|
+
import { AnnotoriousPlugin as Se } from "@annotorious/react";
|
|
6
|
+
import { TEIPlugin as D } from "@recogito/text-annotator-tei";
|
|
7
|
+
import { serializeW3CTEIAnnotation as Ee } from "@recogito/text-annotator-tei";
|
|
8
|
+
import { createTextAnnotator as L, toViewportBounds as R, toDomRectList as V, NOT_ANNOTATABLE_CLASS as Y } from "@soomo/text-annotator";
|
|
9
|
+
import { W3CTextFormat as Oe, parseW3CTextAnnotation as Pe, serializeW3CTextAnnotation as Be } from "@soomo/text-annotator";
|
|
10
10
|
import "@soomo/text-annotator/dist/text-annotator.css";
|
|
11
|
-
import { Ignore as
|
|
12
|
-
import { Origin as
|
|
13
|
-
import
|
|
14
|
-
import { useFloating as
|
|
15
|
-
const
|
|
11
|
+
import { Ignore as $ } from "@annotorious/core";
|
|
12
|
+
import { Origin as Re, UserSelectAction as Ie, createBody as Ne } from "@annotorious/core";
|
|
13
|
+
import q from "debounce";
|
|
14
|
+
import { useFloating as J, autoUpdate as G, inline as K, offset as X, flip as Z, shift as ee, arrow as te, FloatingPortal as ne, FloatingFocusManager as oe, FloatingArrow as re } from "@floating-ui/react";
|
|
15
|
+
const F = {
|
|
16
16
|
tei: {
|
|
17
17
|
ref: (e) => {
|
|
18
18
|
const t = document.createElement("a");
|
|
@@ -22,9 +22,9 @@ const O = {
|
|
|
22
22
|
},
|
|
23
23
|
// Cf. https://github.com/TEIC/CETEIcean/issues/67
|
|
24
24
|
graphic: (e) => {
|
|
25
|
-
var
|
|
25
|
+
var r;
|
|
26
26
|
const t = new Image();
|
|
27
|
-
t.src = (
|
|
27
|
+
t.src = (r = e.getAttribute("url")) == null ? void 0 : r.trim(), e.hasAttribute("width") && t.setAttribute("width", e.getAttribute("width")), e.hasAttribute("height") && t.setAttribute("height", e.getAttribute("height")), e.appendChild(t);
|
|
28
28
|
},
|
|
29
29
|
list: null,
|
|
30
30
|
note: null,
|
|
@@ -36,15 +36,15 @@ const O = {
|
|
|
36
36
|
}, Ce = (e) => {
|
|
37
37
|
const t = w(null);
|
|
38
38
|
return u(() => {
|
|
39
|
-
var
|
|
39
|
+
var r;
|
|
40
40
|
if (e.tei) {
|
|
41
|
-
const i = new
|
|
41
|
+
const i = new _(e.initArgs);
|
|
42
42
|
i.addBehaviors({
|
|
43
|
-
...
|
|
43
|
+
...F,
|
|
44
44
|
...e.behaviors || {},
|
|
45
45
|
tei: {
|
|
46
|
-
...
|
|
47
|
-
...((
|
|
46
|
+
...F.tei,
|
|
47
|
+
...((r = e.behaviors) == null ? void 0 : r.tei) || {}
|
|
48
48
|
}
|
|
49
49
|
}), i.makeHTML5(e.tei, (n) => {
|
|
50
50
|
t.current.appendChild(n), e.onLoad(t.current);
|
|
@@ -60,116 +60,114 @@ const O = {
|
|
|
60
60
|
className: "tei-container"
|
|
61
61
|
}
|
|
62
62
|
);
|
|
63
|
-
},
|
|
64
|
-
const { children: t, ...
|
|
65
|
-
const
|
|
66
|
-
n(
|
|
63
|
+
}, pe = (e) => {
|
|
64
|
+
const { children: t, ...r } = e, { anno: i, setAnno: n } = P(B), s = v((l) => {
|
|
65
|
+
const c = D(L(l, r));
|
|
66
|
+
n(c);
|
|
67
67
|
}, []);
|
|
68
68
|
return u(() => {
|
|
69
69
|
i && i.setStyle(e.style);
|
|
70
70
|
}, [e.style]), u(() => {
|
|
71
71
|
i && i.setFilter(e.filter);
|
|
72
|
-
}, [e.filter]), e.children ? /* @__PURE__ */ f(
|
|
72
|
+
}, [e.filter]), e.children ? /* @__PURE__ */ f(N, { children: k.toArray(e.children).map((l) => U(l, { onLoad: s })) }) : null;
|
|
73
73
|
}, T = (e, t = { timeout: 250 }) => {
|
|
74
|
-
const
|
|
74
|
+
const r = j(), [i, n] = x(!0);
|
|
75
75
|
return u(() => {
|
|
76
|
-
if (!
|
|
76
|
+
if (!r || !e) return;
|
|
77
77
|
let s;
|
|
78
|
-
const l = (
|
|
79
|
-
const { changes: { updated: g } } =
|
|
80
|
-
(g == null ? void 0 : g.some((
|
|
81
|
-
const { targetUpdated:
|
|
82
|
-
if (
|
|
83
|
-
const { oldTarget:
|
|
84
|
-
return
|
|
78
|
+
const l = (c) => {
|
|
79
|
+
const { changes: { updated: g } } = c;
|
|
80
|
+
(g == null ? void 0 : g.some((o) => {
|
|
81
|
+
const { targetUpdated: a } = o;
|
|
82
|
+
if (a) {
|
|
83
|
+
const { oldTarget: b, newTarget: d } = a;
|
|
84
|
+
return ie(b, d);
|
|
85
85
|
}
|
|
86
86
|
})) && (n(!1), clearTimeout(s), s = setTimeout(() => n(!0), t.timeout));
|
|
87
87
|
};
|
|
88
|
-
return
|
|
88
|
+
return r.observe(l, {
|
|
89
89
|
annotations: e,
|
|
90
|
-
ignore:
|
|
91
|
-
origin:
|
|
90
|
+
ignore: $.BODY_ONLY,
|
|
91
|
+
origin: H.LOCAL
|
|
92
92
|
}), () => {
|
|
93
|
-
clearTimeout(s),
|
|
93
|
+
clearTimeout(s), r.unobserve(l);
|
|
94
94
|
};
|
|
95
|
-
}, [
|
|
96
|
-
},
|
|
97
|
-
const { selector:
|
|
95
|
+
}, [r, e, t.timeout]), i;
|
|
96
|
+
}, ie = (e, t) => {
|
|
97
|
+
const { selector: r } = e, i = r.map(({ quote: l }) => l), { selector: n } = t, s = n.map(({ quote: l }) => l);
|
|
98
98
|
return i.join() !== s.join();
|
|
99
|
-
},
|
|
100
|
-
const t = w(null), { className:
|
|
99
|
+
}, we = (e) => {
|
|
100
|
+
const t = w(null), { className: r, children: i, ...n } = e, { style: s, filter: l, user: c, annotatingEnabled: g, userSelectAction: A } = n, { anno: o, setAnno: a } = P(B);
|
|
101
101
|
return u(() => {
|
|
102
|
-
if (!
|
|
103
|
-
const
|
|
104
|
-
return
|
|
105
|
-
}, [
|
|
106
|
-
},
|
|
102
|
+
if (!a) return;
|
|
103
|
+
const b = typeof n.adapter == "function" ? n.adapter(t.current) : n.adapter, d = L(t.current, { ...n, adapter: b });
|
|
104
|
+
return a(d), () => d.destroy();
|
|
105
|
+
}, [a]), u(() => o == null ? void 0 : o.setStyle(s), [o, s]), u(() => o == null ? void 0 : o.setFilter(l), [o, l]), u(() => o == null ? void 0 : o.setFilter(l), [o, l]), u(() => o == null ? void 0 : o.setUserSelectAction(A), [o, A]), u(() => o == null ? void 0 : o.setUser(c), [o, c]), u(() => o == null ? void 0 : o.setAnnotatingEnabled(g), [o, g]), /* @__PURE__ */ f("div", { ref: t, className: `r6o-annotatable no-focus-outline ${r}`, children: i });
|
|
106
|
+
}, O = () => {
|
|
107
107
|
if (typeof navigator > "u") return !1;
|
|
108
108
|
var e = navigator.userAgent || navigator.vendor || (window == null ? void 0 : window.opera);
|
|
109
109
|
return !!(/android/i.test(e) || /iPad|iPhone/.test(e) && !window.MSStream);
|
|
110
110
|
};
|
|
111
111
|
let S = null;
|
|
112
|
-
const
|
|
112
|
+
const se = q((e, t, r) => {
|
|
113
113
|
requestAnimationFrame(() => {
|
|
114
114
|
const i = t.getAnnotationBounds(e);
|
|
115
|
-
i && (S = R(i,
|
|
115
|
+
i && (S = R(i, r.getBoundingClientRect()));
|
|
116
116
|
});
|
|
117
|
-
}, 250),
|
|
117
|
+
}, 250), le = (e) => {
|
|
118
118
|
var E;
|
|
119
|
-
const t =
|
|
119
|
+
const t = Q(), { selected: r, event: i } = z(), n = (E = r[0]) == null ? void 0 : E.annotation;
|
|
120
120
|
T(n == null ? void 0 : n.id);
|
|
121
|
-
const [s, l] = x((
|
|
121
|
+
const [s, l] = x((r == null ? void 0 : r.length) > 0), c = () => t == null ? void 0 : t.cancelSelected(), [g, A] = x(!1);
|
|
122
122
|
v(() => A(!0), []);
|
|
123
|
-
const
|
|
123
|
+
const o = v(() => A(!1), []);
|
|
124
124
|
u(() => {
|
|
125
|
-
s ||
|
|
126
|
-
}, [s,
|
|
127
|
-
const
|
|
128
|
-
placement:
|
|
125
|
+
s || o();
|
|
126
|
+
}, [s, o]);
|
|
127
|
+
const a = w(!1), b = w(null), { refs: d, floatingStyles: I, update: p, context: y } = J({
|
|
128
|
+
placement: O() ? "bottom" : e.placement || "top",
|
|
129
129
|
strategy: "absolute",
|
|
130
130
|
open: s,
|
|
131
|
-
onOpenChange: (m, h,
|
|
132
|
-
!m && (
|
|
131
|
+
onOpenChange: (m, h, C) => {
|
|
132
|
+
!m && (C === "escape-key" || C === "focus-out") && (l(m), c());
|
|
133
133
|
},
|
|
134
134
|
middleware: [
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
135
|
+
K(),
|
|
136
|
+
X(10),
|
|
137
|
+
Z({ crossAxis: !0 }),
|
|
138
|
+
ee({ crossAxis: !0, padding: 10 }),
|
|
139
|
+
te({ element: b })
|
|
140
140
|
],
|
|
141
|
-
whileElementsMounted:
|
|
141
|
+
whileElementsMounted: G
|
|
142
142
|
});
|
|
143
|
-
u(() => {
|
|
143
|
+
return u(() => {
|
|
144
144
|
if (!t) return;
|
|
145
145
|
const m = n == null ? void 0 : n.id, h = n == null ? void 0 : n.target.selector.length;
|
|
146
146
|
if (m && h > 0 && T) {
|
|
147
|
-
const
|
|
148
|
-
l(!!
|
|
147
|
+
const C = t == null ? void 0 : t.state.store.getAnnotationBounds(n.id);
|
|
148
|
+
l(!!C);
|
|
149
149
|
} else
|
|
150
150
|
l(!1);
|
|
151
151
|
}, [n == null ? void 0 : n.id, n == null ? void 0 : n.target.selector, T, t == null ? void 0 : t.state.store]), u(() => {
|
|
152
|
-
e.onClose && (s ?
|
|
152
|
+
e.onClose && (s ? a.current = !0 : a.current && (a.current = !1, e.onClose()));
|
|
153
153
|
}, [e.onClose, s]), u(() => {
|
|
154
154
|
t && (s && (n != null && n.id) ? d.setPositionReference({
|
|
155
|
-
getBoundingClientRect: () => (
|
|
155
|
+
getBoundingClientRect: () => (se(n.id, t.state.store, t.element), S || new DOMRect()),
|
|
156
156
|
getClientRects: () => {
|
|
157
157
|
const h = t.state.store.getAnnotationRects(n.id).map(
|
|
158
|
-
(
|
|
158
|
+
(C) => R(C, t.element.getBoundingClientRect())
|
|
159
159
|
);
|
|
160
|
-
return
|
|
160
|
+
return V(h);
|
|
161
161
|
}
|
|
162
162
|
}) : d.setPositionReference(null));
|
|
163
163
|
}, [s, n == null ? void 0 : n.id, n == null ? void 0 : n.target, t]), u(() => {
|
|
164
164
|
if (!e.asPortal) return;
|
|
165
|
-
const m = { attributes: !0, childList: !0, subtree: !0 }, h = new MutationObserver(() =>
|
|
166
|
-
return h.observe(document.body, m), window.document.addEventListener("scroll",
|
|
167
|
-
h.disconnect(), window.document.removeEventListener("scroll",
|
|
165
|
+
const m = { attributes: !0, childList: !0, subtree: !0 }, h = new MutationObserver(() => p());
|
|
166
|
+
return h.observe(document.body, m), window.document.addEventListener("scroll", p, !0), () => {
|
|
167
|
+
h.disconnect(), window.document.removeEventListener("scroll", p, !0);
|
|
168
168
|
};
|
|
169
|
-
}, [
|
|
170
|
-
|
|
171
|
-
return s && n ? /* @__PURE__ */ f(
|
|
172
|
-
re,
|
|
169
|
+
}, [p, e.asPortal]), W(() => e.autoFocus === !1 || (i == null ? void 0 : i.type) === "keyup" || (i == null ? void 0 : i.type) === "contextmenu" || O() ? -1 : 0, [e.autoFocus, i]), s && n ? /* @__PURE__ */ f(
|
|
170
|
+
ne,
|
|
173
171
|
{
|
|
174
172
|
root: e.asPortal ? void 0 : t.element,
|
|
175
173
|
children: /* @__PURE__ */ f(
|
|
@@ -179,28 +177,28 @@ const le = J((e, t, o) => {
|
|
|
179
177
|
modal: !1,
|
|
180
178
|
closeOnFocusOut: !0,
|
|
181
179
|
returnFocus: !1,
|
|
182
|
-
initialFocus:
|
|
183
|
-
children: /* @__PURE__ */
|
|
180
|
+
initialFocus: -1,
|
|
181
|
+
children: /* @__PURE__ */ M(
|
|
184
182
|
"div",
|
|
185
183
|
{
|
|
186
|
-
className: `a9s-popup r6o-popup annotation-popup r6o-text-popup ${
|
|
184
|
+
className: `a9s-popup r6o-popup annotation-popup r6o-text-popup ${Y}`,
|
|
187
185
|
ref: d.setFloating,
|
|
188
186
|
style: I,
|
|
189
187
|
children: [
|
|
190
188
|
e.popup({
|
|
191
|
-
annotation:
|
|
192
|
-
editable:
|
|
189
|
+
annotation: r[0].annotation,
|
|
190
|
+
editable: r[0].editable,
|
|
193
191
|
event: i
|
|
194
192
|
}),
|
|
195
193
|
e.arrow && /* @__PURE__ */ f(
|
|
196
|
-
|
|
194
|
+
re,
|
|
197
195
|
{
|
|
198
|
-
ref:
|
|
196
|
+
ref: b,
|
|
199
197
|
context: y,
|
|
200
198
|
...e.arrowProps || {}
|
|
201
199
|
}
|
|
202
200
|
),
|
|
203
|
-
/* @__PURE__ */ f("button", { className: "r6o-popup-sr-only", "aria-live": "assertive", onClick:
|
|
201
|
+
/* @__PURE__ */ f("button", { className: "r6o-popup-sr-only", "aria-live": "assertive", onClick: c, children: e.ariaCloseWarning || "Click or leave this dialog to close it." })
|
|
204
202
|
]
|
|
205
203
|
}
|
|
206
204
|
)
|
|
@@ -208,23 +206,23 @@ const le = J((e, t, o) => {
|
|
|
208
206
|
)
|
|
209
207
|
}
|
|
210
208
|
) : null;
|
|
211
|
-
},
|
|
209
|
+
}, Te = (e) => (u(() => {
|
|
212
210
|
console.warn("TextAnnotatorPopup is deprecated and will be removed in a future version. Please use TextAnnotationPopup instead.");
|
|
213
|
-
}, []), /* @__PURE__ */ f(
|
|
211
|
+
}, []), /* @__PURE__ */ f(le, { ...e }));
|
|
214
212
|
export {
|
|
215
|
-
|
|
213
|
+
Se as AnnotoriousPlugin,
|
|
216
214
|
Ce as CETEIcean,
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
215
|
+
Re as Origin,
|
|
216
|
+
pe as TEIAnnotator,
|
|
217
|
+
le as TextAnnotationPopup,
|
|
218
|
+
we as TextAnnotator,
|
|
219
|
+
Te as TextAnnotatorPopup,
|
|
220
|
+
Ie as UserSelectAction,
|
|
221
|
+
Oe as W3CTextFormat,
|
|
222
|
+
Ne as createBody,
|
|
223
|
+
Pe as parseW3CTextAnnotation,
|
|
224
|
+
Ee as serializeW3CTEIAnnotation,
|
|
225
|
+
Be as serializeW3CTextAnnotation,
|
|
228
226
|
T as useAnnotationQuoteIdle
|
|
229
227
|
};
|
|
230
228
|
//# sourceMappingURL=react-text-annotator.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-text-annotator.es.js","sources":["../src/tei/CETEIcean.tsx","../src/tei/TEIAnnotator.tsx","../src/hooks/useAnnotationQuoteIdle.ts","../src/TextAnnotator.tsx","../src/TextAnnotationPopup/isMobile.ts","../src/TextAnnotationPopup/TextAnnotationPopup.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport CETEI from 'CETEIcean';\n\ninterface CETEIceanProps {\n\n initArgs?: any;\n\n tei?: string;\n\n onLoad?(element: Element): void;\n\n behaviors?: any;\n\n}\n\n// Override default list, note, table, and ref behaviors \n// so they don't introduce text into the DOM that interferes\n// with annotation. Apply a patch to graphics for robustness.\nconst PRESET_BEHAVIORS = {\n tei: {\n ref: (elem: Element) => {\n const a = document.createElement('a');\n\n while(elem.firstChild) {\n a.appendChild(elem.removeChild(elem.firstChild));\n }\n\n a.setAttribute('href', elem.getAttribute('target'));\n\n elem.appendChild(a);\n },\n // Cf. https://github.com/TEIC/CETEIcean/issues/67\n graphic: (elem: Element) => {\n const content = new Image();\n content.src = elem.getAttribute('url')?.trim();\n\n if (elem.hasAttribute('width'))\n content.setAttribute('width', elem.getAttribute('width'));\n\n if (elem.hasAttribute('height'))\n content.setAttribute('height', elem.getAttribute('height'));\n\n elem.appendChild(content);\n },\n list: null,\n note: null,\n table: null,\n teiHeader: (elem: HTMLElement) => {\n elem.hidden = true;\n }\n }\n}\n\nexport const CETEIcean = (props: CETEIceanProps) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (props.tei) {\n const ceteicean = new CETEI(props.initArgs);\n\n ceteicean.addBehaviors({\n ...PRESET_BEHAVIORS,\n ...(props.behaviors || {}),\n tei: {\n ...PRESET_BEHAVIORS.tei,\n ...(props.behaviors?.tei || {})\n }\n });\n\n ceteicean.makeHTML5(props.tei, (data: Element) => {\n el.current.appendChild(data);\n props.onLoad(el.current);\n });\n }\n\n return () => {\n if (el.current)\n el.current.innerHTML = '';\n }\n }, [props.tei, JSON.stringify(props.initArgs), props.onLoad]);\n\n return (\n <div \n ref={el}\n className=\"tei-container\" />\n )\n\n}","import { Children, JSX, ReactElement, ReactNode, cloneElement, useCallback, useContext, useEffect } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport { TEIPlugin } from '@recogito/text-annotator-tei';\nimport { createTextAnnotator, HighlightStyleExpression } from '@soomo/text-annotator';\nimport type { TextAnnotatorOptions } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/text-annotator.css';\n\nexport type TEIAnnotatorProps = TextAnnotatorOptions & {\n\n children?: ReactNode | JSX.Element;\n\n filter?: Filter;\n\n style?: HighlightStyleExpression\n\n}\n\nexport const TEIAnnotator = (props: TEIAnnotatorProps) => {\n\n const { children, ...opts } = props;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n const onLoad = useCallback((element: HTMLElement) => {\n const anno = TEIPlugin(createTextAnnotator(element, opts));\n setAnno(anno);\n }, []);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setStyle(props.style);\n }, [props.style]);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setFilter(props.filter);\n }, [props.filter]);\n\n return props.children ? (\n <>\n {Children.toArray(props.children).map(child => \n cloneElement(child as ReactElement, { onLoad } as any))}\n </>\n ) : null;\n\n}\n","import { useEffect, useState } from 'react';\nimport { Origin, useAnnotationStore } from '@annotorious/react';\nimport { Ignore, type StoreChangeEvent } from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationStore, TextAnnotationTarget } from '@soomo/text-annotator';\n\nexport const useAnnotationQuoteIdle = (\n annotationId: string | undefined,\n options: { timeout: number } = { timeout: 250 }\n) => {\n const store = useAnnotationStore<TextAnnotationStore>();\n\n const [isIdle, setIsIdle] = useState(true);\n\n useEffect(() => {\n if (!store || !annotationId) return;\n\n let idleTimeout: ReturnType<typeof setTimeout>;\n\n const scheduleSetIsIdle = (event: StoreChangeEvent<TextAnnotation>) => {\n const { changes: { updated } } = event;\n\n const hasChanged = updated?.some(update => {\n const { targetUpdated } = update;\n if (targetUpdated) {\n const { oldTarget, newTarget } = targetUpdated;\n return hasQuoteChanged(oldTarget, newTarget);\n }\n });\n\n if (hasChanged) {\n setIsIdle(false);\n clearTimeout(idleTimeout);\n idleTimeout = setTimeout(() => setIsIdle(true), options.timeout);\n }\n };\n\n store.observe(scheduleSetIsIdle, {\n annotations: annotationId,\n ignore: Ignore.BODY_ONLY,\n origin: Origin.LOCAL\n });\n\n return () => {\n clearTimeout(idleTimeout);\n store.unobserve(scheduleSetIsIdle);\n };\n }, [store, annotationId, options.timeout]);\n\n return isIdle;\n};\n\nconst hasQuoteChanged = (oldValue: TextAnnotationTarget, newValue: TextAnnotationTarget) => {\n const { selector: oldSelector } = oldValue;\n const oldQuotes = oldSelector.map(({ quote }) => quote);\n\n const { selector: newSelector } = newValue;\n const newQuotes = newSelector.map(({ quote }) => quote);\n\n return oldQuotes.join() !== newQuotes.join();\n};\n","import { JSX, ReactNode, useContext, useEffect, useRef } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport type { FormatAdapter } from '@annotorious/core';\nimport type { HighlightStyleExpression, TextAnnotation, TextAnnotatorOptions } from '@soomo/text-annotator';\nimport { createTextAnnotator } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/text-annotator.css';\n\nexport interface TextAnnotatorProps<I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation> extends Omit<TextAnnotatorOptions<I, E>, 'adapter'> {\n\n children?: ReactNode | JSX.Element;\n\n adapter?: FormatAdapter<I, E> | ((container: HTMLElement) => FormatAdapter<I, E>) | null;\n\n filter?: Filter<I>;\n\n style?: HighlightStyleExpression;\n\n className?: string;\n\n}\n\nexport const TextAnnotator = <I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation>(\n props: TextAnnotatorProps<I, E>\n) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n const { className, children, ...opts } = props;\n const { style, filter, user, annotatingEnabled, userSelectAction } = opts;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n useEffect(() => {\n if (!setAnno) return;\n\n const adapter = typeof opts.adapter === 'function' ? opts.adapter(el.current) : opts.adapter;\n\n const anno = createTextAnnotator(el.current, { ...opts, adapter });\n setAnno(anno);\n\n return () => anno.destroy();\n }, [setAnno]);\n\n useEffect(() => anno?.setStyle(style), [anno, style]);\n\n useEffect(() => anno?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setUserSelectAction(userSelectAction), [anno, userSelectAction]);\n\n useEffect(() => anno?.setUser(user), [anno, user]);\n\n useEffect(() => anno?.setAnnotatingEnabled(annotatingEnabled), [anno, annotatingEnabled]);\n\n return (\n <div ref={el} className={`r6o-annotatable no-focus-outline ${className}`}>\n {children}\n </div>\n );\n\n};\n","// https://stackoverflow.com/questions/21741841/detecting-ios-android-operating-system\nexport const isMobile = () => {\n if (typeof navigator === 'undefined') return false;\n\n // @ts-ignore\n var userAgent: string = navigator.userAgent || navigator.vendor || window?.opera;\n\n if (/android/i.test(userAgent)) \n return true;\n\n // @ts-ignore\n // Note: as of recently, this NO LONGER DETECTS FIREFOX ON iOS!\n // This means FF/iOS will behave like on the desktop, and loose\n // selection handlebars after the popup opens.\n if (/iPad|iPhone/.test(userAgent) && !window.MSStream)\n return true;\n\n return false;\n}","import React, { FC, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'debounce';\nimport { useAnnotator, useSelection } from '@annotorious/react';\nimport {\n NOT_ANNOTATABLE_CLASS,\n TextAnnotationStore,\n toViewportBounds,\n toDomRectList,\n type TextAnnotation,\n type TextAnnotator,\n} from '@soomo/text-annotator';\nimport {\n arrow,\n autoUpdate,\n flip,\n FloatingArrow,\n FloatingArrowProps,\n FloatingFocusManager,\n FloatingPortal,\n inline,\n offset,\n Placement,\n shift,\n useDismiss,\n useFloating,\n useInteractions,\n useRole\n} from '@floating-ui/react';\nimport { isMobile } from './isMobile';\nimport { useAnnotationQuoteIdle } from '../hooks';\n\nimport './TextAnnotationPopup.css';\n\ninterface TextAnnotationPopupProps {\n\n ariaNavigationMessage?: string;\n\n ariaCloseWarning?: string;\n\n arrow?: boolean;\n\n arrowProps?: Omit<FloatingArrowProps, 'context' | 'ref'>;\n\n asPortal?: boolean;\n\n placement?: Placement;\n\n popup(props: TextAnnotationPopupContentProps): ReactNode;\n\n onClose?(): void;\n\n}\n\nexport interface TextAnnotationPopupContentProps<T extends TextAnnotation = TextAnnotation> {\n\n annotation: T;\n\n editable?: boolean;\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nlet cachedBounds = null;\n\nconst updateViewportBounds = debounce((annotationId: string, store: TextAnnotationStore, container: HTMLElement) => {\n requestAnimationFrame(() => {\n const bounds = store.getAnnotationBounds(annotationId);\n if (!bounds) return;\n cachedBounds = toViewportBounds(bounds, container.getBoundingClientRect());\n });\n}, 250);\n\nexport const TextAnnotationPopup = (props: TextAnnotationPopupProps) => {\n\n const r = useAnnotator<TextAnnotator>();\n\n const { selected, event } = useSelection<TextAnnotation>();\n\n const annotation = selected[0]?.annotation;\n\n const isAnnotationQuoteIdle = useAnnotationQuoteIdle(annotation?.id);\n\n const [isOpen, setOpen] = useState(selected?.length > 0);\n const handleClose = () => r?.cancelSelected();\n\n const [isFocused, setFocused] = useState(false);\n const handleFocus = useCallback(() => setFocused(true), []);\n const handleBlur = useCallback(() => setFocused(false), []);\n useEffect(() => {\n if (!isOpen) handleBlur();\n }, [isOpen, handleBlur]);\n\n // So we can reliably trigger the onClose callback\n const wasOpenRef = useRef(false);\n\n const arrowRef = useRef(null);\n\n const { refs, floatingStyles, update, context } = useFloating({\n placement: isMobile() ? 'bottom' : props.placement || 'top',\n strategy: 'absolute',\n open: isOpen,\n onOpenChange: (open, _event, reason) => {\n if (!open && (reason === 'escape-key' || reason === 'focus-out')) {\n setOpen(open);\n handleClose();\n }\n },\n middleware: [\n inline(),\n offset(10),\n flip({ crossAxis: true }),\n shift({ crossAxis: true, padding: 10, }),\n arrow({ element: arrowRef })\n ],\n whileElementsMounted: autoUpdate\n });\n\n useEffect(() => {\n if (!r) return;\n\n const annotationId = annotation?.id;\n const annotationSelectorsLength = annotation?.target.selector.length;\n\n if (annotationId && annotationSelectorsLength > 0 && useAnnotationQuoteIdle) {\n const bounds = r?.state.store.getAnnotationBounds(annotation.id);\n setOpen(Boolean(bounds));\n } else {\n setOpen(false);\n }\n }, [annotation?.id, annotation?.target.selector, useAnnotationQuoteIdle, r?.state.store]);\n\n useEffect(() => {\n if (!props.onClose) return;\n\n if (isOpen) {\n wasOpenRef.current = true;\n } else if (wasOpenRef.current) {\n wasOpenRef.current = false;\n props.onClose();\n }\n }, [props.onClose, isOpen]);\n\n useEffect(() => {\n if (!r) return;\n\n if (isOpen && annotation?.id) {\n refs.setPositionReference({\n getBoundingClientRect: () => {\n // Debounced!\n updateViewportBounds(annotation.id, r.state.store, r.element);\n return cachedBounds ? cachedBounds : new DOMRect();\n },\n getClientRects: () => {\n const rects = r.state.store.getAnnotationRects(annotation.id);\n const denormalizedRects = rects.map((rect) =>\n toViewportBounds(rect, r.element.getBoundingClientRect())\n );\n return toDomRectList(denormalizedRects);\n }\n });\n } else {\n refs.setPositionReference(null);\n }\n }, [isOpen, annotation?.id, annotation?.target, r]);\n\n useEffect(() => {\n if (!props.asPortal) return;\n\n const config: MutationObserverInit = { attributes: true, childList: true, subtree: true };\n\n const mutationObserver = new MutationObserver(() => update());\n mutationObserver.observe(document.body, config);\n\n window.document.addEventListener('scroll', update, true);\n\n return () => {\n mutationObserver.disconnect();\n window.document.removeEventListener('scroll', update, true);\n };\n }, [update, props.asPortal]);\n\n // Don't shift focus to the floating element if selected via keyboard or on mobile.\n const initialFocus = useMemo(() => {\n return (event?.type === 'keyup' || event?.type === 'contextmenu' || isMobile()) ? -1 : 0;\n }, [event]);\n\n /**\n * Announce the navigation hint only on the keyboard selection,\n * because the focus isn't shifted to the popup automatically then\n */\n // useAnnouncePopupNavigation({\n // disabled: isFocused,\n // floatingOpen: isOpen,\n // message: ariaNavigationMessage,\n // });\n\n return isOpen && annotation ? (\n <FloatingPortal\n root={props.asPortal ? undefined : r.element}>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={true}\n returnFocus={false}\n initialFocus={initialFocus}>\n <div\n className={`a9s-popup r6o-popup annotation-popup r6o-text-popup ${NOT_ANNOTATABLE_CLASS}`}\n ref={refs.setFloating}\n style={floatingStyles}>\n {props.popup({\n annotation: selected[0].annotation,\n editable: selected[0].editable,\n event\n })}\n{props.arrow && (\n <FloatingArrow\n ref={arrowRef}\n context={context}\n {...(props.arrowProps || {})} />\n )}\n\n <button className=\"r6o-popup-sr-only\" aria-live=\"assertive\" onClick={handleClose}>\n {props.ariaCloseWarning || 'Click or leave this dialog to close it.'}\n </button>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n ) : null;\n\n};\n\n/** For backwards compatibility **/\n/** @deprecated Use TextAnnotationPopup instead */\nexport const TextAnnotatorPopup = (props: TextAnnotationPopupProps) => {\n\n useEffect(() => {\n console.warn('TextAnnotatorPopup is deprecated and will be removed in a future version. Please use TextAnnotationPopup instead.');\n }, []);\n\n return <TextAnnotationPopup {...props} />;\n};\n"],"names":["PRESET_BEHAVIORS","elem","a","content","_a","CETEIcean","props","el","useRef","useEffect","ceteicean","CETEI","data","jsx","TEIAnnotator","children","opts","anno","setAnno","useContext","AnnotoriousContext","onLoad","useCallback","element","TEIPlugin","createTextAnnotator","Fragment","Children","child","cloneElement","useAnnotationQuoteIdle","annotationId","options","store","useAnnotationStore","isIdle","setIsIdle","useState","idleTimeout","scheduleSetIsIdle","event","updated","update","targetUpdated","oldTarget","newTarget","hasQuoteChanged","Ignore","Origin","oldValue","newValue","oldSelector","oldQuotes","quote","newSelector","newQuotes","TextAnnotator","className","style","filter","user","annotatingEnabled","userSelectAction","adapter","isMobile","userAgent","cachedBounds","updateViewportBounds","debounce","container","bounds","toViewportBounds","TextAnnotationPopup","r","useAnnotator","selected","useSelection","annotation","isOpen","setOpen","handleClose","isFocused","setFocused","handleBlur","wasOpenRef","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","annotationSelectorsLength","denormalizedRects","rect","toDomRectList","config","mutationObserver","initialFocus","useMemo","FloatingPortal","FloatingFocusManager","jsxs","NOT_ANNOTATABLE_CLASS","FloatingArrow","TextAnnotatorPopup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-text-annotator.es.js","sources":["../src/tei/CETEIcean.tsx","../src/tei/TEIAnnotator.tsx","../src/hooks/useAnnotationQuoteIdle.ts","../src/TextAnnotator.tsx","../src/TextAnnotationPopup/isMobile.ts","../src/TextAnnotationPopup/TextAnnotationPopup.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport CETEI from 'CETEIcean';\n\ninterface CETEIceanProps {\n\n initArgs?: any;\n\n tei?: string;\n\n onLoad?(element: Element): void;\n\n behaviors?: any;\n\n}\n\n// Override default list, note, table, and ref behaviors \n// so they don't introduce text into the DOM that interferes\n// with annotation. Apply a patch to graphics for robustness.\nconst PRESET_BEHAVIORS = {\n tei: {\n ref: (elem: Element) => {\n const a = document.createElement('a');\n\n while(elem.firstChild) {\n a.appendChild(elem.removeChild(elem.firstChild));\n }\n\n a.setAttribute('href', elem.getAttribute('target'));\n\n elem.appendChild(a);\n },\n // Cf. https://github.com/TEIC/CETEIcean/issues/67\n graphic: (elem: Element) => {\n const content = new Image();\n content.src = elem.getAttribute('url')?.trim();\n\n if (elem.hasAttribute('width'))\n content.setAttribute('width', elem.getAttribute('width'));\n\n if (elem.hasAttribute('height'))\n content.setAttribute('height', elem.getAttribute('height'));\n\n elem.appendChild(content);\n },\n list: null,\n note: null,\n table: null,\n teiHeader: (elem: HTMLElement) => {\n elem.hidden = true;\n }\n }\n}\n\nexport const CETEIcean = (props: CETEIceanProps) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (props.tei) {\n const ceteicean = new CETEI(props.initArgs);\n\n ceteicean.addBehaviors({\n ...PRESET_BEHAVIORS,\n ...(props.behaviors || {}),\n tei: {\n ...PRESET_BEHAVIORS.tei,\n ...(props.behaviors?.tei || {})\n }\n });\n\n ceteicean.makeHTML5(props.tei, (data: Element) => {\n el.current.appendChild(data);\n props.onLoad(el.current);\n });\n }\n\n return () => {\n if (el.current)\n el.current.innerHTML = '';\n }\n }, [props.tei, JSON.stringify(props.initArgs), props.onLoad]);\n\n return (\n <div \n ref={el}\n className=\"tei-container\" />\n )\n\n}","import { Children, JSX, ReactElement, ReactNode, cloneElement, useCallback, useContext, useEffect } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport { TEIPlugin } from '@recogito/text-annotator-tei';\nimport { createTextAnnotator, HighlightStyleExpression } from '@soomo/text-annotator';\nimport type { TextAnnotatorOptions } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/text-annotator.css';\n\nexport type TEIAnnotatorProps = TextAnnotatorOptions & {\n\n children?: ReactNode | JSX.Element;\n\n filter?: Filter;\n\n style?: HighlightStyleExpression\n\n}\n\nexport const TEIAnnotator = (props: TEIAnnotatorProps) => {\n\n const { children, ...opts } = props;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n const onLoad = useCallback((element: HTMLElement) => {\n const anno = TEIPlugin(createTextAnnotator(element, opts));\n setAnno(anno);\n }, []);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setStyle(props.style);\n }, [props.style]);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setFilter(props.filter);\n }, [props.filter]);\n\n return props.children ? (\n <>\n {Children.toArray(props.children).map(child => \n cloneElement(child as ReactElement, { onLoad } as any))}\n </>\n ) : null;\n\n}\n","import { useEffect, useState } from 'react';\nimport { Origin, useAnnotationStore } from '@annotorious/react';\nimport { Ignore, type StoreChangeEvent } from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationStore, TextAnnotationTarget } from '@soomo/text-annotator';\n\nexport const useAnnotationQuoteIdle = (\n annotationId: string | undefined,\n options: { timeout: number } = { timeout: 250 }\n) => {\n const store = useAnnotationStore<TextAnnotationStore>();\n\n const [isIdle, setIsIdle] = useState(true);\n\n useEffect(() => {\n if (!store || !annotationId) return;\n\n let idleTimeout: ReturnType<typeof setTimeout>;\n\n const scheduleSetIsIdle = (event: StoreChangeEvent<TextAnnotation>) => {\n const { changes: { updated } } = event;\n\n const hasChanged = updated?.some(update => {\n const { targetUpdated } = update;\n if (targetUpdated) {\n const { oldTarget, newTarget } = targetUpdated;\n return hasQuoteChanged(oldTarget, newTarget);\n }\n });\n\n if (hasChanged) {\n setIsIdle(false);\n clearTimeout(idleTimeout);\n idleTimeout = setTimeout(() => setIsIdle(true), options.timeout);\n }\n };\n\n store.observe(scheduleSetIsIdle, {\n annotations: annotationId,\n ignore: Ignore.BODY_ONLY,\n origin: Origin.LOCAL\n });\n\n return () => {\n clearTimeout(idleTimeout);\n store.unobserve(scheduleSetIsIdle);\n };\n }, [store, annotationId, options.timeout]);\n\n return isIdle;\n};\n\nconst hasQuoteChanged = (oldValue: TextAnnotationTarget, newValue: TextAnnotationTarget) => {\n const { selector: oldSelector } = oldValue;\n const oldQuotes = oldSelector.map(({ quote }) => quote);\n\n const { selector: newSelector } = newValue;\n const newQuotes = newSelector.map(({ quote }) => quote);\n\n return oldQuotes.join() !== newQuotes.join();\n};\n","import { JSX, ReactNode, useContext, useEffect, useRef } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport type { FormatAdapter } from '@annotorious/core';\nimport type { HighlightStyleExpression, TextAnnotation, TextAnnotatorOptions } from '@soomo/text-annotator';\nimport { createTextAnnotator } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/text-annotator.css';\n\nexport interface TextAnnotatorProps<I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation> extends Omit<TextAnnotatorOptions<I, E>, 'adapter'> {\n\n children?: ReactNode | JSX.Element;\n\n adapter?: FormatAdapter<I, E> | ((container: HTMLElement) => FormatAdapter<I, E>) | null;\n\n filter?: Filter<I>;\n\n style?: HighlightStyleExpression;\n\n className?: string;\n\n}\n\nexport const TextAnnotator = <I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation>(\n props: TextAnnotatorProps<I, E>\n) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n const { className, children, ...opts } = props;\n const { style, filter, user, annotatingEnabled, userSelectAction } = opts;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n useEffect(() => {\n if (!setAnno) return;\n\n const adapter = typeof opts.adapter === 'function' ? opts.adapter(el.current) : opts.adapter;\n\n const anno = createTextAnnotator(el.current, { ...opts, adapter });\n setAnno(anno);\n\n return () => anno.destroy();\n }, [setAnno]);\n\n useEffect(() => anno?.setStyle(style), [anno, style]);\n\n useEffect(() => anno?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setUserSelectAction(userSelectAction), [anno, userSelectAction]);\n\n useEffect(() => anno?.setUser(user), [anno, user]);\n\n useEffect(() => anno?.setAnnotatingEnabled(annotatingEnabled), [anno, annotatingEnabled]);\n\n return (\n <div ref={el} className={`r6o-annotatable no-focus-outline ${className}`}>\n {children}\n </div>\n );\n\n};\n","// https://stackoverflow.com/questions/21741841/detecting-ios-android-operating-system\nexport const isMobile = () => {\n if (typeof navigator === 'undefined') return false;\n\n // @ts-ignore\n var userAgent: string = navigator.userAgent || navigator.vendor || window?.opera;\n\n if (/android/i.test(userAgent)) \n return true;\n\n // @ts-ignore\n // Note: as of recently, this NO LONGER DETECTS FIREFOX ON iOS!\n // This means FF/iOS will behave like on the desktop, and loose\n // selection handlebars after the popup opens.\n if (/iPad|iPhone/.test(userAgent) && !window.MSStream)\n return true;\n\n return false;\n}","import React, { FC, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'debounce';\nimport { useAnnotator, useSelection } from '@annotorious/react';\nimport {\n NOT_ANNOTATABLE_CLASS,\n TextAnnotationStore,\n toViewportBounds,\n toDomRectList,\n type TextAnnotation,\n type TextAnnotator,\n} from '@soomo/text-annotator';\nimport {\n arrow,\n autoUpdate,\n flip,\n FloatingArrow,\n FloatingArrowProps,\n FloatingFocusManager,\n FloatingPortal,\n inline,\n offset,\n Placement,\n shift,\n useFloating\n} from '@floating-ui/react';\nimport { isMobile } from './isMobile';\nimport { useAnnotationQuoteIdle } from '../hooks';\n\nimport './TextAnnotationPopup.css';\n\ninterface TextAnnotationPopupProps {\n\n ariaNavigationMessage?: string;\n\n ariaCloseWarning?: string;\n\n arrow?: boolean;\n\n arrowProps?: Omit<FloatingArrowProps, 'context' | 'ref'>;\n\n asPortal?: boolean;\n\n autoFocus?: boolean;\n\n placement?: Placement;\n\n popup(props: TextAnnotationPopupContentProps): ReactNode;\n\n onClose?(): void;\n\n}\n\nexport interface TextAnnotationPopupContentProps<T extends TextAnnotation = TextAnnotation> {\n\n annotation: T;\n\n editable?: boolean;\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nlet cachedBounds = null;\n\nconst updateViewportBounds = debounce((annotationId: string, store: TextAnnotationStore, container: HTMLElement) => {\n requestAnimationFrame(() => {\n const bounds = store.getAnnotationBounds(annotationId);\n if (!bounds) return;\n cachedBounds = toViewportBounds(bounds, container.getBoundingClientRect());\n });\n}, 250);\n\nexport const TextAnnotationPopup = (props: TextAnnotationPopupProps) => {\n\n const r = useAnnotator<TextAnnotator>();\n\n const { selected, event } = useSelection<TextAnnotation>();\n\n const annotation = selected[0]?.annotation;\n\n const isAnnotationQuoteIdle = useAnnotationQuoteIdle(annotation?.id);\n\n const [isOpen, setOpen] = useState(selected?.length > 0);\n const handleClose = () => r?.cancelSelected();\n\n const [isFocused, setFocused] = useState(false);\n const handleFocus = useCallback(() => setFocused(true), []);\n const handleBlur = useCallback(() => setFocused(false), []);\n useEffect(() => {\n if (!isOpen) handleBlur();\n }, [isOpen, handleBlur]);\n\n // So we can reliably trigger the onClose callback\n const wasOpenRef = useRef(false);\n\n const arrowRef = useRef(null);\n\n const { refs, floatingStyles, update, context } = useFloating({\n placement: isMobile() ? 'bottom' : props.placement || 'top',\n strategy: 'absolute',\n open: isOpen,\n onOpenChange: (open, _event, reason) => {\n if (!open && (reason === 'escape-key' || reason === 'focus-out')) {\n setOpen(open);\n handleClose();\n }\n },\n middleware: [\n inline(),\n offset(10),\n flip({ crossAxis: true }),\n shift({ crossAxis: true, padding: 10, }),\n arrow({ element: arrowRef })\n ],\n whileElementsMounted: autoUpdate\n });\n\n useEffect(() => {\n if (!r) return;\n\n const annotationId = annotation?.id;\n const annotationSelectorsLength = annotation?.target.selector.length;\n\n if (annotationId && annotationSelectorsLength > 0 && useAnnotationQuoteIdle) {\n const bounds = r?.state.store.getAnnotationBounds(annotation.id);\n setOpen(Boolean(bounds));\n } else {\n setOpen(false);\n }\n }, [annotation?.id, annotation?.target.selector, useAnnotationQuoteIdle, r?.state.store]);\n\n useEffect(() => {\n if (!props.onClose) return;\n\n if (isOpen) {\n wasOpenRef.current = true;\n } else if (wasOpenRef.current) {\n wasOpenRef.current = false;\n props.onClose();\n }\n }, [props.onClose, isOpen]);\n\n useEffect(() => {\n if (!r) return;\n\n if (isOpen && annotation?.id) {\n refs.setPositionReference({\n getBoundingClientRect: () => {\n // Debounced!\n updateViewportBounds(annotation.id, r.state.store, r.element);\n return cachedBounds ? cachedBounds : new DOMRect();\n },\n getClientRects: () => {\n const rects = r.state.store.getAnnotationRects(annotation.id);\n const denormalizedRects = rects.map((rect) =>\n toViewportBounds(rect, r.element.getBoundingClientRect())\n );\n return toDomRectList(denormalizedRects);\n }\n });\n } else {\n refs.setPositionReference(null);\n }\n }, [isOpen, annotation?.id, annotation?.target, r]);\n\n useEffect(() => {\n if (!props.asPortal) return;\n\n const config: MutationObserverInit = { attributes: true, childList: true, subtree: true };\n\n const mutationObserver = new MutationObserver(() => update());\n mutationObserver.observe(document.body, config);\n\n window.document.addEventListener('scroll', update, true);\n\n return () => {\n mutationObserver.disconnect();\n window.document.removeEventListener('scroll', update, true);\n };\n }, [update, props.asPortal]);\n\n // Don't shift focus to the floating element if selected via keyboard or on mobile.\n const initialFocus = useMemo(() => {\n return (\n props.autoFocus === false || \n event?.type === 'keyup' || \n event?.type === 'contextmenu' || \n isMobile()\n ) ? -1 : 0;\n }, [props.autoFocus, event]);\n\n /**\n * Announce the navigation hint only on the keyboard selection,\n * because the focus isn't shifted to the popup automatically then\n */\n // useAnnouncePopupNavigation({\n // disabled: isFocused,\n // floatingOpen: isOpen,\n // message: ariaNavigationMessage,\n // });\n\n return isOpen && annotation ? (\n <FloatingPortal\n root={props.asPortal ? undefined : r.element}>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={true}\n returnFocus={false}\n initialFocus={-1}>\n <div\n className={`a9s-popup r6o-popup annotation-popup r6o-text-popup ${NOT_ANNOTATABLE_CLASS}`}\n ref={refs.setFloating}\n style={floatingStyles}>\n {props.popup({\n annotation: selected[0].annotation,\n editable: selected[0].editable,\n event\n })}\n{props.arrow && (\n <FloatingArrow\n ref={arrowRef}\n context={context}\n {...(props.arrowProps || {})} />\n )}\n\n <button className=\"r6o-popup-sr-only\" aria-live=\"assertive\" onClick={handleClose}>\n {props.ariaCloseWarning || 'Click or leave this dialog to close it.'}\n </button>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n ) : null;\n\n};\n\n/** For backwards compatibility **/\n/** @deprecated Use TextAnnotationPopup instead */\nexport const TextAnnotatorPopup = (props: TextAnnotationPopupProps) => {\n\n useEffect(() => {\n console.warn('TextAnnotatorPopup is deprecated and will be removed in a future version. Please use TextAnnotationPopup instead.');\n }, []);\n\n return <TextAnnotationPopup {...props} />;\n};\n"],"names":["PRESET_BEHAVIORS","elem","a","content","_a","CETEIcean","props","el","useRef","useEffect","ceteicean","CETEI","data","jsx","TEIAnnotator","children","opts","anno","setAnno","useContext","AnnotoriousContext","onLoad","useCallback","element","TEIPlugin","createTextAnnotator","Fragment","Children","child","cloneElement","useAnnotationQuoteIdle","annotationId","options","store","useAnnotationStore","isIdle","setIsIdle","useState","idleTimeout","scheduleSetIsIdle","event","updated","update","targetUpdated","oldTarget","newTarget","hasQuoteChanged","Ignore","Origin","oldValue","newValue","oldSelector","oldQuotes","quote","newSelector","newQuotes","TextAnnotator","className","style","filter","user","annotatingEnabled","userSelectAction","adapter","isMobile","userAgent","cachedBounds","updateViewportBounds","debounce","container","bounds","toViewportBounds","TextAnnotationPopup","r","useAnnotator","selected","useSelection","annotation","isOpen","setOpen","handleClose","isFocused","setFocused","handleBlur","wasOpenRef","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","annotationSelectorsLength","denormalizedRects","rect","toDomRectList","config","mutationObserver","useMemo","FloatingPortal","FloatingFocusManager","jsxs","NOT_ANNOTATABLE_CLASS","FloatingArrow","TextAnnotatorPopup"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soomo/react-text-annotator",
|
|
3
|
-
"version": "3.4.0-staging.
|
|
3
|
+
"version": "3.4.0-staging.3",
|
|
4
4
|
"description": "Recogito Text Annotator React bindings",
|
|
5
5
|
"author": "Rainer Simon",
|
|
6
6
|
"license": "BSD-3-Clause",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"@annotorious/react": "^3.7.7",
|
|
51
51
|
"@floating-ui/react": "^0.27.16",
|
|
52
52
|
"@react-aria/live-announcer": "^3.3.4",
|
|
53
|
-
"@soomo/text-annotator": "3.4.0-staging.
|
|
54
|
-
"@recogito/text-annotator-tei": "3.
|
|
53
|
+
"@soomo/text-annotator": "3.4.0-staging.3",
|
|
54
|
+
"@recogito/text-annotator-tei": "3.2.0",
|
|
55
55
|
"CETEIcean": "^1.9.5",
|
|
56
56
|
"debounce": "^2.2.0",
|
|
57
57
|
"dequal": "^2.0.3",
|