about summary refs log tree commit diff
diff options
context:
space:
mode:
authorabcang <abcang1015@gmail.com>2017-05-20 03:19:14 +0900
committerEugen Rochko <eugen@zeonfederated.com>2017-05-19 20:19:14 +0200
commitd22cec81fb7c3222405cd49380b486d40323c5d4 (patch)
tree18509ab3b2e321195e846a7c5c07b9ae87fad311
parentd2e0edd721e202a0b32485e74b4dbf95148d171e (diff)
Unify the method of extracting tags (#3138)
-rw-r--r--app/lib/extractor.rb26
-rw-r--r--app/services/process_hashtags_service.rb2
2 files changed, 27 insertions, 1 deletions
diff --git a/app/lib/extractor.rb b/app/lib/extractor.rb
index 3d88b01cd..c582b5e4d 100644
--- a/app/lib/extractor.rb
+++ b/app/lib/extractor.rb
@@ -30,4 +30,30 @@ module Extractor
     end
     possible_entries
   end
+
+  def extract_hashtags_with_indices(text, _options = {})
+    return [] unless text =~ /#/
+
+    tags = []
+    text.scan(Tag::HASHTAG_RE) do |hash_text, _|
+      match_data = $LAST_MATCH_INFO
+      start_position = match_data.char_begin(1) - 1
+      end_position = match_data.char_end(1)
+      after = $'
+      if after =~ %r{\A://}
+        hash_text.match(/(.+)(https?\Z)/) do |matched|
+          hash_text = matched[1]
+          end_position -= matched[2].char_length
+        end
+      end
+
+      tags << {
+        hashtag: hash_text,
+        indices: [start_position, end_position],
+      }
+    end
+
+    tags.each { |tag| yield tag[:hashtag], tag[:indices].first, tag[:indices].last } if block_given?
+    tags
+  end
 end
diff --git a/app/services/process_hashtags_service.rb b/app/services/process_hashtags_service.rb
index 617a38159..990e01a4b 100644
--- a/app/services/process_hashtags_service.rb
+++ b/app/services/process_hashtags_service.rb
@@ -2,7 +2,7 @@
 
 class ProcessHashtagsService < BaseService
   def call(status, tags = [])
-    tags = status.text.scan(Tag::HASHTAG_RE).map(&:first) if status.local?
+    tags = Extractor.extract_hashtags(status.text) if status.local?
 
     tags.map { |str| str.mb_chars.downcase }.uniq(&:to_s).each do |tag|
       status.tags << Tag.where(name: tag).first_or_initialize(name: tag)