Project

General

Profile

機能 #866

URIを渡すと適切な方法で開く機能

Added by toshi_a 初音 almost 4 years ago. Updated over 3 years ago.

Status:
終了
Priority:
通常
Target version:
Start date:
2016-08-29
Due date:
% Done:

0%

プラグイン名:

Description

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イベントみたいな高級な名前にしてしまって、なんでも受け入れるようにするかもしれない


Related issues

Related to 機能 #900: PhotoModel終了2016-09-27toshi_a 初音

Actions
Blocks 機能 #870: Entityを開く手段を、Retriever::ModelやURIを渡す形式に変更する終了2016-09-03toshi_a 初音

Actions
Blocks 機能 #876: Activityの詳細画面新規2016-09-03

Actions
Blocks バグ #879: 実績メッセージのmikutter_botのアイコンをクリックするとmikutterが落ちる終了2016-09-04trorornmn roboActions
Blocks 機能 #905: 次回以降似たようなURIをどうやって開くか設定する機能終了2016-10-06toshi_a 初音

Actions
Blocks 機能 #906: 次のintentで開く終了2016-10-06toshi_a 初音

Actions
#1

Updated by toshi_a 初音 almost 4 years ago

  • Blocks 機能 #870: Entityを開く手段を、Retriever::ModelやURIを渡す形式に変更する added
#2

Updated by toshi_a 初音 almost 4 years ago

#3

Updated by toshi_a 初音 almost 4 years ago

  • Blocks バグ #879: 実績メッセージのmikutter_botのアイコンをクリックするとmikutterが落ちる added
#4

Updated by toshi_a 初音 almost 4 years ago

  • Status changed from 新規 to 実装待ち
#5

Updated by toshi_a 初音 almost 4 years ago

#6

Updated by toshi_a 初音 over 3 years ago

  • Blocks 機能 #905: 次回以降似たようなURIをどうやって開くか設定する機能 added
#7

Updated by toshi_a 初音 over 3 years ago

#8

Updated by toshi_a 初音 over 3 years ago

  • Status changed from 実装待ち to 終了

すごいぞ

#9

Updated by rhen ium over 3 years ago

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
#10

Updated by toshi_a 初音 over 3 years ago

ありがとう、修正します

#11

Updated by toshi_a 初音 over 3 years ago

なんだこのコード…俺は何を考えてこんなことを…

Also available in: Atom PDF