ObsidianのWikilinkとMarkdownリンクを相互変換するCLIツール olconv を作った
はじめに
Obsidianでは主に2つのリンク形式を使うことができます。
- Wikilink形式:
[[ノート名]]
や[[ノート名|表示テキスト]]
- Markdownリンク形式:
[表示テキスト](ノート名.md)
Wikilink形式はObsidianで使えるファイルリンクの記法で、書きやすく読みやすいのが特徴です。
一方、Markdownリンク形式は標準的なMarkdown記法なので、他のツールでも扱いやすいという利点があります。
しかし、一度どちらかの形式で書き始めると、後から変更するのは大変です。特に大量のノートがある場合、手動での変換は現実的ではありません。
ツールの移行や心境の変化でもう一方の形式に変更したくなったときのために、2つの形式を相互変換できるCLIツールを作成しました。
リポジトリ
インストール方法
go install github.com/ikorihn/olconv/cmd/olconv@latest
きっかけ
Obsidianを使い始めた当初はWikilink形式を使っていました。
あるとき、VaultをHugoでブログとして公開してみたくなったのですが、Markdownリンクしか対応していなかったので変換する必要がありました。
その後結局Hugoは使わなくなったので、またWikilink形式に戻したくなりました。
Obsidian Link Converter Plugin のようなObsidianの拡張機能で変換する方法もあるのですが、実際に使ってみると非常に時間がかかってしまいます。
リンク形式の変換なんて頻繁にやることでもないので待てばいいじゃんというツッコミは置いておいて、高速に処理できるCLIツールを作成してみました。
Obsidianのプラグインとしてではなく、GoのCLIとして実装しています。
そのためObsidian以外で管理しているmarkdownファイルでも変換可能です。
ツールでできること
双方向変換に対応
- Markdownリンク → Wikilink:
[タイトル](ノート.md)
→[[ノート|タイトル]]
- Wikilink → Markdownリンク:
[[ノート|タイトル]]
→[タイトル](ノート.md)
どちらの方向にも変換できるので、用途に応じて自由に形式を切り替えられます。
Wikilinkに変換する際は、Obsidianのリンク形式の設定における Shortest path when possible
に変換されます。
ディレクトリ構造の解析とファイルマップによる重複解決
変換処理を開始する前に、指定されたディレクトリ配下の全体構造を解析してファイルマップを作成します。
この仕組みにより、Obsidianの Shortest path when possible
設定と同様の動作を実現しています。
- 別のディレクトリに同名ファイルがある場合は自動でパスを含める
- 一意に特定できる場合は最短のリンク形式を選択
ディレクトリ構造の例
例として、以下のようなvault構造があるとします:
vault/
├── programming/
│ ├── Go.md # プログラミング関連のGoのノート
│ ├── Python.md
│ └── JavaScript.md
├── books/
│ ├── Go.md # Go言語の書籍に関するノート
│ └── Clean Code.md
└── work/
├── meeting.md
└── project/
└── Go.md # 仕事のプロジェクトでのGoのノート
この場合、Go.md
という同名のファイルが3つの異なる場所に存在しています。
ファイルマップの作成
ツールは最初にディレクトリをスキャンして、以下のようなファイルマップを作成します:
"Go" -> ["programming/Go.md", "books/Go.md", "work/project/Go.md"]
"Python" -> ["programming/Python.md"]
"JavaScript" -> ["programming/JavaScript.md"]
"Clean Code" -> ["books/Clean Code.md"]
"meeting" -> ["work/meeting.md"]
変換時の判定ロジック
MarkdownリンクからWikilinkへの変換時
- 同名ファイルが1つだけの場合
[Python入門](programming/Python.md) → [[Python|Python入門]]
[JavaScript](programming/JavaScript.md) → [[JavaScript]]
- 同名ファイルが複数ある場合
[Go](programming/Go.md) → [[programming/Go]]
[Go本レビュー](books/Go.md) → [[books/Go|Go本レビュー]]
[プロジェクトでGo](work/project/Go.md) → [[work/project/Go|プロジェクトでGo]]
WikilinkからMarkdownリンクへの変換時:
同様にファイルマップを参照して適切なパスを決定します:
[[programming/Go|Go言語]] → [Go言語](programming/Go.md)
[[JavaScript]] → [JavaScript](programming/JavaScript.md)
実際の使用例
安全のため必ずvaultのバックアップを取った上で実行してください
基本的な使い方
# Markdownリンクをwikilinkに変換
olconv -to-wiki
# WikilinkをMarkdownリンクに変換
olconv -to-markdown
# 特定のディレクトリを対象にする場合
olconv -basepath path/to/vault -to-wiki
変換例
Markdownリンク -> Wikilink
変換前
- [memo](memo.md)
- [タイトル](ノート.md)
- [サブフォルダのノート](subfolder/note.md)
- [同じファイル名](sub2/note.md)
変換後
- [[memo]]
- [[ノート|タイトル]]
- [[subfolder/note|サブフォルダのノート]]
- [[sub2/note|同じファイル名]]
まとめ
WikilinkとMarkdownリンクの相互変換というニッチな問題でしたが、1000以上のノートがあるvaultでも変換が一瞬で完了するようになりました。
Discussion