From 8d8b9c84a41b0b7e22822ed49ed58e77da2970ef Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 20 Aug 2026 08:14:50 +0000 Subject: [PATCH] Fix autosuggestions overstaying their welcome in languages that don't use spaces (#40217) --- .../components/autosuggest/utils.test.ts | 38 ++++++++++++++++++- .../mastodon/components/autosuggest/utils.ts | 2 +- app/javascript/mastodon/utils/hashtags.ts | 2 +- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/components/autosuggest/utils.test.ts b/app/javascript/mastodon/components/autosuggest/utils.test.ts index 79b8b767b83..71b8fbdb1bd 100644 --- a/app/javascript/mastodon/components/autosuggest/utils.test.ts +++ b/app/javascript/mastodon/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/mastodon/components/autosuggest/utils.ts b/app/javascript/mastodon/components/autosuggest/utils.ts index 99a433358fb..5744a773017 100644 --- a/app/javascript/mastodon/components/autosuggest/utils.ts +++ b/app/javascript/mastodon/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/mastodon/utils/hashtags.ts b/app/javascript/mastodon/utils/hashtags.ts index d136f1ff603..5ec215aa3f7 100644 --- a/app/javascript/mastodon/utils/hashtags.ts +++ b/app/javascript/mastodon/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 = () => {