Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,92 @@ describe('isPartHighlighted', () => {
)
).toEqual(true);
});

// Japanese (俺はジャイアン): start / middle / end

test('does not treat Japanese text as a separator at the start (俺はジャイアン)', () => {
expect(
isPartHighlighted(
[
{ isHighlighted: false, value: '俺は' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: true, value: 'ジャイアン' },
],
0
)
).toEqual(false);
});

test('does not treat Japanese text as a separator in the middle (俺はジャイアンだ)', () => {
expect(
isPartHighlighted(
[
{ isHighlighted: true, value: '俺は' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: false, value: 'ジャイアン' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: true, value: 'だ' },
],
2
)
).toEqual(false);
});

test('does not treat Japanese text as a separator at the end (俺はジャイアンだ)', () => {
expect(
isPartHighlighted(
[
{ isHighlighted: true, value: '俺は' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: true, value: 'ジャイアン' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: false, value: 'だ' },
],
4
)
).toEqual(false);
});

// Cyrillic (regression #1317): start / middle / end

test('does not treat Cyrillic text as a separator at the start (regression #1317)', () => {
expect(
isPartHighlighted(
[
{ isHighlighted: false, value: 'привет' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: true, value: 'мир' },
],
0
)
).toEqual(false);
});

test('does not treat Cyrillic text as a separator in the middle (regression #1317)', () => {
expect(
isPartHighlighted(
[
{ isHighlighted: true, value: 'привет' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: false, value: 'мир' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: true, value: 'привет' },
],
2
)
).toEqual(false);
});

test('does not treat Cyrillic text as a separator at the end (regression #1317)', () => {
expect(
isPartHighlighted(
[
{ isHighlighted: true, value: 'привет' },
{ isHighlighted: false, value: ' ' },
{ isHighlighted: false, value: 'мир' },
],
2
)
).toEqual(false);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@ const htmlEscapes = {
'"': '"',
''': "'",
};
const hasAlphanumeric = new RegExp(/\w/i);
const hasLetterOrNumber = (() => {
try {
return new RegExp('[\\p{L}\\p{N}_]', 'u');
} catch {
return new RegExp(/\w/i);
}
})();
const regexEscapedHtml = /&(amp|quot|lt|gt|#39);/g;
const regexHasEscapedHtml = RegExp(regexEscapedHtml.source);

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

if (
!hasAlphanumeric.test(unescape(current.value)) &&
!hasLetterOrNumber.test(unescape(current.value)) &&
isPreviousHighlighted === isNextHighlighted
) {
return isPreviousHighlighted;
Expand Down