Double échappement des underscores dans le texte alternatif des images corrompt le post brut à chaque édition

Lorsqu’un message contient une image dont le nom de fichier comporte un underscore (par exemple), chaque sauvegarde du message double les barres obliques inversées avant l’underscore dans le contenu brut :

  • Après la 1re édition : ![20260421_140231|…]
  • Après la 2e édition : ![20260421\_140231|…]
  • Après la N-ième édition : ![20260421{2^N}_140231|…]

Après 17 éditions, le champ brut a accumulé 131 072 caractères de barre oblique inversée (2^17), passant d’environ 8 Ko à environ 136 Ko. Cela finit par rendre le message impossible à éditer : le compositeur indique un nombre de caractères bien supérieur à max_post_length, même si le contenu visible est petit.

Étapes pour reproduire le problème :

  1. Téléchargez une image dont le nom de fichier contient un underscore.
  2. Insérez-la dans un message. Discourse génère un texte alternatif comme 20260421_140231.
  3. Éditez et sauvegardez le message à plusieurs reprises (5 à 10 fois suffisent pour constater la croissance).
  4. Examinez le contenu brut via /posts/{id}.json : le nombre de barres obliques inversées double à chaque sauvegarde.

Comportement attendu : Le contenu brut doit rester stable lors des éditions. Les underscores dans le texte alternatif des images ne doivent pas être rééchappés à chaque sauvegarde.

Comportement actuel : Chaque sauvegarde multiplie par 2 les barres obliques inversées avant _ dans le texte alternatif des images.

Contournement : Exécutez les commandes suivantes dans la console Rails pour supprimer les barres obliques inversées excédentaires et relancer le processus de cuisson :

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

Environnement :

  • Version de Discourse : 2026.4.0-latest
  • Installé via la configuration Docker officielle ./launcher

Merci pour le rapport @Елиан_Гешев. Il s’agit très probablement d’une régression introduite par un commit récent.

Je regarde :eyes: