Evernoteのノートリンクが仕様変更で使い物にならないので何とかしようとした

まとめ

  • Evernoteのノートリンクの仕様が変わって使い物にならなくなった
  • 前の仕様でも動くので変換スクリプトを書いた
  • ただし、Macではスクリプトの実行方法で問題あり

Evernoteのノートリンク仕様の変更

Evernoteでは図のように、「ノートリンクをコピー」で特定のノートに一対一対応するURIを取れます。

Evernote link

この機能でコピーされるのは、これまでは evernote:///という独自スキームが使われていました。
そのため、開こうとするとEvernoteアプリが立ち上がり、対応するノートを開いてくれていました。
AndroidやiPhoneでもEvernoteアプリをインストールしてあれば、
同じようにアプリでノートを開いてくれるため、とても便利でした。

しかし、最近の変更により、https://www.evernote.com/ へのリンクに変わってしまい、
ブラウザが起動してノートがEvernoteのサイト上で表示され、
そこからさらにEvernoteのアプリが開くという挙動になりました。

これにより、モバイル端末などではEvernoteへの通信時間が余計にかかるようになったうえに、
オフライン状態ではノートを開くことができなくなってしまいました。

正直使い物にならないレベルになってしまったのですが、
幸いなことにevernote:///スキームは未だ有効です。
また、必要な情報はどちらにも含まれているため、URIの変換スクリプトを書くことで対応可能です。

リンク置換スクリプトの作成

ノートリンクの仕様

以下は予想であり、正確なものではありません

Evernoteのhttpsリンクは以下のようになっています。
https://www.evernote.com/shard/s2/nl/ユーザ固有の文字列/ノート固有の文字列/
対して、evernote:///スキームは以下のようになっています。
evernote:///view/ユーザ固有の文字列/s2/ノート固有の文字列/ノート固有の文字列/
(ノート固有の文字列は二回とも同じ値になります)  

どちらもユーザ固有の文字列とノート固有の文字列は含まれているため、相互に変換可能です。

Windowsならクリップボードの置換ソフトはたくさんあるのですが、
Macでは残念ながらまともな物はありませんでした。

一応、ClipMenuは正規表現で置換ができますが、
それを実行するまでにかなりキーストロークが必要なため、見送りました。
理想は自動置換、最低でもスクリプトを簡単に実行できるのが最低条件です。

リンク置換スクリプト

結局、クリップボードのURLをevernote:///に変換するスクリプトを作りました。
事前にclipboard gemをインストールしておく必要があります。

#!/bin/bash

pushd $(dirname $0)

bundle exec ruby -e "
require 'clipboard'

url = Clipboard.paste
r = Regexp.new(\"https://www.evernote.com/shard/s2/nl/([0-9]*)/(.*)/\")
result = r.match url
if result
  new_url = \"evernote:///view/#{result[1]}/s2/#{result[2]}/#{result[2]}/\"
  p new_url
  Clipboard.copy new_url
end
"

popd

これをevernote.commandという名前で保存して、
Alfredなどから実行すればいける!!と思ったのですが、
実行すると新たなターミナルが起動してスクリプトが実行され、
終了後にターミナルがそのまま残るという状態になってしまいました。

毎回ターミナルを消すのは面倒すぎるので、とりあえずこの手法の採用は見送ることにします。