Concept internals
Markdown biçimlendirmesi
OpenClaw, çıkış Markdown'ını kanala özgü çıktıyı oluşturmadan önce paylaşılan bir ara temsile (IR) dönüştürerek biçimlendirir. IR, kaynak metni olduğu gibi korurken stil/bağlantı aralıklarını taşır; böylece parçalara ayırma ve render işlemi kanallar arasında tutarlı kalabilir.
Hedefler
- Tutarlılık: tek ayrıştırma adımı, birden çok renderer.
- Güvenli parçalara ayırma: metni render işleminden önce bölerek satır içi biçimlendirmenin parçalar arasında bozulmasını önleme.
- Kanala uygunluk: aynı IR'yi Markdown'ı yeniden ayrıştırmadan Slack mrkdwn, Telegram HTML ve Signal stil aralıklarına eşleme.
Pipeline
- Markdown'ı ayrıştır -> IR
- IR, düz metin ile stil aralıklarından (kalın/italik/üstü çizili/kod/spoiler) ve bağlantı aralıklarından oluşur.
- Ofsetler UTF-16 kod birimleridir; böylece Signal stil aralıkları API'siyle hizalanır.
- Tablolar yalnızca bir kanal tablo dönüştürmeyi etkinleştirdiğinde ayrıştırılır.
- IR'yi parçalara ayır (önce biçim)
- Parçalara ayırma, render işleminden önce IR metni üzerinde gerçekleşir.
- Satır içi biçimlendirme parçalar arasında bölünmez; aralıklar her parça için dilimlenir.
- Kanal başına render et
- Slack: mrkdwn belirteçleri (kalın/italik/üstü çizili/kod), bağlantılar
<url|label>olarak. - Telegram: HTML etiketleri (
<b>,<i>,<s>,<code>,<pre><code>,<a href>). - Signal: düz metin +
text-stylearalıkları; etiket farklıysa bağlantılarlabel (url)olur.
- Slack: mrkdwn belirteçleri (kalın/italik/üstü çizili/kod), bağlantılar
IR örneği
Girdi Markdown'ı:
Hello **world** - see [docs](https://docs.openclaw.ai).
IR (şematik):
{
"text": "Hello world - see docs.",
"styles": [{ "start": 6, "end": 11, "style": "bold" }],
"links": [{ "start": 19, "end": 23, "href": "https://docs.openclaw.ai" }]
}
Nerede kullanılır
- Slack, Telegram ve Signal çıkış bağdaştırıcıları IR'den render eder.
- Diğer kanallar (WhatsApp, iMessage, Microsoft Teams, Discord) hâlâ düz metin veya kendi biçimlendirme kurallarını kullanır; etkinleştirildiğinde Markdown tablo dönüştürme parçalara ayırmadan önce uygulanır.
Tablo işleme
Markdown tabloları sohbet istemcileri arasında tutarlı şekilde desteklenmez.
Kanal başına (ve hesap başına) dönüştürmeyi denetlemek için markdown.tables kullanın.
code: tabloları kod blokları olarak render et (çoğu kanal için varsayılan).bullets: her satırı madde işaretlerine dönüştür (Signal + WhatsApp için varsayılan).off: tablo ayrıştırmayı ve dönüştürmeyi devre dışı bırakır; ham tablo metni olduğu gibi geçer.
Yapılandırma anahtarları:
channels:
discord:
markdown:
tables: code
accounts:
work:
markdown:
tables: off
Parçalara ayırma kuralları
- Parça sınırları kanal bağdaştırıcılarından/yapılandırmadan gelir ve IR metnine uygulanır.
- Kod blokları, kanalların doğru render etmesi için sonunda yeni satır bulunan tek bir blok olarak korunur.
- Liste önekleri ve alıntı bloğu önekleri IR metninin parçasıdır; bu yüzden parçalara ayırma önekin ortasında bölmez.
- Satır içi stiller (kalın/italik/üstü çizili/satır içi kod/spoiler) hiçbir zaman parçalar arasında bölünmez; renderer her parçanın içinde stilleri yeniden açar.
Kanallar arasında parçalara ayırma davranışı hakkında daha fazlasına ihtiyacınız varsa Streaming + parçalara ayırma bölümüne bakın.
Bağlantı ilkesi
- Slack:
[label](url)-><url|label>; çıplak URL'ler çıplak kalır. Çift bağlantılamayı önlemek için ayrıştırma sırasında otomatik bağlantı devre dışıdır. - Telegram:
[label](url)-><a href="url">label</a>(HTML ayrıştırma modu). - Signal: etiket URL ile eşleşmediği sürece
[label](url)->label (url).
Spoiler'lar
Spoiler işaretleri (||spoiler||) yalnızca Signal için ayrıştırılır; burada
SPOILER stil aralıklarına eşlenir. Diğer kanallar bunları düz metin olarak ele alır.
Bir kanal biçimlendirici nasıl eklenir veya güncellenir
- Bir kez ayrıştır: kanala uygun seçeneklerle (autolink, başlık stili, alıntı bloğu öneki)
paylaşılan
markdownToIR(...)yardımcısını kullanın. - Render et:
renderMarkdownWithMarkers(...)ve bir stil işaretçisi eşlemesiyle (veya Signal stil aralıklarıyla) bir renderer uygulayın. - Parçalara ayır: render işleminden önce
chunkMarkdownIR(...)çağırın; her parçayı render edin. - Bağdaştırıcıyı bağla: kanal çıkış bağdaştırıcısını yeni parçalara ayırıcıyı ve renderer'ı kullanacak şekilde güncelleyin.
- Test et: kanal parçalara ayırmayı kullanıyorsa biçim testleri ve bir çıkış teslim testi ekleyin veya güncelleyin.
Yaygın dikkat noktaları
- Slack açılı ayraç belirteçleri (
<@U123>,<#C123>,<https://...>) korunmalıdır; ham HTML'yi güvenli şekilde kaçışlayın. - Telegram HTML, bozuk işaretlemeyi önlemek için etiketlerin dışındaki metnin kaçışlanmasını gerektirir.
- Signal stil aralıkları UTF-16 ofsetlerine bağlıdır; kod noktası ofsetleri kullanmayın.
- Çitli kod blokları için sondaki yeni satırları koruyun; böylece kapanış işaretçileri kendi satırlarına denk gelir.