菜单

Markdown 渲染流程

相关源文件

目的与范围

本文档描述了 Markdown Here 扩展中的 Markdown 渲染管道。该管道负责将电子邮件编辑器中的原始 Markdown 内容转换为格式化的 HTML,反之亦然。它解释了 Markdown 如何在您的电子邮件撰写窗口中渲染成精美 HTML 的过程流、关键组件和技术实现细节。

有关 Markdown 切换功能如何在不同平台工作的更多信息,请参阅Markdown 切换功能。有关 HTML 如何转换回 Markdown 的详细信息,请参阅HTML 到 Markdown 转换

流水线概览

Markdown 渲染管道将用户编写的 Markdown 语法转换为格式正确且样式化的 HTML,适用于电子邮件客户端和其他撰写环境。该过程包括检测要渲染的内容、解析 Markdown、对代码块应用语法高亮、渲染数学表达式(如果启用),并仔细保留原始内容以备后续“取消渲染”。

来源: src/common/markdown-here.js570-646 src/common/markdown-render.js28-101

渲染过程详解

当用户触发 Markdown Here 切换操作时,渲染过程开始。让我们详细了解每个阶段。

1. 输入检测与初始化

当用户触发 Markdown 切换时,系统首先通过检查选区或光标位置中是否存在现有的 Markdown Here 包装器来确定是渲染还是取消渲染内容。

来源: src/common/markdown-here.js570-646 src/common/markdown-here.js60-106 src/common/markdown-here.js410-427

2. Markdown 到 HTML 的转换

从 Markdown 到 HTML 的核心转换由 markdownRender 函数处理,该函数使用 marked.js 库处理原始 Markdown。

来源: src/common/markdown-render.js28-101 src/common/marked.js1153-1229

3. 包装与原始内容保留

该管道的一个关键方面是保留原始 Markdown 内容,以便后续能够取消渲染。这通过创建一个包含 base64 编码的原始内容的隐藏元素的包装器结构来实现。

来源: src/common/markdown-here.js483-534 src/common/utils.js542-547

4. 样式处理

电子邮件客户端通常会删除外部样式块,因此 Markdown Here 会显式地将样式应用于元素以确保正确渲染。

来源: src/common/markdown-here.js280-336 src/common/default.css1-202

取消渲染过程

当用户再次切换时,取消渲染过程会将已渲染内容转换回其原始 Markdown 形式。

来源: src/common/markdown-here.js536-552 src/common/markdown-here.js359-394

关键组件及其作用

下表列出了 Markdown 渲染管道的关键组件及其职责

组件文件职责
markdownHeremarkdown-here.js入口点函数,用于确定是渲染还是取消渲染内容
renderMarkdownmarkdown-here.js协调渲染过程,包括包装和样式处理
unrenderMarkdownmarkdown-here.js提取并恢复原始 Markdown 内容
markdownRendermarkdown-render.js使用 marked.js 将 Markdown 转换为 HTML 的核心函数
makeStylesExplicitmarkdown-here.js通过将样式移至行内来确保样式得以保留
markedmarked.js将 Markdown 解析为 HTML 的第三方库

来源: src/common/markdown-here.js483-534 src/common/markdown-render.js28-101 src/common/markdown-here.js536-552

详细数据流

下图展示了从输入到最终输出的完整渲染管道中的数据流

来源: src/common/markdown-here.js483-534 src/common/markdown-render.js28-101 src/common/markdown-here.js536-552

扩展点和配置选项

渲染管道可以通过多个影响输出的配置选项进行自定义

用户偏好

传递给 markdownRenderuserprefs 对象控制着渲染的各个方面

偏好设置描述默认
math-enabled启用 LaTeX 数学渲染false
math-value数学渲染模板可变
header-anchors-enabled为标题添加锚点链接false
gfm-line-breaks-enabled启用 GitHub 风格的 Markdown 换行符true

渲染器自定义

marked.js 渲染器经过定制以提供额外功能

  1. 自定义标题渲染以添加锚点链接
  2. 自定义链接渲染以修复缺少协议的 URL
  3. 智能箭头和排版转换

来源: src/common/markdown-render.js28-101 src/common/test/markdown-render-test.js18-183

错误处理

该管道包含多项安全措施以优雅地处理错误

  1. 安全检查以清理 HTML 并防止 XSS 攻击
  2. 内容修改检测,用于在用户修改已渲染内容时发出警告
  3. 突变观察器以检测已渲染内容的变化

来源: src/common/markdown-here.js515-530 src/common/markdown-here.js611-626 src/common/utils.js75-107

性能考量

多项优化确保了渲染管道的良好性能

  1. 仅渲染所选内容
  2. 渲染引擎的按需加载(延迟加载)
  3. 对已渲染内容进行缓存以备后续取消渲染
  4. 高效的样式应用以避免重复解析样式表

来源: src/common/markdown-here.js280-336 src/common/markdown-here.js121-167

浏览器兼容性

渲染管道旨在跨多个浏览器和电子邮件客户端工作,并针对客户端特定问题提供了解决方案

  1. 对 Gmail 和其他客户端中的 iframe 进行特殊处理
  2. 在不同浏览器环境中检测选区
  3. 对不具备某些 JavaScript API 的平台提供回退方案

来源: src/common/markdown-here.js60-106 src/common/utils.js124-157