プロジェクト

全般

プロフィール

機能 #866

完了

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

toshi_a 初音 さんが8年以上前に追加. 約8年前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2016-08-29
期日:
進捗率:

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


関連するチケット

関連している 機能 #900: PhotoModel終了toshi_a 初音2016-09-27

操作
ブロック先 機能 #870: Entityを開く手段を、Retriever::ModelやURIを渡す形式に変更する終了toshi_a 初音2016-09-03

操作
ブロック先 機能 #876: Activityの詳細画面新規2016-09-03

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

操作
ブロック先 機能 #906: 次のintentで開く終了toshi_a 初音2016-10-06

操作

toshi_a 初音 さんが8年以上前に更新

  • ブロック先 機能 #870: Entityを開く手段を、Retriever::ModelやURIを渡す形式に変更する を追加

toshi_a 初音 さんが8年以上前に更新

  • ブロック先 機能 #876: Activityの詳細画面 を追加

toshi_a 初音 さんが8年以上前に更新

  • ブロック先 バグ #879: 実績メッセージのmikutter_botのアイコンをクリックするとmikutterが落ちる を追加

toshi_a 初音 さんが8年以上前に更新

  • ステータス新規 から 実装待ち に変更

toshi_a 初音 さんが約8年前に更新

toshi_a 初音 さんが約8年前に更新

  • ブロック先 機能 #905: 次回以降似たようなURIをどうやって開くか設定する機能 を追加

toshi_a 初音 さんが約8年前に更新

  • ブロック先 機能 #906: 次のintentで開く を追加

toshi_a 初音 さんが約8年前に更新

  • ステータス実装待ち から 終了 に変更

すごいぞ

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

toshi_a 初音 さんが約8年前に更新

ありがとう、修正します

toshi_a 初音 さんが約8年前に更新

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

他の形式にエクスポート: Atom PDF