Двойное экранирование нижних подчеркиваний в alt-тексте изображений повреждает исходный текст поста при каждом редактировании

Когда в посте есть изображение с подчеркиванием в имени файла (например, ), каждое сохранение поста удваивает обратные слеши перед подчеркиванием в необработанном содержимом:

  • После 1-го редактирования: ![20260421_140231|…]
  • После 2-го редактирования: ![20260421\_140231|…]
  • После N-го редактирования: ![20260421{2^N}_140231|…]

После 17 редактирований в поле raw накопилось 131 072 символа обратного слеша (2^17), что привело к увеличению размера с ~8 КБ до ~136 КБ. В результате пост становится невозможным редактировать — редактор показывает количество символов, значительно превышающее max_post_length, хотя видимое содержимое остаётся небольшим.

Шаги для воспроизведения:

  1. Загрузите изображение, имя файла которого содержит подчеркивание.
  2. Вставьте его в пост. Discourse сгенерирует альтернативный текст вида 20260421_140231.
  3. Несколько раз отредактируйте и сохраните пост (5–10 раз достаточно, чтобы заметить рост).
  4. Проверьте необработанное содержимое через /posts/{id}.json — количество обратных слешей удваивается при каждом сохранении.

Ожидаемое поведение: необработанное содержимое должно оставаться стабильным при редактировании. Подчеркивания в альтернативном тексте изображений не должны экранироваться заново при каждом сохранении.

Фактическое поведение: при каждом сохранении количество обратных слешей перед _ в альтернативном тексте изображения умножается на 2.

Обходное решение: выполните следующие команды в консоли Rails, чтобы удалить лишние обратные слеши и пересобрать пост:

p = Post.find(POST_ID)
p.update_column(:raw, p.raw.gsub(/\+(?=_)/, “”))
p.rebake!

Окружение:

  • Версия Discourse: 2026.4.0-latest
  • Установлен через официальный Docker-сценарий ./launcher

Спасибо за отчет @Елиан_Гешев. Скорее всего, это регрессия в результате недавнего коммита.

Провожу проверку :eyes: