我在主题编辑器中发现 emoji 标签的行为不一致,并在未修改的 main 分支(提交哈希 802125b979b5bb848a7cfc52409ef3176ffd4d82)上复现了该问题。
对于已存在的 emoji 标签,输入其名称时可能会显示创建选项,而不是显示现有标签及其使用次数。选择该选项并发布后,系统仍然会关联现有的标签。全新的 emoji 标签属于另一种情况:它可以在编辑器中被选中,但在发布后会消失。
要复现已有标签的问题:
- 使用一个包含现有 emoji 标签(例如
😊)以及其他更常用标签的网站。 - 打开主题编辑器并输入该 emoji 标签的名称。
- 如果该标签不在返回的热门标签限制范围内,下拉菜单将显示创建选项和不相关的热门标签,而不显示现有标签的使用次数。
- 选择创建选项,发布并刷新页面。该主题仍使用原始的标签记录。
在独立的浏览器测试中,我使用了一个计数为 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 标签问题。