تنسيق Markdown
يقوم OpenClaw بتنسيق Markdown الصادر عبر تحويله إلى تمثيل وسيط مشترك (IR) قبل عرض المخرجات الخاصة بكل قناة. ويحافظ IR على النص المصدر كما هو، مع حمل نطاقات الأنماط/الروابط بحيث يظل التقطيع والعرض متسقين عبر القنوات.الأهداف
- الاتساق: خطوة تحليل واحدة، وعدة عارضات.
- تقطيع آمن: تقسيم النص قبل العرض حتى لا ينكسر التنسيق المضمن عبر الأجزاء.
- الملاءمة مع القناة: تعيين IR نفسه إلى Slack mrkdwn وTelegram HTML ونطاقات أنماط Signal من دون إعادة تحليل Markdown.
خط الأنابيب
- تحليل Markdown -> IR
- يكون IR عبارة عن نص عادي بالإضافة إلى نطاقات الأنماط (غامق/مائل/مشطوب/كود/مفسد) ونطاقات الروابط.
- تكون الإزاحات بوحدات UTF-16 البرمجية بحيث تتوافق نطاقات أنماط Signal مع API الخاصة بها.
- لا يتم تحليل الجداول إلا عندما تختار القناة التحويل من الجداول.
- تقطيع IR (التنسيق أولًا)
- يحدث التقطيع على نص IR قبل العرض.
- لا ينقسم التنسيق المضمن عبر الأجزاء؛ ويتم اقتطاع النطاقات لكل جزء.
- العرض لكل قناة
- Slack: رموز mrkdwn (غامق/مائل/مشطوب/كود)، والروابط بصيغة
<url|label>. - Telegram: وسوم HTML (
<b>و<i>و<s>و<code>و<pre><code>و<a href>). - Signal: نص عادي + نطاقات
text-style؛ وتصبح الروابطlabel (url)عندما يختلف label.
- Slack: رموز mrkdwn (غامق/مائل/مشطوب/كود)، والروابط بصيغة
مثال IR
إدخال Markdown:أين يُستخدم
- تعرض محولات Slack وTelegram وSignal الصادرة انطلاقًا من IR.
- لا تزال القنوات الأخرى (WhatsApp وiMessage وMicrosoft Teams وDiscord) تستخدم نصًا عاديًا أو قواعد التنسيق الخاصة بها، مع تطبيق تحويل جداول Markdown قبل التقطيع عند التمكين.
التعامل مع الجداول
لا يتم دعم جداول Markdown بشكل متسق عبر عملاء الدردشة. استخدمmarkdown.tables للتحكم في التحويل لكل قناة (ولكل حساب).
code: عرض الجداول ككتل كود (الافتراضي لمعظم القنوات).bullets: تحويل كل صف إلى نقاط تعداد (الافتراضي لـ Signal + WhatsApp).off: تعطيل تحليل الجداول وتحويلها؛ ويمر نص الجدول الخام كما هو.
قواعد التقطيع
- تأتي حدود التقطيع من محولات/إعدادات القناة وتُطبّق على نص IR.
- يتم الحفاظ على أسوار الكود ككتلة واحدة مع سطر جديد لاحق حتى تعرضها القنوات بشكل صحيح.
- تكون بادئات القوائم وبادئات blockquote جزءًا من نص IR، لذلك لا يؤدي التقطيع إلى الانقسام في منتصف البادئة.
- لا يتم أبدًا تقسيم الأنماط المضمنة (غامق/مائل/مشطوب/كود مضمن/مفسد) عبر الأجزاء؛ ويعيد العارض فتح الأنماط داخل كل جزء.
سياسة الروابط
- Slack: تتحول
[label](url)إلى<url|label>؛ وتبقى عناوين URL المجردة كما هي. يتم تعطيل autolink أثناء التحليل لتجنب الربط المزدوج. - Telegram: تتحول
[label](url)إلى<a href="url">label</a>(وضع تحليل HTML). - Signal: تتحول
[label](url)إلىlabel (url)ما لم يكن label مطابقًا لـ URL.
المفسدات
يتم تحليل علامات المفسد (||spoiler||) فقط في Signal، حيث تُعيَّن إلى
نطاقات أنماط SPOILER. أما القنوات الأخرى فتتعامل معها كنص عادي.
كيفية إضافة أو تحديث منسّق قناة
- حلّل مرة واحدة: استخدم المساعد المشترك
markdownToIR(...)مع الخيارات المناسبة للقناة (autolink، ونمط العنوان، وبادئة blockquote). - اعرض: نفّذ عارضًا باستخدام
renderMarkdownWithMarkers(...)وخريطة محددات الأنماط (أو نطاقات أنماط Signal). - قطّع: استدعِ
chunkMarkdownIR(...)قبل العرض؛ ثم اعرض كل جزء. - اربط المحول: حدّث المحول الصادر للقناة لاستخدام المقطّع والعارض الجديدين.
- اختبر: أضف أو حدّث اختبارات التنسيق واختبار تسليم صادر إذا كانت القناة تستخدم التقطيع.
المشكلات الشائعة
- يجب الحفاظ على رموز Slack ذات الأقواس الزاوية (
<@U123>و<#C123>و<https://...>)؛ مع تهريب HTML الخام بأمان. - يتطلب Telegram HTML تهريب النص خارج الوسوم لتجنب كسر الوسوم.
- تعتمد نطاقات أنماط Signal على إزاحات UTF-16؛ لا تستخدم إزاحات نقاط الكود.
- حافظ على الأسطر الجديدة اللاحقة لكتل الكود المسيّجة حتى تصل علامات الإغلاق إلى سطرها الخاص.