Obsidian2Hexo

最终流程图

  • 简明流程:Win (obsidian) <— 坚果云 —> Mac (obsidian) <— 软链接 —> Hexo
  • 实现功能:Win 的 Obsidian 做笔记,或者 Mac 的 Obsidian 做笔记 —> md 格式的文件 —> 通过 hexo 的 3 条命令上传至博客

image.png

Why Obsidian

博客文章都是使用 Markdown 格式完成的,在 Markdown 编辑体验上,Obsidian 的体验要远远好于 VS Code。毕竟术业有专攻,Obsidian 主打 Markdown 这种垂直领域的文件编辑,而 VS Code 作为通用代码编辑器,不奢求太多体验,大抵能用就行

Obsidian 丰富的插件、轻量和自定义程度高的快捷键这几点已经足以秒杀大多数具有 Markdown 编辑功能的编辑器了

面临的问题

Yaml 字段问题

Hexo 的 URL 使用 abbrlink 永久链接,而这个永久链接是使用 CRC32 算法和十六进制表示法生成的,在 Ob 中自然没有现成的工具可以实现这个功能 —> 那么转换思路,abbrlink 只要唯一就好,完全可以使用时间戳来代替这种复杂的计算

至于时间戳,可以使用 Ob 核心插件中的 模板 插件来完成,创建文件后即可自动添加 abbrlink

image.png

同理,date 和 title 字段也可以使用模板来完成,简易的 YAML 字段如下:

1
2
3
4
5
title: {{NAME}}
categories:
date: {{DATE:YYYY-MM-DD HH:mm:ss}}
abbrlink: {{DATE:YYYYMMDDHHmmss}}
tag:

图片上传问题

习惯使用 SM.MS 这类的图床工具,在 Ob 中插入图片还需要额外手动将文中图片一张张上传到图床中,过程简单但又浪费时间,操作过程也毫无意义 —> 需要一个更加自动化的流程

既然锁定了图床这类工具,必然和 image 有关,思路也很清晰,去 Ob 的插件市场搜索关键词 image 即可

image.png

参考资料:

图片压缩问题

问题也很清晰,在 图片压缩指南 | 智朋的个人博客 中已经介绍过了几款工具,推荐使用 caesium,可这仍然无法接入自动化流程 —> 需要将图片上传至图床前自动压缩图片 —> 也就指向了 Picgo 上传工具

image.png

image.png

注:图床配置名是根据 图床设置 自己设置的,并非一定为 “SM”

参考资料:GitHub - juzisang/picgo-plugin-compress: Image compression plugin for PicGo

经测试,同样一张截图,系统直接保存图片 127KB,通过插件压缩上传后 39KB,压缩效果可以,主要是实现了自动化

实际上,对于非博客中的文章,如自己的一些笔记,当然还是插入本地图片更方便。插件作者在设计上增加了一个控制开关,在 MD 文件的 YAML 区添加 image-auto-upload: true 才实现图片粘贴上传功能 —> 因此,可以利用 QuickAdd + 模板 (配置好 YAML 区) 来实现「只有某一种模板的文件,向其中粘贴图片的时候才会自动上传到图床中」

1
2
3
4
5
6
title: {{NAME}}
categories:
date: {{DATE:YYYY-MM-DD HH:mm:ss}}
abbrlink: {{DATE:YYYYMMDDHHmmss}}
image-auto-upload: true
tag:

文件同步问题

面临的问题:Ob 资源文件夹路径和 hexo 文件夹路径不在一块,如何将 hexo 中包含 markdown 文件的文件夹导入到 Ob 资源库中是一个问题

尝试 1:使用 rsync 命令工具

1
rsync -avzh --delete /Users/wuzhipeng/Documents/ZhPObsidian/ZhPObsidian/_posts  /Users/wuzhipeng/ZhPblog/source

选项说明

  • -a 或 --archive:以归档模式同步文件,包括保留文件权限、时间戳等元数据。
  • -v 或 --verbose:显示详细的输出信息。
  • -z 或 --compress:使用压缩传输来减少数据传输量。
  • -h 或 --human-readable:以易读的格式显示输出信息。
  • -n 或 --dry-run:模拟同步操作,不实际同步文件。
  • -P 或 --progress:显示同步进度。
  • --delete:在目标目录中删除不存在于源文件夹中的文件。
  • --exclude:排除指定的文件或目录。
  • --include:只包含指定的文件或目录。
  • --bwlimit:限制带宽使用。

的确可以同步,但这样做有几个明显的缺点:

  • 单向同步:如果双方都做了修改,那么需要左右来回同步一次,容易出错
  • 同步错误:虽然同步是成功的,但是有报错的出现且暂时无法解决,用起来不放心
1
rsync error: some files could not be transferred (code 23) at /AppleInternal/Library/BuildRoots/c2cb9645-dafc-11ed-aa26-6ec1e3b3f7b3/Library/Caches/com.apple.xbs/Sources/rsync/rsync/main.c(996)

尝试 2:软链接

1
ln -s /Users/wuzhipeng/Documents/ZhPObsidian/ZhPObsidian/_posts  /Users/wuzhipeng/ZhPblog/source

没想到 Ob 支持软链接,这样 hexo 和 Obsidian 访问的就是同一文件目录,不涉及同步问题,这样也很稳定,目前使用的就是这种方案

注意事项:

  • Ob 中的一个文件夹软链接到 Hexo 中,需要首先删除 Hexo 中的对应文件夹,比如以上中的 _posts 文件夹

购买 Obsidian 官方同步之后

仍然是使用软链接方案,删除软链接文件夹,将 Obsidian 本地库的对应文件夹路径粘贴替换一下即可。目前软链接的文件夹有:_postsaboutdownloadnotes

image.png

1
ln -s /Users/wuzhipeng/Documents/SynZhPObsidian/SynZhPObsidan/_posts  /Users/wuzhipeng/ZhPblog/source
1
ln -s /Users/wuzhipeng/Documents/SynZhPObsidian/SynZhPObsidan/download  /Users/wuzhipeng/ZhPblog/source
1
ln -s /Users/wuzhipeng/Documents/SynZhPObsidian/SynZhPObsidan/about  /Users/wuzhipeng/ZhPblog/source
1
ln -s /Users/wuzhipeng/Documents/SynZhPObsidian/SynZhPObsidan/notes  /Users/wuzhipeng/ZhPblog/source