الهروب المزدوج للشرطات السفلية في نص بديل للصورة يُفسد نص المنشور الأصلي عند كل تعديل

عندما يحتوي المنشور على صورة تحتوي على شرطة سفلية في اسم الملف (على سبيل المثال)، فإن كل حفظ للمنشور يضاعف علامات السلاش العكسي قبل الشرطة السفلية في المحتوى الخام:

  • بعد التعديل الأول: ![20260421_140231|…]
  • بعد التعديل الثاني: ![20260421\_140231|…]
  • بعد التعديل N: ![20260421{2^N}_140231|…]

بعد 17 تعديلًا، تراكمت حقل الخام 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: