aboutsummaryrefslogtreecommitdiffstats
path: root/core/lib/retriever/entity/regexp_entity.rb
diff options
context:
space:
mode:
authorToshiaki Asai <toshi.alternative@gmail.com>2016-08-26 17:01:28 +0900
committerToshiaki Asai <toshi.alternative@gmail.com>2016-08-26 17:01:28 +0900
commita83fb55d3921f050adccf5ff5f3ae9a4af70dc49 (patch)
treead48d58bf0eb51ce4f5ac55a37f0747b1151238f /core/lib/retriever/entity/regexp_entity.rb
parentb6413bfc916309f84024b98b12e4cf61e44ad80e (diff)
downloadmikutter-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.rb49
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