ちょっとしたメモを Alfred for Mac から一発で TaskPaper ファイルに挿入したい。Packal 上に TaskPaper のための多機能な Alfred Workflow があるので入れたんだけれど、うまくタスク追加ができないことがあるので、自前でスクリプトを作って Alfred から呼ぶことにした。
TaskPaper ファイルはテキストファイルなので書き慣れている Perl でスクリプトを書いてもいいんだけれど、 編集の競合が避けられるし parser も書かなくて済むしということで TaskPaper の API を使うことにした。
JavaScript for Automation (JXA) を使えば JavaScript コードで TaskPaper API を呼べるっぽい。
以下指定した TaskPaper ファイルに Inbox: プロジェクトがなければ追加した上でその子供としてノートを挿入するコード(エラー処理割愛。実際にはタイムスタンプとかもノートにつけるようにした)。
#!/usr/bin/env osascript -l JavaScript
function TaskPaperContext(editor, options) {
let inbox = editor.outline.evaluateItemPath("//Inbox:")[0];
if (!inbox) {
inbox = editor.outline.createItem("Inbox:");
let projects = editor.outline.evaluateItemPath('@type = project')
if (projects.length == 0) {
editor.outline.root.appendChildren(inbox)
} else {
editor.outline.root.insertChildrenBefore(inbox, projects[0]);
}
}
let items = ItemSerializer.deserializeItems(options.text, editor.outline, ItemSerializer.TEXTMimeType)
editor.setCollapsed(items[0])
inbox.appendChildren(items, inbox.firstChild)
}
function run(argv) {
Application('TaskPaper').open(argv[0]).evaluate({
script:TaskPaperContext.toString(),
withOptions: {text: argv[1]}
})
}
これを inbox.scpt というファイルで保存し実行権限を与えれば
./inbox.scpt $HOME/tmp/test.taskpaper こんにちはこんにちは!!
という感じで呼び出せるようになる。
あとは Alfred Workflow を作ってそこからこのスクリプトを実行すれば OK だ。