DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

【Obsidian】外部ファイル参照パスを生成するAutomator JXA

はじめに

仕事でのメモ書きに、いまはObsidian*1を使っています。Obisidianにした理由は、概ねこんな感じです。

  • Notionは表現がリッチ過ぎ、単純なmarkdownで記述したい
  • VS Codeだと重たすぎ、気軽にパッと書きたい
  • iPhoneでもクラウドで同期できて、出先でも確認できると嬉しい

本来のPKMツールとしてはまだまだ使いこなせてないですが、サッとメモを書く、記録した情報を参照する、みたいな部分では非常に使いやすく、動作も軽快で気に入っています。
今回は、このObisidianで、クリックしたらPDFを開くみたいなことがやりたいと思い、結果的にAutomator(中身はJXA)を作ったという話です。

外部ファイルを参照する書き方

Obsidianでは外部ファイルを画像として埋め込むこともできます。できますが、PDFはページがあるものが多いし、Acrobatなどで開いたほうが都合がいいです。Obsidianで外部ファイルを開くには、[キャプション](<file://ファイルパス>)という表記にすればいいようでした。

Automatorで作ってみる

できあがりはこんな感じです。

Automator

設定項目は下記の通り。

  • クイックアクションとして作成
  • ワークフローが受け取る現在の項目:ファイルまたはフォルダ
  • 画像:お好みで
  • 選択されたFinder項目を取得
  • JavaScriptを実行
  • クリップボードにコピー

JXAの中身

JXA(JavaScript for Automation)のコードは下記のようになっています。

function run(input, parameters) {
    var result = [];
    // debugger;
    root:
    for (var i = 0; i < input.length; i++) {
        var fpath = input[i].toString();
        var resString = "[" + fpath.match(/([^\/]+)$/)[1].replace(/\.[^.]+$/, "") + "]" + "(<file:/" + fpath + ">)";
        if (result.includes(resString)) { continue; }
        result.push(resString);
    }
    return result.join("\n");
}

debuggerステートメントについては、SafariでJXAをデバッグするために書いています*2

引数のinputFile型オブジェクトの配列になっており、選択したファイルを順番にtoString()メソッドで文字列に変換しています(var fpath = input[i].toString();の部分)。

次に、文字列として取得したファイルパスを整形して、[拡張子を除いたファイル名](<file://ファイルへの絶対パス>)という形にします。

本来であればこれをreturnしておしまい、のはずだったんですが、Finderの不具合? で、選択したファイルが複数取得できてしまいます。なので、既に取得済みのものを弾くために、配列resultの中身をArray.includes()メソッドで調べて、重複があれば無視するようにしました。

使い方

クイックアクションを適当な名前で保存してください。そうすると、Finder上でファイルを選択して右クリック、コンテキストメニューのクイックアクションに登録されます。

クイックアクション

実行すると、整形されたテキストがクリップボードに送られます。

参考文献

Obsidianの小技その6|PC上のファイル・フォルダへのリンクを貼る #Markdown - Qiita
リンク先はシェルスクリプトで対応されていますが、僕は上記のようにテキスト整形や配列としての処理をかんたんにやりたかったのでJXAにしました。

*1:Obsidian is 何、という方はこちらをどうぞ:Obsidian.Zenn

*2:過去記事を参照:JXAのデバッグにSafariのWEBインスペクタが使える - DTPab