diff options
author | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-08-26 17:01:28 +0900 |
---|---|---|
committer | Toshiaki Asai <toshi.alternative@gmail.com> | 2016-08-26 17:01:28 +0900 |
commit | a83fb55d3921f050adccf5ff5f3ae9a4af70dc49 (patch) | |
tree | ad48d58bf0eb51ce4f5ac55a37f0747b1151238f /core/lib/retriever/entity/regexp_entity.rb | |
parent | b6413bfc916309f84024b98b12e4cf61e44ad80e (diff) | |
download | mikutter-a83fb55d3921f050adccf5ff5f3ae9a4af70dc49.tar.gz |
基本的なEntityを数種類用意 refs #863
Diffstat (limited to 'core/lib/retriever/entity/regexp_entity.rb')
-rw-r--r-- | core/lib/retriever/entity/regexp_entity.rb | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/core/lib/retriever/entity/regexp_entity.rb b/core/lib/retriever/entity/regexp_entity.rb new file mode 100644 index 00000000..22e82070 --- /dev/null +++ b/core/lib/retriever/entity/regexp_entity.rb @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +require_relative 'blank_entity' + +module Retriever::Entity + +=begin rdoc +特定の正規表現にマッチする部分を自動的にSegmentにするEntity。 +=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_ が返した値 + # ==== Return + # Class その正規表現を自動でリンクにする新しいEntityクラス + def filter(regexp, generator:, open:) + Class.new(self) do + @@autolink_condition = regexp.freeze + @@generator = generator + @@open = open + + def initialize(*rest) + super + segments = Set.new(@generate_value) + self.message.to_show.scan(@@autolink_condition) do + match = Regexp.last_match + pos = match.begin(0) + body = match.to_s.freeze + if not segments.any?{ |this| this[:range].include?(pos) } + segments << @@generator.( + slug: :urls, + range: Range.new(pos, pos + body.size, true), + face: body, + url: body).freeze + end + end + @generate_value = segments.sort_by{ |r| r[:range].first }.freeze + end + end + end + end + + end +end |