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

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

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

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

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

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

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

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

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

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

Обновление — 23 октября 2026 г.

Исправление теперь отправлено в виде PR #44994: FIX: Preserve emoji tags during search and saving и готово к ревью.

Полный CI на моей форке прошёл успешно: все 10 задач матрицы тестов, линтинг и проверки лицензий.

Для этого запуска я использовал отдельную ветку проверки с тем же исправлением и увеличил таймаут задачи тестирования с 20/30 минут до 90 минут, так как предыдущий запуск превысил время ожидания на раннере форка. Команды тестов, матрица и ассерты не изменялись. Настройка таймаута не входит в состав upstream PR. PR ещё не слит; upstream CI ожидает одобрения мейнтейнера.

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

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

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