Markdown 处理(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/5.3-markdown-processing
翻译时间:2026-06-09T16:08:30.330Z
翻译模型:deepseek-chat
原文字符数:11429
项目:Open WebUI (open-webui)
---
Markdown 处理
相关源文件
以下文件为本 wiki 页面的生成提供了上下文:
src/lib/components/AddTerminalServerModal.sveltesrc/lib/components/admin/Settings/Integrations.sveltesrc/lib/components/chat/ContentRenderer/FloatingButtons.sveltesrc/lib/components/chat/Messages/CodeBlock.sveltesrc/lib/components/chat/Messages/ContentRenderer.sveltesrc/lib/components/chat/Messages/Markdown.sveltesrc/lib/components/chat/Messages/Markdown/AlertRenderer.sveltesrc/lib/components/chat/Messages/Markdown/ConsecutiveDetailsGroup.sveltesrc/lib/components/chat/Messages/Markdown/HTMLToken.sveltesrc/lib/components/chat/Messages/Markdown/KatexRenderer.sveltesrc/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.sveltesrc/lib/components/chat/Messages/Markdown/MarkdownInlineTokens/CodespanToken.sveltesrc/lib/components/chat/Messages/Markdown/MarkdownInlineTokens/TextToken.sveltesrc/lib/components/chat/Messages/Markdown/MarkdownTokens.sveltesrc/lib/components/chat/PyodideFileNav.sveltesrc/lib/components/chat/Settings/Integrations/Terminals.sveltesrc/lib/components/chat/Settings/Integrations/Terminals/Connection.sveltesrc/lib/components/common/ToolCallDisplay.sveltesrc/lib/utils/marked/extension.tssrc/lib/utils/marked/katex-extension.tssrc/lib/workers/pyodide.worker.ts
目的与范围
本文档描述了 Open WebUI 中的 Markdown 处理系统,该系统将 Markdown 格式的文本转换为渲染后的 HTML,用于在聊天消息中显示。系统支持 GitHub 风格 Markdown(GFM)、通过 KaTeX 渲染的 LaTeX 数学公式、语法高亮,以及代码执行、引用和交互式表格等特殊元素处理。
关于渲染后的 Markdown 如何在 UI 中显示,请参阅内容渲染管道。关于代码块执行功能,请参阅代码块执行。
---
系统概览
Markdown 处理系统在渲染之前,通过多个阶段对原始文本内容进行转换:
graph TB
UserInput["用户输入 / AI 响应<br/>(原始文本)"]
Preprocessing["replaceTokens()<br/>processResponseContent()"]
MarkedLexer["marked.lexer(processed)<br/>(词法分析)"]
TokenStream["Token 流<br/>(标题、代码、表格等)"]
subgraph "渲染管道"
MarkdownTokens["MarkdownTokens.svelte<br/>(块级)"]
MarkdownInline["MarkdownInlineTokens.svelte<br/>(行内级)"]
SpecialRenderers["专用渲染器<br/>(Katex、CodeBlock、Alert)"]
end
UserInput --> Preprocessing
Preprocessing --> MarkedLexer
MarkedLexer --> TokenStream
TokenStream --> MarkdownTokens
MarkdownTokens --> MarkdownInline
MarkdownTokens --> SpecialRenderers
MarkdownInline --> SpecialRenderers
来源:src/lib/components/chat/Messages/Markdown.svelte:62-71、src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:141-180
---
核心 Markdown 配置
系统使用 marked 库,并通过多个自定义扩展来支持高级 AI 特定功能。
扩展集成
| 扩展 | 用途 | 文件引用 |
|---|---|---|
markedKatexExtension | LaTeX 数学公式渲染($ 和 $$) | src/lib/utils/marked/katex-extension.ts:107-111 |
citationExtension | AI 引用处理([1]) | src/lib/components/chat/Messages/Markdown.svelte:15 |
footnoteExtension | 标准 Markdown 脚注 | src/lib/components/chat/Messages/Markdown.svelte:14 |
mentionExtension | 用户/模型/工具提及(@、#、$) | src/lib/components/chat/Messages/Markdown.svelte:54-60 |
markedExtension | 通用 GFM 增强 | src/lib/components/chat/Messages/Markdown.svelte:49 |
colonFenceExtension | 自定义冒号围栏块(例如 :::) | src/lib/components/chat/Messages/Markdown.svelte:52 |
disableSingleTilde | 禁用单波浪线删除线 | src/lib/components/chat/Messages/Markdown.svelte:53 |
来源:src/lib/components/chat/Messages/Markdown.svelte:48-60
---
LaTeX 数学公式渲染
系统使用高度优化的 KaTeX 扩展来处理数学符号。它支持多种分隔符,并包含针对昂贵正则表达式操作的优化。
支持的分隔符
- 块级:
$$...$$、\[...\]、\begin{equation}...\end{equation}src/lib/utils/marked/katex-extension.ts:1-9 - 行内:
$ ... $、\( ... \)、\pu{...}、\ce{...}src/lib/utils/marked/katex-extension.ts:1-9
优化
为防止流式传输期间性能下降,系统预编译正则规则,并使用 Unicode 属性转义来高效处理周围字符。ALLOWED_SURROUNDING_CHARS_REGEX 在模块加载时预编译一次,以避免重复的昂贵编译 src/lib/utils/marked/katex-extension.ts:20-21。
graph LR
src["原始文本源"]
katexStart["katexStart()<br/>查找分隔符"]
katexTokenizer["katexTokenizer()<br/>提取数学文本"]
KatexRenderer["KatexRenderer.svelte<br/>通过 KaTeX 渲染"]
src --> katexStart
katexStart --> katexTokenizer
katexTokenizer --> KatexRenderer
来源:src/lib/utils/marked/katex-extension.ts:1-9、src/lib/utils/marked/katex-extension.ts:20-21、src/lib/utils/marked/katex-extension.ts:142-172
---
专用块级渲染
当 marked 识别出块级元素时,它们会被传递给 MarkdownTokens.svelte 进行专用渲染。
代码块与执行
代码块由 CodeBlock.svelte 处理。除了通过 highlight.js 进行语法高亮 src/lib/components/chat/Messages/CodeBlock.svelte:2 之外,该组件还支持:
- 执行:Python 代码可以通过
PyodideWorkersrc/lib/components/chat/Messages/CodeBlock.svelte:223-268或通过executeCode的 Jupyter 服务器src/lib/components/chat/Messages/CodeBlock.svelte:149-216执行。执行引擎由$config?.code?.engine决定src/lib/components/chat/Messages/CodeBlock.svelte:149。 - 可视化:通过
renderMermaidDiagram和renderVegaVisualization支持 Mermaid 图表和 Vega 可视化src/lib/components/chat/Messages/CodeBlock.svelte:12-13。 - 工件:检测 HTML/SVG 代码以触发工件 UI
src/lib/components/chat/Messages/ContentRenderer.svelte:176-189。
来源:src/lib/components/chat/Messages/CodeBlock.svelte:142-221、src/lib/components/chat/Messages/ContentRenderer.svelte:176-189、src/lib/workers/pyodide.worker.ts:177-236
详情分组与工具调用
系统使用 ConsecutiveDetailsGroup.svelte 对连续的详情令牌(如工具调用和推理)进行分组 src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:23。
- 工具调用显示:单个工具调用通过
ToolCallDisplay.svelte渲染src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:20,显示参数、结果和执行状态src/lib/components/common/ToolCallDisplay.svelte:121-140。 - 分组逻辑:
getDisplayTokens识别可分组类型,如tool_calls、reasoning和code_interpreter,以便在 UI 中合并显示src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:56-91。
来源:src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:56-91、src/lib/components/chat/Messages/Markdown/ConsecutiveDetailsGroup.svelte:74-104、src/lib/components/common/ToolCallDisplay.svelte:121-140
---
内容预处理
在 marked 词法分析器处理文本之前,文本会经过 Markdown.svelte 的更新处理程序。
令牌替换
replaceTokens 工具函数 src/lib/components/chat/Messages/Markdown.svelte:66 替换动态占位符。它还处理 processResponseContent,后者管理特定的 AI 响应格式化和清理 src/lib/components/chat/Messages/Markdown.svelte:66。
节流解析
在活跃流式传输期间,系统使用 requestAnimationFrame 对 Markdown 解析进行节流,确保 UI 保持响应 src/lib/components/chat/Messages/Markdown.svelte:73-80。
sequenceDiagram
participant MR as Markdown.svelte
participant Utils as utils.ts
participant Marked as marked.lexer
participant UI as MarkdownTokens.svelte
MR->>Utils: processResponseContent(content)
Utils-->>MR: cleanedContent
MR->>Utils: replaceTokens(cleanedContent)
Utils-->>MR: finalContent
MR->>Marked: lexer(finalContent)
Marked-->>MR: tokens[]
MR->>UI: render(tokens)
来源:src/lib/components/chat/Messages/Markdown.svelte:62-82、src/lib/components/chat/Messages/Markdown.svelte:4-11
---
交互功能
表格 CSV 导出
表格渲染为标准 HTML,但包含增强功能:
- CSV 导出:
exportTableToCSVHandlersrc/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:101允许用户下载表格数据。它提取表头和行文本,解码 HTML 实体,并使用file-saver触发下载src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:105-136。
浮动操作按钮
ContentRenderer.svelte 监视文本选择以显示 FloatingButtons.svelte src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:1。
- 上下文操作:允许用户对选中的文本执行“提问”或“解释”操作
src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:41-55。 - 动态提示:使用
{{SELECTED_CONTENT}}和{{INPUT_CONTENT}}等模板,基于高亮的 Markdown 生成新的 AI 查询src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:113-116。
来源:src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:101-137、src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:41-55、src/lib/components/chat/Messages/ContentRenderer.svelte:70-119