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
ثلاث نقاط دخول:
- رأس
Accept: text/markdown(مثالي لنماذج الذكاء الاصطناعي) - لاحقة
.mdفي الرابط - الاكتشاف (كل استجابة 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 |
الموارد
- المصدر/المشكلات: GitHub - roots/discourse-to-markdown: Serve Discourse content as Markdown via Accept: text/markdown or .md URLs — content negotiation for LLMs and agents. · GitHub
- acceptmarkdown.com — تقديم Markdown للوكلاء عبر التفاوض على المحتوى، بالإضافة إلى فحص جاهزية لموقعك
- RFC 9110 §12.5.1 — التفاوض الاستباقي — المواصفات التي تطبقها هذه الإضافة
- RFC 7763 — تسجيل نوع الوسائط
text/markdown - MDN — التفاوض على المحتوى — مقدمة سهلة الفهم للمفهوم
- راجع acceptmarkdown.com/reference للحصول على المواصفات الكاملة + قائمة وثائق المطورين