Concept internals

قالب‌بندی Markdown

OpenClaw پیش از رندر خروجی مختص هر کانال، Markdown خروجی را به یک نمایش میانی مشترک (IR) تبدیل می‌کند. IR متن ساده را همراه با گستره‌های سبک/پیوند نگه می‌دارد؛ بنابراین یک مرحله تجزیه برای همه کانال‌ها استفاده می‌شود و قطعه‌بندی هرگز قالب‌بندی را در میانه یک گستره نمی‌شکند.

خط لوله

  1. تجزیه Markdown به IR (markdownToIR) - متن ساده به‌همراه گستره‌های سبک (پررنگ، مورب، خط‌خورده، کد، بلوک کد، متن پنهان، نقل‌قول بلوکی، سرفصل‌های ۱ تا ۶) و گستره‌های پیوند. آفست‌ها واحدهای کد UTF-16 هستند تا محدوده‌های سبک Signal مستقیماً با API آن هم‌تراز شوند. جدول‌ها فقط زمانی تجزیه می‌شوند که کانال یک حالت جدول را فعال کرده باشد.
  2. قطعه‌بندی IR (chunkMarkdownIR / renderMarkdownIRChunksWithinLimit)
    • تقسیم پیش از رندر روی متن IR انجام می‌شود؛ بنابراین سبک‌های درون‌خطی و پیوندها برای هر قطعه برش می‌خورند، نه اینکه در مرز قطعه شکسته شوند.
  3. رندر برای هر کانال (renderMarkdownWithMarkers) - یک نگاشت نشانگر سبک، گستره‌ها را به نشانه‌گذاری بومی کانال تبدیل می‌کند.
کانال رندرکننده نکات
Slack توکن‌های mrkdwn (*bold*، _italic_، `code`، حصارهای کد) پیوندها به <url|label> تبدیل می‌شوند؛ برای جلوگیری از پیونددهی دوباره، autolink هنگام تجزیه غیرفعال است
Telegram تگ‌های HTML (<b>، <i>، <s>، <code>، <pre><code>، <a href>، <tg-spoiler>) وقتی richMessages روشن باشد، از جدول‌های پیام غنی و سرفصل‌ها (<h1>-<h6>) نیز پشتیبانی می‌کند
Signal متن ساده + محدوده‌های text-style وقتی برچسب با URL متفاوت باشد، پیوندها به‌شکل label (url) رندر می‌شوند
Discord، WhatsApp، iMessage، Microsoft Teams و سایر کانال‌ها متن ساده بدون سبک‌دهی مبتنی بر IR؛ تبدیل جدول Markdown همچنان از طریق convertMarkdownTables اجرا می‌شود

نمونه IR

Markdown ورودی: OC_I18N_900000 IR (شماتیک): OC_I18N_900001

مدیریت جدول‌ها

markdown.tables نحوه تبدیل جدول‌های Markdown توسط هر کانال را، به‌ازای هر کانال و در صورت نیاز هر حساب، کنترل می‌کند:

حالت رفتار
code رندر به‌صورت جدول ASCII تراز‌شده درون یک بلوک کد (پیش‌فرض بازگشتی)
bullets تبدیل هر ردیف به موارد گلوله‌ای label: value
block حفظ جدول‌های بومی در انتقال‌هایی که از آن‌ها پشتیبانی می‌کنند؛ در غیر این صورت بازگشت به code
off غیرفعال‌کردن تجزیه جدول؛ متن خام جدول بدون تغییر عبور می‌کند

پیش‌فرض‌های Plugin برای هر کانال: پیش‌فرض Signal، WhatsApp و Matrix برابر bullets است؛ پیش‌فرض Mattermost برابر off است؛ و پیش‌فرض Telegram برابر block است (که مگر در صورت فعال‌بودن richMessages برای حساب، به code تبدیل می‌شود). هر کانالی که پیش‌فرض صریحی در Plugin نداشته باشد، به code بازمی‌گردد. OC_I18N_900002

قواعد قطعه‌بندی

  • محدودیت‌های قطعه از آداپتورها/پیکربندی کانال می‌آیند و بر متن IR اعمال می‌شوند، نه خروجی رندرشده.
  • بلوک‌های کد حصاردار همراه با یک نویسه خط جدید در انتها، به‌صورت یک بلوک حفظ می‌شوند تا کانال‌ها حصار پایانی را به‌درستی رندر کنند.
  • پیشوندهای فهرست و نقل‌قول بلوکی بخشی از متن IR هستند؛ بنابراین قطعه‌بندی هرگز در میانه پیشوند تقسیم نمی‌کند.
  • سبک‌های درون‌خطی هرگز میان قطعه‌ها شکسته نمی‌شوند؛ رندرکننده سبک باز را در ابتدای قطعه بعدی دوباره باز می‌کند.

برای آگاهی از رفتار مرز قطعه‌ها و تحویل در کانال‌های مختلف، به استریم و قطعه‌بندی مراجعه کنید.

سیاست پیوند

  • Slack: [label](url) -> <url|label>؛ URLهای بدون برچسب دست‌نخورده می‌مانند.
  • Telegram: [label](url) -> <a href="url">label</a> (حالت تجزیه HTML).
  • Signal: [label](url) -> label (url)، مگر اینکه برچسب از قبل با URL مطابقت داشته باشد.

متن‌های پنهان

نشانگرهای متن پنهان (||spoiler||) برای Signal (نگاشت‌شده به محدوده‌های سبک SPOILER) و Telegram (نگاشت‌شده به <tg-spoiler>) تجزیه می‌شوند. سایر کانال‌ها ||...|| را متن ساده در نظر می‌گیرند.

افزودن یا به‌روزرسانی قالب‌بند یک کانال

  1. با markdownToIR(...) یک‌بار تجزیه کنید و گزینه‌های مناسب کانال (autolink، headingStyle، blockquotePrefix، tableMode) را ارسال کنید.
  2. با renderMarkdownWithMarkers(...) و یک نگاشت نشانگر سبک رندر کنید (یا برای انتقال‌هایی مانند Signal از منطق سفارشی محدوده سبک استفاده کنید).
  3. پیش از رندر هر قطعه، با chunkMarkdownIR(...) یا renderMarkdownIRChunksWithinLimit(...) قطعه‌بندی کنید.
  4. آداپتور را متصل کنید تا قطعه‌بند و رندرکننده جدید را از مسیر ارسال خروجی فراخوانی کند.
  5. با آزمون‌های قالب و، اگر کانال قطعه‌بندی می‌کند، یک آزمون تحویل خروجی آزمایش کنید.

نکات رایج و مشکل‌ساز

  • توکن‌های داخل براکت زاویه‌دار Slack (<@U123>، <#C123>، <https://...>) باید از فراردهی جان سالم به در ببرند؛ HTML خام همچنان باید به‌صورت ایمن فراردهی شود.
  • HTML در Telegram برای جلوگیری از نشانه‌گذاری خراب، نیازمند فراردهی متن خارج از تگ‌ها است.
  • محدوده‌های سبک Signal از آفست‌های UTF-16 استفاده می‌کنند، نه آفست‌های نقطه کد.
  • نویسه‌های خط جدید انتهایی بلوک‌های کد حصاردار را حفظ کنید تا نشانگر پایانی در خط مستقل خود قرار گیرد.

مرتبط

Was this useful?
On this page

On this page