機能 #866
完了URIを渡すと適切な方法で開く機能
0%
説明
ModelやURIをいい感じに開くイベントを提供して、Modelの種類を呼び出し側が考えずに開くことができるようにする
動機¶
今は似たような機能をGtk::Timelineが担当していて(!?)、URLを開くときに、特定の画像サービスの正規表現にURLがマッチしたらそれで開くという挙動を実現している。
今Gtkプラグインに実装されている方法だと、開く手段が複数ある場合に対応できていない。 #862 カスタムEntity、 #834 マルチサービスといったものが実装されると、パーマリンク、URIがリソースを特定するために広く使われるようになるため、あるURLを開く手段が複数提供されるようなケースが出てくると思う。
さらに、開く方法も Gtk::Timeline.openurl という俺も全然覚えてなかったヤバいメソッドを直接叩くようになっているので、URI投げたらざっくり開いてくれるイベントを提供する。
handle¶
Retriever::Model.handle(Regexp condition)
そのModelが扱えるURIを登録しておく。実際には===を呼び出すようにしておいて、Procとかもいけるみたいにしておくといいっぽい
Intent¶
Plugin#intent(Symbol intent_slug, String label, Class model){|IntentToken token| } class Intent Symbol slug String label Class supporting_model_class
各Modelを開くためのルーチン(intent)はプラグインが提供する。
開く手段が複数あって決定できないときにユーザにintentを選択させることができるように、表示用のlabelをつけておく。
intent自身が特定のURIの書式をサポートするのではなく、対応するModelのクラスのみを宣言することで、たまにパーマリンクを変えてくるサービスがあっても(そんなサービスあるわけないったーw)、Model側だけの変更で済む。
パーマリンクを開くときにIntentが利用されたら、IntentTokenを引数にブロックが呼ばれる。
IntentToken¶
class IntentToken URI uri Retriever::Model model Intent intent IntentToken parent
Intentで開くときのブロックに渡すパラメータ用のクラス。Structとかでよさそう
「別のやつで開く」みたいなのを実装するために連結リストになっていて、今までどんなIntentで開かれてきたかをあとから辿れるようにしておく。「別のIntentで開く」みたいな抽象的なこをやりたい。
例) あるURIに対するIntentの候補が3つあって、それぞれが「別のIntentで開く」機能を提供している場合、今まで利用したIntentがわからないと、Intent A→Intent B→Intent A...みたいにたらいまわしにされる。
Event¶
Plugin.call(:open_uri, URI uri) Plugin.call(:open_uri, String uri) Plugin.call(:open_model, Retriever::Model model) Plugin.call(:open_intent, IntentToken intent_token)
handleを全て走査して、利用できるintentを決定し、それで開くイベント。Web Modelみたいなのを作っておいて、WebサイトのURLを投げたらブラウザで表示してくれるような感じにする。そのURLが偶然Twitterのパーマリンクだったりすると、Userのhandlerが反応して、プロフィールを開く。
URIのほかにModelも受け入れ可能にしておく。Modelのクラスが決定していれば、どのIntentで開くべきかを決定するのに役立ちそう。
(TwitterユーザのパーマリンクはWebModelとUserどちらともとれるが、Userが渡されていれば一つに決定できる)
また、IntentTokenの節に書いたような問題にも対応できるように、IntentTokenも受け入れ可能にする。
値の種類ごとにイベントを分けずに、openイベントみたいな高級な名前にしてしまって、なんでも受け入れるようにするかもしれない
関連するチケット
rhen ium さんが約8年前に更新
commit 64bdaac3ae3d:
url_open_command が変数とメソッド名でかぶってるので、URL を開く方法を「デフォルトブラウザを使う」にしている場合にうまく動きません
diff --git a/core/plugin/web/web.rb b/core/plugin/web/web.rb index 7273c99..a22da33 100644 --- a/core/plugin/web/web.rb +++ b/core/plugin/web/web.rb @@ -14,6 +14,7 @@ Plugin.create(:web) do shellExecuteA = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i') shellExecuteA.call(0, 'open', url, 0, 0, 1) else + url_open_command = find_url_open_command if url_open_command bg_system(url_open_command, url) else @@ -30,7 +31,7 @@ Plugin.create(:web) do end # URLを開くことができるコマンドを返す。 - memoize def url_open_command + memoize def find_url_open_command openable_commands = %w{xdg-open open /etc/alternatives/x-www-browser} wellknown_browsers = %w{firefox chromium opera} command = nil