From 49356d4b7c8b14eb8dce667472dd41ff0392728c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 20 Aug 2026 08:14:50 +0000 Subject: [PATCH] [Glitch] Fix autosuggestions overstaying their welcome in languages that don't use spaces Port 8d8b9c84a41b0b7e22822ed49ed58e77da2970ef to glitch-soc Signed-off-by: Claire --- .../components/autosuggest/utils.test.ts | 38 ++++++++++++++++++- .../glitch/components/autosuggest/utils.ts | 2 +- .../flavours/glitch/utils/hashtags.ts | 2 +- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/app/javascript/flavours/glitch/components/autosuggest/utils.test.ts b/app/javascript/flavours/glitch/components/autosuggest/utils.test.ts index 79b8b767b8..71b8fbdb1b 100644 --- a/app/javascript/flavours/glitch/components/autosuggest/utils.test.ts +++ b/app/javascript/flavours/glitch/components/autosuggest/utils.test.ts @@ -6,6 +6,14 @@ describe('textAtCursorMatchesToken', () => { ['#hashtag', 7, ['#']], [1, '#hashtag'], ], + [ + ['@alice', 6, ['@']], + [1, '@alice'], + ], + [ + ['@alice', 6, ['@']], + [1, '@alice'], + ], [ ['#hash tag', 8, ['#']], [1, '#hash tag'], @@ -24,7 +32,35 @@ describe('textAtCursorMatchesToken', () => { ], [ ['#ハッシュ タグ', 7, ['#']], - [1, '#ハッシュ タグ'], + [null, null], + ], + [ + ['@alice reply', 12, ['@']], + [1, '@alice reply'], + ], + [ + ['@alice 这是我输入的回复内容', 17, ['@']], + [null, null], + ], + [ + ['@alice これは本文', 12, ['@']], + [null, null], + ], + [ + ['@alice 이것은답변입니다', 15, ['@']], + [null, null], + ], + [ + ['@alice これは本文', 12, ['@']], + [null, null], + ], + [ + ['@алиса', 6, ['@']], + [1, '@алиса'], + ], + [ + ['@алиса пример', 13, ['@']], + [1, '@алиса пример'], ], ] as const)( 'textAtCursorMatchesToken(%s) is %o', diff --git a/app/javascript/flavours/glitch/components/autosuggest/utils.ts b/app/javascript/flavours/glitch/components/autosuggest/utils.ts index 3e02114a97..f41668fcf8 100644 --- a/app/javascript/flavours/glitch/components/autosuggest/utils.ts +++ b/app/javascript/flavours/glitch/components/autosuggest/utils.ts @@ -8,7 +8,7 @@ export const textAtCursorMatchesToken = ( let word: string; const regex = new RegExp( - `[${searchTokens.join('')}${WORD}+-]+(\\s[${WORD}]+)?$`, + `[${searchTokens.join('')}${WORD}+-]+(\\s[\\p{Script=Latin}\\p{Script=Cyrillic}\\p{M}]+)?$`, 'iu', ); const left = str.slice(0, caretPosition).search(regex); diff --git a/app/javascript/flavours/glitch/utils/hashtags.ts b/app/javascript/flavours/glitch/utils/hashtags.ts index d136f1ff60..5ec215aa3f 100644 --- a/app/javascript/flavours/glitch/utils/hashtags.ts +++ b/app/javascript/flavours/glitch/utils/hashtags.ts @@ -1,5 +1,5 @@ const HASHTAG_SEPARATORS = '_\\u00b7\\u200c'; -const ALPHA = '\\p{L}\\p{M}'; +export const ALPHA = '\\p{L}\\p{M}'; export const WORD = '\\p{L}\\p{M}\\p{N}\\p{Pc}'; const buildHashtagPatternRegex = () => {