已有表情标签在编辑器中显示为新标签;新表情标签发布后消失

我在主题编辑器中发现 emoji 标签的行为不一致,并在未修改的 main 分支(提交哈希 802125b979b5bb848a7cfc52409ef3176ffd4d82)上复现了该问题。

对于已存在的 emoji 标签,输入其名称时可能会显示创建选项,而不是显示现有标签及其使用次数。选择该选项并发布后,系统仍然会关联现有的标签。全新的 emoji 标签属于另一种情况:它可以在编辑器中被选中,但在发布后会消失。

要复现已有标签的问题:

  1. 使用一个包含现有 emoji 标签(例如 😊)以及其他更常用标签的网站。
  2. 打开主题编辑器并输入该 emoji 标签的名称。
  3. 如果该标签不在返回的热门标签限制范围内,下拉菜单将显示创建选项和不相关的热门标签,而不显示现有标签的使用次数。
  4. 选择创建选项,发布并刷新页面。该主题仍使用原始的标签记录。

在独立的浏览器测试中,我使用了一个计数为 17 的现有 emoji 标签、一个计数为 100 的不相关标签,以及搜索限制为 1。下拉菜单显示了 Create: '😊' 和 popular x100;发布后,现有的 emoji 标签被正确重用。在没有现有 😊 记录的情况下,相同的操作返回 HTTP 200,但未保存任何标签。

问题出在 DiscourseTagging.clean_tag 方法中,该方法同时用于搜索术语和保存新名称。它会移除 emoji 字符。因此,搜索回退到热门结果,而保存操作仍可能通过原始名称在清理新名称之前找到现有标签。

我有一个小的补丁,可以保留由现有 Emoji.unicode_replacements 数据识别的完整 emoji 字位(graphemes)。它保留了现有的 ASCII 过滤,并从非 emoji 文本中移除了无效字符。它还允许禁用标签的建议匹配名称的开头,因为当前的单词边界表达式会遗漏以 emoji 开头的名称,例如 😊-restricted。

该补丁修改了两个实现文件,并在三个测试文件中添加了回归覆盖。它没有添加数据库迁移、前端更改、新 API 或另一个 emoji 缓存。

本地验证:572 个相关的后端示例和 8 个浏览器示例已通过。浏览器测试检查了现有 emoji 标签是否显示 x17,以及发布并刷新后,该标签和一个全新的 😊 标签是否都得以保留。

补丁分支:

相关报告和讨论:

这些报告描述了早期的 emoji 标签限制。此补丁解决了上述复现的编辑器搜索和保存故障;它并不声称解决所有 emoji 标签问题。