Emoji 插入的位置错误

当您在字母后面添加冒号时,表情符号自动完成功能不起作用,但在标点符号(如 _ - : ; . , )后面添加冒号时,它会提供表情符号。但是,当您使用自动完成功能时,表情符号会插入到开头,替换第一个字母,而不是在您键入的位置。

我首先在聊天中注意到这一点,但主题撰写器也表现相同。

8 个赞

我无法重现此问题了,我认为是 @kelv 修复的。

我仍然可以重现这个问题。

我输入:

让我们写一些文字,然后添加一个表情符号。

然后我尝试在逗号后面添加一个表情符号。

1 个赞

这是仅限 iOS 的问题吗?其他浏览器会受到影响吗?

我不知道这是否是 iOS 的问题。这肯定不限于 iOS,因为我没有 iOS 设备。
最新的复现是在我的 Android 平板电脑上使用 Firefox 发生的。(我刚检查过,Chrome 上也是一样)

根据文件名、报告时间以及 OP 中没有屏幕键盘的事实,那可能是 Windows 10 上的 Edge。

我只是来报告这个问题的 @Moin :slight_smile:

这里是 iPadOS 18.7.1 和 Safari @sam

另外,在 iPad 上突出显示文本以引用时,我遇到了另一个问题,Discourse 的“引用”弹出窗口现在隐藏在 iOS 的“复制粘贴”后面,所以你永远无法点击它。我会尝试找出重现步骤并在本周晚些时候单独报告(除非有人抢先)。在这里提到它是因为这两个问题都是本周才出现的,可能有关联。

1 个赞

那么我不确定你的问题是否和我的一样。标点符号后表情符号的错位已经发生了一年半了。

2 个赞

哦,我明白了,这样就可以了:

diff --git a/frontend/discourse/app/modifiers/d-autocomplete.js b/frontend/discourse/app/modifiers/d-autocomplete.js
index e49fc0ec53..33fb51a1f4 100644
--- a/frontend/discourse/app/modifiers/d-autocomplete.js
+++ b/frontend/discourse/app/modifiers/d-autocomplete.js
@@ -599,10 +599,19 @@ export default class DAutocompleteModifier extends Modifier {
         prev = this.getValue()[caretPos - 1];
         const shouldTrigger = await this.shouldTrigger({ backSpace });
 
-        if (
-          shouldTrigger &&
-          (prev === undefined || this.ALLOWED_LETTERS_REGEXP.test(prev))
-        ) {
+        // For emoji autocomplete (key === ':'), use a more permissive check that includes
+        // common punctuation like comma, period, etc. that can appear before emoji
+        let isAllowed;
+        if (this.options.key === ":") {
+          // Match the same characters allowed in emoji autocomplete's onKeyUp regex
+          isAllowed =
+            prev === undefined || /[\\s.?,@/#!%\u0026*;:\\[\\]{}=\\-_()+]/.test(prev);
+        } else {
+          isAllowed =
+            prev === undefined || this.ALLOWED_LETTERS_REGEXP.test(prev);
+        }
+
+        if (shouldTrigger && isAllowed) {
           start = caretPos;
           term = this.getValue().substring(caretPos + 1, initialCaretPos);
           end = caretPos + term.length;

@kelv 我不太熟悉这段代码是如何演变的,也许你最近进行的一些移植工作让你对其中一些内容有印象?

2 个赞

这与移植无关,我只是在旧实例(3.5.0.beta8-dev)上重新复制了它,并将基于 floatkit 的新自动完成功能关闭了。似乎这是一个已经存在一段时间的插入符号定位错误。我仍然会研究一个适当的修复方法,但这不应该成为完全移除旧自动完成库的障碍。

3 个赞

我刚在添加表情符号后丢失了整个聊天消息。

我输入了消息,输入了冒号和两个字母以获取建议,点击了更多和一个表情符号,然后整个消息就消失了。这是一个不同的错误还是相关的?到目前为止,我无法在撰写器中重现它,只能在聊天中重现。而且只在我的笔记本电脑上,不在我的平板电脑上。

2 个赞

是的,这是边界检测错误,我们不确定表情符号的开始和结束位置。\n\n棘手的问题是,也许整个逻辑都是错误的,我想知道为什么它需要做这种决定,因为它确切地知道光标在哪里以及我们传递了多少个字符给表情符号自动完成。也许只需回溯 N 个字符然后替换掉……不确定。

哎呀,这是另一个 bug,因为我刚刚用标点符号后的表情符号插入修复了之前类型的问题(https://github.com/discourse/discourse/pull/35830),这个修复还没有部署到 Meta。

同样,这个问题已经存在一段时间了,我可以确认它只发生在聊天中。我也会安排一些时间来处理它。

3 个赞

谢谢。效果非常棒。

3 个赞

此问题已在 FIX: emoji picker autocomplete in chat replaces entire draft by tyb-talks · Pull Request #36017 · discourse/discourse · GitHub 修复。感谢您的报告 :slight_smile:

4 个赞

此主题已在 3 天后自动关闭。不再允许回复。