本文档描述了 Joplin 的 Markdown 编辑器实现,该实现为桌面和移动平台提供了核心笔记编辑体验。Markdown 编辑器允许用户以 Markdown 格式编写笔记,支持语法高亮、格式化工具和实时预览。有关富文本编辑器的信息,请参阅 富文本编辑器。
Joplin 使用 CodeMirror 实现 Markdown 编辑器,这是一个浏览器中通用的文本编辑器。该编辑器旁边有一个笔记查看器组件,可实时渲染 Markdown 内容。桌面和移动平台的实现方式有所不同。
该编辑器支持语法高亮、Markdown 格式化命令、搜索功能和插件扩展。
来源
编辑器实现围绕几个关键组件构建:
CodeMirrorControl:一个核心类,提供 CodeMirror 功能的高级 API,负责处理命令、事件和状态管理。
createEditor():一个工厂函数,用于初始化新的 CodeMirror 编辑器实例,并带有 Joplin 特定的扩展和配置。
EditorSettings:一个配置接口,用于定义编辑器的行为、外观和功能。
EditorCommandType:一个枚举,列出所有支持的编辑器命令,用于格式化、导航和内容操作。
NoteBody 组件:特定于平台的 React 组件,将编辑器集成到 Joplin 的 UI 中。
来源
桌面端实现将 CodeMirror 直接集成到 React 组件树中。主要组件包括:
CodeMirror.tsx:主要的 React 组件,将编辑器和查看器并排渲染,处理状态管理以及与应用程序其余部分的集成。
Editor.tsx:一个内部组件,用于创建和配置 CodeMirror 编辑器实例。
桌面端实现的关键特性包括:
来源
移动端实现使用 WebView 加载 CodeMirror,并通过自定义消息传递系统处理 React Native 层和 WebView 之间的通信。
NoteEditor.tsx:一个 React Native 组件,负责创建 WebView 并将 CodeMirror 加载到其中。
CodeMirror.ts:一个脚本,用于在 WebView 中初始化 CodeMirror 并设置与 React Native 层的通信。
移动端实现的关键方面:
来源
编辑器提供了一系列丰富的命令来操作文本和格式化 Markdown 内容。这些命令在 EditorCommandType 枚举中定义,并在 editorCommands 模块中实现。
主要命令类别包括:
文本格式化
编辑与导航。
查找与替换。
命令系统允许通过多种来源触发命令:
来源
编辑器提供搜索功能,包括编辑器内搜索和与 Joplin 全局搜索系统的集成。
搜索实现的关键特性:
来源
编辑器通过内容脚本系统支持插件,允许扩展编辑器的功能。
插件系统支持:
来源
编辑器与渲染 Markdown 内容为 HTML 的查看器组件协同工作。这两个组件同步以提供分屏编辑体验。
来源
编辑器与 Joplin 的命令系统集成,以响应来自各种来源的用户操作。
execCommand 方法路由到编辑器。来源
Markdown 编辑器的核心是与 CodeMirror 的集成,它提供了文本编辑功能。集成包括:
为了兼容 CodeMirror 5,还有一个 CodeMirror5Emulation 层,它在 CodeMirror 6 之上提供了类似于 CodeMirror 5 的 API,从而简化了版本之间的迁移。
来源
移动端实现由于 React Native 环境而面临独特的挑战。关键的实现细节包括:
来源
编辑器使用事件系统来沟通更改和用户交互。
关键事件类型包括:
来源
该编辑器可通过 EditorSettings 接口进行高度配置,该接口控制着编辑器的行为和外观的各个方面。
| 设置 | 描述 | 默认 |
|---|---|---|
language | 编辑器语言(Markdown 或 HTML) | Markdown |
readOnly | 编辑器是否处于只读模式 | false |
themeData | 主题信息,包括颜色和字体 | 基于 Joplin 主题 |
keymap | 键盘映射风格(Default, Vim, Emacs) | 默认 |
automatchBraces | 自动补全匹配的括号 | true |
spellcheckEnabled | 启用拼写检查 | 基于设置 |
markdownMarkEnabled | 启用 Markdown 标记语法支持 | 基于设置 |
katexEnabled | 启用 KaTeX 数学语法支持 | 基于设置 |
来源
此配置系统允许跨平台提供一致的编辑体验,同时也适应平台特定的需求和用户偏好。