Concept internals
Pemformatan Markdown
OpenClaw mengonversi Markdown keluar menjadi representasi perantara bersama (IR) sebelum merender keluaran khusus kanal. IR menyimpan teks biasa beserta rentang gaya/tautan, sehingga satu langkah penguraian digunakan oleh setiap kanal dan pemotongan tidak pernah membagi pemformatan di tengah rentang.
Alur pemrosesan
- Uraikan Markdown menjadi IR (
markdownToIR) - teks biasa beserta rentang gaya (tebal, miring, coret, kode, blok kode, spoiler, kutipan blok, judul 1-6) dan rentang tautan. Offset menggunakan unit kode UTF-16 agar rentang gaya Signal selaras langsung dengan API-nya. Tabel hanya diuraikan jika kanal mengaktifkan mode tabel. - Potong IR (
chunkMarkdownIR/renderMarkdownIRChunksWithinLimit)- pemisahan dilakukan pada teks IR sebelum perenderan, sehingga gaya sebaris dan tautan dipotong per potongan alih-alih terputus pada batas.
- Render per kanal (
renderMarkdownWithMarkers) - peta penanda gaya mengubah rentang menjadi markup asli kanal.
| Kanal | Perender | Catatan |
|---|---|---|
| Slack | token mrkdwn (*bold*, _italic_, `code`, pagar kode) |
Tautan menjadi <url|label>; tautan otomatis dinonaktifkan saat penguraian untuk menghindari tautan ganda |
| Telegram | tag HTML (<b>, <i>, <s>, <code>, <pre><code>, <a href>, <tg-spoiler>) |
Juga mendukung tabel dan judul pesan kaya (<h1>-<h6>) saat richMessages aktif |
| Signal | teks biasa + rentang text-style |
Tautan dirender sebagai label (url) jika label berbeda dari URL |
| Discord, WhatsApp, iMessage, Microsoft Teams, dan kanal lainnya | teks biasa | Tanpa penataan berbasis IR; konversi tabel Markdown tetap dijalankan melalui convertMarkdownTables |
Contoh IR
Markdown masukan: OC_I18N_900000 IR (skematis): OC_I18N_900001
Penanganan tabel
markdown.tables mengontrol cara kanal mengonversi tabel Markdown, per
kanal dan secara opsional per akun:
| Mode | Perilaku |
|---|---|
code |
Render sebagai tabel ASCII yang disejajarkan di dalam blok kode (nilai bawaan cadangan) |
bullets |
Konversi setiap baris menjadi poin butir label: value |
block |
Pertahankan tabel asli jika transportasi mendukungnya; jika tidak, gunakan code sebagai cadangan |
off |
Nonaktifkan penguraian tabel; teks tabel mentah diteruskan tanpa perubahan |
Nilai bawaan Plugin per kanal: Signal, WhatsApp, dan Matrix menggunakan
bullets secara bawaan; Mattermost menggunakan off secara bawaan; Telegram menggunakan block secara bawaan (yang
ditetapkan menjadi code kecuali akun mengaktifkan richMessages). Setiap
kanal tanpa nilai bawaan Plugin eksplisit menggunakan code sebagai cadangan.
OC_I18N_900002
Aturan pemotongan
- Batas potongan berasal dari adaptor/konfigurasi kanal dan berlaku untuk teks IR, bukan keluaran yang telah dirender.
- Blok kode berpagar dipertahankan sebagai satu blok dengan baris baru di akhir agar kanal merender pagar penutup dengan benar.
- Awalan daftar dan kutipan blok merupakan bagian dari teks IR, sehingga pemotongan tidak pernah membagi di tengah awalan.
- Gaya sebaris tidak pernah terbagi di antara potongan; perender membuka kembali gaya yang masih aktif di awal potongan berikutnya.
Lihat Streaming dan pemotongan untuk perilaku batas potongan dan pengiriman di berbagai kanal.
Kebijakan tautan
- Slack:
[label](url)-><url|label>; URL polos tetap polos. - Telegram:
[label](url)-><a href="url">label</a>(mode penguraian HTML). - Signal:
[label](url)->label (url)kecuali label sudah cocok dengan URL.
Spoiler
Penanda spoiler (||spoiler||) diuraikan untuk Signal (dipetakan ke rentang gaya SPOILER)
dan Telegram (dipetakan ke <tg-spoiler>). Kanal lain memperlakukan
||...|| sebagai teks biasa.
Menambahkan atau memperbarui pemformat kanal
- Uraikan sekali dengan
markdownToIR(...), dengan meneruskan opsi yang sesuai untuk kanal (autolink,headingStyle,blockquotePrefix,tableMode). - Render dengan
renderMarkdownWithMarkers(...)dan peta penanda gaya (atau logika rentang gaya khusus untuk transportasi seperti Signal). - Potong dengan
chunkMarkdownIR(...)ataurenderMarkdownIRChunksWithinLimit(...)sebelum merender setiap potongan. - Hubungkan adaptor agar memanggil pemotong dan perender baru dari jalur pengiriman keluar.
- Uji dengan pengujian format serta pengujian pengiriman keluar jika kanal melakukan pemotongan.
Kendala umum
- Token kurung sudut Slack (
<@U123>,<#C123>,<https://...>) harus tetap utuh saat pengodean; HTML mentah tetap harus dikodekan dengan aman. - HTML Telegram memerlukan pengodean teks di luar tag untuk menghindari markup yang rusak.
- Rentang gaya Signal menggunakan offset UTF-16, bukan offset titik kode.
- Pertahankan baris baru di akhir blok kode berpagar agar penanda penutup berada pada baris tersendiri.