問題点

Obsidianでファイル名をUIDにするとwikiリンクの恩恵を受けにくくなる

具体的には、

01.md
# hoge
[[fuga]]

というファイルがあって

02.md
# fuga

というファイルをあとから作ったときに

01.md
# hoge
[[02|fuga]]

と、自動的に更新してくれない

解決策

そこで、Obsidian内ではあくまでH1をファイル名として扱い、
Quartz側の実行スクリプトでUIDに置換する、ということをやる

frontmatterの設定

Templaterで設定する

frontmatter
uid: 
title: 
created: 
modified: 

Quartzプロジェクトのディレクトリ構成

tree
./
├── content/
├── obsidian -> symlink or submodule
├── scripts/
...
  • obsidianはvaultのことで、シンボリックリンクかサブモジュールにする
  • content内は空にしておき、obsidianから前処理したページを移動してくる
  • scriptsディレクトリを用意する

前処理するスクリプトを書く

scripts/rename_with_uid - GitHub

  • 全てのファイルのfrontmatterからuidをとってきてリネームする
  • 全てのファイルのwikiリンクをuidで更新する
    • [[title]] [[uid|title]]
    • [[title|alias]] [[uid|alias]]

実行権限を与える

zsh
chmod +x scripts/rename_with_uid

使い方

zsh
scripts/rename_with_uid -h
usage: rename_with_uid [-h] [-i I] [-o O] [--ignore IGNORE]

Rename files with uid, then update wiki links

options:
  -h, --help       show this help message and exit
  -i I             Obsidian vault (default: obsidian)
  -o O             Quartz content (default: content)
  --ignore IGNORE  Prefix to ignore (default: "_ .")
  • -i
    • 生成元のファイルがあるディレクトリ
    • 指定した相対パス配下を全て処理する
    • デフォルトは./obsidian
  • -o
    • 生成先のディレクトリ
    • 生成元のディレクトリ構成を受け継ぐ
    • デフォルトは./content
  • --ignore
    • 無視するディレクトリを前方一致で指定できるようにした
    • スペース区切りで列挙できる
    • デフォルトは_.

syncコマンド一発でpushまで行う

scripts/sync
#!/usr/bin/env bash
DIR=`dirname $0`
$DIR/rename_with_uid && bun quartz sync
zsh
chmod +x scripts/sync
zsh
scripts/sync