Skip to content

Commit 6cf0fd3

Browse files
committed
add text strategy
1 parent df2e2ea commit 6cf0fd3

File tree

3 files changed

+88
-54
lines changed

3 files changed

+88
-54
lines changed

src/SerializedHighlight.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { getContentPath } from './contentPath';
44
import Highlight, { IHighlightData } from './Highlight';
55
import Highlighter from './Highlighter';
66
import { getDeserializer, IDeserializer, ISerializationData } from './serializationStrategies';
7-
import { discriminator as xPathDiscriminator, serialize as defaultSerializer } from './serializationStrategies/XpathRangeSelector';
7+
import { serialize as defaultSerializer } from './serializationStrategies/XpathRangeSelector';
88

99
const mapKeys = (transform: (key: string) => string, obj: {[key: string]: any}) => Object.keys(obj).reduce((result, key) => ({
1010
...result, [transform(key)]: obj[key],
@@ -86,9 +86,7 @@ export default class SerializedHighlight {
8686

8787
let contentPath: number[] | undefined;
8888

89-
if (serializationData.type === xPathDiscriminator) {
90-
contentPath = getContentPath({ referenceElementId, ...serializationData }, highlighter);
91-
}
89+
contentPath = getContentPath({ referenceElementId, ...serializationData }, highlighter);
9290

9391
if (!style) {
9492
throw new Error('a style is requred to create an api payload');

src/contentPath.test.ts

Lines changed: 79 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,90 @@
11
import { getContentPath } from './contentPath';
22
import Highlighter from './Highlighter';
33
import { adjacentTextSections } from './injectHighlightWrappers.spec.data';
4-
import { IData } from './serializationStrategies/XpathRangeSelector';
4+
import { IData as TextPositionData } from './serializationStrategies/TextPositionSelector';
5+
import { IData as XpathRangeData } from './serializationStrategies/XpathRangeSelector';
56

67
describe('getContentPath', () => {
7-
it('creates a path of indexes', () => {
8-
document.body.innerHTML = `<div id="page">${adjacentTextSections}</div>`;
9-
10-
const container = document.getElementById('page')!;
11-
const highlighter = new Highlighter(container, { formatMessage: jest.fn() });
12-
13-
const result = getContentPath(
14-
{
15-
referenceElementId: 'test-container',
16-
// tslint:disable-next-line quotemark
17-
startContainer: "./*[name()='section'][1]/*[name()='div'][1]/*[name()='p'][1]/text()[1]",
18-
startOffset: 4,
19-
} as IData,
20-
highlighter
21-
);
22-
23-
expect(result).toEqual([3, 1, 1, 0, 4]);
24-
});
8+
describe('with XpathRangeSelector type', () => {
9+
it('creates a path of indexes', () => {
10+
document.body.innerHTML = `<div id="page">${adjacentTextSections}</div>`;
11+
12+
const container = document.getElementById('page')!;
13+
const highlighter = new Highlighter(container, { formatMessage: jest.fn() });
14+
15+
const result = getContentPath(
16+
{
17+
referenceElementId: 'test-container',
18+
// tslint:disable-next-line quotemark
19+
startContainer: "./*[name()='section'][1]/*[name()='div'][1]/*[name()='p'][1]/text()[1]",
20+
startOffset: 4,
21+
type: 'XpathRangeSelector',
22+
} as XpathRangeData,
23+
highlighter
24+
);
25+
26+
expect(result).toEqual([3, 1, 1, 0, 4]);
27+
});
2528

26-
it('handles adjacent text highlights', () => {
27-
document.body.innerHTML = `<div id="page">
29+
it('handles adjacent text highlights', () => {
30+
document.body.innerHTML = `<div id="page">
2831
<div id="test-container">
29-
<p id="test-p">
30-
<span data-highlighted>A shortcut called</span> FOIL is sometimes used to find the product of two binomials.
32+
<p id="test-p">
33+
<span data-highlighted>A shortcut called</span> FOIL is sometimes used to find the product of two binomials.
3134
</p>
3235
</div>
33-
</div>`;
34-
35-
const container = document.getElementById('test-container')!;
36-
const highlighter = new Highlighter(container, { formatMessage: jest.fn() });
37-
38-
const range: any = {
39-
collapse: false,
40-
commonAncestorContainer: container,
41-
endContainer: './text()[1]',
42-
endOffset: 31,
43-
setEndAfter: jest.fn(),
44-
setStartBefore: jest.fn(),
45-
startContainer: './text()[1]',
46-
startOffset: 27,
47-
};
48-
49-
const result = getContentPath(
50-
{
51-
referenceElementId: 'test-p',
52-
startContainer: range.startContainer,
53-
startOffset: range.startOffset,
54-
} as IData,
55-
highlighter
56-
);
57-
58-
expect(result).toEqual([0, 27]);
36+
</div>`;
37+
38+
const container = document.getElementById('test-container')!;
39+
const highlighter = new Highlighter(container, { formatMessage: jest.fn() });
40+
41+
const range: any = {
42+
collapse: false,
43+
commonAncestorContainer: container,
44+
endContainer: './text()[1]',
45+
endOffset: 31,
46+
setEndAfter: jest.fn(),
47+
setStartBefore: jest.fn(),
48+
startContainer: './text()[1]',
49+
startOffset: 27,
50+
};
51+
52+
const result = getContentPath(
53+
{
54+
referenceElementId: 'test-p',
55+
startContainer: range.startContainer,
56+
startOffset: range.startOffset,
57+
type: 'XpathRangeSelector',
58+
} as XpathRangeData,
59+
highlighter
60+
);
61+
62+
expect(result).toEqual([0, 27]);
63+
});
64+
});
65+
66+
describe('with TextPositionSelector type', () => {
67+
it('returns a simplified path and offset', () => {
68+
document.body.innerHTML = `<div id="page">
69+
<div id="test-container">
70+
A shortcut called FOIL is sometimes used to find the product of two binomials.
71+
</div>
72+
</div>`;
73+
74+
const container = document.getElementById('page')!;
75+
const highlighter = new Highlighter(container, { formatMessage: jest.fn() });
76+
77+
const result = getContentPath(
78+
{
79+
end: 11,
80+
referenceElementId: 'test-container',
81+
start: 3,
82+
type: 'TextPositionSelector',
83+
} as TextPositionData,
84+
highlighter
85+
);
86+
87+
expect(result).toEqual([0, 3]);
88+
});
5989
});
6090
});

src/contentPath.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import Highlighter from './Highlighter';
2-
import { IData } from './serializationStrategies/XpathRangeSelector';
2+
import { IData as TextPositionData } from './serializationStrategies/TextPositionSelector';
3+
import { IData as XpathData } from './serializationStrategies/XpathRangeSelector';
34
import { getFirstByXPath, isText, isTextHighlightOrScreenReaderNode } from './serializationStrategies/XpathRangeSelector/xpath';
45

6+
type IData = XpathData | TextPositionData;
7+
58
export function getContentPath(serializationData: IData, highlighter: Highlighter) {
9+
if (serializationData.type === 'TextPositionSelector') {
10+
return [0, serializationData.start];
11+
}
612

713
const referenceElement = highlighter.getReferenceElement(serializationData.referenceElementId);
814
if (!referenceElement) { return; }

0 commit comments

Comments
 (0)