Concept internals

Markdown फ़ॉर्मेटिंग

OpenClaw आउटबाउंड Markdown को चैनल-विशिष्ट आउटपुट रेंडर करने से पहले एक साझा मध्यवर्ती निरूपण (IR) में बदलता है। IR सादा टेक्स्ट और शैली/लिंक स्पैन बनाए रखता है, ताकि एक पार्स चरण हर चैनल को इनपुट दे और चंकिंग कभी भी स्पैन के बीच में फ़ॉर्मैटिंग को विभाजित न करे।

पाइपलाइन

  1. Markdown को IR में पार्स करें (markdownToIR) - सादा टेक्स्ट और शैली स्पैन (बोल्ड, इटैलिक, स्ट्राइकथ्रू, कोड, कोड ब्लॉक, स्पॉइलर, ब्लॉककोट, शीर्षक 1-6) तथा लिंक स्पैन। ऑफ़सेट UTF-16 कोड इकाइयाँ हैं, इसलिए Signal शैली रेंज सीधे उसके API के अनुरूप होती हैं। तालिकाएँ केवल तभी पार्स होती हैं, जब चैनल किसी तालिका मोड का विकल्प चुनता है।
  2. IR को चंकों में बाँटें (chunkMarkdownIR / renderMarkdownIRChunksWithinLimit)
    • विभाजन रेंडरिंग से पहले IR टेक्स्ट पर होता है, इसलिए इनलाइन शैलियों और लिंक को सीमा के आर-पार टूटने के बजाय प्रत्येक चंक के अनुसार काटा जाता है।
  3. प्रत्येक चैनल के लिए रेंडर करें (renderMarkdownWithMarkers) - एक शैली-मार्कर मैप स्पैन को चैनल के मूल मार्कअप में बदलता है।
चैनल रेंडरर टिप्पणियाँ
Slack mrkdwn टोकन (*bold*, _italic_, `code`, कोड फ़ेंस) लिंक <url|label> बन जाते हैं; दोहरी लिंकिंग से बचने के लिए पार्स करते समय ऑटोलिंक अक्षम रहता है
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:

markdown
नमस्ते **दुनिया** - [दस्तावेज़](https://docs.openclaw.ai) देखें।

IR (रूपरेखात्मक):

json
{  "text": "Hello world - see docs.",  "styles": [{ "start": 6, "end": 11, "style": "bold" }],  "links": [{ "start": 19, "end": 23, "href": "https://docs.openclaw.ai" }]}

तालिका प्रबंधन

markdown.tables नियंत्रित करता है कि कोई चैनल Markdown तालिकाओं को कैसे रूपांतरित करता है, प्रत्येक चैनल के लिए और वैकल्पिक रूप से प्रत्येक खाते के लिए:

मोड व्यवहार
code कोड ब्लॉक के भीतर संरेखित ASCII तालिका के रूप में रेंडर करें (डिफ़ॉल्ट फ़ॉलबैक)
bullets प्रत्येक पंक्ति को label: value बुलेट बिंदुओं में बदलें
block जहाँ ट्रांसपोर्ट उनका समर्थन करता है वहाँ मूल तालिकाएँ बनाए रखें; अन्यथा code पर फ़ॉलबैक होता है
off तालिका पार्सिंग अक्षम करें; अपरिष्कृत तालिका टेक्स्ट बिना बदलाव के आगे जाता है

प्रति-चैनल Plugin डिफ़ॉल्ट: Signal, WhatsApp और Matrix के लिए डिफ़ॉल्ट bullets है; Mattermost के लिए डिफ़ॉल्ट off है; Telegram के लिए डिफ़ॉल्ट block है (जो code में बदलता है, जब तक खाते में richMessages सक्षम न हो)। स्पष्ट Plugin डिफ़ॉल्ट के बिना कोई भी चैनल code पर फ़ॉलबैक करता है।

yaml
channels:  discord:    markdown:      tables: code    accounts:      work:        markdown:          tables: off

चंकिंग नियम

  • चंक सीमाएँ चैनल अडैप्टर/कॉन्फ़िगरेशन से आती हैं और 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. चैनल के लिए उपयुक्त विकल्प (autolink, headingStyle, blockquotePrefix, tableMode) पास करते हुए markdownToIR(...) के साथ एक बार पार्स करें
  2. शैली-मार्कर मैप (या Signal जैसे ट्रांसपोर्ट के लिए कस्टम शैली-रेंज लॉजिक) के साथ renderMarkdownWithMarkers(...) का उपयोग करके रेंडर करें
  3. प्रत्येक चंक को रेंडर करने से पहले chunkMarkdownIR(...) या renderMarkdownIRChunksWithinLimit(...) के साथ चंक में बाँटें
  4. आउटबाउंड प्रेषण पथ से नए चंकर और रेंडरर को कॉल करने के लिए अडैप्टर को जोड़ें
  5. यदि चैनल चंकिंग करता है, तो फ़ॉर्मैट परीक्षणों और आउटबाउंड डिलीवरी परीक्षण के साथ परीक्षण करें

सामान्य सावधानियाँ

  • Slack एंगल-ब्रैकेट टोकन (<@U123>, <#C123>, <https://...>) को एस्केपिंग के बाद भी सुरक्षित रहना चाहिए; अपरिष्कृत HTML को फिर भी सुरक्षित रूप से एस्केप करना आवश्यक है।
  • Telegram HTML में टूटे हुए मार्कअप से बचने के लिए टैग के बाहर के टेक्स्ट को एस्केप करना आवश्यक है।
  • Signal शैली रेंज UTF-16 ऑफ़सेट का उपयोग करती हैं, कोड-पॉइंट ऑफ़सेट का नहीं।
  • फ़ेंस किए गए कोड ब्लॉक में अंतिम न्यूलाइन सुरक्षित रखें, ताकि समापन मार्कर अपनी अलग पंक्ति पर आए।

संबंधित

Was this useful?
On this page

On this page