aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToshiaki Asai <toshi.alternative@gmail.com>2016-10-12 07:25:07 +0900
committerToshiaki Asai <toshi.alternative@gmail.com>2016-10-12 07:25:07 +0900
commit5770262f7a4092ada7f9517bacfcffbd58d90466 (patch)
tree2e9005f92f7e57b557c6041f4958bc4525aff3e3
parent99d250f617f708c9f9fc78eb8aadfd41cedd74bd (diff)
downloadmikutter-5770262f7a4092ada7f9517bacfcffbd58d90466.tar.gz
RegexpEntity: callbackを使わずに、Intentを利用して開く refs #870
-rw-r--r--core/lib/retriever/entity/regexp_entity.rb31
-rw-r--r--core/lib/retriever/entity/url_entity.rb3
2 files changed, 23 insertions, 11 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/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