diff --git a/packages/web/lib/highlights/normalizeHighlightRange.ts b/packages/web/lib/highlights/normalizeHighlightRange.ts index c35445c2a..d9c207398 100644 --- a/packages/web/lib/highlights/normalizeHighlightRange.ts +++ b/packages/web/lib/highlights/normalizeHighlightRange.ts @@ -1,9 +1,10 @@ export function extendRangeToWordBoundaries(range: Range): void { const { nodeValue: startValue } = range.startContainer const { nodeValue: endValue } = range.endContainer + const noWordSnap = disableWordSnap(range.toString()) - const startOffset = findNextWord(range.startOffset, false, startValue) - const endOffset = findNextWord(range.endOffset, true, endValue) + const startOffset = noWordSnap ? range.startOffset : findNextWord(range.startOffset, false, startValue) + const endOffset = noWordSnap ? range.endOffset : findNextWord(range.endOffset, true, endValue) try { range.setStart(range.startContainer, startOffset) @@ -13,7 +14,17 @@ export function extendRangeToWordBoundaries(range: Range): void { } } -const isWhitespace = (c?: string): boolean => !!c && /\s/.test(c) +function disableWordSnap(str: string): boolean { + // For CJK languages we don't attempt word snapping + if (str.match(/[\u3131-\uD79D]/ugi)) { + return true + } + return false +} + +const isWhitespace = (c?: string): boolean => { + return !!c && /\u2014|\u2013|,|\s/.test(c) +} function findNextWord( start: number,