Существующие эмодзи-теги отображаются как новые в редакторе, а новые исчезают после публикации

Я обнаружил непоследовательное поведение с эмодзи-тегами в редакторе темы и воспроизвёл его на неизменённой ветке main (коммит 802125b979b5bb848a7cfc52409ef3176ffd4d82).

Для существующего эмодзи-тега при вводе его имени может отображаться опция Создать, а не существующий тег с количеством использований. Выбор этой опции и публикация всё равно привязывают существующий тег. Полностью новый эмодзи-тег — это отдельный случай: его можно выбрать в редакторе, но после публикации он исчезает.

Чтобы воспроизвести проблему со существующим тегом:

  1. Используйте сайт с существующим эмодзи-тегом, например 😊, и другими, более часто используемыми тегами.
  2. Откройте редактор темы и введите имя эмодзи-тега.
  3. Если этот тег находится за пределами возвращаемого лимита популярных тегов, выпадающий список покажет опцию создания и нерелевантные популярные теги, без количества использований существующего тега.
  4. Выберите опцию создания, опубликуйте тему и обновите страницу. Тема по-прежнему использует исходную запись тега.

В изолированном браузерном тесте я использовал существующий эмодзи-тег со счётчиком 17, нерелевантный тег со счётчиком 100 и лимит поиска 1. Выпадающий список показал Создать: '😊' и популярный x100; после публикации существующий эмодзи-тег был корректно переиспользован. При отсутствии существующей записи 😊 та же операция возвращала HTTP 200, но тег не сохранялся.

Причина кроется в DiscourseTagging.clean_tag, который используется как для поисковых запросов, так и для сохранения новых имён. Он удаляет символы эмодзи. Тогда поиск переходит к популярным результатам, в то время как сохранение всё ещё может найти существующий тег по его исходному имени до очистки новых имён.

У меня есть небольшой патч, который сохраняет полные графемы эмодзи, распознаваемые существующими данными Emoji.unicode_replacements. Он сохраняет существующую фильтрацию ASCII и удаляет недопустимые символы из текста, не содержащего эмодзи. Также он позволяет предложениям отключённых тегов совпадать с началом имени, поскольку текущее выражение с границами слов пропускает имена, начинающиеся с эмодзи, такие как 😊-restricted.

Патч изменяет два файла реализации и добавляет регрессионное покрытие в трёх тестовых файлах. Он не добавляет миграцию базы данных, изменения во фронтенде, новый API или другой кэш эмодзи.

Локальная валидация: прошли 572 связанных примера бэкенда и 8 браузерных примеров. Браузерные тесты проверяют, что существующий эмодзи-тег отображает x17, и что как он, так и действительно новый 😊 остаются после публикации и обновления страницы.

Ветка с патчем:

Связанные отчеты и обсуждения:

Эти отчеты описывают предыдущие ограничения с эмодзи-тегами. Этот патч решает проблемы поиска и сохранения в редакторе, воспроизведённые выше; он не утверждает, что устраняет все проблемы с эмодзи-тегами.