需求

图片可以使用图床解决,其他类型的附件也想自动上传并分享。

思路

可以借鉴图片的做法:

最自然的想法是手动上传到 github 仓库中,拿到 cdn 地址后,将 markdown 中附件的语法 !\[\[filename.ext\]\] 改为 [filename.ext](url)

最终的形态就是要解决这里面手动的两个操作:

  • 上传附件到 github
  • 替换附件的语法

开始前,请阅读我的博客构建流程以了解上下文

通过 pre-commit 自动上传 assets 目录

attachments 目录为什么不直接上传到 quartz 仓库?

因为 cloudflare 托管平台会拉取 quartz 仓库并构建静态站点,所以我不希望这个仓库特别大

之前在Obsidian-Configuration-Directory-Management-Guide中已经验证了 cloudflare 不会拉取 submodule,所以我把 attachments 作为 quartz 主仓库的 submodule

此时,自然的需求就是在 push quartz 仓库之前,自动 push attachment submodule

  • 第一步:加 submodule,举个例子
    cd quartz
    git submodule add -f git@github.com:HRXWEB/obsidian-assets.git content/attachments.nosync

注意

保证 submodule 至少有一个 commit

  • 第二步:设置 obsidian,使得附件全部在 submodule 目录管理

    image.png

Tips

assets/ 目录是 attachment submodule 的子目录,防止所有文件都放在根目录,github页面太难看了。

  • 最后一步:安装、编辑 pre-commit 相关文件

    pip install pre-commit
    pre-commit install

    新建并编辑 .pre-commit-config.yaml内容见此,id 为 update-assets-submodule

    执行的脚本在此

通过 pre-commit 自动修改附件语法

.pre-commit-config.yaml内容见此,id 为 convert-obsidian-links

执行的脚本在此,就是通过正则表达式替换文本内容,这就是纯文本的力量(power~)

写在最后

在认知内实现了类似图床的方案来解决这个问题,触类旁通。