☰
思源笔记 v3.1.22 发布解析:行级标记开关、粘贴体验与插件 API 的细节进化
2026/10/6 12:22:16 网站建设 项目流程

思源笔记 v3.1.22 发布解析:行级标记开关、粘贴体验与插件 API 的细节进化

【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan

本篇文章基于思源笔记(SiYuan)开源仓库中 v3.1.22 版本的官方变更记录(v3.1.22.md)展开,逐一解读该版本在编辑器、粘贴、界面、同步与开发者 API 方面的改进,并结合仓库源码剖析各项改动的实现原理与配置方式。读完本文,你将理解==高亮==行级标记的开关机制、虚拟引用与本地文件链接粘贴的细节优化、数据库日期相对过滤的用法,以及protyleSlash.callback新增nodeElement参数对插件开发者的意义。

版本概述:一次面向细节的打磨

v3.1.22 是思源笔记 v3.1.x 系列中的一个细节改进版本,官方概述仅用一句话概括:"此版本改进了一些细节。"(This version improves some details.)但这并不意味着内容单薄——本版本共包含 10 项改进功能和 1 项开发者 API 变更,覆盖了编辑器输入、粘贴处理、界面交互、同步兼容性、数据库查询等多个核心模块。从仓库的发布节奏看,v3.1.x 系列在持续进行高频率的体验打磨,v3.1.22 正是其中聚焦"编辑器体验与数据进出兼容性"的一次集中迭代。

一、编辑器改进:行级标记语法开关与聚焦定位

1. 支持禁用==foo==行级标记语法

这是本版本最值得关注的编辑器改动之一(对应 issue 13868)。在 Markdown 体系中,==foo==用于表示行内高亮(mark),此前思源默认解析该语法;但部分用户的输入内容(尤其是代码片段、数学文本或外部复制内容)中包含连续等号,容易被误解析为高亮标记,造成显示与预期不符。

本版本在编辑器设置中新增了独立的开关项。从源码可以看到该开关的注册位置在 editorTab.ts:

group.switch("editor.markdown.inlineMark", { title: window.siyuan.languages.editorMarkdownInlineMark, desc: window.siyuan.languages.editorMarkdownInlineMarkTip, });

该开关位于"Markdown 行级语法"配置分组下,与之并列的还有行内斜体*、行内下划线_、行内上标、行内下标、行内标签、行内数学、行内删除线等开关(见 editorTab.ts)。其配置项在类型定义中声明为布尔值(config.d.ts):

inlineMark: boolean;

该配置最终会传导到 Lute(思源内核使用的 Markdown 解析引擎)的解析行为中。在编辑器渲染初始化时,setLute.ts 会执行:

lute.SetMark(window.siyuan.config.editor.markdown.inlineMark);

同样,在粘贴内容解析时,paste.ts 也会同步应用该开关:

protyle.lute.SetMark(window.siyuan.config.editor.markdown.inlineMark);

配置路径:设置 → 编辑器 → Markdown → 行级语法 → 高亮(Mark)。关闭后,==foo==将按普通文本显示,不再渲染为高亮。该开关同时作用于实时渲染与粘贴解析两个环节,确保行为一致。

2. 改进退出聚焦定位(issue 14056)

在编辑器中,当用户通过快捷键或点击操作使光标退出某个块的编辑状态时,聚焦位置的准确性直接影响后续输入与键盘导航。本版本优化了"退出聚焦"场景下的光标落点定位,减少退出后焦点丢失或跳转到非预期位置的情况。这类改进通常涉及 WYSIWYG 编辑器对focus、range与块边界处理的协调,位于编辑器内核层(protyle 目录),属于编辑器可用性的基础体验优化。

3. 改进文本外观设置(issue 14019)

"文本外观"相关设置在本版本中得到增强。思源的文本外观设置涉及编辑器内文字颜色、背景色、粗体、斜体等行级样式的自定义,对应的设置项定义于编辑器配置类型中(config.d.ts 附近可见字体、字号等外观相关字段)。本次改进让外观设置的即时生效与撤销行为更加准确,具体表现为修改设置后编辑器内的实时预览与实际渲染结果保持一致。

二、粘贴体验优化:虚拟引用与本地文件链接

1. 改进虚拟引用内容粘贴(issue 14035)

虚拟引用(Virtual Reference)是思源的特色双向链接机制,允许在不显式创建链接的情况下通过关键词关联到目标文档。此前从虚拟引用处复制内容进行粘贴时,可能出现链接上下文丢失或内容格式异常。本版本针对虚拟引用内容的粘贴流程进行了专门优化。从类型定义可见,虚拟引用的行为受多项开关控制(config.d.ts),包括virtualRefAlias(虚拟引用别名)、virtualRefAnchor(锚文本)、virtualRefDoc(文档名)、virtualRefName(引用名称)等。本次粘贴改进确保了复制虚拟引用内容后,粘贴结果能正确保留引用语义或按预期转换为纯文本。

