إضافة تحويل Discourse إلى Markdown

discourse-to-markdown هو إضافة جديدة تعيد محتوى المنتدى بصيغة Markdown عندما يرسل العميل Accept: text/markdown أو يضيف .md إلى أي رابط محتوى.

نقوم بتشغيلها على منتدى خاص بنا في https://discourse.roots.io:

curl -H "Accept: text/markdown" https://discourse.roots.io/latest
curl https://discourse.roots.io/t/serve-your-wordpress-posts-as-markdown/30321.md

تعتبر صيغة HTML مكلفة عند تغذيتها لنموذج لغوي كبير (LLM)، وغالبًا ما يؤدي تقديم Markdown الذي يحتوي فقط على المحتوى إلى تقليل استخدام الرموز (tokens) بنسبة 3 إلى 5 أضعاف. وهذا يعني مكالمات API أرخص، واستجابات أسرع، ومساحة أكبر في نافذة السياق للنموذج للتفكير فيها. راجع https://acceptmarkdown.com للحصول على عرض تقديمي مفصل وفحص جاهزية لأي موقع.

كيف يطلب العملاء صيغة Markdown

ثلاث نقاط دخول:

  1. رأس Accept: text/markdown (مثالي لنماذج الذكاء الاصطناعي)
  2. لاحقة .md في الرابط
  3. الاكتشاف (كل استجابة HTML تعلن عن نظيرتها بصيغة Markdown عبر Link: <...>; rel="alternate"; type="text/markdown" وعلامة <link rel="alternate"> في <head>، وتحتوي تغذيات RSS على <atom:link> يشير إلى النسخة المكافئة بصيغة Markdown)

المسارات المدعومة

المسار HTML Markdown
موضوع /t/:slug/:id /t/:slug/:id.md
منشور واحد /t/:slug/:id/:post_number /t/:slug/:id/:post_number.md
فئة /c/:slug/:id /c/:slug/:id.md
وسم /tag/:tag /tag/:tag.md
الأحدث /latest /latest.md
الأعلى /top /top.md
الساخن /hot /hot.md
نشاط المستخدم /u/:username/activity /u/:username/activity.md

التثبيت

أضف الإضافة إلى ملف app.yml الخاص بك:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/roots/discourse-to-markdown.git

أعد بناء الحاوية:

cd /var/discourse
./launcher rebuild app

ثم قم بتفعيلها في Admin → Settings → Plugins → Markdown output.

ملاحظات حول التحويل

تقوم الإضافة بتحويل HTML الخاصة بـ cooked في Discourse — وهي التمثيل المعروض للقراء، مع توسيع oneboxes، وربط الإشارات، وتوثيق الاقتباسات — وليس raw. هذا يحافظ على ما يراه القراء فعليًا ويحافظ على قابلية نقل المخرجات عبر أي محرك عرض متوافق مع GFM. يتم إعادة كتابة الهياكل الخاصة بـ Discourse (الاقتباسات، oneboxes، التفاصيل، الإشارات، الهاشتاجات، الرموز التعبيرية، lightboxes، الاستطلاعات) بشكل منطقي قبل التحويل.

يتم تخزين Markdown المحول مؤقتًا في Redis لكل منشور بناءً على مفتاح post.id + post.updated_at، ويتم إبطال التحديثات تلقائيًا.

الإعدادات

الإعداد الافتراضي الغرض
discourse_to_markdown_enabled false مفتاح التحكم الرئيسي للإضافة
discourse_to_markdown_md_urls_enabled true قبول لاحقة .md في الرابط كنظير للمسار HTML
discourse_to_markdown_strict_accept false إرجاع 406 Not Acceptable عندما يستبعد رأس Accept الخاص بالعميل كلاً من text/html و text/markdown
discourse_to_markdown_emit_vary true إصدار Vary: Accept في استجابات Markdown و 406 لضمان عدم تداخل التخزين المؤقت للتمثيلات
discourse_to_markdown_include_post_metadata true تضمين الرابط، الفئة، الوسوم، المؤلف، الطوابع الزمنية في تمثيل Markdown

الموارد