Concept internals
Markdown biçimlendirmesi
OpenClaw, kanala özgü çıktıyı oluşturmadan önce giden Markdown içeriğini ortak bir ara gösterime (IR) dönüştürür. IR, düz metni biçem/bağlantı aralıklarıyla birlikte tutar; böylece tek bir ayrıştırma adımı tüm kanalları besler ve parçalara ayırma işlemi biçimlendirmeyi hiçbir zaman bir aralığın ortasından bölmez.
İşlem hattı
- Markdown'ı IR'ye ayrıştırma (
markdownToIR) - düz metin ile biçem aralıkları (kalın, italik, üstü çizili, kod, kod bloğu, spoiler, blok alıntı, 1-6 düzey başlık) ve bağlantı aralıkları. Konumlar UTF-16 kod birimleriyle belirtilir; böylece Signal biçem aralıkları doğrudan API'siyle hizalanır. Tablolar yalnızca kanal bir tablo modunu etkinleştirdiğinde ayrıştırılır. - IR'yi parçalara ayırma (
chunkMarkdownIR/renderMarkdownIRChunksWithinLimit)- bölme işlemi oluşturmadan önce IR metni üzerinde gerçekleşir; böylece satır içi biçemler ve bağlantılar bir sınırda kopmak yerine her parça için dilimlenir.
- Kanala göre oluşturma (
renderMarkdownWithMarkers) - bir biçem işaretçisi eşlemesi, aralıkları kanalın yerel işaretlemesine dönüştürür.
| Kanal | Oluşturucu | Notlar |
|---|---|---|
| Slack | mrkdwn belirteçleri (*kalın*, _italik_, `kod`, kod çitleri) |
Bağlantılar <url|etiket> biçimine dönüşür; çift bağlantılandırmayı önlemek için ayrıştırma sırasında otomatik bağlantı devre dışıdır |
| Telegram | HTML etiketleri (<b>, <i>, <s>, <code>, <pre><code>, <a href>, <tg-spoiler>) |
richMessages açıkken zengin ileti tablolarını ve başlıkları (<h1>-<h6>) da destekler |
| Signal | düz metin + text-style aralıkları |
Etiket URL'den farklıysa bağlantılar etiket (url) biçiminde oluşturulur |
| Discord, WhatsApp, iMessage, Microsoft Teams ve diğer kanallar | düz metin | IR tabanlı biçemlendirme yoktur; Markdown tablo dönüşümü yine convertMarkdownTables aracılığıyla çalışır |
IR örneği
Girdi Markdown'ı: OC_I18N_900000 IR (şematik): OC_I18N_900001
Tablo işleme
markdown.tables, bir kanalın Markdown tablolarını kanal ve isteğe bağlı olarak hesap
bazında nasıl dönüştüreceğini denetler:
| Mod | Davranış |
|---|---|
code |
Kod bloğu içinde hizalanmış bir ASCII tablosu olarak oluşturur (varsayılan geri dönüş) |
bullets |
Her satırı etiket: değer madde işaretlerine dönüştürür |
block |
Aktarım destekliyorsa yerel tabloları korur; aksi durumda code moduna geri döner |
off |
Tablo ayrıştırmayı devre dışı bırakır; ham tablo metni değiştirilmeden geçirilir |
Kanal bazlı Plugin varsayılanları: Signal, WhatsApp ve Matrix varsayılan olarak
bullets; Mattermost varsayılan olarak off; Telegram varsayılan olarak block kullanır (hesapta
richMessages etkin değilse code olarak çözümlenir). Açık bir Plugin varsayılanı
olmayan tüm kanallar code moduna geri döner.
OC_I18N_900002
Parçalara ayırma kuralları
- Parça sınırları kanal adaptörlerinden/yapılandırmasından gelir ve oluşturulan çıktıya değil IR metnine uygulanır.
- Çitli kod blokları, kanalların kapanış çitini doğru biçimde oluşturabilmesi için sonunda yeni satır bulunan tek bir blok olarak tutulur.
- Liste ve blok alıntı önekleri IR metninin parçasıdır; bu nedenle parçalara ayırma işlemi hiçbir zaman önekin ortasından bölmez.
- Satır içi biçemler hiçbir zaman parçalar arasında bölünmez; oluşturucu, açık bir biçemi sonraki parçanın başında yeniden açar.
Kanallar arasındaki parça sınırı ve teslim davranışı için Akış ve parçalara ayırma bölümüne bakın.
Bağlantı politikası
- Slack:
[etiket](url)-><url|etiket>; yalın URL'ler yalın kalır. - Telegram:
[etiket](url)-><a href="url">etiket</a>(HTML ayrıştırma modu). - Signal: Etiket zaten URL ile eşleşmiyorsa
[etiket](url)->etiket (url).
Spoiler'lar
Spoiler işaretçileri (||spoiler||) Signal için (SPOILER
biçem aralıklarına eşlenir) ve Telegram için (<tg-spoiler> öğesine eşlenir) ayrıştırılır. Diğer kanallar
||...|| ifadesini düz metin olarak değerlendirir.
Kanal biçimlendiricisi ekleme veya güncelleme
- Kanala uygun seçenekleri (
autolink,headingStyle,blockquotePrefix,tableMode) geçirerekmarkdownToIR(...)ile bir kez ayrıştırın. renderMarkdownWithMarkers(...)ve bir biçem işaretçisi eşlemesiyle oluşturun (veya Signal gibi aktarımlar için özel biçem aralığı mantığı kullanın).- Her parçayı oluşturmadan önce
chunkMarkdownIR(...)veyarenderMarkdownIRChunksWithinLimit(...)ile parçalara ayırın. - Adaptörü bağlayarak giden gönderim yolundan yeni parçalayıcıyı ve oluşturucuyu çağırmasını sağlayın.
- Biçim testleriyle ve kanal parçalara ayırıyorsa bir giden teslim testiyle test edin.
Yaygın sorunlar
- Slack açılı ayraç belirteçleri (
<@U123>,<#C123>,<https://...>) kaçış işleminden etkilenmemelidir; ham HTML yine de güvenli biçimde kaçırılmalıdır. - Telegram HTML'sinde işaretlemenin bozulmasını önlemek için etiketlerin dışındaki metin kaçırılmalıdır.
- Signal biçem aralıkları kod noktası konumlarını değil, UTF-16 konumlarını kullanır.
- Kapanış işaretçisinin kendi satırında yer alması için çitli kod bloklarının sonundaki yeni satırları koruyun.