2. 改进本地文件链接粘贴(issue 14076)

在思源中,用户常通过拖拽或复制粘贴将本地文件引入文档资产目录。此前粘贴本地文件链接时,可能因路径处理不当导致资源引用失效。本版本优化了本地文件链接粘贴时的路径识别与资源处理逻辑,让从文件管理器复制路径、再粘贴进编辑器生成合法链接的操作更加顺畅。该能力与仓库中的资产(Asset)管理与路径处理模块(asset 目录与 path.go)密切相关,粘贴时会经过链接识别与资源落库两个环节,本次改进主要作用于识别环节的兼容性。

三、界面交互:停靠面板、搜索预览与浏览器兼容

1. 改进停靠面板弹出(issue 13938)

思源的左右侧停靠面板(Dock)支持多种弹出方式,例如鼠标悬停自动展开、点击钉住等。本版本改进了停靠面板的弹出行为,重点优化了面板弹出时的位置计算与动画过渡,避免面板弹出时遮挡编辑器关键内容或出现跳动。停靠面板的配置模型位于 config.d.ts(dock 相关配置、是否钉住 dock、dock 标签页数据与尺寸),本次改进主要落在前端交互层(layout 目录),不影响配置结构。

2. 改进块自定义属性搜索预览区域定位(issue 14061)

在块自定义属性(Custom Attribute)中,如果属性值本身是关键词,思源会在属性面板中提供"搜索预览"能力,即预览该属性值在文档中对应的内容区域。本版本修正了搜索预览区域的位置计算,使预览弹层准确指向目标块,避免在长文档或滚动状态下定位偏移。这一交互由属性视图相关模块承载,属于块级元数据(IAL,即 inline attribute list)功能链路的界面优化。

3. 改进 Firefox 兼容性(issue 13967)

本版本专门针对 Firefox(火狐)浏览器进行了兼容性修复。思源的 Web 端在 Firefox 中可能存在的差异点包括:contenteditable选区行为、剪贴板事件处理、以及部分 CSS 属性(如user-select、滚动容器行为)的解析差异。此次改进让 Firefox 用户在使用思源 Web 端(app/appearance/boot/index.html引导入口)时获得与 Chromium 内核浏览器更一致的编辑体验。这类兼容性修复通常不会改变配置与数据格式,属于纯前端适配。

四、数据库能力:日期字段相对过滤(issue 14058)

思源数据库(数据库/属性视图)中的日期字段支持在筛选器中按"相对时间"进行过滤,例如"最近 7 天""本月""过去一年"等动态范围。本版本改进了日期字段相对过滤(relative between filter)的边界计算,修复了跨月、跨年场景下相对区间首尾日期计算不准确的问题。

从仓库结构看,数据库筛选逻辑实现在内核侧(filter.go 与 calc_template.go),日期相对过滤涉及"今天"作为基准的动态重算:每次查询时以当前时间点为锚,将相对条件(如between today-7d and today)展开为绝对时间范围。前端则通过 av.go 暴露查询接口。改进后,日期字段的相对过滤在"上周""本月""今年"等边界场景下能正确包含首尾日期,避免遗漏当天或跨期数据。使用方式:在数据库视图的日期列筛选器中,选择"介于"并切换为相对时间模式即可。

五、同步兼容性:修复部分 S3 提供商不可用(issue 14053)

思源自 2.x 时代起就支持通过 S3 协议将数据同步到兼容的对象存储(如 MinIO、Cloudflare R2、Backblaze B2 以及各类国产对象存储)。本版本修复了"某些 S3 提供商不可用"的问题,属于同步链路的兼容性改进。

S3 同步的配置模型定义于内核配置文件中(sync.go),字段相当完整:

