
SiYuan v2.10.2 版本技术解析资源文件内容搜索修复、PDF 解析提速与内核 API 扩展【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuanv2.10.2 是 SiYuan思源笔记在 2.8.4 至 2.12.8 演进线中的一个以资源文件Asset内容检索与解析为主题的稳定版本它集中修复了资源文件内容搜索相关的索引与解析问题并显著优化了大型 PDF 资源文件的文本解析性能同时面向桌面端用户与插件/内核开发者带来了一批编辑体验改进与 API、事件总线扩展。阅读本文后你将了解该版本在资源内容索引边界编码、页数、大小上的设计取舍、PDF 并行解析的实现原理、新增内核 API 的调用方式以及插件侧新增的类型与事件便于评估升级影响或直接基于新能力开发。版本概览与主题定位根据官方变更日志 v2.10.2.md另有简体中文版 v2.10.2_zh_CN.md 与繁体中文版 v2.10.2_zh_CHT.md本版本核心围绕两条主线修复资源文件内容搜索相关问题——包括若干索引异常issue #9045、非 UTF-8 文本文件与超大 PDF 不再纳入索引#9052、#9053优化 PDF 资源文件的解析性能——通过工作线程池并行抽取各页文本PR #9051并改进 PDF 矩形标注的复制PR #9061。需要提醒的是官方变更日志同时说明搜索资源文件内容特性属于付费会员功能处于早鸟价阶段。这意味着本章涉及的内容索引/搜索链路在生产使用中存在权益门槛但其索引构建与解析逻辑在仓库中均有完整开源实现可供学习。资源文件内容搜索边界条件与底层实现资源文件内容搜索指的是对文档中所挂载的文本类、PDF、EPUB 等资源内容建立文本索引并支持全文检索的能力。本版本在解析边界上做了两处明确收紧其实现事实可直接在 kernel/model/asset_content.go 中验证。非 UTF-8 编码文本文件不再纳入索引在TxtAssetParser.Parse()中解析器先校验文件大小上限再调用os.ReadFile读取临时副本随后通过utf8.Valid(data)判断内容是否为合法 UTF-8若不合法则记录告警日志并返回空结果if !utf8.Valid(data) { // Non-UTF-8 encoded text files are not included in asset file content searching logging.LogWarnf(text asset [%s] is not UTF-8 encoded, absPath) return }对应变更日志条目为非 UTF-8 编码的文本文件不再纳入资源文件内容搜索#9052。这一收紧的动机很直接非 UTF-8如 GBK、UTF-16内容的切分、检索与高亮定位存在歧义纳入索引反而可能产生错误的命中结果。PDF 页数与体积限制超过 1024 页不再纳入同一文件中定义了三项核心常量asset_content.go 第 513–520 行const ( TxtAssetContentMaxSize 1024 * 1024 * 4 // 文本资源最大 4MB PDFAssetContentMaxPage 1024 // PDF 最大解析页数 ) var ( PDFAssetContentMaxSize uint64 1024 * 1024 * 128 // PDF 最大 128MB )在PdfAssetParser.Parse()中先用 pdfium 获取总页数再判断是否超过 1024 页if PDFAssetContentMaxPage pc.PageCount { // PDF files longer than 1024 pages are not included in asset file content searching logging.LogWarnf(ignore large PDF asset [%s] with [%d] pages, absPath, pc.PageCount) return }此外PDF 体积上限还允许通过环境变量SIYUAN_PDF_ASSET_CONTENT_INDEX_MAX_SIZE单位字节在运行时覆盖PDFAssetContentMaxSize便于有特殊需求的部署方放宽约束。移动端容器则直接跳过 PDF 内容搜索util.IsMobileContainer()时返回。PDF 解析性能优化worker pool 并行抽文大型 PDF 解析的卡顿主要来自逐页顺序调用 pdfium WebAssembly 抽取文本。本版本PR #9051将解析改造为有界工作线程池并行模式pdfPage表示一个待抽取页页号 PDF 文档字节数据的任务pdfTextResult表示该页的抽取结果页号 文本 错误getTextPageWorker()是每个 worker 的执行体通过 pdfium 打开文档、按页索引GetPageText抽文、关闭文档并把结果写入 result channelParse()中依据min(runtime.NumCPU(), 4)初始化 pdfium WebAssembly 实例池以显式限制内存占用随后把 PDF 数据在内存中共享给各 worker goroutine 使用。从源码结构可以推断这种页级任务拆分 受限并发的设计兼顾了两点既能利用多核加快整份 PDF 的文本抽取又通过把并发数上限钳制在 4 来避免海量页面同时加载导致的内存峰值。该文件同时维护了.txt、.pdf、.epub三类解析器AssetParser接口 Parse方法方便后续继续扩展资源类型。编辑器与桌面端体验增强本版本在改进功能Enhancement维度共有 12 项其中相当一部分面向日常写作与桌面端交互变更说明相关源码/依据代码块支持 hlsl 语法高亮#8431代码块语言列表中加入 HLSL着色器语言支持app/src/constants.ts 语言常量表及注释中可见 hlsl 等第三方语言的收录位置设置搜索支持空格分隔#9007设置界面搜索项可按空格分词命中多个关键词配置/搜索相关实现支持输入公式块#9015增加全角作为公式块输入的触发标记与$$并列编辑器输入监听CtrlW 后不再显示浮窗#9018关闭标签页后避免残留内容浮窗干扰布局/标签页关闭逻辑AI 配置项不再限制最大 Token 数#9023移除 AI 对话配置中最大 Token 数的上限约束交由用户自定义AI 配置项聚焦后部分场景 CtrlZ 退出聚焦#9041图片等对象放大/聚焦后撤销CtrlZ行为与聚焦状态联动编辑器按键处理主菜单快捷入口 Alt\ 与方向键选择#9055桌面端主菜单支持 Alt\ 唤出并可用方向键在菜单项间移动桌面端菜单实现代码块与行级代码 Tab 显示宽度调整为 4 空格#9056统一 Tab 键在代码中的视觉宽度为 4 个空格渲染样式/CSS表格中添加多个资源文件时自动换行#9058连续插入多资源时列表自动换行避免溢出表格单元格渲染改进 PDF 矩形标注复制PR #9061复制 PDF 矩形标注rect annotation时内容更准确PDF 标注剪贴板处理以上条目均以官方变更日志为准其中 hlsl 语言收录可对照 app/src/constants.ts 中代码语言常量列表定位。缺陷修复要点Bugfix 共 7 项主要覆盖块级编辑与文档定位右击公式块不弹出菜单#9020修复公式块上右键菜单缺失的问题涉及菜单触发区域的块类型判定代码块导出图片时行号错位#9029修复代码块导出为图片时行号与代码行对齐偏移滚动位置的块不存在时无法打开文档#9030当文档树中记录的滚动锚点块已被删除时改为安全降级而非拒绝打开任务列表下存在标题块时优化排版异常#9035修复优化排版在任务列表 标题组合结构下的异常修复一些资源文件内容搜索索引问题#9045本版本资源内容索引相关的综合修复对应上文所述AssetParser/SQL 查询链路的边界调整粘贴行级公式后输入中文标点符号重复#9054修复行级公式inline-math粘贴后紧接着输入中文标点被重复输出文档分屏后编辑光标位置切换错误#9063同一文档在分屏标签中编辑时光标在多个编辑器实例间错误跳转的问题。其中第 3、7 两项均与文档分屏/滚动定位链路相关改动集中在编辑器滚动保存与恢复逻辑可对照 app/src/protyle/scroll/saveScroll.ts 等文件理解现有机制。面向开发者的内核 API 与插件能力扩展v2.10.2 的 Development开发者区块是本版本含金量较高的部分新增了两组内核 API 与若干插件事件/类型能力官方文档明确给出编号并可在此仓库中逐项核实。归档 API/api/archive/zip 与 /api/archive/unzip#9028新增两个 POST 接口实现在 kernel/api/archive.go路由注册于 kernel/api/router.goPOST /api/archive/zip 需要 CheckAuth CheckAdminRole CheckReadonly POST /api/archive/unzip 同上zip接收path待打包的目录或文件相对工作空间与zipPath生成的 zip 路径调用gulu.Zip完成压缩目录使用AddDirectory单文件使用AddEntryunzip与之对称解压二者共同通过rejectEncryptedArchivePath()拒绝加密笔记本等受保护路径的归档操作避免通过归档绕过加密边界。这是一个典型的工作空间内数据打包/解包能力插件或外部脚本可据此实现备份、迁移、批量导入导出。路由注册同时带CheckReadonly只读模式下拒绝说明设计上不允许在只读工作区写入 zip。WebSocket 消息广播内核 APIPR #9031变更日志标注为添加内核 API WebSocket 消息广播。仓库中对应内核级广播基础设施位于 kernel/api/broadcast.go路由层注册了GET /es/broadcast/subscribe 订阅SSE/WebSocket 握手与升级 POST /api/broadcast/publish 向指定频道推送二进制/文本消息从实现看BroadcastChannel基于 melody 维护 WebSocket 会话具备BroadcastString/BroadcastBinary能力并通过统一 SSEUnifiedSSE把消息转播给订阅方最大消息体限制为 128MiB。这为需要服务端主动推送如多端协同、外部进程通知插件的场景提供了内核级通道。插件事件总线loaded-protyle-dynamic 与 destroy-protyle#9021 / #9033插件事件总线类型TEventBus在 app/src/types/index.d.ts 中合并入两个新事件名loaded-protyle-dynamic某个 Protyle编辑器实例动态加载完成后触发例如打开新文档与既有loaded-protyle-static静态初始化构成互补便于插件在文档内容真正就绪后再做渲染注入destroy-protyle编辑器实例销毁时触发配合前者实现插件资源的对称回收。其中destroy-protyle的实际派发可在 app/src/protyle/util/destroy.ts 中看到销毁流程中对元素上挂载的事件总线调用eventBus.emit(destroy-protyle, ...)插件通过监听该事件清理自身为文档注入的 DOM 与监听器。新插件类型 TProtyleAction#8988变更日志将TProtyleAction列为新增插件类型其定义位于 app/src/types/protyle.d.ts是一个字符串字面量联合类型覆盖了打开文档/定位块过程中的全部行为选项type TProtyleAction cb-get-append | // 向下滚动加载 cb-get-before | // 向上滚动加载 cb-get-unchangeid | // 滚动定位时不修改 blockid cb-get-hl | // 高亮 cb-get-focus | // 光标定位 cb-get-focusfirst | // 动态定位到第一个块 cb-get-setid | // 大纲点击重置 blockid cb-get-outline | // 大纲点击 cb-get-all | // 获取所有块 cb-get-backlink | // 反链悬浮窗展示上下文 cb-get-unundo | // 不记录历史 cb-get-scroll | // 滚动到指定位置必有 rootID cb-get-search | // 使用搜索打开 cb-get-context | // 包含上下文 cb-get-rootscroll | // rootID 时滚动到指定位置 cb-get-html | // 直接渲染跳过 block 信息查询 cb-get-history | // 历史渲染 cb-get-opennew | // 只读新建文件临时解锁 cb-get-av-no-create // 属性视图不自动创建从调用侧看编辑器/书签/大纲/关系图等多处都会携带action: TProtyleAction[]打开文档如 app/src/editor/index.ts插件开发者在调用打开文档相关 API 时可显式指定这些动作来控制加载、定位与渲染行为。行级元素自定义属性#9038支持行级元素自定义属性意味着对行内inline元素如加粗、代码、超链接等可附加自定义数据。前端侧可见常量DIALOG_SETCUSTOMATTR设置自定义属性对话框见 app/src/constants.ts配合custom-attr相关渲染与交互实现。从源码结构看该能力与属性视图AV共用一套自定义属性 UI 基建属于对块级自定义属性能力的行级补全具体可用于附加机器可读元数据等场景。其余变更重构、文档与图片编辑细节重构升级 Electron#8982桌面端运行容器版本升级属常规维护动作相关打包配置可对照仓库根目录下的electron-builder*.yml系列文件了解当前基线文档修复中文用户指南中的部分坏链#9059属于文档工程质量改进图片重置大小使用 width 代替 maxWidth#8683从源码结构推断这是为了让图片缩放后能记录明确宽度值width而非依赖容器的 maxWidth 约束避免放大后尺寸丢失。升级建议与进一步阅读若你重度依赖资源文件内容搜索请关注索引边界1024 页 PDF、128MB PDF可用SIYUAN_PDF_ASSET_CONTENT_INDEX_MAX_SIZE覆盖与非 UTF-8 文本将不再建立内容索引索引重建后可观察到相关告警日志插件开发者可优先试用新增的destroy-protyle/loaded-protyle-dynamic事件做资源的创建/销毁配对管理并使用TProtyleAction精确控制文档打开行为需要批量打包/解包工作空间内容的场景备份、迁移脚本可直接调用/api/archive/zip与/api/archive/unzip注意两者均要求管理员角色且拒绝加密笔记本路径想深入验证本文结论可继续阅读资源解析 kernel/model/asset_content.go、归档实现 kernel/api/archive.go、路由注册 kernel/api/router.go、广播通道 kernel/api/broadcast.go、事件总线类型 app/src/types/index.d.ts 与 Protyle 动作类型 app/src/types/protyle.d.ts。本版本的完整条目含各 issue/PR 链接可在 v2.10.2.md 查看相邻版本演进记录位于 app/changelogs/v2.8.4-v2.12.8 目录下可按需对比阅读。【免费下载链接】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),仅供参考