Skip to content

Commit 3a3d96a

Browse files
Haroenvrinoshiyo
andauthored
fix(autocomplete-preset-algolia): support Unicode in ReverseHighlight (#1330) (#1331)
* fix(autocomplete-preset-algolia): support Unicode word characters in ReverseHighlight * test(autocomplete-preset-algolia): add regression tests for Unicode ReverseHighlight fixes #1317 see #1330 Co-authored-by: rinoshiyo <45587676+rinoshiyo@users.noreply.github.com>
1 parent e885c75 commit 3a3d96a

2 files changed

Lines changed: 96 additions & 2 deletions

File tree

packages/autocomplete-preset-algolia/src/highlight/__tests__/isPartHighlighted.test.ts

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,92 @@ describe('isPartHighlighted', () => {
3030
)
3131
).toEqual(true);
3232
});
33+
34+
// Japanese (俺はジャイアン): start / middle / end
35+
36+
test('does not treat Japanese text as a separator at the start (俺はジャイアン)', () => {
37+
expect(
38+
isPartHighlighted(
39+
[
40+
{ isHighlighted: false, value: '俺は' },
41+
{ isHighlighted: false, value: ' ' },
42+
{ isHighlighted: true, value: 'ジャイアン' },
43+
],
44+
0
45+
)
46+
).toEqual(false);
47+
});
48+
49+
test('does not treat Japanese text as a separator in the middle (俺はジャイアンだ)', () => {
50+
expect(
51+
isPartHighlighted(
52+
[
53+
{ isHighlighted: true, value: '俺は' },
54+
{ isHighlighted: false, value: ' ' },
55+
{ isHighlighted: false, value: 'ジャイアン' },
56+
{ isHighlighted: false, value: ' ' },
57+
{ isHighlighted: true, value: 'だ' },
58+
],
59+
2
60+
)
61+
).toEqual(false);
62+
});
63+
64+
test('does not treat Japanese text as a separator at the end (俺はジャイアンだ)', () => {
65+
expect(
66+
isPartHighlighted(
67+
[
68+
{ isHighlighted: true, value: '俺は' },
69+
{ isHighlighted: false, value: ' ' },
70+
{ isHighlighted: true, value: 'ジャイアン' },
71+
{ isHighlighted: false, value: ' ' },
72+
{ isHighlighted: false, value: 'だ' },
73+
],
74+
4
75+
)
76+
).toEqual(false);
77+
});
78+
79+
// Cyrillic (regression #1317): start / middle / end
80+
81+
test('does not treat Cyrillic text as a separator at the start (regression #1317)', () => {
82+
expect(
83+
isPartHighlighted(
84+
[
85+
{ isHighlighted: false, value: 'привет' },
86+
{ isHighlighted: false, value: ' ' },
87+
{ isHighlighted: true, value: 'мир' },
88+
],
89+
0
90+
)
91+
).toEqual(false);
92+
});
93+
94+
test('does not treat Cyrillic text as a separator in the middle (regression #1317)', () => {
95+
expect(
96+
isPartHighlighted(
97+
[
98+
{ isHighlighted: true, value: 'привет' },
99+
{ isHighlighted: false, value: ' ' },
100+
{ isHighlighted: false, value: 'мир' },
101+
{ isHighlighted: false, value: ' ' },
102+
{ isHighlighted: true, value: 'привет' },
103+
],
104+
2
105+
)
106+
).toEqual(false);
107+
});
108+
109+
test('does not treat Cyrillic text as a separator at the end (regression #1317)', () => {
110+
expect(
111+
isPartHighlighted(
112+
[
113+
{ isHighlighted: true, value: 'привет' },
114+
{ isHighlighted: false, value: ' ' },
115+
{ isHighlighted: false, value: 'мир' },
116+
],
117+
2
118+
)
119+
).toEqual(false);
120+
});
33121
});

packages/autocomplete-preset-algolia/src/highlight/isPartHighlighted.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ const htmlEscapes = {
77
'&quot;': '"',
88
'&#39;': "'",
99
};
10-
const hasAlphanumeric = new RegExp(/\w/i);
10+
const hasLetterOrNumber = (() => {
11+
try {
12+
return new RegExp('[\\p{L}\\p{N}_]', 'u');
13+
} catch {
14+
return new RegExp(/\w/i);
15+
}
16+
})();
1117
const regexEscapedHtml = /&(amp|quot|lt|gt|#39);/g;
1218
const regexHasEscapedHtml = RegExp(regexEscapedHtml.source);
1319

@@ -23,7 +29,7 @@ export function isPartHighlighted(parts: ParsedAttribute[], i: number) {
2329
const isPreviousHighlighted = parts[i - 1]?.isHighlighted || true;
2430

2531
if (
26-
!hasAlphanumeric.test(unescape(current.value)) &&
32+
!hasLetterOrNumber.test(unescape(current.value)) &&
2733
isPreviousHighlighted === isNextHighlighted
2834
) {
2935
return isPreviousHighlighted;

0 commit comments

Comments
 (0)