私は普段から医学やプログラミングについて勉強したことをノートアプリに記録しています。自分が蓄積したノートを第二の脳として使うことで効率的に知的生産ができると考えているからです。 最近はScrapboxを使っていたのですが、いろいろな理由からObsidianも試してみたいと思ったので、今回はScrapboxのデータをMarkdownに変換してObsidianで使えるように移行してみました。
現時点で特に他のアプリに移行する予定がなくても、汎用性の高いMarkdownでバックアップデータを持っておくことは有益だと思うので、ぜひお試しください。
使用したコードは、GitHubに置いておきます。
ちなみに、ScrapboxからObsidianへの移行を検討している理由はまた別の記事で書きます。 今回はあくまで技術的に、ScrapboxをMarkdownへ変換するところに焦点を当てます。 あくまでまだ試しに使ってみようかなという段階ですが、第一印象はかなりいい感じです。
背景
ScrapboxとObsidianはどちらも非階層型リンクを特徴とするノートテイキングアプリですが、データの保管形式が異なります。 Obsidianは様々なアプリで採用されているMarkdownを採用しているのに対し、Scrapboxは独自の記法を採用しています。 その理由はこちらに書かれているとおりです。
[ ]Markdownに慣れたエンジニアがよく「何故[Scrapbox]はMarkdownを採用しないんだ」と言ってくる。「Markdownを採用しないとか馬鹿じゃないの?」とまで言う人もいる。こういう人々は完全に[* Markdown脳]というか、自分がタマタマ慣れているものがサイコーだと考えているだけに思える。 [ ]Scrapboxのような[Wiki]で一番大事なのは[* ページ間リンクの記述]であり、ここに
[
…]
という単純な記法を使っているためMarkdownとは異なる記法になっているのだが、そこを理解せずに「ScrapboxもMarkdownを採用すべき」とか言われるのはとても困る。ScrapboxがMarkdownを採用すべきだと言うのならWikipediaもMarkdownを採用すべきだと主張してもよさそうなものだが、そう言ってる人は見たことがない。事情を考えず、自分が慣れてるものを採用しろと主張するのは思考停止でありゴーマンである。
独自記法の採用にはメリット・デメリットがありますが、少なくとも他のツールに移行するときは独自記法が大きな障壁となります。 Scrapboxはデータをバックアップしてjsonファイルに出力可能ですが、その中身も結局Scrapbox記法なので変換する必要があるのです。
実行
幸い、scrapbox-parser を使えばScrapbox記法をパースしてJavaScriptのオブジェクトとして処理できます。また、既にこのparserを使ってScrapboxをMarkdownに変換しているコードも公開されていたので、このコードをベースにしました。
実は元のコードのままでもObsidianで読み込めるMarkdownを出力できます。 やはりMarkdown(というか標準規格)は便利ですね。 しかし、微妙な部分でやや見た目に違和感があったので、出力するMarkdownのスタイルを少し変更しました。
具体的には、次のような箇所です。
- 内部リンクの記法を変更 (例:
[[リンク]]
) - インデントをスペースからタブへ変更
- インラインのTeX数式がObsidianで正しく表示されるように変更
- タイトルにコロンなどの記号が含まれている場合、スペースに置換
- 画像をリモートのURLではなく、ローカルへの参照に変更
繰り返しになりますが、使用したコードは、GitHubに置いておきます。
やり直し
一度移行先のプラットフォームを使い始めると、移行作業をやり直すのは非常に面倒です。 なぜなら、移行したノートが既に新しいプラットフォーム(Obsidian)上で編集・移動されている可能性があるからです. とはいえ、変換したVaultでしばらく作業していると、うまく変換されていない箇所が見つかることはよくあります。 スペースの数やちょっとしたズレは、特に支障はないのですがやっぱり微妙に気持ち悪い感じがするのです。
そこで、Pythonを使ってScrapboxから変換したMarkdownファイルとObsidianのファイルの対応を取って、Obsidianへ移行した後に変更が加えられていないファイルについてのみ、上書きする形で更新しました。
具体的な手順は以下のとおりです。
- 変換ルールを自分好みに更新する
- Scrapboxから変換したMarkdownファイルと現在Obsidianに存在するMarkdownファイルについて、細かい違い(スペース、改行など)を無視したハッシュ値を算出する
- このハッシュ値が一致する場合、Obsidianに移行後も本質的な変更はされていないことになります
- 細かい違いを無視するのは、変換ルールに加えた変更によって、そのような違いが生じるためです
- filenameベースで両者の対応を取り、ハッシュ値が一致するもののみを更新対象とする
- 更新対象のファイルについて、親ディレクトリはObsidianを尊重しつつ、filenameは変換されたMarkdownのほうを採用して上書きコピーする
これによって、ファイル名や中身の変換ルールを少し変えた場合でも、移行作業をやり直すことができます。 ただし、Obsidianで既に変更してしまったファイルは更新されません。
ちなみに、GitHubに上げたコードはすでに自分が気になった箇所を修正した後のコードですが、もし追加で気になるところがあれば自分好みに変更してください。
感想
無事、ScrapboxからObsidianへの移行作業ができました。 今回Scrapboxから移行したノートをObsidianで新しく作成したノートと比べても、特に違和感はないです。
今後Obsidianをメインに使っていくかはまだ分かりませんが、Scrapboxを使い続けるにしてもMarkdownの形で手元にデータがあるのは良いことだと思います。 自分の第二の脳が特定のサービスに強く依存していることは、ややストレスだからです。 とりあえずローカルにMarkdownとして残っていれば、Scrapboxに何かあっても(ないと信じていますが)、自分の育ててきたノートが失われないという点で安心できます。