امتدادات Markdown لـ BBCode

أنا أحاول تعلّم كيفية كتابة قواعد Markdown لتنفيذ وظائف BBCode جديدة باستخدام هذا الدليل، لكنني أواجه صعوبة كبيرة في فهم ما يحدث نظرًا لوجود الكثير من الأمور غير الموضّحة:

لقد راجعت أيضًا وثائق markdown-it، لكنها تبدو شحيحة جدًا وتبدو في الغالب مجرد نظرة عامة عالية المستوى على وظائف النظام. لدي بعض الأسئلة المحددة:

  • يحتوي الدليل على هذا السطر: // standard markdown it inline extension goes here.
    ما هي الامتدادات المضمنة القياسية؟ هل هذا هو المكان الذي تُعرّف فيه القواعد التي تُدفع إلى الراب (ruler)؟ ولماذا يُرجع false؟

  • ما هي أنواع الرموز (token types)؟ أرى أمثلة مثل 'link_open' و 'html_inline' - من أين تأتي هذه؟ هل توجد قائمة ثابتة في مكان ما لما هو متاح؟ هل يمكنني إضافة أنواع جديدة؟ وكيف يعرف المحلّل ماذا يفعل مع هذه الأنواع؟

كيف يعمل هذا؟ وكيف يعرف المحلّل ماذا يفعل الرمز 'code_inline'؟ وما وظيفة دالة state.push() وكيف يُفترض استخدامها؟

أشعر أنني قريب من “الفهم”، لكنني أعتقد أنني أفتقد بعض المفاهيم. لقد كتبت أبسط القواعد على الإطلاق ويبدو أنها تعمل - أنا فقط بحاجة إلى فهم أفضل للمضي قدمًا. أي مساعدة ستكون محل تقدير!

لماذا لا تنظر إلى إضافة BBCode الرسمية الموجودة التي تضيف دعمًا لـ [color] وما إلى ذلك؟

لقد قمت بمراجعة إضافة BBCode الرسمية مرارًا وتكرارًا على https://github.com/discourse/discourse-bbcode، ولكن حتى الآن لم أحرز تقدمًا كبيرًا ولا يزال فهمي لآلية عملها الداخلية غير واضح.

أولاً، أحاول بناء كود [table] للبدء. أدرك أن Markdown يدعم الجداول بالفعل، ولكن (بافتراض أنني أستطيع بناء دعم لأكواد BBCode الأخرى الخاصة بنا)، سنقوم بنقل حوالي 20 مليون منشور إلى Discourse، لذا أريد ضمان توافق الخلفيات بشكل صحيح مع أكواد BBCode الحالية، والطريقة التي يُستخدم فيها رمز الأنبوب في Markdown تجعل عملية فحص المنشورات لتحويل الجداول مستحيلة تقريبًا.

كود الجدول الذي بنيتُه حتى الآن يتم حذفه باستمرار. فهو موجود في المنشور، لكنه يستمر في (أفترض) إزالته بواسطة أداة التنقية (scrubber). هذا ما لدي حتى الآن:

md.block.bbcode.ruler.push("table", {
    tag: "table",
    wrap: function(token, tagInfo) {
      token.attrs = [['class', "bbcode-table table-style-" + tagInfo.attrs['_default']]];
      return true;
    }
  });

