Project

General

Profile

機能 #866

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

Added by toshi_a 初音 almost 3 years ago. Updated over 2 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-27

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

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

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

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

Actions

Associated revisions

Revision a4c8a984 (diff)
Added by toshi_a 初音 over 2 years ago

Retriever::Model.handle を実装 refs #866

Revision 6afa8504 (diff)
Added by toshi_a 初音 over 2 years ago

Intentプラグイン追加 refs #866

Modelを開くためのopenイベント
Modelを開く方法を宣言するintentメソッド

Revision 19049a2f (diff)
Added by toshi_a 初音 over 2 years ago

Model: フィールドタイプuriを追加 refs #866

Revision ce7aecc1 (diff)
Added by toshi_a 初音 over 2 years ago

IntentにModel slugフィールドを追加 refs #866

Revision 8e67ab4a (diff)
Added by toshi_a 初音 over 2 years ago

openイベントにURIを渡した時、URIからModelを取得する refs #866

Revision 7990f5cc (diff)
Added by toshi_a 初音 over 2 years ago

Web Modelを追加し、openイベントにURLを渡すと外部ブラウザで開く refs #866

Revision b7fd96bb (diff)
Added by toshi_a 初音 over 2 years ago

Retriever::Model.handleに正規表現を渡してもマッチしない refs #866

右辺がURIなので。条件がRegexpだったら右辺をto_sで文字列にすることにした

Revision 8e327116 (diff)
Added by toshi_a 初音 over 2 years ago

URIを開く方法が一つに決定できない場合、Gtk::Dialogを出してユーザに決定させる refs #866

Revision 6c75b178 (diff)
Added by toshi_a 初音 over 2 years ago

URIからModelを生成するメソッドの定義方法を変更 refs #866

Revision 538da0c3 (diff)
Added by toshi_a 初音 over 2 years ago

MessageのpermalinkからMessageを作成する手段 refs #866

Revision 9d39aaf1 (diff)
Added by toshi_a 初音 over 2 years ago

UserのpermalinkからUserを作成する手段 refs #866

Revision 67106654 (diff)
Added by toshi_a 初音 over 2 years ago

Web上のリソースを扱うためのwebプラグイン追加 refs #866

Revision 64bdaac3 (diff)
Added by toshi_a 初音 over 2 years ago

Gtk.openurlを、openイベントを発生させるメソッドに変更 refs #866

Gtk.openurlの内容は、webプラグインに移植した

Revision 52cd1303 (diff)
Added by toshi_a 初音 over 2 years ago

URLを開く方法>デフォルトブラウザを使う がレニウムされていた refs #866

History

#1

Updated by toshi_a 初音 almost 3 years ago

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

Updated by toshi_a 初音 almost 3 years ago

#3

Updated by toshi_a 初音 almost 3 years ago

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

Updated by toshi_a 初音 almost 3 years ago

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

Updated by toshi_a 初音 over 2 years ago

#6

Updated by toshi_a 初音 over 2 years ago

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

Updated by toshi_a 初音 over 2 years ago

#8

Updated by toshi_a 初音 over 2 years ago

  • Status changed from 実装待ち to 終了

すごいぞ

#9

Updated by rhen ium over 2 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 2 years ago

ありがとう、修正します

#11

Updated by toshi_a 初音 over 2 years ago

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

Also available in: Atom PDF