SiYuan v2.10.11 版本技术变更详解:字体变量、工作区命名限制、Pandoc 路径初始化与数据库视图能力升级
【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
本文以 SiYuan(思源笔记)v2.10.11 的官方变更日志为主体,完整覆盖该版本的全部 Enhancement、Bugfix 与 Development 条目,并结合当前仓库中的 Go 内核源码与前端主题样式,深入讲解每一项变更背后的实现机制,帮助开发者理解 SiYuan 在编辑器排版、工作区管理、导出管线与插件沙箱等环节的真实实现方式。
版本概览
v2.10.11 是一个以缺陷修复为主、兼具多项编辑器与数据库(Database)体验增强的维护版本,官方建议升级。原文档还附带了一条商业化说明:PRO Features当时处于早鸟价格阶段,且年度Subscription已包含 Pro 功能,年度订阅用户无需单独购买 PRO Features。以下各节按技术主题对变更日志中的全部条目进行继承与展开。
编辑器排版:--b3-font-family字体变量体系
v2.10.11 的排版增强包含三条紧密相关的条目:
- 数学块与嵌入(embed)块编辑时使用固定宽度字体(issue #9406);
- 为
<kbd>元素的 font-family 追加--b3-font-family(issue #9412); - 为
.b3-menu__accelerator(菜单快捷键提示)的 font-family 追加--b3-font-family(issue #9439)。
这三处修改都落在 SiYuan 的主题 CSS 变量体系内。从源码结构看,主题样式文件 theme.css 定义了一整套排版变量:
--b3-font-family: "Emojis Additional", "Emojis Reset", BlinkMacSystemFont, Helvetica, "Luxi Sans", "DejaVu Sans", arial, sans-serif, emojis; --b3-font-family-protyle: var(--b3-font-family); --b3-font-family-code: "Emojis Additional", "Emojis Reset", "JetBrainsMono-Regular", mononoki, Consolas, "Liberation Mono", var(--b3-font-family); --b3-font-family-graph: arial; --b3-font-family-emoji: "Emojis Additional", emojis; --b3-font-family-math: KaTeX_Math; --b3-font-family-kbd: var(--b3-font-family-protyle);可以看到 SiYuan 用变量名区分了正文(protyle)、代码、图谱(graph)、表情、数学(math)与键盘按键(kbd)等不同渲染场景。--b3-font-family-kbd: var(--b3-font-family-protyle)这一条正是本版本"为<kbd>元素追加--b3-font-family"的落点:键盘按键样式最终继承正文变量,从而随用户选定的字体(如 appearance/fonts 中可选的 JetBrains Mono、LXGW 文楷、Noto 等字体包)联动。数学块使用--b3-font-family-math: KaTeX_Math则对应 KaTeX 渲染字体;而本版本将数学与 embed 块编辑态切换为固定宽度字体(即--b3-font-family-code一类的等宽栈),目的是在编辑过程中减少因字符宽度变化导致的行内跳动。深色主题 midnight/theme.css 中存在对称定义,修改会同时覆盖两套内置主题。
工作区命名限制调整为 32 个 rune
变更日志中"Adjust workspace name length limit to 32 runes"(issue #9440)对应内核侧的校验逻辑。在 isInvalidWorkspacePath 中可以看到完整校验链:
func isInvalidWorkspacePath(absPath string) bool { if "" == absPath { return true } name := filepath.Base(absPath) if "" == name { return true } if strings.HasPrefix(name, ".") { return true } if !gulu.File.IsValidFilename(name) { return true } if 32 < utf8.RuneCountInString(name) { // Adjust workspace name length limit to 32 runes https://github.com/siyuan-note/siyuan/issues/9440 return true } toLower := strings.ToLower(name) return gulu.Str.Contains(toLower, []string{"conf", "home", "data", "temp"}) }这里有一个值得注意的细节:限制使用的是utf8.RuneCountInString而非字节长度,即 32 的计数单位是 Unicode 字符(rune)。这意味着中文工作区名可以取 32 个汉字,而不是被字节长度压缩到约 10 个字符;源码注释也直接标注了对应的 issue 编号,体现了 SiYuan 变更日志与代码的逐条对应关系。该校验同时拒绝以.开头的隐藏目录、非法文件名字符,以及名称中包含conf、home、data、temp的目录,避免工作区路径与内核自身的数据目录冲突。
插件加载与 Bazaar 信任机制
"Don't load plugin when the user hasn't agreed to trust bazaar content yet"(issue #9426)是一项安全边界调整:用户在未明确信任 Bazaar(插件市场)内容之前,内核不启动任何插件。从源码结构看,这一约束由Conf.Bazaar.Trust配置项统一把关,例如 PluginManager.Start:
if model.Conf.Bazaar.PetalDisabled || !model.Conf.Bazaar.Trust { logging.LogInfof("kernel plugins are disabled by configuration, skipping start") return }同样的判断也出现在 model/plugin.go 的插件加载入口与 api/setting.go 的设置接口中,即信任开关在模型层、API 层与管理器层三处共同生效,用户同意前插件进程(worker)根本不会被拉起。配合PetalDisabled全局禁用项,可以推断 SiYuan 将"市场内容信任"视为插件供应链的第一道门禁。
Pandoc 二进制路径设置改进
"Improve pandoc binary path setting"(issue #9427)对应导出管线中 Pandoc 的初始化逻辑。核心实现在 InitPandoc,其初始化优先级如下:
- 资源文件探测:先在
pandoc-resources/、再在pandoc/pandoc-resources/下查找 Docx 模板pandoc-template.docx与颜色过滤器pandoc_color_filter.lua(仓库内可见 pandoc-resources 目录); - 自定义路径优先:若工作区
conf.json的export.pandocBin指向一个不属于临时目录(strings.HasPrefix(customPandocBinPath, tempPandocDir)判断)且能成功执行pandoc --version的可执行文件,则直接采用用户自定义的二进制,并跳过内置解压流程; - 内置二进制:按操作系统与架构(Windows amd64 / Darwin / Linux amd64)定位
<temp>/pandoc/bin/pandoc; - 兜底解压:内置二进制不存在时,按平台从
pandoc-<os>-<arch>.zip(仓库提供 pandoc-linux-amd64.zip 等五平台压缩包)解压到临时目录,在 macOS/Linux 上执行chmod +x后再验证版本。
用户侧的自定义入口是导出配置项PandocBin,定义于 conf/export.go(JSON 键pandocBin),实际导出时由 ExportPandocConvertZipWithOptions 等函数以exec.Command(Conf.Export.PandocBin, args...)调用。本版本的"改进"正是让这套"自定义 → 内置 → 解压兜底"的路径探测更稳健,避免用户设置了自定义 pandoc 后仍被内置版本覆盖或反复解压。
数据库(Database)视图能力增强
v2.10.11 的 Development 条目绝大多数围绕 SiYuan 的数据库块(Attribute View,即"数据库")展开,完整继承如下:
- 修改数据库模板列的自定义属性动作(#9401);
- 点击数据库资产列中的 PDF 资产时在右侧打开(#9402);
- 改进数据库模板编辑(#9404);
- 数据库模板列支持数字计算(#9408);
- 数据库模板列支持数字过滤(#9414);
- 数据库块加载动画(#9416);
- 数据库表格视图支持方向键/Esc 选择单元格/行(#9417);
- 改进数据库 UI,并为文本、模板、数字、日期、创建时间与更新时间列添加复制按钮(#9418);
- 支持搜索数据库视图内容(#9419);
- 改进数据库表格视图行菜单属性(#9420)、改进行交互(#9421);
- 点击模板单元格修改模板(#9423);
- 修复数据库表格视图导出时 select 列内容不显示的问题(#9428)。
这些功能在内核侧有对应的分层实现可以印证:列值的取值、计算与过滤逻辑集中在 kernel/av(calc.go、filter.go、value.go等),不同布局的渲染分别位于 layout_table.go、layout_kanban.go、layout_gallery.go;SQL 层的表视图查询在 sql/av_table.go,模板与列定义则经由 attribute_view.go 管理。从源码结构看,"模板列支持数字计算与数字过滤"依赖av/calc.go对模板列求值结果的类型判定,"支持搜索数据库视图内容"则可推断是扩展了 sql/av.go 中视图内容检索对模板列渲染值的覆盖。资产列点击 PDF 在右侧打开,则与 api/av.go 中资产预览接口的前端联动相关。
其他增强与缺陷修复
其余 Enhancement 条目完整继承如下,并附源码印证:
- macOS 桌面应用图标改进(#9403):桌面端图标资源由 app/appearance/icons 与 Electron 打包配置(electron-builder.yml)共同提供;
- 只读文档下引用右键菜单不显示 backlink 与 graph(#9409):引用菜单项的可见性受文档只读状态约束;
- 大纲支持 Ctrl+Click 聚焦打开(#9410):大纲面板的标题定位行为增强;
- PDF 大纲遮挡编辑器选中文本工具栏(#9415):PDF 预览大纲层与选区工具栏的层级冲突修复;
- 移动端使用 ref 时隐藏文本工具栏(#9431):移动布局(app/src/mobile)下的工具栏显隐策略;
- 选中图片后 Ctrl+X 应剪切图片而非整个块(#9433):块编辑器(app/src/protyle)中图片选区优先于块选区的剪切语义修正;
- *PDF 批注中清空链接锚点时将文本置为,并新增"转为文本"菜单(#9443)。
Bugfix 条目逐条如下:
- 以新窗口打开的 PDF 再次打开时应跳回该窗口(#9405):PDF 打开行为受单窗口策略约束,model/pdf.go 负责 PDF 的打开与标注管理;
- 点击表格块空白处粘贴文本抛异常(#9411);
- 部分系统上 SVG 图片无法显示(#9413);
- 打开无标注的 PDF 文件时出错(#9425);
- iPad 上不显示访问授权码设置项(#9432);
- 标题块折叠状态(super block)叠加使用时,展开标题导致内容重复(#9435)。
小结
v2.10.11 是一个典型的 SiYuan 维护版本:以字体变量、工作区命名(32 rune 上限,见 workspace.go 的 rune 计数)、Pandoc 路径初始化(见 pandoc.go 的三级探测)与 Bazaar 信任门禁(见 plugin/manager.go)等源码可见的调整印证了日志中每一项变更;同时,大量 Development 条目集中投入数据库块的模板列计算、过滤、搜索与表格视图交互,奠定了后续版本 Attribute View 能力的基础。对于自托管部署的用户,升级此版本可同步获得上述全部修复与增强。
【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考