aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToshiaki Asai <toshi.alternative@gmail.com>2016-10-12 07:26:27 +0900
committerToshiaki Asai <toshi.alternative@gmail.com>2016-10-12 07:26:27 +0900
commit34b5b594106cc46ce5a3c984a9ce55d6b327bac0 (patch)
tree2e9005f92f7e57b557c6041f4958bc4525aff3e3
parent4aff8cde265cc190b22a853b74db9f818473c98c (diff)
parent5770262f7a4092ada7f9517bacfcffbd58d90466 (diff)
downloadmikutter-34b5b594106cc46ce5a3c984a9ce55d6b327bac0.tar.gz
Merge branch 'topic/870-entity-open-with-model' into develop
-rw-r--r--core/lib/retriever/entity/regexp_entity.rb31
-rw-r--r--core/lib/retriever/entity/twitter_entity.rb33
-rw-r--r--core/lib/retriever/entity/url_entity.rb3
-rw-r--r--core/mui/cairo_miracle_painter.rb7
-rw-r--r--core/plugin/openimg/window.rb8
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)
}