2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-09-02 05:15:08 -04:00
|
|
|
require 'sanitize'
|
|
|
|
|
2013-05-23 14:26:51 -04:00
|
|
|
class Search
|
|
|
|
|
|
|
|
class GroupedSearchResults
|
2014-09-02 05:15:08 -04:00
|
|
|
include ActiveModel::Serialization
|
2013-05-23 14:26:51 -04:00
|
|
|
|
2014-09-02 05:15:08 -04:00
|
|
|
class TextHelper
|
|
|
|
extend ActionView::Helpers::TextHelper
|
2013-05-23 14:26:51 -04:00
|
|
|
end
|
|
|
|
|
2017-07-17 11:57:13 -04:00
|
|
|
attr_reader(
|
|
|
|
:type_filter,
|
|
|
|
:posts,
|
|
|
|
:categories,
|
|
|
|
:users,
|
2017-08-25 11:52:18 -04:00
|
|
|
:tags,
|
2019-03-04 04:30:09 -05:00
|
|
|
:groups,
|
2017-07-17 11:57:13 -04:00
|
|
|
:more_posts,
|
|
|
|
:more_categories,
|
|
|
|
:more_users,
|
|
|
|
:term,
|
|
|
|
:search_context,
|
2017-07-20 12:07:13 -04:00
|
|
|
:include_blurbs,
|
2019-07-01 21:21:52 -04:00
|
|
|
:more_full_page_results,
|
|
|
|
:error
|
2017-07-17 11:57:13 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
attr_accessor :search_log_id
|
2014-09-02 05:15:08 -04:00
|
|
|
|
2015-07-27 02:13:11 -04:00
|
|
|
def initialize(type_filter, term, search_context, include_blurbs, blurb_length)
|
2014-09-02 05:15:08 -04:00
|
|
|
@type_filter = type_filter
|
|
|
|
@term = term
|
|
|
|
@search_context = search_context
|
|
|
|
@include_blurbs = include_blurbs
|
2020-07-09 11:19:18 -04:00
|
|
|
@blurb_length = blurb_length || 200
|
2014-09-02 05:15:08 -04:00
|
|
|
@posts = []
|
|
|
|
@categories = []
|
|
|
|
@users = []
|
2017-08-25 11:52:18 -04:00
|
|
|
@tags = []
|
2019-03-04 04:30:09 -05:00
|
|
|
@groups = []
|
2019-07-01 21:21:52 -04:00
|
|
|
@error = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def error=(error)
|
|
|
|
@error = error
|
2013-05-23 14:26:51 -04:00
|
|
|
end
|
|
|
|
|
2016-03-18 01:26:20 -04:00
|
|
|
def find_user_data(guardian)
|
|
|
|
if user = guardian.user
|
|
|
|
topics = @posts.map(&:topic)
|
|
|
|
topic_lookup = TopicUser.lookup_for(user, topics)
|
|
|
|
topics.each { |ft| ft.user_data = topic_lookup[ft.id] }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-09-02 05:15:08 -04:00
|
|
|
def blurb(post)
|
2015-07-27 02:13:11 -04:00
|
|
|
GroupedSearchResults.blurb_for(post.cooked, @term, @blurb_length)
|
2014-09-02 05:15:08 -04:00
|
|
|
end
|
2013-05-23 14:26:51 -04:00
|
|
|
|
2014-09-02 05:15:08 -04:00
|
|
|
def add(object)
|
|
|
|
type = object.class.to_s.downcase.pluralize
|
2013-05-23 14:26:51 -04:00
|
|
|
|
2019-05-06 22:22:37 -04:00
|
|
|
if @type_filter.present? && public_send(type).length == Search.per_filter
|
2017-07-20 12:07:13 -04:00
|
|
|
@more_full_page_results = true
|
2019-05-06 22:22:37 -04:00
|
|
|
elsif !@type_filter.present? && public_send(type).length == Search.per_facet
|
2014-09-02 05:15:08 -04:00
|
|
|
instance_variable_set("@more_#{type}".to_sym, true)
|
2013-05-23 14:26:51 -04:00
|
|
|
else
|
2019-05-06 22:05:58 -04:00
|
|
|
(self.public_send(type)) << object
|
2013-05-23 14:26:51 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-07-09 11:19:18 -04:00
|
|
|
def self.blurb_for(cooked, term = nil, blurb_length = 200)
|
2015-06-24 15:08:22 -04:00
|
|
|
blurb = nil
|
2018-09-17 04:31:15 -04:00
|
|
|
cooked = SearchIndexer.scrub_html_for_search(cooked)
|
|
|
|
|
2019-10-30 13:07:16 -04:00
|
|
|
urls = Set.new
|
|
|
|
cooked.scan(URI.regexp(%w{http https})) { urls << $& }
|
|
|
|
urls.each do |url|
|
2019-11-06 10:32:15 -05:00
|
|
|
begin
|
|
|
|
case File.extname(URI(url).path || "")
|
|
|
|
when Oneboxer::VIDEO_REGEX
|
|
|
|
cooked.gsub!(url, I18n.t("search.video"))
|
|
|
|
when Oneboxer::AUDIO_REGEX
|
|
|
|
cooked.gsub!(url, I18n.t("search.audio"))
|
|
|
|
end
|
|
|
|
rescue URI::InvalidURIError
|
2019-10-31 09:13:24 -04:00
|
|
|
end
|
2019-10-30 13:07:16 -04:00
|
|
|
end
|
|
|
|
|
2015-06-24 15:08:22 -04:00
|
|
|
if term
|
2020-07-09 11:19:18 -04:00
|
|
|
terms = term.split(/\s+/)
|
|
|
|
phrase = terms.first
|
|
|
|
|
|
|
|
if phrase =~ Regexp.new(Search::PHRASE_MATCH_REGEXP_PATTERN)
|
|
|
|
phrase = Regexp.last_match[1]
|
2019-03-26 05:01:19 -04:00
|
|
|
end
|
|
|
|
|
2020-07-09 11:19:18 -04:00
|
|
|
blurb = TextHelper.excerpt(cooked, phrase,
|
2019-10-31 09:32:42 -04:00
|
|
|
radius: blurb_length / 2
|
2019-03-26 05:01:19 -04:00
|
|
|
)
|
2015-06-24 15:08:22 -04:00
|
|
|
end
|
2018-09-17 04:31:15 -04:00
|
|
|
|
2019-10-31 09:32:42 -04:00
|
|
|
blurb = TextHelper.truncate(cooked, length: blurb_length) if blurb.blank?
|
2015-06-24 15:08:22 -04:00
|
|
|
Sanitize.clean(blurb)
|
|
|
|
end
|
2013-05-23 14:26:51 -04:00
|
|
|
end
|
|
|
|
|
2014-02-16 22:34:14 -05:00
|
|
|
end
|