Markdown biçimlendirme
OpenClaw, giden Markdown’ı kanala özgü çıktı oluşturmadan önce paylaşılan bir ara gösterime (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 işleme kanallar arasında tutarlı kalabilir.Hedefler
- Tutarlılık: tek ayrıştırma adımı, birden çok işleyici.
- Güvenli parçalara ayırma: metni işlemeden önce bölün, böylece satır içi biçimlendirme hiçbir zaman parçalar arasında bozulmaz.
- Kanala uyum: aynı IR’yi yeniden Markdown ayrıştırması yapmadan Slack mrkdwn, Telegram HTML ve Signal stil aralıklarına eşleyin.
İşlem hattı
- Markdown -> IR ayrıştır
- IR, düz metin ile stil aralıklarından (bold/italic/strike/code/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 seçtiğinde ayrıştırılır.
- IR’yi parçalara ayır (önce biçim)
- Parçalara ayırma, işlemden önce IR metni üzerinde gerçekleşir.
- Satır içi biçimlendirme parçalar arasında bölünmez; aralıklar parça başına dilimlenir.
- Kanal başına işle
- Slack: mrkdwn belirteçleri (bold/italic/strike/code), 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ı olduğunda bağlantılarlabel (url)olur.
- Slack: mrkdwn belirteçleri (bold/italic/strike/code), bağlantılar
IR örneği
Girdi Markdown:Nerede kullanılır
- Slack, Telegram ve Signal giden adaptörleri IR’den işlem yapar.
- Diğer kanallar (WhatsApp, iMessage, Microsoft Teams, Discord) hâlâ düz metin veya kendi biçimlendirme kurallarını kullanır; Markdown tablo dönüştürme etkinse 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 kontrol etmek içinmarkdown.tables kullanın.
code: tabloları kod blokları olarak işle (ç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; ham tablo metni olduğu gibi geçer.
Parçalara ayırma kuralları
- Parça sınırları kanal adaptörlerinden/yapılandırmadan gelir ve IR metnine uygulanır.
- Kod çitleri, kanalların bunları doğru işlemesi için sondaki bir satır sonuyla birlikte tek bir blok olarak korunur.
- Liste önekleri ve blockquote önekleri IR metninin parçasıdır, bu yüzden parçalara ayırma öneğin ortasında bölünmez.
- Satır içi stiller (bold/italic/strike/inline-code/spoiler) hiçbir zaman parçalar arasında bölünmez; işleyici her parçanın içinde stilleri yeniden açar.
Bağlantı ilkesi
- Slack:
[label](url)-><url|label>; yalın URL’ler yalın kalır. Çift bağlantı oluşmasını önlemek için ayrıştırma sırasında otomatik bağlantı kapatılı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şaretleyicileri (||spoiler||) yalnızca Signal için ayrıştırılır; burada bunlar
SPOILER stil aralıklarına eşlenir. Diğer kanallar bunları düz metin olarak ele alır.
Bir kanal biçimlendiricisi nasıl eklenir veya güncellenir
- Bir kez ayrıştır: kanala uygun
seçeneklerle (autolink, heading style, blockquote prefix) paylaşılan
markdownToIR(...)yardımcısını kullanın. - İşle:
renderMarkdownWithMarkers(...)ve bir stil işaretleyici eşlemesiyle (veya Signal stil aralıklarıyla) bir işleyici uygulayın. - Parçalara ayır: işlemden önce
chunkMarkdownIR(...)çağırın; her parçayı işleyin. - Adaptörü bağla: yeni parçalayıcıyı ve işleyiciyi kullanacak şekilde kanal giden adaptörünü güncelleyin.
- Test et: kanal parçalara ayırma kullanıyorsa biçim testleri ve bir giden teslim testi ekleyin veya güncelleyin.
Yaygın dikkat edilmesi gerekenler
- Slack köşeli ayraç belirteçleri (
<@U123>,<#C123>,<https://...>) korunmalıdır; ham HTML’yi güvenli biçimde escape edin. - Telegram HTML, bozuk biçimlendirmeyi önlemek için etiket dışındaki metni escape etmeyi gerektirir.
- Signal stil aralıkları UTF-16 ofsetlerine bağlıdır; kod noktası ofsetleri kullanmayın.
- Kapanış işaretleyicilerinin kendi satırlarına gelmesi için fenced code block’lar için sondaki satır sonlarını koruyun.