
简介思源SVG静止无功发生器检查与故障排查方法PPT面向电力系统运维、检修及现场调试工程师旨在帮助读者系统掌握SVG模块测试流程与常见故障定位技巧。内容从模块测试仪检查、直流/交流接线、光纤连接顺序讲起覆盖测试按钮操作规范并详细解读链接监控板上的LF1LF5、L3L6故障指示灯含义针对IGBT左右桥臂故障、直流欠压/过压等典型问题提供了拆检更换、光纤清洁、监控板更换等排错路径同时强调静电防护与双人协作等安全要点。资料为1个PPTX演示文稿压缩包大小仅2.55MB图文并茂、步骤清晰便于现场对照使用。目前已有525人学习是一份实用性强、适合快速上手的思源SVG运维参考资料。1. 思源笔记里 SVG 显示异常的常见假象不是图片坏了是链路断了往思源笔记里插入一张 SVG 图片编辑器里能看见缩略图但导出 PDF 后那块区域变成空白或者复制了一段带svg的 HTML 块自己电脑上显示正常换台设备就渲染失败。这类问题很容易被当成“文件损坏”处理但实际上大多数故障都发生在文件到渲染引擎之间的链路上资源文件没有落盘、XML 语法不合法、引用路径大小写不一致、或者思源的 HTML 块安全策略拦截了部分标签。本文围绕思源笔记里 SVG 的三种载入路径梳理检查步骤和故障排查方法先解决“在哪一层出错”再给可直接复用的校验脚本和验证技巧。适合在思源中长期维护流程图、图标库和图表并对笔记数据有完整性要求的用户。2. 思源SVG渲染原理资源文件、HTML块与代码块的三条载入路径2.1 思源笔记的存储结构assets 目录与资源引用思源笔记的文档数据保存在 data 目录下每个文档对应一个.sy文件内部以 JSON 格式记录内容。插入的图片、附件等资源会被复制到工作空间的数据目录下的assets文件夹中文档内容区使用带属性的资源链接来引用。理解这一点是排查 SVG 问题的重要前提因为所谓“SVG 不显示”很多时候只是资源的引用路径指向了一个不存在或者被改名的文件。查看方式很简单打开思源的「设置-资源」面板能看到资源目录的路径也可以直接在文件管理器中定位。一个常见误操作是把assets里的 SVG 文件手动改名或者在外部删除后没有通过思源界面操作导致文档中的资源链接仍然指向旧文件名。思源不会在每次启动时去做全量路径校验所以这类断链只能靠检查来发现。排查时我一般会先确认资源文件本身是否还在cd /path/to/siyuan/data find assets -type f -name *.svg | head -20这条命令列出 assets 目录下所有 SVG 文件。如果文档里引用了assets/xxx-20230101.svg但该文件不在列表中说明资源已经丢失需要从备份恢复或重新导入。这里的find参数可以自由调整例如把*.svg换成*.SVG再查一遍因为个别情况下资源扩展名大小写不一致也会导致引用失败。2.2 思源SVG三条载入路径各走各的渲染管线在思源笔记里SVG 的显示方式不是只有一种。搞清楚这一点排查方向就不会乱。载入方式操作方式渲染链路常见故障点资源图片从外部粘贴或拖拽 SVG 文件复制到 assets → 标记为资源 → 渲染为img srcassets/xxx.svg文件丢失、路径错误、浏览器加载失败内联 HTML在 HTML 块中直接嵌入svg标签思源内核清理/过滤 → 输出到页面 DOM标签被过滤、命名空间缺失、CSS 样式冲突代码块外部引用用代码块编写img或 iframe 引用代码块原样渲染浏览器自行请求相对路径错误、跨目录问题、加载时序三种方式对应三种故障类型。资源图片方式最接近普通图片检测点在于文件是否存在于 assets 目录、浏览器能否正常读取内联 HTML 方式则是思源特有的需要用开发者工具查看最终渲染出来的 DOM 是否保留了svg根节点代码块方式本质上是让浏览器直接访问文件问题多半出在 URL 构造。内联方式的实际写法如下这也是思源笔记中常用的图表组织方式div classsvg-diagram svg xmlnshttp://www.w3.org/2000/svg viewBox0 0 200 200 width200 height200 circle cx100 cy100 r80 fill#e6e6e6/ path dM 100 20 C 150 60 170 140 100 180 C 30 140 50 60 100 20 Z fill#4a90d9/ /svg /div这里把svg放在一个div中包裹语义清晰也方便后续用 CSS 控制尺寸。参数方面xmlns是必须的缺少它会被部分渲染引擎当成未知元素处理viewBox决定内部坐标系统width和height决定呈现尺寸两者不匹配时会出现裁剪或留白问题这一点在后续排错章节会展开。2.3 思源对HTML块的安全过滤SVG 被拦截的原因思源笔记出于安全考虑对 HTML 块中的内容并非全盘接收。思源内部的 HTML sanitizer 会过滤掉可能执行脚本或造成页面污染的内容。常见被拦截的对象包括script标签、带on*属性的元素、iframe的某些参数以及部分生僻的 SVG 元素。需要特别注意的是并不是所有svg子标签都被允许。use href、foreignObject、style在某些思源版本中可能被转义或剥离。这类问题往往表现为看代码块里的源码是完整的但渲染结果中部分元素消失而且不报任何错误。对于静态图标的场景我建议把 SVG 文件导入 assets 再插入走“资源图片”的路径安全过滤只影响 HTML 块不影响资源加载。对需要交互或动态效果的专属组件可以考虑用 iframe 独立承载规避思源对主文档 DOM 的清理规则。但 iframe 的问题在于它内部无法直接调用思源的 API只能做展示。3. 思源SVG检查步骤存储层、语法层、渲染层三层核对3.1 存储层检查用 find 和 file 确认真实存在第一步检查应该聚焦于文件本身而不是思源界面。打开数据目录检查 assets 中是否有对应的 SVG 文件以及文件是否可被正常读取。这里有一个入口容易被忽略很多用户会在思源中看到缩略图就认定文件没问题但缩略图可能来自思源自己生成的缓存并不代表文件完整。更严谨的做法是看文件的实际类型cd /path/to/siyuan/data/assets file icon.svg如果输出SVG Scalable Vector Graphics image说明文件头正常。如果输出HTML document、ASCII text或者data说明这个文件虽然叫.svg但实际不是合法的 XML 文档甚至可能是下载失败后的空白页存成了 SVG。这类“假 SVG”在从网页直接拖拽图标时很常见。还可以顺便检查文件大小ls -lh icon.svg一个只有十几个字节的 SVG 文件大概率只是空壳。正常图标一般超过 200 字节复杂图表可达几十 KB。如果文件很小用编辑器打开看一眼内容基本能确认问题。3.2 语法层检查用 Python 校验 XML 可解析性SVG 本质是 XML 文档。浏览器对 XML 的解析相对宽容但思源在部分渲染场景下会丢失某些错误提示导致显示不完整。最有效的检查方式是把 SVG 拿出来独立解析一遍。import sys from xml.etree import ElementTree as ET def check_svg(path): try: tree ET.parse(path) root tree.getroot() print(f[OK] {path} - root tag: {root.tag}) except ET.ParseError as e: print(f[FAIL] {path} - {e}) if __name__ __main__: for p in sys.argv[1:]: check_svg(p)这个脚本的思路是用 Python 标准库的 ElementTree 解析 SVG 文件。如果能正常构建元素树说明文件在 XML 语法层没有致命错误如果报mismatched tag或not well-formed则需要在特征编辑器中修复后再导回思源。参数上这个脚本接受任意数量的文件路径也可以结合 shell 的find对 assets 目录做批量检查find assets -name *.svg -exec python3 check_svg.py {} \;不过对于大型 SVGElementTree 对实体和外部引用的处理比较保守如果文件里有!DOCTYPE或自定义实体可能会产生警告这属于正常现象。3.3 渲染层检查用浏览器直接验证 SVG 本身在语法层没问题的情况下故障可能出在思源的渲染环境里。把 SVG 文件在浏览器中打开确认是否有显示问题open -a Safari icon.svg # 或 xdg-open icon.svg如果浏览器中显示正常说明文件没问题问题出在思源的集成方式上。这时再把视角切换到思源的 HTML 块或资源引用路径上。资源图片加载的检测要看思源实际生成的 HTML 结构。打开思源开发者工具的 Elements 面板定位到对应图片元素。如果src属性指向assets/xxx.svg但 Network 面板中显示请求失败或状态码 404基本可以确定资源定位层出了问题。这种错误下思源编辑器内会显示一个空白或破碎图标占位而不是报错弹窗。3.4 内联 HTML 块的检查查看最终 DOM 而不是源码思源的内联 HTML 块经过一层过滤后进入文档最后呈现给用户的是过滤后的结果。排查时不能只看编辑器中显示的原始码需要看实际渲染后的 DOM。操作步骤如下在内联 HTML 块中写入一段带svg的测试代码。打开思源开发者工具定位到protyle-content的对应节点。检查该节点下是否依然存在svg元素以及它的width、height、viewBox属性是否被完整保留。一个容易混淆的地方思源在源代码模式下看到的内容是文档源码不是未经清理的渲染结果。做对比测试时应该分别检查“编辑模式”和“阅读模式”下的差异。一些 SVG 元素在编辑模式下正常切换到阅读模式后丢失原因是思源对两种模式应用了不同的样式表或过滤配置。4. 思源SVG故障排查空白、变形、导出丢失的定位与修复4.1 图片空白三种情况的区分SVG 在思源中显示为空白无非三种情况文件路径错误资源加载失败此时img元素的自然尺寸可能为 0。文件内容本身是空壳 XML浏览器渲染时不会报错但输出为空。SVG 的根节点尺寸为 0例如width0 height0。快速区分方法是打开浏览器开发者工具的 Network 面板检查 SVG 请求是否返回 200。如果返回 200 但仍然空白把响应的预览展开看一眼或者直接在新的标签页中打开该 URL。这种情况下我一般会先用curl观察响应头curl -sI http://localhost:6806/assets/xxx.svg -H Authorization: Token 你的token如果连接被拒绝或者返回 500说明思源的资源服务没起来或鉴权信息错误。注意思源对资源文件的访问本身需要鉴权直接访问http://localhost:6806/assets/有时会被阻止这并不代表文件损坏。4.2 图形变形viewBox 与 width/height 的协同关系变形是那批对着 SVG 规格生出的高频问题。核心原因viewBox定义了 SVG 内部的坐标系width和height决定显示尺寸。两者不一致但构成等比时图形会被等比缩放比例不一致时图形会被拉伸。看下面两组写法svg xmlnshttp://www.w3.org/2000/svg width100 height200 viewBox0 0 200 100 rect x0 y0 width100 height100 fill#ccc/ /svgviewBox的宽高比是 2:1width/height的比值是 1:2浏览器会把整个坐标系拉伸正方形被拉成长方形。要避免变形要么让width:height等于viewBox的宽高比要么去掉width/height只保留viewBox。在思源笔记中资源 SVG 的img标签中宽高由主题样式决定用户无法直接控制到单独元素。因此如果一个 SVG 文件在浏览器中显示正常在思源中却变形需要检查思源的主题 CSS 是否覆盖了img的选择器。比如某些主题会设置img { width: 100%; }这会让不等比的 SVG 被强制拉伸。恢复统一尺度的方法是在原文件中加上显式的width和height一般写成 viewBox 同比例即可。4.3 导出 PDF 时 SVG 消失从渲染链路上找根因导出 PDF 时 SVG 消失跟思源使用的导出方案有关。常见导出链路是用内核将内容渲染为 HTML再交给浏览器打印为 PDF或者用 Puppeteer 类的无头浏览器截图。在这一过程中img srcassets/xxx.svg这类引用可能因为资源 URL 在导出阶段的临时页面中不可达而加载失败。排查思路上先看导出的 PDF 中该区域是整体空白还是只少了图片但文字正常。如果是整体空白说明导出阶段未加载到资源如果文字正常只是图片缺失大概率是资源 URL 拼接问题。有实际价值的一个技巧把 SVG 转成 PNG 后再插入能规避 80% 的导出兼容性问题。但缺点也很明显PNG 无法在后续编辑中改颜色和路径。保留 SVG 原件作为附件同时插入 PNG 用于预览是思路比较完备的做法。4.4 CSS 样式冲突主题隐藏、占位尺寸为 0思源的主题通过 CSS 自定义文档的显示样式某些主题对 SVG 图标做出display: none;或visibility: hidden;设置。这类问题难以从语义上判断因为源码存在、文件加载成功、语法正确唯独显示被 CSS 覆盖。排查方法是用开发者工具选中 SVG查看 Computed 样式中的display和visibility。如果确实被隐藏可以在思源的「设置-外观-代码片段」中添加如下 CSS 覆盖.protyle-content svg { display: inline-block; width: auto; height: auto; }这段代码把文档内容区内的 SVG 强制设为行内块元素并恢复默认尺寸。width: auto和height: auto的组合让 SVG 自行依据viewBox或固有属性计算大小避免被主题的固定宽度覆盖。与图片做对比img里的 SVG 是 as 图片加载的不会被当作内联 SVG 处理因此上面的选择器要用img[src$.svg]来命中。4.5 故障定位速查表现象优先检查项常用命令/工具常见修复完全空白文件是否存在、文件头是否合法file、find重新导入资源编辑正常阅读空白HTML 块过滤规则开发者工具 Elements改用资源图片方式图形拉伸viewBox 与宽高比浏览器打开验证调整 width/height导出 PDF 缺失导出阶段资源 URL浏览器打印调试转 PNG 插入主题下隐藏CSS 覆盖Computed 样式添加代码片段覆盖加载超慢文件过大、复杂度过高du -h精简路径或转 PNG5. 批量自检与防御用脚本给思源SVG做体检5.1 自动化遍历 assets 目录找出全部坏文件日常维护中手动逐一检查 SVG 不现实。写一个简单脚本把 assets 目录下的所有 SVG 文件解析一遍输出异常列表。import os import sys from xml.etree import ElementTree as ET def check_all_svg(root_dir): bad_files [] for dirpath, _, filenames in os.walk(root_dir): for f in filenames: if not f.lower().endswith(.svg): continue path os.path.join(dirpath, f) if os.path.getsize(path) 0: bad_files.append((path, empty file)) continue try: ET.parse(path) except ET.ParseError as e: bad_files.append((path, str(e))) return bad_files if __name__ __main__: if len(sys.argv) ! 2: print(usage: python3 scan_svg.py path/to/assets) sys.exit(1) results check_all_svg(sys.argv[1]) for path, reason in results: print(f[BAD] {path} reason: {reason}) if not results: print(all svg files are valid)这个脚本的核心思路是两层判断第一层排除空文件第二层用 XML 解析器确认文件是不是结构完整的 XML 文档。因为ElementTree对 SVG 标签的命名空间处理比较细致只要 XML 结构不合法就会抛异常所以try-except能稳定捕获到问题文件。参数说明脚本接收一个路径参数root_dir是 assets 目录的绝对路径。os.walk会递归遍历所有子目录有的用户会按照主题或项目再分子目录这个写法能覆盖到。输出格式统一为[BAD] 文件路径 reason: 原因。运行完把坏文件逐个修复或重新导出即可。注意事项这个脚本只检查 XML 结构无法检查语义问题比如所有元素都透明、坐标超界、viewBox 负值等。这类语义问题仍然需要借助浏览器验证。5.2 在思源内用开发者工具快速确认图片加载状态不打开文件系统时在思源内也能完成一次体检。打开开发者工具切到 Console 面板执行以下代码document.querySelectorAll(.protyle-content img[src$.svg]).forEach((img) { if (!img.complete || img.naturalWidth 0) { console.log(SVG加载失败:, img.getAttribute(src)); } });这段代码枚举当前文档内容区中所有引用.svg的图片元素。img.complete表示浏览器是否已经完成加载naturalWidth为 0 则说明图片未能解码。输出内容会直接把加载失败的资源地址打印出来省去逐个翻 DOM 的功夫。放进去即执行即可。如果想要更完整的报告可以加上img.src的展开检查和请求耗时统计但对核心需求来说上面的十行代码就足够定位到问题资源了。注意img[src$.svg]这里使用的属性选择器区分大小写若资源名带大写.SVG需要额外适配。5.3 维护建议动画 SVG 与导入规范动画 SVG例如animate、animateTransform、CSS transition 驱动的路径动画在思源中是否能正常呈现取决于渲染时的浏览器环境。PDF 导出时动画会被定格在第一帧部分无头浏览器在首帧未触发时会截获空白帧。此类文件建议导出时转换静态帧而不是寄希望于导出器逐帧渲染。导入规范方面推荐在导入前统一做三步处理一是用xmllint --format格式化源码保证文件头正常二是根标签必须带xmlns属性三是不使用外部 DTD 和外部字体引用。这类文件在思源中的兼容性最好排查负担最小。另一个细节所有 SVG 文件统一小写扩展名.svg避免在 Windows 和 macOS 间同步时出现大小写匹配问题。把巡检脚本挂到定时任务上或者在每次批量导入图标后手动跑一遍能避免绝大多数 SVG 显示问题在笔记使用中途才暴露。真正有价值的是建立一套“导入-检查-引用”的固定流程而不是等到需要演示或导出时才去追查原因。本文还有配套的精品资源点击获取