मुख्य सामग्री पर जाएं

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

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

लक्ष्य

  • सुसंगतता: एक पार्स चरण, कई रेंडरर।
  • सुरक्षित चंकिंग: रेंडरिंग से पहले पाठ को विभाजित करना ताकि इनलाइन फ़ॉर्मैटिंग चंक्स के बीच कभी न टूटे।
  • चैनल अनुकूलता: एक ही IR को Slack mrkdwn, Telegram HTML, और Signal स्टाइल रेंज में बिना Markdown को दोबारा पार्स किए मैप करना।

पाइपलाइन

  1. Markdown पार्स करें -> IR
    • IR में सादा पाठ + स्टाइल स्पैन (bold/italic/strike/code/spoiler) और लिंक स्पैन होते हैं।
    • ऑफ़सेट UTF-16 कोड यूनिट्स में होते हैं ताकि Signal की स्टाइल रेंज उसके API के साथ संरेखित रहें।
    • तालिकाएँ केवल तभी पार्स की जाती हैं जब कोई चैनल तालिका रूपांतरण को सक्षम करता है।
  2. IR को चंक करें (format-first)
    • चंकिंग रेंडरिंग से पहले IR पाठ पर होती है।
    • इनलाइन फ़ॉर्मैटिंग चंक्स के बीच विभाजित नहीं होती; स्पैन प्रति-चंक स्लाइस किए जाते हैं।
  3. प्रति चैनल रेंडर करें
    • Slack: mrkdwn टोकन (bold/italic/strike/code), लिंक <url|label> के रूप में।
    • Telegram: HTML टैग (<b>, <i>, <s>, <code>, <pre><code>, <a href>)।
    • Signal: सादा पाठ + text-style रेंज; जब लेबल अलग हो तो लिंक label (url) बनते हैं।

IR उदाहरण

इनपुट Markdown:
Hello **world** — see [docs](https://docs.openclaw.ai).
IR (स्कीमैटिक):
{
  "text": "Hello world — see docs.",
  "styles": [{ "start": 6, "end": 11, "style": "bold" }],
  "links": [{ "start": 19, "end": 23, "href": "https://docs.openclaw.ai" }]
}

इसका उपयोग कहाँ होता है

  • Slack, Telegram, और Signal के आउटबाउंड एडेप्टर IR से रेंडर करते हैं।
  • अन्य चैनल (WhatsApp, iMessage, MS Teams, Discord) अभी भी सादा पाठ या अपने फ़ॉर्मैटिंग नियमों का उपयोग करते हैं; सक्षम होने पर चंकिंग से पहले Markdown तालिका रूपांतरण लागू किया जाता है।

तालिका हैंडलिंग

Markdown टेबल्स सभी चैट क्लाइंट्स में समान रूप से समर्थित नहीं हैं। प्रति चैनल (और प्रति अकाउंट) कन्वर्ज़न को नियंत्रित करने के लिए markdown.tables का उपयोग करें।
  • code: तालिकाओं को कोड ब्लॉक्स के रूप में रेंडर करें (अधिकांश चैनलों के लिए डिफ़ॉल्ट)।
  • bullets: प्रत्येक पंक्ति को बुलेट पॉइंट्स में बदलें (Signal + WhatsApp के लिए डिफ़ॉल्ट)।
  • off: तालिका पार्सिंग और रूपांतरण अक्षम करें; कच्चा तालिका पाठ यथावत पास होता है।
कॉन्फ़िग कुंजियाँ:
channels:
  discord:
    markdown:
      tables: code
    accounts:
      work:
        markdown:
          tables: off

चंकिंग नियम

  • चंक सीमाएँ चैनल एडेप्टर/विन्यास से आती हैं और IR पाठ पर लागू की जाती हैं।
  • कोड फ़ेंस को एकल ब्लॉक के रूप में संरक्षित किया जाता है, अंत में ट्रेलिंग न्यूलाइन के साथ, ताकि चैनल उन्हें सही ढंग से रेंडर करें।
  • सूची उपसर्ग और ब्लॉकक्वोट उपसर्ग IR पाठ का हिस्सा होते हैं, इसलिए चंकिंग उपसर्ग के बीच में विभाजित नहीं होती।
  • इनलाइन स्टाइल (bold/italic/strike/inline-code/spoiler) कभी भी चंक्स के बीच विभाजित नहीं होते; रेंडरर प्रत्येक चंक के भीतर स्टाइल्स को पुनः खोलता है।
यदि आपको चैनलों के बीच चंकिंग व्यवहार के बारे में और जानकारी चाहिए, तो देखें Streaming + chunking

लिंक नीति

  • Slack: [label](url) -> <url|label>; बिना लेबल वाले URLs वैसे ही रहते हैं। डबल-लिंकिंग से बचने के लिए पार्स के दौरान ऑटोलिंक अक्षम किया जाता है।
  • Telegram: [label](url) -> <a href="url">label</a> (HTML पार्स मोड)।
  • Signal: [label](url) -> label (url) जब तक लेबल URL से मेल न खाए।

स्पॉइलर

स्पॉइलर मार्कर्स (||spoiler||) केवल Signal के लिए पार्स किए जाते हैं, जहाँ वे SPOILER स्टाइल रेंज में मैप होते हैं। अन्य चैनल इन्हें साधारण टेक्स्ट के रूप में扱ते हैं।

चैनल फ़ॉर्मैटर कैसे जोड़ें या अपडेट करें

  1. एक बार पार्स करें: चैनल-उपयुक्त विकल्पों (autolink, heading style, blockquote prefix) के साथ साझा markdownToIR(...) हेल्पर का उपयोग करें।
  2. रेंडर करें: renderMarkdownWithMarkers(...) और एक स्टाइल मार्कर मैप (या Signal स्टाइल रेंज) के साथ रेंडरर लागू करें।
  3. चंक करें: रेंडरिंग से पहले chunkMarkdownIR(...) कॉल करें; प्रत्येक चंक को रेंडर करें।
  4. एडेप्टर जोड़ें: नए चंकर और रेंडरर का उपयोग करने के लिए चैनल आउटबाउंड एडेप्टर अपडेट करें।
  5. परीक्षण: फ़ॉर्मैट परीक्षण जोड़ें या अपडेट करें, और यदि चैनल चंकिंग का उपयोग करता है तो एक आउटबाउंड डिलीवरी परीक्षण जोड़ें।

सामान्य अड़चनें

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