From 3ccb3c6c8476e24013b055c2919e49fc6d2d4432 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Mon, 26 Sep 2022 14:42:19 +0800 Subject: [PATCH 1/3] Disable word snapping on CJK languages --- .../lib/highlights/normalizeHighlightRange.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/web/lib/highlights/normalizeHighlightRange.ts b/packages/web/lib/highlights/normalizeHighlightRange.ts index c35445c2a..9f1a90b73 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, From d164013ff958b385306f648103d49e20671408c5 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Mon, 26 Sep 2022 14:49:57 +0800 Subject: [PATCH 2/3] Also break on comma --- packages/web/lib/highlights/normalizeHighlightRange.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/lib/highlights/normalizeHighlightRange.ts b/packages/web/lib/highlights/normalizeHighlightRange.ts index 9f1a90b73..76960ee80 100644 --- a/packages/web/lib/highlights/normalizeHighlightRange.ts +++ b/packages/web/lib/highlights/normalizeHighlightRange.ts @@ -23,7 +23,7 @@ function disableWordSnap(str: String): boolean { } const isWhitespace = (c?: string): boolean => { - return !!c && /\u2014|\u2013|\s/.test(c) + return !!c && /\u2014|\u2013|,|\s/.test(c) } function findNextWord( From c2bd50715d7028aa1ed11b873b181b595b7ee0bc Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Mon, 26 Sep 2022 16:27:39 +0800 Subject: [PATCH 3/3] We are writing Typescript here not Swift --- packages/web/lib/highlights/normalizeHighlightRange.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/lib/highlights/normalizeHighlightRange.ts b/packages/web/lib/highlights/normalizeHighlightRange.ts index 76960ee80..d9c207398 100644 --- a/packages/web/lib/highlights/normalizeHighlightRange.ts +++ b/packages/web/lib/highlights/normalizeHighlightRange.ts @@ -14,7 +14,7 @@ export function extendRangeToWordBoundaries(range: Range): void { } } -function disableWordSnap(str: String): boolean { +function disableWordSnap(str: string): boolean { // For CJK languages we don't attempt word snapping if (str.match(/[\u3131-\uD79D]/ugi)) { return true