Skip to main content
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

  1. 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.
  2. Potong IR (chunkMarkdownIR / renderMarkdownIRChunksWithinLimit)
    • pemisahan dilakukan pada teks IR sebelum perenderan, sehingga gaya sebaris dan tautan dipotong per potongan alih-alih terputus pada batas.
  3. Render per kanal (renderMarkdownWithMarkers) - peta penanda gaya mengubah rentang menjadi markup asli kanal.

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: 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

  1. Uraikan sekali dengan markdownToIR(...), dengan meneruskan opsi yang sesuai untuk kanal (autolink, headingStyle, blockquotePrefix, tableMode).
  2. Render dengan renderMarkdownWithMarkers(...) dan peta penanda gaya (atau logika rentang gaya khusus untuk transportasi seperti Signal).
  3. Potong dengan chunkMarkdownIR(...) atau renderMarkdownIRChunksWithinLimit(...) sebelum merender setiap potongan.
  4. Hubungkan adaptor agar memanggil pemotong dan perender baru dari jalur pengiriman keluar.
  5. 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.

Terkait

Streaming dan pemotongan

Perilaku streaming keluar, batas potongan, dan pengiriman khusus kanal.

Prompt sistem

Hal yang dilihat model sebelum percakapan, termasuk berkas ruang kerja yang disuntikkan.