Skip to content

Commit 82d8f9e

Browse files
Added capturing of the quote prefix & suffix on selection
1 parent f5ed322 commit 82d8f9e

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

packages/text-annotator/src/SelectionHandler.ts

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,37 @@ import type { TextSelector, TextAnnotationTarget } from './model';
55
import { trimRange } from './utils';
66

77
export const rangeToSelector = (range: Range, container: HTMLElement, offsetReferenceSelector?: string): TextSelector => {
8-
const rangeBefore = document.createRange();
9-
108
const offsetReference: HTMLElement = offsetReferenceSelector ?
119
(range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector) : container;
1210

13-
// A helper range from the start of the contentNode to the start of the selection
11+
// Helper range from the start of the contentNode to the start of the selection
12+
const rangeBefore = document.createRange();
1413
rangeBefore.setStart(offsetReference, 0);
1514
rangeBefore.setEnd(range.startContainer, range.startOffset);
1615

17-
const quote = range.toString();
16+
/**
17+
* Capture the prefix and suffix of the selection to match the `Text Quote Selector` spec from the W3C Annotation Data Model
18+
* @see https://www.w3.org/TR/annotation-model/#text-quote-selector
19+
*/
20+
const snippetLength = 10;
21+
22+
const rangePrefix = document.createRange();
23+
const rangePrefixStartOffset = range.startOffset < snippetLength ? 0 : range.startOffset - snippetLength;
24+
rangePrefix.setStart(range.startContainer, rangePrefixStartOffset);
25+
rangePrefix.setEnd(range.startContainer, range.startOffset);
26+
27+
const rangeSuffix = document.createRange();
28+
const rangeSuffixEndOffset = range.endOffset + snippetLength > range.endContainer.textContent.length ? range.endContainer.textContent.length : range.endOffset + snippetLength;
29+
rangeSuffix.setStart(range.endContainer, range.endOffset);
30+
rangeSuffix.setEnd(range.endContainer, rangeSuffixEndOffset);
31+
32+
const quote = {
33+
exact: range.toString(),
34+
prefix: rangePrefix.toString(),
35+
suffix: rangeSuffix.toString()
36+
}
1837
const start = rangeBefore.toString().length;
19-
const end = start + quote.length;
38+
const end = start + quote.exact.length;
2039

2140
return offsetReferenceSelector ?
2241
{ quote, start, end, range, offsetReference } :
@@ -151,4 +170,4 @@ export const SelectionHandler = (
151170
setUser
152171
}
153172

154-
}
173+
}

0 commit comments

Comments
 (0)