Doble escape de guiones bajos en el texto alternativo de imágenes corrompe el contenido original del post en cada edición

Cuando una publicación contiene una imagen con un guion bajo en el nombre del archivo (por ejemplo), cada guardado de la publicación duplica las barras invertidas antes del guion bajo en el contenido crudo:

  • Tras la 1ª edición: ![20260421_140231|…]
  • Tras la 2ª edición: ![20260421\_140231|…]
  • Tras la N-ésima edición: ![20260421{2^N}_140231|…]

Tras 17 ediciones, el campo crudo acumuló 131.072 caracteres de barra invertida (2^17), pasando de ~8 KB a ~136 KB. Esto finalmente hace que la publicación deje de ser editable: el editor informa un recuento de caracteres muy superior a max_post_length, aunque el contenido visible sea pequeño.

Pasos para reproducir:

  1. Sube una imagen cuyo nombre de archivo contenga un guion bajo.
  2. Insértala en una publicación. Discourse genera texto alternativo como 20260421_140231.
  3. Edita y guarda la publicación repetidamente (5–10 veces es suficiente para notar el crecimiento).
  4. Inspecciona el contenido crudo mediante /posts/{id}.json: el número de barras invertidas se duplica en cada guardado.

Comportamiento esperado: El contenido crudo debería mantenerse estable entre ediciones. Los guiones bajos en el texto alternativo de las imágenes no deberían volver a escaparse en cada guardado.

Comportamiento real: Cada guardado multiplica por 2 las barras invertidas antes de _ en el texto alternativo de las imágenes.

Solución temporal: Ejecuta lo siguiente en la consola de Rails para eliminar las barras invertidas sobrantes y volver a generar la publicación:

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

Entorno:

  • Versión de Discourse: 2026.4.0-latest
  • Instalado mediante la configuración oficial de Docker ./launcher

Gracias por el informe @Елиан_Гешев. Lo más probable es que sea una regresión en un commit reciente.

Echando un vistazo :eyes: