本页介绍了适用于 Firefox 和 Thunderbird 的 Markdown Here 扩展的结构和实现。它涵盖了该扩展如何使用基于 XUL 的技术与这些 Mozilla 应用程序集成、涉及的关键文件以及它们如何相互作用以提供核心功能。有关 Chrome 扩展结构的信息,请参阅 Chrome 扩展结构。
Markdown Here 为 Firefox 和 Thunderbird 使用了传统的基于 XUL (XML 用户界面语言) 的扩展结构,这与 Chrome 扩展模型显著不同。在 WebExtensions 成为主流之前,这种架构是 Mozilla 应用程序的标准方法。
来源:src/chrome.manifest src/firefox/chrome/content/ff-overlay.js src/firefox/chrome/content/ff-overlay.xul src/firefox/chrome/content/tb-overlay.xul
chrome.manifest 文件是核心配置文件,它决定了扩展如何与浏览器/邮件客户端集成。它定义了
content markdown_here firefox/chrome/content/
skin markdown_here classic/1.0 firefox/chrome/skin/
locale markdown_here en firefox/chrome/locale/en/
resource markdown_here_common common/
这些映射创建了扩展可以访问的 chrome:// URL。resource 映射尤为重要,因为它允许访问共享代码。
# Firefox
overlay chrome://browser/content/browser.xul chrome://markdown_here/content/ff-overlay.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
# Thunderbird
overlay chrome://messenger/content/messengercompose/messengercompose.xul chrome://markdown_here/content/tb-overlay.xul application={3550f703-e582-4d05-9a08-453d09bdfdc6}
这些声明告诉浏览器将哪些 XUL 文件覆盖到特定的应用程序窗口上。应用程序 ID 确保覆盖只在适当的应用程序中加载。
Firefox/Thunderbird 扩展使用以下目录结构
此结构遵循 Mozilla 传统的扩展布局,为内容(JavaScript 和 XUL)、皮肤(CSS)和本地化(国际化)设置了单独的目录。
来源:src/chrome.manifest src/firefox/chrome/content/ff-overlay.js
XUL 覆盖是 Markdown Here 与 Firefox 和 Thunderbird 用户界面集成的方式。
Firefox 覆盖添加了
来源:src/firefox/chrome/content/ff-overlay.xul11-30
Thunderbird 覆盖添加了
来源:src/firefox/chrome/content/tb-overlay.xul10-31
ff-overlay.js 文件包含了 Firefox 和 Thunderbird 的核心功能。它创建了一个 markdown_here 对象来处理所有扩展操作。
来源:src/firefox/chrome/content/ff-overlay.js15-496
扩展加载时,它使用 Mozilla 脚本加载器导入所需的模块
这种机制通过从 chrome.manifest 中映射的 resource://markdown_here_common/ URL 加载,实现了 Chrome、Firefox 和 Thunderbird 扩展之间的代码共享。
来源:src/firefox/chrome/content/ff-overlay.js102-125
该扩展处理各种事件
| 事件 | 处理器 | 目的 |
|---|---|---|
| 上下文菜单点击 | onMenuItemCommand() | 处理来自上下文菜单的 Markdown 切换 |
| 工具栏按钮点击 | onToolbarButtonCommand() | 处理来自工具栏的 Markdown 切换 |
| 上下文菜单显示 | contextMenuShowing() | 控制上下文菜单项的可见性 |
| 焦点变化 | focusChange() | 根据当前元素更新按钮状态 |
| 快捷键按下 | 动态创建的处理程序 | 处理键盘快捷键 |
来源:src/firefox/chrome/content/ff-overlay.js31-79 src/firefox/chrome/content/ff-overlay.js228-357
markdownRender 函数处理从 Markdown 到 HTML 的实际转换
此函数
MarkdownRender 模块渲染 Markdown来源:src/firefox/chrome/content/ff-overlay.js272-286
该扩展包含了针对 Thunderbird 的特殊处理
这段代码检查扩展是否在 Thunderbird 中运行并验证
来源:src/firefox/chrome/content/ff-overlay.js40-55
此功能检查用户是否正在发送包含未渲染 Markdown 的电子邮件,并提示他们确认或返回渲染。
来源:src/firefox/chrome/content/ff-overlay.js169-224
该扩展动态管理按钮状态
此函数
来源:src/firefox/chrome/content/ff-overlay.js295-324
该扩展使用平台特定的 CSS 文件对 UI 元素应用 CSS 样式,并根据不同操作系统进行条件加载
# Linux
style chrome://markdown_here/content/ff-overlay.xul chrome://markdown_here/skin/toolbar-linux.css os=Linux
style chrome://markdown_here/content/tb-overlay.xul chrome://markdown_here/skin/toolbar-linux.css os=Linux
# OS X
style chrome://markdown_here/content/ff-overlay.xul chrome://markdown_here/skin/toolbar-osx.css os=Darwin
style chrome://markdown_here/content/tb-overlay.xul chrome://markdown_here/skin/toolbar-osx.css os=Darwin
# Windows
style chrome://markdown_here/content/ff-overlay.xul chrome://markdown_here/skin/toolbar-windows.css os=WINNT
style chrome://markdown_here/content/tb-overlay.xul chrome://markdown_here/skin/toolbar-windows.css os=WINNT
toolbar.css 文件为所有 UI 元素提供了详细的样式,包括适用于 Retina 显示器的高 DPI (2dppx) 版本。
来源:src/chrome.manifest40-50 src/firefox/chrome/skin/toolbar.css1-151
此图显示了 Firefox 或 Thunderbird 启动时扩展的加载方式
来源:src/firefox/chrome/content/ff-overlay.js498-507 src/chrome.manifest24-30
传统的基于 XUL 的扩展(如 Markdown Here 的 Firefox/Thunderbird 实现)与现代 WebExtension 模型显著不同
| 功能 | XUL 扩展 | WebExtension |
|---|---|---|
| UI 集成 | 通过 XUL 覆盖实现深度集成 | 限于浏览器操作、页面操作和上下文菜单 |
| 权限 | 完全访问浏览器 API | 受限于明确的权限 |
| 跨浏览器 | Mozilla 专用 | 适用于 Chrome、Firefox、Edge |
| 文件结构 | chrome.manifest + XUL 文件 | manifest.json + HTML/JS/CSS |
| 脚本加载 | scriptLoader.loadSubScript | import/require 或后台脚本 |
| DOM 访问 | 直接访问浏览器 DOM | 内容脚本,访问受限 |
现代 Firefox 已基本弃用 XUL 扩展,转而支持 WebExtensions,但 Thunderbird 仍支持此模型以实现更深度的集成。
来源:src/firefox/chrome/content/ff-overlay.js15-26 src/chrome/backgroundscript.js11-15
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(a7dd5c)