降价格式
出站渠道的 Markdown 格式化管道
OpenClaw 通过将出站 Markdown 转换为共享中间体来格式化它
渲染特定通道输出之前的表示 (IR)。 IR 保持
源文本完好无损,同时携带样式/链接跨度,因此分块和渲染可以
跨渠道保持一致。
目标
- 一致性: 一个解析步骤,多个渲染器。
- 安全分块: 在渲染之前分割文本,因此内联格式永远不会
打破块。
- 频道匹配: 将相同的 IR 映射到 Slack mrkdwn、Telegram HTML 和 Signal
样式范围无需重新解析 Markdown。
管道
1. 解析 Markdown -> IR
- IR 是纯文本加上样式跨度(粗体/斜体/删除线/代码/剧透)和链接跨度。
- 偏移量是 UTF-16 代码单元,因此信号样式范围与其 API 一致。
- 仅当通道选择表转换时才会解析表。
2. 块 IR(格式优先)
- 在渲染之前对 IR 文本进行分块。
- 内联格式化不会跨块分割; Span 按块进行切片。
3. 每通道渲染
- ''Slack:'' mrkdwn tokens (bold/italic/strike/code), links as ''<url|label>''.
- ''Telegram:'' HTML tags (''<b>'', ''<i>'', ''<s>'', ''<code>'', ''<pre><code>'', ''<a href>'').
- ''信号:''纯文本 + ''text-style'' 范围;当标签不同时,链接将变为 ''label (url)''。
红外示例
输入降价:
Hello **world** — see [docs](https://docs.openclaw.ai).
红外(原理图):
{ "text": "Hello world — see docs.", "styles": [{ "start": 6, "end": 11, "style": "bold" }], "links": [{ "start": 19, "end": 23, "href": "https://docs.openclaw.ai" }] }使用地点
- Slack、Telegram 和 Signal 出站适配器从 IR 渲染。
- 其他渠道(WhatsApp、iMessage、MS Teams、Discord)仍然使用纯文本或
他们自己的格式规则,之前应用了 Markdown 表格转换
启用时分块。
表处理
Markdown 表在聊天客户端中并未得到一致支持。使用
''markdown.tables'' 控制每个渠道(和每个帐户)的转化。
- ''code'':将表渲染为代码块(大多数通道的默认值)。
- ''bullets'':将每一行转换为要点(Signal + WhatsApp 的默认值)。
- ''off'':禁用表解析和转换;原始表格文本通过。
配置键:
channels: discord: markdown: tables: code accounts: work: markdown: tables: off
分块规则
- 块限制来自通道适配器/配置并应用于 IR 文本。
- 代码栅栏被保留为带有尾随换行符的单个块,以便通道
正确渲染它们。
- 列表前缀和块引用前缀是 IR 文本的一部分,因此分块
不分割中间前缀。
- 内联样式(粗体/斜体/删除线/内联代码/剧透)永远不会被分割
大块;渲染器重新打开每个块内的样式。
如果您需要更多有关跨渠道分块行为的信息,请参阅
''流+分块''。
链接政策
- ''Slack:'' ''[label](url)'' -> ''<url|label>''; bare URLs stay bare. Autolinks
在解析期间禁用以避免双重链接。
- ''Telegram:'' ''[label](url)'' -> ''<a href="url">label</a>'' (HTML parse mode).
- ''信号:'' ''[label](url)'' -> ''label (url)'' 除非标签与 URL 匹配。
剧透
剧透标记 (''||spoiler||'') 仅针对 Signal 进行解析,它们映射到
扰流板风格系列。其他渠道将它们视为纯文本。
如何添加或更新通道格式化程序
1. ''解析一次:'' 使用适合通道的共享 ''markdownToIR(...)'' 帮助器
选项(自动链接、标题样式、块引用前缀)。
2. ''渲染:'' 使用 ''renderMarkdownWithMarkers(...)'' 和一个实现渲染器
样式标记图(或信号样式范围)。
3. ''Chunk:''渲染前调用''chunkMarkdownIR(...)'';渲染每个块。
4. Wire 适配器: 更新通道出站适配器以使用新的分块器
和渲染器。
5. 测试: 添加或更新格式测试和外向交货测试(如果
通道使用分块。
常见问题
- Angle bracket markers (''<@U123>'', ''<#C123>'', ''<https://...>'') must be
保存;安全地转义原始 HTML。
- Telegram HTML 需要将文本转义到标签之外,以避免标记损坏。
- 信号样式范围取决于 UTF-16 偏移量;不要使用代码点偏移。
- 保留受隔离代码块的尾随换行符,以便关闭标记落地
他们自己的线路。