agentic_huge_data_base / wiki
页面 Open WebUI · 5.3 Markdown 处理·DeepWiki 中文全文译文

5.3 · Markdown 处理(Markdown Processing)

多模型对话工作台与知识应用入口 · 本章是 Open WebUI DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目Open WebUI 章节5.3 状态全文译文 模块界面与交互、频道、笔记与协作、系统架构、工具、记忆与模型调用
源码线索
  • src/lib/components/AddTerminalServerModal.svelte
  • src/lib/components/admin/Settings/Integrations.svelte
  • src/lib/components/chat/ContentRenderer/FloatingButtons.svelte
  • src/lib/components/chat/Messages/CodeBlock.svelte
  • src/lib/components/chat/Messages/ContentRenderer.svelte
  • src/lib/components/chat/Messages/Markdown.svelte
  • src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte
  • src/lib/components/chat/Messages/Markdown/ConsecutiveDetailsGroup.svelte
  • src/lib/components/chat/Messages/Markdown/HTMLToken.svelte
  • src/lib/components/chat/Messages/Markdown/KatexRenderer.svelte
模块标签
  • 界面与交互
  • 频道、笔记与协作
  • 系统架构
  • 工具、记忆与模型调用
  • 接口与服务契约

中文译文

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.svelte
  • src/lib/components/admin/Settings/Integrations.svelte
  • src/lib/components/chat/ContentRenderer/FloatingButtons.svelte
  • src/lib/components/chat/Messages/CodeBlock.svelte
  • src/lib/components/chat/Messages/ContentRenderer.svelte
  • src/lib/components/chat/Messages/Markdown.svelte
  • src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte
  • src/lib/components/chat/Messages/Markdown/ConsecutiveDetailsGroup.svelte
  • src/lib/components/chat/Messages/Markdown/HTMLToken.svelte
  • src/lib/components/chat/Messages/Markdown/KatexRenderer.svelte
  • src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte
  • src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens/CodespanToken.svelte
  • src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens/TextToken.svelte
  • src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte
  • src/lib/components/chat/PyodideFileNav.svelte
  • src/lib/components/chat/Settings/Integrations/Terminals.svelte
  • src/lib/components/chat/Settings/Integrations/Terminals/Connection.svelte
  • src/lib/components/common/ToolCallDisplay.svelte
  • src/lib/utils/marked/extension.ts
  • src/lib/utils/marked/katex-extension.ts
  • src/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-71src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:141-180

---

核心 Markdown 配置

系统使用 marked 库,并通过多个自定义扩展来支持高级 AI 特定功能。

扩展集成
扩展用途文件引用
markedKatexExtensionLaTeX 数学公式渲染($ 和 $$)src/lib/utils/marked/katex-extension.ts:107-111
citationExtensionAI 引用处理([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-9src/lib/utils/marked/katex-extension.ts:20-21src/lib/utils/marked/katex-extension.ts:142-172

---

专用块级渲染

marked 识别出块级元素时,它们会被传递给 MarkdownTokens.svelte 进行专用渲染。

代码块与执行

代码块由 CodeBlock.svelte 处理。除了通过 highlight.js 进行语法高亮 src/lib/components/chat/Messages/CodeBlock.svelte:2 之外,该组件还支持:

  1. 执行:Python 代码可以通过 PyodideWorker src/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
  2. 可视化:通过 renderMermaidDiagramrenderVegaVisualization 支持 Mermaid 图表和 Vega 可视化 src/lib/components/chat/Messages/CodeBlock.svelte:12-13
  3. 工件:检测 HTML/SVG 代码以触发工件 UI src/lib/components/chat/Messages/ContentRenderer.svelte:176-189

来源:src/lib/components/chat/Messages/CodeBlock.svelte:142-221src/lib/components/chat/Messages/ContentRenderer.svelte:176-189src/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_callsreasoningcode_interpreter,以便在 UI 中合并显示 src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:56-91

来源:src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte:56-91src/lib/components/chat/Messages/Markdown/ConsecutiveDetailsGroup.svelte:74-104src/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-82src/lib/components/chat/Messages/Markdown.svelte:4-11

---

交互功能

表格 CSV 导出

表格渲染为标准 HTML,但包含增强功能:

  • CSV 导出exportTableToCSVHandler src/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-137src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:41-55src/lib/components/chat/Messages/ContentRenderer.svelte:70-119