思源笔记 v2.11.3 深度解读:按元素类型精准搜索替换、模板函数扩展与新内核 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)v2.11.3 版本发布说明(v2.11.3_zh_CN.md)为骨架,系统梳理该版本的核心改进与修复内容,并逐条对照当前仓库源码给出实现层面的佐证。读完本文,你将掌握该版本"搜索替换按元素类型精准控制"这一标志性能力的完整使用方式、四种新模板函数的计算语义,以及getTailChildBlocks、addVirtualBlockRefInclude/Exclude等新内核 API 的入参与调用约定,可直接用于日常笔记维护与插件开发。
版本总览与亮点
v2.11.3 处于思源笔记 2.8.4~2.12.8 版本演进区间内,属于该区间接近收尾的维护版本,重点围绕编辑器体验、搜索替换精度、知识库数据一致性与开发接口补齐展开。依据发布说明内"功能特性早鸟价将于 2024 年 1 月初结束"的提示可以推断,该版本发布于 2023 年末前后。
整体改进可归纳为四条主线:
- 搜索替换精细化:新增"替换类型"选择能力,可把替换范围精确限定到普通文本、行级公式、链接锚文本等特定元素;
- 内容管理与呈现:文档题头图可显示链接地址、CSS/JS 代码片段支持一键全部启用或禁用;
- 数据一致性与稳定性:删除文档时同步清理数据库 attributes 表数据,并修复多处解析、拖拽与滚动问题;
- 开发者能力开放:新增
/api/block/getTailChildBlocks、虚拟引用管理 API、WebSocketsetConf推送事件,并大幅增强数据库表格视图的编辑与排序能力。
核心亮点:搜索替换支持按元素类型精准控制
发布说明中明确把该版本的第一卖点描述为"搜索替换支持选择元素类型,比如可以仅替换纯文本中的内容而不替换公式内容",对应社区工单 搜索替换支持选择元素类型 #9895。
从"整块替换"到"按元素替换"
在早期版本中,全局搜索替换的粒度通常是"块"一级,勾选的是搜索范围(如是否命中段落、标题、代码块等);而像"正文中的一个加粗词"这类行内元素级内容,替换时容易被连带误伤——例如把公式中的某个变量也一并改掉。v2.11.3 引入的替换类型机制,把目标细化到了 Markdown 行内语法层级。
从当前前端源码 app/src/search/menu.ts 可以看到,替换面板通过replaceFilterMenu渲染一组独立开关,并把勾选结果写入搜索配置的replaceTypes字段;而zh-CN.json语言文件中完整的键定义则给出了这套"元素类型"清单:
| 类型键 | 中文含义 | 类型键 | 中文含义 |
|---|---|---|---|
text | 普通文本 | blockRef | 引用锚文本 |
imgText | 图片提示文本 | fileAnnotationRef | PDF 标注锚文本 |
imgTitle | 图片标题 | kbd | 键盘 |
imgSrc | 图片链接 | mark | 高亮 |
aText | 链接锚文本 | s | 删除 |
aTitle | 链接标题 | sub | 下标 |
aHref | 链接地址 | sup | 上标 |
code | 行级代码 | tag | 标签 |
em | 斜体 | u | 下划线 |
strong | 粗体 | docTitle | 文档标题 |
inlineMath | 行级公式 | codeBlock | 代码块 |
inlineMemo | 行级备注 | mathBlock | 公式块 |
htmlBlock | HTML 块 |
(完整定义见 app/appearance/langs/zh-CN.json。)
典型操作场景
发布说明举例的场景即可用上述开关直观复现:
- 只想改正文文字、不碰公式:执行替换前,在"替换类型"弹层中仅保留"普通文本",取消勾选"行级公式""公式块",替换操作便不会波及
$...$数学公式内容; - 只想批量修正失效链接:仅勾选"链接地址"(
aHref),即可在不动锚文本的情况下统一替换 URL 前缀; - 精确替换特定格式:例如把全文所有斜体的某个词改为普通文本,可只勾选"斜体"(
em)。
该机制与搜索面板原本的"搜索类型"过滤配合使用:前者决定"搜到哪些块",后者决定"块内具体改哪些元素"。搜索类型菜单在 app/src/search/menu.ts 中还以parentSubtypes建立了父子层级联动(父类型勾选时同步影响其子类型)。两者共同存放在页签搜索配置的replaceTypes/types字段中,切换页签或重新打开面板时可保持一致。
文档题头图支持显示链接地址
发布说明中另一项呈现层改进是"文档题头图支持显示链接地址"(工单 #9850)。在文档设置中为文档配置题头图(封面)后,现在可以直接看到题头图所引用的资源链接,便于确认图片来源、排查失效图片或在多个文档间复用同一张封面,而无需再到资源文件中逐一核对。
CSS / JS 代码片段:一键全部启用或禁用
此前用户只能逐条开关代码片段,当启用了几十条第三方外观 / JS 片段导致界面异常时,排查成本较高。v2.11.3 起(工单 #9860)支持对全部 CSS 与 JS 代码片段一键启用或禁用,方便快速定位问题片段:
- 进入
设置 → 外观 → 代码片段; - 在"自定义 CSS"或"自定义 JS"分组中使用顶部的全局开关,一键放行或屏蔽该分组内所有片段;
- 片段变更会立即重新推送生效,无需重启内核。
从内核实现看,片段配置对象由conf.Snpt承载,设置接口在写入model.Conf.Snippet并调用model.Conf.Save()持久化后,会通过model.PushReloadSnippet(snippet)将新配置热推送给编辑器渲染层,相关逻辑见 kernel/api/setting.go。因此"一键启用/禁用"本质上是批量改写配置后触发的一次全局重载,响应即时且不会中断内核服务。
删除文档后清理数据库 attributes 记录
为保持属性(Attribute)数据一致性,该版本修复了文档删除后其关联的属性残留问题(工单 #9875):删除文档时,数据库中该文档对应的 attributes 表记录会同步清除。这一改动避免了在数据库视图中出现指向已删除文档的"孤儿"属性,降低数据表体积并防止属性视图关联异常。
闪卡间隔重复:支持Space/Enter快捷评分
闪卡(间隔重复)模块新增键盘操作支持:在复习答题并完成自我评分前的确认环节,可直接按Space或Enter选择"良好"评分(工单 #9878)。相比在按钮上点击鼠标,双手不离键盘的评分流程更适合快速刷卡场景;同时保持原有评分选项不变,习惯鼠标操作的用户不受影响。
网页剪藏与代码块转换改进
该版本改进了网页剪藏的代码块转换逻辑(工单 #9896)。剪藏工具在前端抓取网页时,对于以<pre><code>等结构呈现的代码区域,现在能更可靠地转换为思源的原生代码块,减少转换后代码换行丢失、语言标注缺失或误转为普通段落的情况。配合剪藏后进入编辑器校对,可显著降低手动整理成本。
模板函数扩展:pow、powf、log、logf
v2.11.3 为模板引擎新增四个数学运算函数(工单 #9911 的BuiltInTemplateFuncs内:
ret["pow"] = pow ret["powf"] = powf ret["log"] = log ret["logf"] = logf其具体计算语义见同文件 kernel/filesys/template.go:
func pow(a, b any) int64 { return int64(math.Pow(cast.ToFloat64(a), cast.ToFloat64(b))) } func powf(a, b any) float64 { return math.Pow(cast.ToFloat64(a), cast.ToFloat64(b)) } func log(a, b any) int64 { return int64(math.Log(cast.ToFloat64(a)) / math.Log(cast.ToFloat64(b))) } func logf(a, b any) float64 { return math.Log(cast.ToFloat64(a)) / math.Log(cast.ToFloat64(b)) }使用要点:
pow(a, b)返回a的b次幂,结果按整数返回(int64,会截断小数);powf返回浮点结果,适合需要精确保留小数的场景;log(a, b)与logf(a, b)实现的是ln(a)/ln(b),即以 b 为底求 a 的对数:log(8, 2)将返回 3;logf保留浮点精度;- 参数类型在 Go 侧通过
cast.ToFloat64统一转换,因此模板中传入字符串形式的数值(如从配置或文档属性读取的值)也能参与运算; - 模板函数整体基于 sprig 函数库构建,这四个新函数可直接与原有函数(如
add、mul、round等)组合嵌套使用。
模板代码示例(作用在某文档模板中输出换底对数与幂结果):
计算前,base={{ .HPath }} 无关 {{/* 仅作演示:求 2 的 10 次幂 */}} 结果1 = {{ pow 2 10 }} {{/* 以 2 为底求 1024 的对数 */}} 结果2 = {{ log 1024 2 }}面向开发者的能力升级
新内核 API:/api/block/getTailChildBlocks
为满足"获取某块末尾若干子块"的高频需求(常用于面板联动与自动化脚本),该版本新增内部内核 API/api/block/getTailChildBlocks(工单 #9884,请求与返回结构为:
{ "id": "20230405172236-pg3l9eu", "n": 7 }id:文档或块的 ID,格式须通过util.InvalidIDPattern校验;n:需要取回的末尾子块数量,可选;当缺省或小于 1 时,服务端默认按7处理;- 返回:
model.GetTailChildBlocks(id, n)的计算结果,即按文档树顺序截取的最后n个ChildBlock对象。
具体数据层实现见 kernel/model/block.go 的GetTailChildBlocks,它在子块列表就绪的前提下直接切片取尾部,因此开销较小,适合在页签加载、浮窗预览等场景中快速取得"最近几个子块"。
虚拟引用白名单 / 黑名单 API
对应工单 #9909,新增两个成对的管理接口,用于控制虚拟引用(Virtual Block Reference)的候选生成范围:
/api/setting/addVirtualBlockRefInclude:把关键词加入白名单,虚拟引用只对命中白名单的内容生效;/api/setting/addVirtualBlockRefExclude:把关键词加入黑名单,命中黑名单的内容不再生成虚拟引用。
两个接口的请求体一致,均以数组形式提交关键词:
{ "keywords": ["Python", "Golang"] }处理器实现见 kernel/api/setting.go:解析keywords数组后分别调用model.AddVirtualBlockRefInclude(keywords)/model.AddVirtualBlockRefExclude(keywords),随后通过util.BroadcastByType("main", "setConf", 0, "", model.Conf)向所有客户端广播最新的setConf事件。数据层在 kernel/model/virutalref.go 中维护黑白名单,并统一调用ResetVirtualBlockRefCache()使已生成的虚拟引用缓存失效、随后由内核任务队列异步重建(kernel/model/virutalref.go)。
WebSocketmain通道推送setConf事件
配合上述 API,v2.11.3 明确将setConf定义为 WebSocketmain通道的标准推送事件(工单 #9910)等接口复用。
数据库表格视图能力增强
开发者条目中对数据库表格视图(Attribute View / 表视图)投入了明显资源,包括:
- 降低编辑延迟(#9306):优化单元格编辑的渲染链路,减少输入时的卡顿与同步等待;
- 单元格级剪贴板操作(#9886):单元格选中后支持复制、剪切、粘贴与删除,批量整理数据不再依赖逐格手工编辑;
- 模板列引用日期列(#9887):模板列(模板函数列)内可引用同行的日期类型列参与计算与格式化输出;
- 主键列可修改绑定块(#9892):允许重新指定主键列绑定的文档块,修复了主键一旦绑定便难以调整的限制;
- 新增行自动带入过滤值(#9905):在表格视图处于过滤状态下新增行时,新行会自动填充当前过滤条件对应的取值,减少重复录入;
- 模板列排序改进(#9914):修正模板列参与排序时的取值与稳定性问题。
其他开发向改进
- 改进布局保存机制(#9866):优化工作区布局(页签、停靠面板等)的持久化与恢复策略,减少异常退出导致的布局丢失。
缺陷修复一览
本节汇总 v2.11.3 中修复的主要问题,供遇到同类现象的读者对照验证:
| 问题描述 | 工单 |
|---|---|
| "启动时关闭所有页签"设置在 APP 伺服桌面端浏览器访问时失效 | #9855 |
| 段落包含空白行时回车解析异常 | #9868 |
| 在非 Windows 端创建文档异常 | #9890 |
| 删除或添加块导致编辑器滚动位置跳动 | #9891 |
| 从超级块拖拽出内容后再次拖拽时内容消失 | #9900 |
其中"段落包含空白行时回车解析异常"属于编辑器解析层问题,涉及块级解析对空白行的容忍度;"删除或添加块导致编辑器滚动"则直接关系到长文档编辑体验,二者修复后可显著降低日常写作中的异常打断概率。另外两项体验类修复为:移动端补全了缺失的"上移"按钮(#9882),以及修复 Windows 下面包屑无法显示下划线字符_的问题(#9893);iPhone 端文档树展开时高亮错位亦一并修复(#9904)。
升级与验证建议
- 核对版本:升级到 v2.11.3 后,可在"设置 → 关于"中确认版本号,并建议先用测试工作区验证关键流程;
- 验证替换精度:新建包含行内公式、加粗、链接与普通文本的测试文档,用"替换类型"仅勾选"普通文本"执行一次替换,确认公式与链接锚文本未被误改后再应用到真实笔记库;
- 开发者联调:插件或脚本若需读取文档末尾子块或调整虚拟引用范围,可先以本仓库源码为参照,用上述请求样例在开发环境直接调用
getTailChildBlocks与两个虚拟引用管理接口,观察返回结构与setConf推送是否符合预期。
本版本完整变更清单可查阅仓库内原始发布说明 v2.11.3_zh_CN.md;各功能的实现与配置入口则集中在 kernel/api、kernel/model、kernel/filesys/template.go 与 app/src/search/menu.ts 等文件中,可作为继续深入阅读的起点。
【免费下载链接】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),仅供参考