diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-10-12 07:25:07 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-10-12 07:25:07 +0900 |
commit | 5770262f7a4092ada7f9517bacfcffbd58d90466 (patch) | |
tree | 2e9005f92f7e57b557c6041f4958bc4525aff3e3 | |
parent | 99d250f617f708c9f9fc78eb8aadfd41cedd74bd (diff) | |
download | mikutter-5770262f7a4092ada7f9517bacfcffbd58d90466.tar.gz |
RegexpEntity: callbackを使わずに、Intentを利用して開く refs #870
-rw-r--r-- | core/lib/retriever/entity/regexp_entity.rb | 31 | ||||
-rw-r--r-- | core/lib/retriever/entity/url_entity.rb | 3 |
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 |