Tolaria v2026-06-01 版本解析:笔记 PDF 导出、代码块语言扩展与数学公式编辑升级
【免费下载链接】tolariaDesktop app to manage markdown knowledge bases项目地址: https://gitcode.com/GitHub_Trending/to/tolaria
本篇围绕 Tolaria 的 v2026-06-01 发布说明 展开,完整覆盖该版本的全部功能、改进与稳定性修复,并结合开源仓库中的 ADR 决策记录与源码实现,讲清“笔记导出为 PDF”在 Tauri 桌面端与浏览器模式下的分平台执行路径、“更多代码块语言”背后的 Shiki 惰性注册机制,以及数学公式源编辑、外部编辑刷新等修复项的底层依据。读完本篇,你可以复现 PDF 导出的完整调用链、理解代码块语言目录的别名归一化规则,并掌握各平台能力探测与降级策略。
版本总览
v2026-06-01 是 Tolaria(一个管理 Markdown 知识库的桌面应用)面向 stable 频道的一次常规迭代,发布说明将变更分为四类:
- 新特性:笔记直接导出为 PDF(release 构建携带原生桌面导出路径);富文本编辑器代码块支持更多语言(shell、配置、基础设施与脚本格式)。
- 改进:可编辑的数学公式源面板(双击渲染后的 display 公式即可编辑底层公式源,而不会把公式退化成普通 Markdown 文本);公式编辑交互更干净;AI 工作区内部编排逻辑更聚焦。
- 稳定性与修复:外部编辑后活动笔记刷新更可靠;Windows 上 npm 启动的 agent 命令 shim 处理更稳;PDF 导出、display 公式编辑、KaTeX 源选择、AI 工作区标题持久化与 Tauri 监听器清理在晋级 stable 前经过加固;stable 频道的签名与产物工作流收紧,确保可按预期发布 macOS、Windows、Linux 三平台安装包。
下面逐项结合仓库源码展开。
新特性一:笔记导出为 PDF
产品行为与平台差异
发布说明强调“release 构建携带原生桌面导出路径”,其具体含义在 ADR-0136 中有完整决策记录:第一版 PDF 导出复用了 Tauri 的 webview 打印命令,在 macOS 上会弹出完整的打印机对话框,不符合“导出笔记为 PDF”的产品预期——用户应当直接选择文件系统保存位置并得到 PDF 文件。
因此该版本确立了分平台策略:
- macOS:走 WebKit/AppKit 的直存 PDF 路径,弹出的是“另存为”对话框而非打印机对话框;
- Windows、Linux 及浏览器(开发)模式:保留原生打印对话框回退,因为尚没有对应的平台级直存实现。
关键设计约束是:Tolaria 不引入第二套 Markdown 到 PDF 的渲染器,而是直接复用编辑器里已经渲染好的 BlockNote DOM。ADR 中明确说明,应用打印专用 CSS 后,公式、Mermaid、图片、代码块、表格、链接和自定义块都走用户在编辑器里看到的同一渲染路径,避免双渲染器带来的漂移。
渲染端的导出准备流程
ADR-0136 将导出准备职责划分给渲染端,具体四步:
- 退出 raw/diff 模式,确保导出的是富文本渲染结果;
- 给
<body>打上 PDF 导出专用样式类; - 向用户询问一个
.pdf目标路径; - 调用原生命令
export_current_webview_pdf。
这条链路在 src/utils/notePdfExport.ts 中有完整实现,入口函数是printActiveNoteAsPdf(L163-L203),其执行顺序为:
- 能力探测优先:
resolvePdfExport在 Tauri 环境下调用resolveNativePdfExport(L129-L150),先invoke原生命令can_export_current_webview_pdf判断当前窗口是否支持直存 PDF。只有探测通过才会弹出保存对话框——这正是 ADR 里“不支持的平台不会询问一个无法使用的保存位置”的落地。非 Tauri(浏览器/开发)环境则直接解析到window.print()。 - 文件名规整:保存对话框通过
@tauri-apps/plugin-dialog的save打开,过滤器限定pdf扩展名;ensurePdfExtension保证结果以.pdf结尾。默认文件名由notePdfExportFilename生成(L100-L103):先去掉html?/markdown/md后缀,再按码点过滤控制字符与<>:"/\|?*等不安全字符,空名回退为Untitled Note.pdf。 - 样式类与清理:导出前给 body 添加
tolaria-note-pdf-exporting类(常量NOTE_PDF_EXPORT_CLASS),等待两帧requestAnimationFrame让打印样式生效后再执行导出。schedulePrintModeCleanup通过afterprint事件加 30 秒兜底定时器双保险移除该样式类,避免打印模式样式泄漏到正常编辑视图。 - 可观测性与降级:开始/失败都会上报产品分析事件(
trackNotePdfExportStarted、trackNotePdfExportFailed),失败原因区分export_unavailable与export_error;完全无可用导出通道时抛出NotePdfExportUnavailableError。所有依赖(dialog、invoke)均为动态import,不进入主包关键路径。
原生端:命令与平台降级
Rust 侧在 src-tauri/src/commands/pdf_export.rs 中注册了两个命令:export_current_webview_pdf与can_export_current_webview_pdf,并在 lib.rs 的 command 列表中统一注册(与print_current_webview并列)。当前源码中该模块的默认实现返回“直存 PDF 不可用,请走原生打印对话框”的错误和false能力标志——从源码结构看,这是非 macOS 目标构建下的安全降级形态,与 ADR 中“其余平台保留打印对话框回退”的结论一致;macOS 构建则通过 ADR 所述的方式引入objc2、objc2-app-kit、objc2-foundation、objc2-web-kit依赖,直接向WKWebView请求 WebKit 感知的NSPrintOperation保存 PDF,而不新增独立 PDF 渲染引擎。
ADR 同时约束了后果:这些 macOS 专属依赖必须保持 target 限定,保证 Linux/Windows 构建不会编译 AppKit 相关 crate;且导出产物继续复用富文本编辑器的正文提取逻辑,frontmatter 保持被排除。
新特性二:代码块支持更多语言
背景:BlockNote 捆绑高亮器的覆盖缺口
Tolaria 富编辑器的围栏代码高亮由@blocknote/code-block提供(见 package.json 依赖及patches/@blocknote__code-block@0.46.2.patch补丁)。ADR-0134 记录了动机:BlockNote 捆绑的高亮器已覆盖编辑器菜单中常见的 Web 与系统语言,但不含 PowerShell、VBScript、Dart、Dockerfile、Terraform/HCL、TOML 等常见 Shiki 语法。用户期望powershell、ps1、vb、vbscript这类围栏能够高亮、在语言选择器中呈现有效状态,并稳定地序列化回 Markdown 围栏。
ADR 对比了三个选项后选择保留 BlockNote 的代码块集成,同时按需直接、惰性地注册缺失的@shikijs/langs语法:既不改 BlockNote 的 schema 与解析路径,又只引入用户真正需要的语法模块。
语言目录与别名归一化
新增语言清单集中在 src/utils/codeBlockLanguageCatalog.ts 的EXTRA_CODE_BLOCK_LANGUAGES常量中,每项含id、显示名与别名数组:
| 语言 id | 显示名 | 别名(围栏写法) |
|---|---|---|
powershell | PowerShell | powershell、ps、ps1 |
vbscript | VBScript | vbscript、vbs、vb、vba、visual-basic、visualbasic |
dart | Dart | dart |
groovy | Groovy | groovy |
matlab | MATLAB | matlab |
perl | Perl | perl、pl、pm |
elixir | Elixir | elixir、ex、exs |
erlang | Erlang | erlang、erl |
fsharp | F# | fsharp、f#、fs |
clojure | Clojure | clojure、clj |
asm | Assembly | asm、assembly |
zig | Zig | zig |
hcl | HCL | hcl |
terraform | Terraform | terraform、tf、tfvars |
dockerfile | Dockerfile | dockerfile、docker |
batch | Batch | batch、bat、cmd |
diff | Diff | diff、patch |
ini | INI | ini、properties |
toml | TOML | toml |
此外还单独导出了GO_CODE_BLOCK_LANGUAGE(go/golang)。目录构建了一个别名到规范 id 的Map(L38-L52),canonicalKnownCodeBlockLanguage对输入做trim().toLowerCase()后查表,把ps1、vb等导入时的别名归一到选择器中的规范语言;归一化入口在 src/utils/codeBlockLanguage.ts,配套测试 src/utils/codeBlockLanguage.test.ts 覆盖别名解析行为。
惰性注册与失败安全
按 ADR-0134 的分工:
- src/components/codeBlockOptions.ts 仍是 BlockNote 高亮器配置的 owner,只有当某个匹配的围栏或选择器值需要高亮时,才从
@shikijs/langs直接导入对应的语法模块——这就是“direct, lazy registrations”的实现形态(@shikijs/langs在 package.json 中固定为 3.23.0); - 语言选择器由 src/components/codeBlockLanguageControls.tsx 消费目录数据,编辑器集成点见 src/hooks/editorBlockResolution.ts;
- 失败安全是明确保证:不支持的围栏别名不会报错或吞掉内容,而是“安全地停留在普通显式围栏名”上,即保留原始语言名作为纯文本围栏。
ADR 也留了后手:如果将来需要生成语言包、导出时高亮或显著精简菜单,该决策应被自定义 Shiki 打包方案取代。
改进:数学公式源编辑与 AI 工作区
发布说明的 Improvements 部分有两条与公式编辑直接相关:
- 可编辑数学源面板:双击渲染后的 display 公式,即可在编辑器面板中编辑底层公式源,而不会把公式块降级为普通 Markdown 文本。这延续了 ADR-0082 确立的“Markdown 持久化数学笔记”模型——公式在文件中始终是
$$...$$这类可回读的源,渲染只是展示层;package.json 中的katex依赖支撑渲染,remark-gfm与react-markdown参与 raw 路径的展示。 - 更干净的公式编辑 UX:选中的公式源文本在编辑面板中保持可读,聚焦面板不再叠加“双重 active 边框”处理。
Stability 一节进一步说明“KaTeX 源选择”在晋级 stable 前经过加固,即上述源选择/编辑路径的边界行为(选中态、光标、渲染一致性)在发布前被系统性修正。
AI 工作区的改进则是纯内部重构:共享会话与编排逻辑被整理得更干净,同时保留既有的侧边栏面板行为——对用户可见行为不变,降低后续扩展 AI 会话管理的成本。
稳定性与修复
- 外部编辑后活动笔记刷新更可靠:对应 ADR-0135 的主题——当文件被外部修改时,活动笔记应刷新到最新内容,同时“干净的”编辑状态(如尚未产生脏改动的缓冲区)不被无谓打扰。
- Windows 命令 shim 更稳:npm 方式启动的 agent 命令在 Windows 上依赖
.cmd/shim 形态可执行文件,本版本对该路径的处理更稳,减少 CLI agent 检测与拉起失败。 - 晋级前的集中加固:PDF 导出、display 公式编辑、KaTeX 源选择、AI 工作区标题持久化、Tauri 监听器清理五项在发布 stable 前完成加固。其中 Tauri 监听器清理对应本版本对事件订阅生命周期的收口,避免组件卸载后监听器残留。
- stable 发布流水线收紧:stable 频道的签名与产物工作流被强化,确保能按预期产出 macOS、Windows、Linux 三平台安装包。频道与特性开关的背景可参阅 release-channels 参考文档;ADR 目录中 0057 与 0066 分别定义了 alpha/stable 频道模型与日历版本号规则,本版本文件名
v2026-06-01.md即遵循后者以发布日期命名。
相关仓库入口
- 发布说明:release-notes/v2026-06-01.md
- PDF 导出决策与实现:docs/adr/0136-macos-webview-pdf-export.md、src/utils/notePdfExport.ts、src-tauri/src/commands/pdf_export.rs、src-tauri/src/commands/runtime.rs(
print_current_webview打印回退) - 代码块语言:docs/adr/0134-direct-shiki-language-registrations.md、src/utils/codeBlockLanguageCatalog.ts、src/utils/codeBlockLanguage.ts、src/components/codeBlockOptions.ts
- 数学与刷新修复背景:docs/adr/0082-markdown-durable-math-notes.md、docs/adr/0135-clean-active-note-refresh-after-external-edit.md
总体而言,v2026-06-01 的价值不在单点功能,而在它展示的一套工程纪律:新能力(PDF 导出、语言扩展)都先落 ADR 明确平台边界与失败安全,渲染端做能力探测再降级到既有通道,稳定性项在晋级 stable 前集中加固,再配合收紧的签名与产物流水线发布到三个平台。
【免费下载链接】tolariaDesktop app to manage markdown knowledge bases项目地址: https://gitcode.com/GitHub_Trending/to/tolaria
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考