helper.whiteList([
    "table.bbcode-table",
    "table.table-style-*"

لقد جربت تنسيقات أخرى لقائمة السماح (whitelist) ودالة wrap بناءً على أمثلة أخرى رأيتها، ولكن حتى الآن لم ينجح أي شيء، لذا أفترض أن هناك شيئًا جوهريًا حول كيفية عمل النظام لا أفهمه. أحاول فهم ذلك بشكل أفضل حتى أتمكن من تحقيق نجاح أكثر اتساقًا في المستقبل.

الجداول هي على الأرجح أكثر شيء تعقيدًا يمكنك بناؤه، لذا أنصحك بالبدء بأشياء أبسط بكثير.

في الواقع، سأنصح بعدم دعم كود الجداول حتى لو كان بإمكانك كتابته.

لدينا قائمة بسيطة من أكواد BB التي نحاول دعمها، كما أوضح غان، لأننا منتدى يضم أكثر من 20 مليون مشاركة. نحن بالتأكيد ليس مجتمعًا صغيرًا، ولم يكن هذا قرارًا سهلاً توصلنا إليه، لكننا قررنا أن ديسكورد هو أفضل برنامج لنا للمضي قدمًا. لقد قمنا بحل مشكلة الاستيراد، والشيء الوحيد الذي يمنعنا من الهجرة هو مجرد فهم هذه الخطوة الأخيرة. الآن يمكنني أن أقنعي بالتخلي عن الجداول لأننا نريد التخلي عن أي كود BB يدعمه ديسكورد أو Markdown بالكامل. ومع ذلك، كانت الجداول من تلك التي لا يمكن إعادة تشكيلها بسهولة إلى نسخة Markdown لأن استبدال عناصر الجدول مثل td و tr وما شابه ذلك إلى بناء الجملة الصحيح لـ Markdown ليس أمرًا سهلاً، بل هو شبه مستحيل حسب ما أستطيع أن أقول. لذا، فإن التخلي عنها أمر مقبول، حتى لو لم يكن من السهل إعادة تشكيلها، لكن مجرد تعلم كيفية القيام بذلك سيساعدنا على الأرجح في فهم كل شيء آخر.

تمكنا من التخلي عن [h1] كمثال، لأن تعديلها بسيط حقًا، حيث تحتاج جميع وسوم H إلى أن تصبح عددًا مماثلًا من الرموز #.

لدينا قائمة كاملة على: https://www.rpnation.com/bbcode/، وهناك بضعة أكواد أخرى بخلاف المذكورة في هذا الموضوع، تم التخلي عنها بالفعل لأنها كانت سهلة جدًا للبحث والاستبدال إلى ما يعادلها في Markdown.

أعلم أن هذا المنشور يعود لعام 2020، ولكن نظرًا لأنه لم تتم الإجابة عليه أبدًا (بخلاف مجرد قول “انظر إلى الكود الآخر” و “الجداول صعبة للغاية”)، فقد اعتقدت أنني سأساهم وأشرح المساعدة قدر استطاعتي، حيث إنني أقوم حاليًا بكتابة إضافة bbcode الخاصة بي، واضطررت إلى الكفاح مع عدم وجود أي وثائق على الإطلاق.

نظرت إلى صيغة bbcode [table] الخاصة بك، وهي إضافة معقولة تمامًا لإنشائها، إنها مجرد تغليف. بجدية، لا أعتقد أن سام نظر حتى إلى الرابط الذي أرسلته، لأن تنسيق bbcode الخاص بالجدول الخاص بك هو تقريبًا تنسيق جدول HTML، ولكن مع علامات bbcode.

هذا المنشور ساعد حقًا في شرح القليل حول كيفية القيام بذلك.

ليس لدي وقت الآن لشرح كيفية القيام بما تريد (واختباره لمعرفة ما إذا كان يعمل بالفعل)، لذلك في الوقت الحالي يمكنني أن أخبرك أن أنواع الرموز html_raw و html_block مفيدة جدًا. أيضًا، أفضل طريقة لمعرفة ما إذا كان يعمل بالفعل هي وضع console.log() في دالة wrap، ثم رؤية ما تحصل عليه بالفعل في وحدة التحكم (ومعرفة ما إذا كان ما تفعله يعمل، دون الحاجة إلى القلق بشأن معقم discourse العدواني).

بدأنا العمل على إضافة bbcode جديدة بعد إحراز بعض التقدم في ملحقات markdown، لكننا قررنا في النهاية أنها لن تعمل بنفس الجودة التي كنا نأملها. نأمل أن ننتهي من آخر 3 تقريبًا بحلول هذا الصيف ثم ننتقل بعد ذلك بوقت قصير.

ومع ذلك، من المرجح جدًا ألا تحصل الجداول على مكافئ bbcode وسيُطلب من المستخدمين استخدام إصدار markdown. لا أحد يحب الجداول.

هذا يبدو جيدًا حقًا. أعرف أنك تخلت عن جداول bbcode، ولكن إذا أردت، يمكنني المساعدة في إنشاء برنامج نصي لجعله يعمل.

أنت مرحب بك لتصفح المستودع، وتقديم طلبات سحب أو أي شيء آخر تريده :)!