diff --git a/app/javascript/mastodon/components/autosuggest/utils.test.ts b/app/javascript/mastodon/components/autosuggest/utils.test.ts new file mode 100644 index 00000000000..3e92e2b154b --- /dev/null +++ b/app/javascript/mastodon/components/autosuggest/utils.test.ts @@ -0,0 +1,29 @@ +import { textAtCursorMatchesToken } from './utils'; + +describe('textAtCursorMatchesToken', () => { + test.concurrent.for([ + [ + ['#hashtag', 7, ['#']], + [1, '#hashtag'], + ], + [ + ['#hash tag', 8, ['#']], + [1, '#hash tag'], + ], + [ + ['#ハッシュタグ', 6, ['#']], + [1, '#ハッシュタグ'], + ], + [ + ['#ハッシュ タグ', 7, ['#']], + [1, '#ハッシュ タグ'], + ], + ] as const)( + 'textAtCursorMatchesToken(%s) is %o', + ([input, expected], { expect }) => { + expect( + textAtCursorMatchesToken(input[0], input[1], Array.from(input[2])), + ).toStrictEqual(expected); + }, + ); +}); diff --git a/app/javascript/mastodon/components/autosuggest/utils.ts b/app/javascript/mastodon/components/autosuggest/utils.ts index bef96374bfd..52268bf3cd5 100644 --- a/app/javascript/mastodon/components/autosuggest/utils.ts +++ b/app/javascript/mastodon/components/autosuggest/utils.ts @@ -1,3 +1,5 @@ +import { WORD } from '../../utils/hashtags'; + export const textAtCursorMatchesToken = ( str: string, caretPosition: number, @@ -5,7 +7,10 @@ export const textAtCursorMatchesToken = ( ) => { let word: string; - const regex = new RegExp(`[${searchTokens.join('')}\\w]+(\\s[\\w]+)?$`); + const regex = new RegExp( + `[${searchTokens.join('')}${WORD}]+(\\s[${WORD}]+)?$`, + 'iu', + ); const left = str.slice(0, caretPosition).search(regex); const right = str.slice(caretPosition).search(/\s/); diff --git a/app/javascript/mastodon/utils/hashtags.ts b/app/javascript/mastodon/utils/hashtags.ts index 963ca483693..d136f1ff603 100644 --- a/app/javascript/mastodon/utils/hashtags.ts +++ b/app/javascript/mastodon/utils/hashtags.ts @@ -1,6 +1,6 @@ const HASHTAG_SEPARATORS = '_\\u00b7\\u200c'; const ALPHA = '\\p{L}\\p{M}'; -const WORD = '\\p{L}\\p{M}\\p{N}\\p{Pc}'; +export const WORD = '\\p{L}\\p{M}\\p{N}\\p{Pc}'; const buildHashtagPatternRegex = () => { try {