概述

OpenClaw 通过将 Markdown 转换为共享中间表示(IR)再渲染为各 channel 特定格式,实现出站消息的一致格式化。IR 保留原始文本,同时携带样式/链接 span,使 chunking 和渲染在各 channel 间保持一致。

核心要点

设计目标:

  • 一次解析,多个渲染器
  • 安全 chunking:在渲染前对 IR 文本分块,行内格式不会跨 chunk 断裂
  • Channel 适配:将同一 IR 映射到 Slack mrkdwn、Telegram HTML、Signal style ranges

处理流水线:

  1. 解析 Markdown → IR:纯文本 + 样式 span(bold/italic/strike/code/spoiler)+ 链接 span,偏移量使用 UTF-16 code units
  2. 对 IR 分块:在渲染前分块,行内格式不跨 chunk 断裂
  3. 按 channel 渲染:
    • Slack:mrkdwn tokens,链接为 <url|label>
    • Telegram:HTML tags(<b>、<i>、<s>、<code>、<a href>)
    • Signal:纯文本 + text-style ranges

表格处理(markdown.tables):

  • code:渲染为代码块(大多数 channel 默认)
  • bullets:每行转为 bullet points(Matrix、Signal、WhatsApp 默认)
  • off:禁用表格解析,原始文本直接传递

Chunking 规则:

  • 代码围栏保留为单块(带尾部换行)
  • 列表前缀和引用前缀是 IR 文本的一部分,不会在前缀中间分割
  • 行内样式(bold/italic/strike/inline-code/spoiler)不跨 chunk 分割

常见陷阱:

  • Slack angle-bracket tokens(<@U123>、<#C123>)必须保留
  • Telegram HTML 需要转义标签外的文本
  • Signal style ranges 依赖 UTF-16 偏移量,不能用 code point 偏移

配置/使用

channels:
  discord:
    markdown:
      tables: code
    accounts:
      work:
        markdown:
          tables: off

相关页面