type S3 struct { Endpoint string `json:"endpoint"` // 服务端点 AccessKey string `json:"accessKey"` // Access Key SecretKey string `json:"secretKey"` // Secret Key Bucket string `json:"bucket"` // 存储空间 Region string `json:"region"` // 存储区域 PathStyle bool `json:"pathStyle"` // 是否使用路径风格 SkipTlsVerify bool `json:"skipTlsVerify"` // 是否跳过 TLS 验证 Timeout int `json:"timeout"` // 超时时间,单位:秒 ConcurrentReqs int `json:"concurrentReqs"` // 并发请求数 }

其中pathStyle(路径风格)与region(区域)是各提供商兼容性的关键差异点:

  • 路径风格(Path-Style):部分对象存储(如 MinIO 及多数自建存储)要求使用https://endpoint/bucket/key形式的路径风格寻址,而 AWS S3 等则默认使用虚拟主机风格https://bucket.endpoint/key。若提供商要求路径风格而配置未开启,就会导致请求失败——这正是"某些 S3 提供商不可用"的常见根因之一;
  • Region 区域:部分提供商对 region 字段有严格校验,留空或填写不支持的 region 会导致签名失败;
  • SkipTlsVerify:使用自签名证书的私有对象存储需要开启此项。

思源将同步提供商建模为枚举常量(sync.go):ProviderSiYuan = 0(思源官方云)、ProviderS3 = 2(S3 协议对象存储)、ProviderWebDAV = 3、ProviderLocal = 4。S3 配置的导入导出与设置接口分别位于 sync.go(setSyncProviderS3、importSyncProviderS3、exportSyncProviderS3),路由注册于 router.go。

排障建议:若在 v3.1.22 之后仍遇到 S3 同步失败,可依次检查——① 提供商要求的是路径风格还是虚拟主机风格;② region 是否需要填写;③ 自签名证书场景下是否启用了跳过 TLS 验证;④ 时间戳是否与服务器偏差过大(S3 签名依赖时间)。v3.1.22 的修复正是针对上述参数在部分提供商上的处理差异。

六、开发者 API:protyleSlash.callback新增nodeElement参数(issue 14036)

这是本版本对插件开发者最直接的利好。思源的插件系统允许插件注册自定义的斜杠菜单(Slash Menu)项,此前protyleSlash项的callback只接收protyle实例。从 v3.1.22 起,callback新增了第二个参数nodeElement,即当前光标所处的块节点(HTMLElement)。

插件系统中protyleSlash的类型定义位于 plugin/index.ts:

public protyleSlash: { filter: string[], html: string, id: string, callback: (protyle: import("../protyle").Protyle, nodeElement: HTMLElement) => void }[] = [];

在斜杠菜单项被触发时,编辑器核心会解析出插件、斜杠项 ID 并调用回调,同时把光标所在的块节点作为第二个参数传入(hint/index.ts):

} else if (value.startsWith("plugin")) { protyle.app.plugins.find((plugin) => { const ids = value.split(Constants.ZWSP); if (ids[1] === plugin.name) { plugin.protyleSlash.find((slash) => { if (slash.id === ids[2]) { slash.callback(protyle.getInstance(), nodeElement); return true; } }); return true; } }); }

对插件开发者的意义:此前插件回调若想操作当前块,需要通过protyle.wysiwyg.element.querySelector或范围计算自行查找,代码繁琐且容易在嵌套块中出错。现在直接通过nodeElement即可拿到块节点,并进一步通过getAttribute("data-node-id")获取块 ID、通过outerHTML读取块内容。示例回调如下:

plugin.protyleSlash.push({ id: "my-slash-item", filter: ["示例"], html: '<div class="b3-list-item__first"><span class="b3-list-item__text">插入示例文本</span></div>', callback: (protyle, nodeElement) => { // nodeElement 即当前光标所在块节点 const blockId = nodeElement.getAttribute("data-node-id"); console.log("当前块 ID:", blockId, "块 HTML:", nodeElement.outerHTML); } });

值得注意的是,protyleSlash.callback由插件通过plugin.protyleSlash.push(...)注册(该类型定义位于 plugin/index.ts),而编辑器核心在 hint/index.ts 中统一调度。两者协同构成了斜杠菜单的插件扩展链路,nodeElement的加入让这条链路对插件而言更加完整可用。

七、如何获取与验证 v3.1.22

v3.1.22 的变更记录以三种语言维护在仓库中:英文版 v3.1.22.md、简体中文版 v3.1.22_zh_CN.md、繁体中文版 v3.1.22_zh_CHT.md。升级后可通过以下路径快速验证各项改动:

  1. 行级标记开关:设置 → 编辑器 → Markdown → 行级语法,关闭"高亮"后输入==test==,应显示为普通文本而非高亮;
  2. 虚拟引用粘贴:在文档 A 中复制包含虚拟引用的内容,粘贴到文档 B,观察引用内容是否保持预期格式;
  3. 本地文件链接粘贴:从系统文件管理器复制本地文件路径,粘贴到思源编辑器,应生成可用的文件链接;
  4. S3 同步:在设置 → 同步中检查 S3 提供商配置,无法连接时重点核对路径风格与 Region;
  5. 插件回调:在插件中注册protyleSlash并打印nodeElement,确认能正确获取光标所在块节点。

总结

思源笔记 v3.1.22 是一次典型的"细节打磨型"版本:编辑器侧新增了==高亮==行级标记开关并优化了退出聚焦定位;粘贴侧提升了虚拟引用与本地文件链接的处理质量;界面侧改进了停靠面板弹出、自定义属性搜索预览定位与 Firefox 兼容性;数据库侧修正了日期字段相对过滤的边界计算;同步侧修复了部分 S3 提供商不可用的问题;最后通过protyleSlash.callback新增nodeElement参数,为插件开发者提供了更便利的块级操作入口。对于普通用户,升级本版本即可获得更顺滑的输入与粘贴体验;对于插件开发者,nodeElement参数的引入值得立即跟进适配。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询