↓ 跳过正文
  1. 文章/

Obsidian enhancing-export与custom-attachment-location兼容记录

Obsidian笔记 Hugo笔记 Blog

目录
BlogBuild - 这篇文章属于一个选集。
§ 2: 本文

Obsidian 增强导出与自定义附件路径兼容问题记录
#

  • 日期:2025-10-15
  • 相关插件:
    • obsidian-enhancing-export(导出增强)
    • obsidian-custom-attachment-location(自定义附件路径)
  • 操作系统:Windows

背景与现象
#

在使用 obsidian-custom-attachment-location 为每篇笔记按模板动态放置附件(例如:./999-工具/assets/${noteFilePath})的同时,使用 obsidian-enhancing-export 导出(如 Markdown/HTML/PDF),发现导出的图片等资源路径有时无法解析,只有在 Obsidian 设置里"重新设置"一次核心的附件目录后才会临时生效。 file-Obsidianenhancing-export与custom-attachment-location兼容记录.png

复现步骤(摘要)
#

  1. 在 vault 中启用两个插件:
    • 自定义附件路径插件使用按笔记路径的模板(例如 ./999-工具/assets/${noteFilePath})。
    • 导出增强插件使用内置的 Pandoc 模板(其中包含 --resource-path="${currentDir}" 和 --resource-path="${attachmentFolderPath}")。
  2. 在某篇笔记中插入本地图片(图片实际被保存到自定义附件目录)。
  3. 使用导出增强进行导出,图片在导出结果中无法解析(找不到资源)。

根因分析
#

  • 自定义附件路径插件是通过覆写 app.vault.getConfig('attachmentFolderPath') 的 getter,在"读取配置时"动态返回"与当前笔记相关"的附件目录。
  • 导出增强插件在构造导出上下文时,读取的是"静态配置快照"app.vault.config.attachmentFolderPath,没有调用 getter。因此在导出过程中拿到的是固定值,和每篇笔记的动态目录不一致,导致 --resource-path 指向错误。

换言之:应使用 app.vault.getConfig('attachmentFolderPath')(动态)而不是 app.vault.config.attachmentFolderPath(静态)。

解决方案
#

本次选择"方案 B(无需改代码)",同时记录"方案 A(最小代码改动)“备用。

方案 A:最小改动(改 1 行,长期正确)
#

将导出增强插件里构造导出上下文时的附件目录获取方式改为调用 getter:

  • 原:
    • let D = Y.attachmentFolderPath ?? "/";
  • 建议改为:
    • let D = (e.app.vault.getConfig && e.app.vault.getConfig("attachmentFolderPath")) ?? Y.attachmentFolderPath ?? "/";

这会让导出增强始终读取自定义附件插件提供的"按笔记动态目录”。这是最干净的做法,但需要改插件打包后的 main.js,后续升级可能覆盖。

吐槽:该项目的main.js几乎不可读

后面为了适配叶页面采用了该修改插件的方案 ### 方案 B:不改代码(在模板里补充一条 resource-path)

利用导出增强的命令模板支持模板表达式,在 Arguments 中新增一条 --resource-path,直接根据当前笔记路径拼出自定义附件目录。示例(与模板 ./999-工具/assets/${noteFilePath} 对应):

在导出增强的"命令模板 → Arguments"中,除了原有的

--resource-path="${currentDir}"
--resource-path="${attachmentFolderPath}"

再追加一条(将前缀 999-工具/assets 替换为你自己的规则):

--resource-path="${vaultDir}/999-工具/assets/${(currentPath.substring(vaultDir.length+1).replace(/\.[^/.]+$/,''))}"

file-Obsidianenhancing-export与custom-attachment-location兼容记录1.png 说明:

  • vaultDir:库根目录(绝对路径,导出增强会在 Windows 下自动规范为正斜杠)。
  • currentPath:当前笔记绝对路径(导出增强同样在 Windows 下规范为正斜杠)。
  • currentPath.substring(vaultDir.length+1):得到"库内相对路径(含扩展名)"。
  • replace(/\.[^/.]+$/,''):去掉扩展名,等价于 ${noteFilePath}。
  • 多个 --resource-path:Pandoc 会依次搜索,追加的这一条不会影响原有逻辑。
  • 这样组合出的路径等价于自定义附件插件模板生成的目录。

优点:

  • 无需修改插件文件,插件升级无影响。
  • 可按需为不同导出类型分别添加或调整。

注意:

  • 如果以后更改了自定义附件插件的目录模板(如前缀或规则),记得同步更新这条 --resource-path。
  • 若附件目录包含空格,已用引号包裹,Pandoc 可正确识别。
BlogBuild - 这篇文章属于一个选集。
§ 2: 本文

相关文章