菜单

忘记渲染检查

相关源文件

“忘记渲染检查”是 Markdown Here 中的一项安全功能,可防止用户意外发送包含未渲染 Markdown 文本的电子邮件。此功能监控电子邮件撰写区域,检测看起来是 Markdown 的内容,并拦截发送操作以显示确认提示,从而允许用户选择返回并渲染其内容或按原样发送。

概述与架构

“忘记渲染检查”通过对活动撰写区域进行基于间隔的监控来运行。配置后,系统会扫描 Markdown 模式,并在检测到它们时设置用于发送操作的事件拦截器。当用户尝试发送包含似乎是未渲染 Markdown 的电子邮件时,系统会显示一个模态提示,询问他们是否打算在发送前渲染内容。

忘记渲染系统流程

来源:src/common/common-logic.js143-468 src/chrome/contentscript.js232-265 src/firefox/chrome/content/ff-overlay.js168-225

检测算法

“忘记渲染检查”使用模式识别来确定内容是否看起来是 Markdown。这有助于防止用户意外发送原始 Markdown 而不是渲染后的内容。

Markdown 检测规则

probablyWritingMarkdown 函数分析文本内容中的常见 Markdown 语法模式。

模式示例检测规则
项目符号列表* 项目 1
* 项目 2
多行以 *+- 开头,后跟空格。
代码块代码存在反引号字符
数学表达式$公式$被美元符号包围的文本
加粗**粗体**__粗体__双星号或双下划线
## 标题
标题
------
行以 2-6 个井号开头或以 5 个以上破折号/等号下划线。
链接<FileRef file-url="https://github.com/adam-p/markdown-here/blob/a7dd5c56/text" undefined file-path="text">Hii</FileRef>存在 ](]<FileRef file-url="https://github.com/adam-p/markdown-here/blob/a7dd5c56/ 模式

组件集成

来源:src/common/common-logic.js143-169 src/common/common-logic.js235-318

实现细节

设置和初始化

扩展加载时,它会根据用户偏好初始化“忘记渲染检查”功能。在 Chrome/Chromium 浏览器中,这发生在内容脚本的间隔检查中。在 Firefox/Thunderbird 中,它在叠加脚本的 onLoad 函数中初始化。

初始化期间的关键步骤是:

  1. 检查用户偏好中是否启用该功能
  2. 验证当前编辑器是否兼容(基于 HTML,而非纯文本)
  3. 设置一个每 2 秒运行一次的周期性间隔检查

来源:src/firefox/chrome/content/ff-overlay.js169-225 src/chrome/contentscript.js234-265

事件拦截

系统会拦截这些发送操作:

  1. 按钮点击:直接点击“发送”按钮
  2. 发送按钮的键盘快捷键:当发送按钮获得焦点时按 Enter 或 Space
  3. 全局发送快捷键:在撰写区域内按 Ctrl+Enter 或 ⌘+Enter

拦截通过向相应元素添加事件监听器实现,在事件到达 Gmail/电子邮件客户端处理程序之前捕获事件,并在必要时阻止事件传播。

来源:src/common/common-logic.js235-318 src/common/common-logic.js428-468

提示界面

在发送尝试期间检测到未渲染的 Markdown 时,扩展程序会显示一个模态对话框,要求用户确认其操作。此对话框根据浏览器以不同的方式实现:

  1. Firefox/Thunderbird:通过 openDialog 使用 XUL 对话框
  2. Chrome/Chromium 浏览器:使用注入到页面中的基于 HTML 的模态对话框

两种实现都提供相同基本功能:

  • 一条警告消息,解释检测到 Markdown 内容
  • 两个按钮:“返回撰写”和“仍要发送”
  • 键盘处理,用于 Escape(取消)、Tab(切换焦点)和 Enter/Space(激活按钮)

HTML 提示包含使背景变暗、模态居中以及提供警告视觉强调的样式。

来源:src/common/common-logic.js428-468 src/common/forgot-to-render-prompt.html1-140

特定平台实现

Gmail/Chrome 实现

在 Chrome 浏览器中使用 Gmail 时,系统使用 DOM 选择器查找发送按钮。

[role="button"][tabindex="1"]

它添加了带有 capture: true 的事件监听器,以便在事件到达 Gmail 处理程序之前捕获它们。系统使用直接注入到页面 DOM 中的基于 CSS 的提示。

来源:src/common/common-logic.js130-138 src/chrome/contentscript.js256-263

Firefox/Thunderbird 实现

对于 Thunderbird,实现使用 compose-send-message 事件。

提示使用 Thunderbird 的原生对话框系统显示。

来源:src/firefox/chrome/content/ff-overlay.js169-225 src/common/common-logic.js439-454

Fastmail 支持

系统还包含对 Fastmail 的特定支持,使用不同的选择器来识别发送按钮。

[class~="s-send"]

来源:src/common/common-logic.js133-135

性能考量

几项优化确保“忘记渲染检查”不会影响浏览器性能:

  1. 缓存:系统将元素标记为“已监视”以避免重复设置。
  2. 提前终止:Markdown 检测算法在第一次匹配时停止。
  3. 文本截断:对于大型电子邮件,只检查前 10,000 个字符。
  4. 节流:间隔检查每 2 秒运行一次,而不是持续运行。

来源:src/common/common-logic.js143-177 src/common/common-logic.js346-348 src/chrome/contentscript.js265

配置

用户可以通过扩展的选项页面启用或禁用“忘记渲染检查”。该设置作为 forgot-to-render-check-enabled 存储在用户偏好中。

禁用时,间隔检查会提前退出,并且不会设置任何事件拦截器。

来源:src/firefox/chrome/content/ff-overlay.js169-172 src/common/common-logic.js144-146