@@ -5,18 +5,37 @@ import type { TextSelector, TextAnnotationTarget } from './model';
55import { trimRange } from './utils' ;
66
77export 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