Skip to content

Commit e53e9c8

Browse files
committed
Extracted prefix/suffix computation to re-usable helper function + reverted SelectionHandler
1 parent 35f120d commit e53e9c8

File tree

2 files changed

+41
-31
lines changed

2 files changed

+41
-31
lines changed

packages/text-annotator/src/SelectionHandler.ts

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,31 @@
11
import { Origin, type User } from '@annotorious/core';
22
import { v4 as uuidv4 } from 'uuid';
33
import type { TextAnnotatorState } from './state';
4-
import type { TextSelector, TextAnnotationTarget, TextQuoteSelector } from './model';
4+
import type { TextSelector, TextAnnotationTarget } from './model';
55
import { trimRange } from './utils';
66

7-
const rangeToQuoteSelector = (range: Range): TextQuoteSelector => {
8-
const { startContainer, startOffset, endContainer, endOffset } = range;
9-
10-
const snippetLength = 10;
11-
12-
const rangePrefix = document.createRange();
13-
rangePrefix.setStart(startContainer, Math.max(startOffset - snippetLength, 0));
14-
rangePrefix.setEnd(startContainer, startOffset);
15-
16-
const rangeSuffix = document.createRange();
17-
rangeSuffix.setStart(endContainer, endOffset);
18-
rangeSuffix.setEnd(endContainer, Math.min(endOffset + snippetLength, endContainer.textContent.length));
19-
20-
return {
21-
quote: range.toString(),
22-
quotePrefix: rangePrefix.toString(),
23-
quoteSuffix: rangeSuffix.toString()
24-
}
25-
}
26-
277
export const rangeToSelector = (range: Range, container: HTMLElement, offsetReferenceSelector?: string): TextSelector => {
28-
const offsetReference: HTMLElement = offsetReferenceSelector
29-
? (range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector)
30-
: container;
31-
32-
// Helper range from the start of the contentNode to the start of the selection
338
const rangeBefore = document.createRange();
9+
10+
const offsetReference: HTMLElement = offsetReferenceSelector ?
11+
(range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector) : container;
12+
13+
// A helper range from the start of the contentNode to the start of the selection
3414
rangeBefore.setStart(offsetReference, 0);
3515
rangeBefore.setEnd(range.startContainer, range.startOffset);
3616

37-
const quoteSelector = rangeToQuoteSelector(range);
17+
const quote = range.toString();
3818
const start = rangeBefore.toString().length;
39-
const end = start + quoteSelector.quote.length;
19+
const end = start + quote.length;
4020

4121
return offsetReferenceSelector ?
42-
{ ...quoteSelector, start, end, range, offsetReference } :
43-
{ ...quoteSelector, start, end, range };
22+
{ quote, start, end, range, offsetReference } :
23+
{ quote, start, end, range };
4424
}
4525

4626
export const SelectionHandler = (
4727
container: HTMLElement,
4828
state: TextAnnotatorState,
49-
// Experimental
5029
offsetReferenceSelector?: string
5130
) => {
5231

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export const getContext = (
2+
range: Range,
3+
container: HTMLElement,
4+
length = 10,
5+
offsetReferenceSelector?: string
6+
) => {
7+
const offsetReference: HTMLElement = offsetReferenceSelector
8+
? (range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector)
9+
: container;
10+
11+
const rangeBefore = document.createRange();
12+
rangeBefore.setStart(offsetReference, 0);
13+
rangeBefore.setEnd(range.startContainer, range.startOffset);
14+
15+
const before = rangeBefore.toString();
16+
17+
const rangeAfter = document.createRange();
18+
rangeAfter.setStart(range.endContainer, range.endOffset);
19+
20+
if (offsetReference === document.body)
21+
rangeAfter.setEnd(offsetReference, offsetReference.childNodes.length);
22+
else
23+
rangeAfter.setEndAfter(offsetReference);
24+
25+
const after = rangeAfter.toString();
26+
27+
return {
28+
prefix: before.substring(before.length - length),
29+
suffix: after.substring(0, length)
30+
}
31+
}

0 commit comments

Comments
 (0)