diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-10-12 07:26:27 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-10-12 07:26:27 +0900 |
commit | 34b5b594106cc46ce5a3c984a9ce55d6b327bac0 (patch) | |
tree | 2e9005f92f7e57b557c6041f4958bc4525aff3e3 | |
parent | 4aff8cde265cc190b22a853b74db9f818473c98c (diff) | |
parent | 5770262f7a4092ada7f9517bacfcffbd58d90466 (diff) | |
download | mikutter-34b5b594106cc46ce5a3c984a9ce55d6b327bac0.tar.gz |
Merge branch 'topic/870-entity-open-with-model' into develop
-rw-r--r-- | core/lib/retriever/entity/regexp_entity.rb | 31 | ||||
-rw-r--r-- | core/lib/retriever/entity/twitter_entity.rb | 33 | ||||
-rw-r--r-- | core/lib/retriever/entity/url_entity.rb | 3 | ||||
-rw-r--r-- | core/mui/cairo_miracle_painter.rb | 7 | ||||
-rw-r--r-- | core/plugin/openimg/window.rb | 8 |
5 files changed, 55 insertions, 27 deletions
diff --git a/core/lib/retriever/entity/regexp_entity.rb b/core/lib/retriever/entity/regexp_entity.rb index 60387432..c7c8433d 100644 --- a/core/lib/retriever/entity/regexp_entity.rb +++ b/core/lib/retriever/entity/regexp_entity.rb @@ -5,24 +5,38 @@ module Retriever::Entity =begin rdoc 特定の正規表現にマッチする部分を自動的にSegmentにするEntity。 + +==== Example + + class Sample < Retriever::Model + entity_class Retriever::Entity::RegexpEntity. + filter(/:(?:\w+):/, ->s{ s.merge(open: 'https://...') }). # :???: をクリックされたら対応する絵文字の画像(https://...)を開く + filter(/@(?:\w+)/, ->s{ s.merge(open: "https://twitter.com/#{s[:url]}") }) # @??? をクリックされたらTwitterでユーザページを開く + end + =end class RegexpEntity < BlankEntity class << self # 正規表現ルールを定義する # ==== Args # [regexp] Regexp Segmentを自動生成するための正規表現 - # [generator:] Proc Segmentを受け取って、加工して返すProc。以下の引数を受け取る - # segment :: 元になる _Segment_ - # [open:] Proc クリックされた時に呼び出される。以下の引数を受け取る - # entity :: Retriever::Entity::RegexpEntity 呼び出し元のEntity - # segment :: _generator_ が返した値 + # [generator:] + # Proc テキストを装飾する範囲を表わすHashを引数として受け取って、それを加工して返すProc。 + # 引数はHashひとつだけで、加工する必要がなければ、引数の内容をそのまま返す。 + # ===== Argument of generator + # 引数 _generator:_ のProcに渡されるHashは、以下のキーを持つ + # [:message] Retriever::Model このEntityが装飾する本文を持っているModel + # [:range] Range 装飾する範囲(文字数)。 + # [:face] String _:message_ の本文中の _range_ の範囲にあるテキスト。これを書き換えると、実際の本文は変わらないが、表示上はこの内容に置き換わる。 + # [:url] String 歴史的経緯でこのような名前になっているがURLとは限らない。_:message_ の本文中の _range_ の範囲にあるテキスト。 _:face_ と違って、書き換わる前の内容が格納されている。 + # [:open] Retriever::Model|URI|nil デフォルトでは存在しない。内容を指定すると、UI上で本文の _:range_ の範囲がクリックされた時に、 :open イベントでそれを開くようになる。 + # [:callback] Proc|nil 利用は非推奨。できるだけ _:open_ を使う。デフォルトでは存在しない。内容を指定すると、UI上で本文の _:range_ の範囲がクリックされた時に、これが呼ばれるようになる。指定されている場合、 _:open_ より優先される。 # ==== Return # Class その正規表現を自動でリンクにする新しいEntityクラス - def filter(regexp, generator:, open:) + def filter(regexp, generator: ret_nth) Class.new(self) do @@autolink_condition = regexp.freeze @@generator = generator - @@open = open def initialize(*rest) super @@ -38,8 +52,7 @@ module Retriever::Entity slug: :urls, range: Range.new(pos, pos + body.size, true), face: body, - url: body, - callback: @@open).freeze + url: body).freeze end end @generate_value = segments.sort_by{ |r| r[:range].first }.freeze diff --git a/core/lib/retriever/entity/twitter_entity.rb b/core/lib/retriever/entity/twitter_entity.rb index 87acf70d..904c6599 100644 --- a/core/lib/retriever/entity/twitter_entity.rb +++ b/core/lib/retriever/entity/twitter_entity.rb @@ -48,18 +48,23 @@ module Retriever::Entity case slug when :urls entity[:face] = (entity[:display_url] or entity[:url]) - entity[:url] = (entity[:expanded_url] or entity[:url]) - entity[:callback] = ->segment{ Gtk.openurl(segment[:url]) } + entity[:url] = (entity[:expanded_url] or entity[:url]) + entity[:open] = entity[:url] when :user_mentions - entity[:face] = "@"+entity[:screen_name] - entity[:url] = "@"+entity[:screen_name] - entity[:callback] = ->segment{ Plugin.call(:show_profile, Service.primary, User.findbyidname(entity[:screen_name])) } + entity[:face] = entity[:url] = "@#{entity[:screen_name]}".freeze + user = Retriever::Model(:twitter_user) + if user + entity[:open] = user.findbyidname(entity[:screen_name], Retriever::DataSource::USE_LOCAL_ONLY) || + URI("https://twitter.com/#{entity[:screen_name]}") + else + entity[:open] = URI("https://twitter.com/#{entity[:screen_name]}") + end when :hashtags - entity[:face] = "#"+entity[:text] - entity[:url] = "#"+entity[:text] - entity[:callback] = ->segment{ Plugin.call(:search_start, entity[:url]) } + entity[:face] = entity[:url] = "##{entity[:text]}".freeze + twitter_search = Retriever::Model(:twitter_search) + if twitter_search + entity[:open] = twitter_search.new(query: entity[:text]) end when :media - entity[:callback] = ->segment{ Gtk::TimeLine.openurl(segment[:url]) } case entity[:video_info] and entity[:type] when 'video' variant = Array(entity[:video_info][:variants]) @@ -67,17 +72,23 @@ module Retriever::Entity .sort_by{|v|v[:bitrate]} .last entity[:face] = "#{entity[:display_url]} (%.1fs)" % (entity[:video_info][:duration_millis]/1000.0) - entity[:url] = variant[:url] + entity[:open] = entity[:url] = variant[:url] when 'animated_gif' variant = Array(entity[:video_info][:variants]) .select{|v|v[:content_type] == "video/mp4"} .sort_by{|v|v[:bitrate]} .last entity[:face] = "#{entity[:display_url]} (GIF)" - entity[:url] = variant[:url] + entity[:open] = entity[:url] = variant[:url] else entity[:face] = entity[:display_url] entity[:url] = entity[:media_url] + photo = Retriever::Model(:openimg_photo) + if photo + entity[:open] = photo.new(perma_link: entity[:media_url]) + else + entity[:open] = entity[:media_url] + end end else error "Unknown entity slug `#{slug}' was detected." diff --git a/core/lib/retriever/entity/url_entity.rb b/core/lib/retriever/entity/url_entity.rb index 3db5b2a0..c24e7a68 100644 --- a/core/lib/retriever/entity/url_entity.rb +++ b/core/lib/retriever/entity/url_entity.rb @@ -12,6 +12,5 @@ schemeはhttpまたはhttpsのURLを全てリンクにするEntity。 =end URLEntity = Retriever::Entity::RegexpEntity.filter(URI.regexp(%w<http https>), - generator: ret_nth, - open: ->s{ Gtk::TimeLine.openurl(s[:url]) }) + generator: ->s{ s.merge(open: s[:url]) }) end diff --git a/core/mui/cairo_miracle_painter.rb b/core/mui/cairo_miracle_painter.rb index 35f3a0e3..c3251dc3 100644 --- a/core/mui/cairo_miracle_painter.rb +++ b/core/mui/cairo_miracle_painter.rb @@ -150,7 +150,12 @@ class Gdk::MiraclePainter < Gtk::Object index = main_pos_to_index(x, y) if index and message.links.respond_to?(:segment_by_index) l = message.links.segment_by_index(index) - l[:callback].call(l) if l and l[:callback] end end + if l + case + when l[:callback] + l[:callback].call(l) + when l[:open] + Plugin.call(:open, l[:open]) end end end end when 3 @tree.get_ancestor(Gtk::Window).set_focus(@tree) Plugin::GUI::Command.menu_pop diff --git a/core/plugin/openimg/window.rb b/core/plugin/openimg/window.rb index 4b3c95e6..ee57f07a 100644 --- a/core/plugin/openimg/window.rb +++ b/core/plugin/openimg/window.rb @@ -38,11 +38,11 @@ module Plugin::Openimg end true end - pixbufloader.ssc(:closed, self) do + complete_promise.next{ progress(pixbufloader.pixbuf, paint: true) - true end - - complete_promise.trap { |exception| + pixbufloader.close + }.trap { |exception| + error exception @image_surface = error_surface redraw(repaint: true) } |