OpenClaw formatteert uitgaande Markdown door deze om te zetten naar een gedeelde tussenliggende representatie (IR) voordat kanaalspecifieke uitvoer wordt gerenderd. De IR houdt de brontekst intact terwijl stijl-/linkspans worden meegenomen, zodat opdelen in chunks en rendering consistent kunnen blijven tussen kanalen.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Doelen
- Consistentie: één parseerstap, meerdere renderers.
- Veilig opdelen in chunks: splits tekst vóór rendering, zodat inline-opmaak nooit over chunks heen breekt.
- Passend per kanaal: map dezelfde IR naar Slack mrkdwn, Telegram HTML en Signal stijlbereiken zonder Markdown opnieuw te parseren.
Pipeline
- Markdown parseren -> IR
- IR is platte tekst plus stijlspans (vet/cursief/doorhalen/code/spoiler) en linkspans.
- Offsets zijn UTF-16-code-eenheden, zodat Signal-stijlbereiken overeenkomen met de API.
- Tabellen worden alleen geparseerd wanneer een kanaal kiest voor tabelconversie.
- IR opdelen in chunks (opmaak eerst)
- Opdelen in chunks gebeurt op de IR-tekst vóór rendering.
- Inline-opmaak wordt niet over chunks gesplitst; spans worden per chunk uitgesneden.
- Renderen per kanaal
- Slack: mrkdwn-tokens (vet/cursief/doorhalen/code), links als
<url|label>. - Telegram: HTML-tags (
<b>,<i>,<s>,<code>,<pre><code>,<a href>). - Signal: platte tekst +
text-style-bereiken; links wordenlabel (url)wanneer het label verschilt.
- Slack: mrkdwn-tokens (vet/cursief/doorhalen/code), links als
IR-voorbeeld
Invoer-Markdown:Waar het wordt gebruikt
- Uitgaande adapters voor Slack, Telegram en Signal renderen vanuit de IR.
- Andere kanalen (WhatsApp, iMessage, Microsoft Teams, Discord) gebruiken nog platte tekst of hun eigen opmaakregels, waarbij Markdown-tabelconversie vóór het opdelen in chunks wordt toegepast wanneer dit is ingeschakeld.
Tabelafhandeling
Markdown-tabellen worden niet consistent ondersteund door chatclients. Gebruikmarkdown.tables om conversie per kanaal (en per account) te beheren.
code: render tabellen als codeblokken (standaard voor de meeste kanalen).bullets: zet elke rij om naar opsommingstekens (standaard voor Signal + WhatsApp).off: schakel tabelparsering en conversie uit; ruwe tabeltekst wordt doorgegeven.
Regels voor opdelen in chunks
- Chunklimieten komen uit kanaaladapters/configuratie en worden toegepast op de IR-tekst.
- Code fences blijven behouden als één blok met een afsluitende newline, zodat kanalen ze correct renderen.
- Lijstprefixen en blockquote-prefixen maken deel uit van de IR-tekst, zodat het opdelen in chunks niet midden in een prefix splitst.
- Inline-stijlen (vet/cursief/doorhalen/inline-code/spoiler) worden nooit over chunks gesplitst; de renderer heropent stijlen binnen elke chunk.
Linkbeleid
- Slack:
[label](url)-><url|label>; kale URL’s blijven kaal. Autolink is tijdens het parseren uitgeschakeld om dubbele links te voorkomen. - Telegram:
[label](url)-><a href="url">label</a>(HTML-parsemodus). - Signal:
[label](url)->label (url), tenzij het label overeenkomt met de URL.
Spoilers
Spoilermarkeringen (||spoiler||) worden alleen voor Signal geparseerd, waar ze mappen naar
SPOILER-stijlbereiken. Andere kanalen behandelen ze als platte tekst.
Een kanaalformatter toevoegen of bijwerken
- Eén keer parseren: gebruik de gedeelde helper
markdownToIR(...)met kanaalgeschikte opties (autolink, kopstijl, blockquote-prefix). - Renderen: implementeer een renderer met
renderMarkdownWithMarkers(...)en een stijlmarkermap (of Signal-stijlbereiken). - Opdelen in chunks: roep
chunkMarkdownIR(...)aan vóór rendering; render elke chunk. - Adapter aansluiten: werk de uitgaande kanaaladapter bij om de nieuwe chunker en renderer te gebruiken.
- Testen: voeg opmaaktests toe of werk ze bij, en voeg een uitgaande bezorgtest toe als het kanaal chunking gebruikt.
Veelvoorkomende valkuilen
- Slack-tokens met punthaken (
<@U123>,<#C123>,<https://...>) moeten behouden blijven; escape ruwe HTML veilig. - Telegram HTML vereist escaping van tekst buiten tags om kapotte markup te voorkomen.
- Signal-stijlbereiken zijn afhankelijk van UTF-16-offsets; gebruik geen codepoint-offsets.
- Behoud afsluitende newlines voor fenced code blocks, zodat sluitmarkeringen op hun eigen regel terechtkomen.