summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-08-14 16:50:59 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-08-14 16:50:59 +0900
commitc25a92292848ef99471e2cc1c41b2b70294e69a7 (patch)
tree9238ce3290eb8a801ab5eefa3e5a20919a18b6b9 /packages
parentUpdate about-misskey.vue (diff)
parentBump version to 2025.8.0-alpha.10 (diff)
downloadmisskey-c25a92292848ef99471e2cc1c41b2b70294e69a7.tar.gz
misskey-c25a92292848ef99471e2cc1c41b2b70294e69a7.tar.bz2
misskey-c25a92292848ef99471e2cc1c41b2b70294e69a7.zip
Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop
Diffstat (limited to '')
-rw-r--r--packages/frontend/src/utility/autocomplete.ts36
-rw-r--r--packages/misskey-js/package.json2
2 files changed, 24 insertions, 14 deletions
diff --git a/packages/frontend/src/utility/autocomplete.ts b/packages/frontend/src/utility/autocomplete.ts
index 1246c32554..82109af1a0 100644
--- a/packages/frontend/src/utility/autocomplete.ts
+++ b/packages/frontend/src/utility/autocomplete.ts
@@ -78,7 +78,10 @@ export class Autocomplete {
const caretPos = Number(this.textarea.selectionStart);
const text = this.text.substring(0, caretPos).split('\n').pop()!;
- const mentionIndex = text.lastIndexOf('@');
+ // メンションに含められる文字のみで構成された、最も末尾にある文字列を抽出
+ const mentionCandidate = text.split(/[^a-zA-Z0-9_@.\-]+/).pop()!;
+
+ const mentionIndex = mentionCandidate.lastIndexOf('@');
const hashtagIndex = text.lastIndexOf('#');
const emojiIndex = text.lastIndexOf(':');
const mfmTagIndex = text.lastIndexOf('$');
@@ -97,7 +100,7 @@ export class Autocomplete {
const afterLastMfmParam = text.split(/\$\[[a-zA-Z]+/).pop();
- const isMention = mentionIndex !== -1;
+ const maybeMention = mentionIndex !== -1;
const isHashtag = hashtagIndex !== -1;
const isMfmParam = mfmParamIndex !== -1 && afterLastMfmParam?.includes('.') && !afterLastMfmParam.includes(' ');
const isMfmTag = mfmTagIndex !== -1 && !isMfmParam;
@@ -107,20 +110,27 @@ export class Autocomplete {
let opened = false;
- if (isMention && this.onlyType.includes('user')) {
+ if (maybeMention && this.onlyType.includes('user')) {
// ユーザのサジェスト中に@を入力すると、その位置から新たにユーザ名を取りなおそうとしてしまう
// この動きはリモートユーザのサジェストを阻害するので、@を検知したらその位置よりも前の@を探し、
// ホスト名を含むリモートのユーザ名を全て拾えるようにする
- const mentionIndexAlt = text.lastIndexOf('@', mentionIndex - 1);
- const username = mentionIndexAlt === -1
- ? text.substring(mentionIndex + 1)
- : text.substring(mentionIndexAlt + 1);
- if (username !== '' && username.match(/^[a-zA-Z0-9_@.]+$/)) {
- this.open('user', username);
- opened = true;
- } else if (username === '') {
- this.open('user', null);
- opened = true;
+ const mentionIndexAlt = mentionCandidate.lastIndexOf('@', mentionIndex - 1);
+
+ // @が連続している場合、1つ目を無視する
+ const mentionIndexLeft = (mentionIndexAlt !== -1 && mentionIndexAlt !== mentionIndex - 1) ? mentionIndexAlt : mentionIndex;
+
+ // メンションを構成する条件を満たしているか確認する
+ const isMention = mentionIndexLeft === 0 || '_@.-'.includes(mentionCandidate[mentionIndexLeft - 1]);
+
+ if (isMention) {
+ const username = mentionCandidate.substring(mentionIndexLeft + 1);
+ if (username !== '' && username.match(/^[a-zA-Z0-9_@.\-]+$/)) {
+ this.open('user', username);
+ opened = true;
+ } else if (username === '') {
+ this.open('user', null);
+ opened = true;
+ }
}
}
diff --git a/packages/misskey-js/package.json b/packages/misskey-js/package.json
index 160a34e062..75f8283e9b 100644
--- a/packages/misskey-js/package.json
+++ b/packages/misskey-js/package.json
@@ -1,7 +1,7 @@
{
"type": "module",
"name": "misskey-js",
- "version": "2025.8.0-alpha.9",
+ "version": "2025.8.0-alpha.10",
"description": "Misskey SDK for JavaScript",
"license": "MIT",
"main": "./built/index.js",