2018-06-05 14:21:05 +02:00
|
|
|
module Searchable
|
|
|
|
def search(string_or_regex, &block)
|
|
|
|
case string_or_regex
|
|
|
|
when Regexp
|
|
|
|
search_regex(string_or_regex, &block)
|
|
|
|
else
|
|
|
|
search_string(string_or_regex.to_str, &block)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def simplify_string(string)
|
|
|
|
string.downcase.gsub(/[^a-z\d]/i, "")
|
|
|
|
end
|
|
|
|
|
|
|
|
def search_regex(regex)
|
|
|
|
select do |*args|
|
|
|
|
args = yield(*args) if block_given?
|
2018-07-22 21:50:54 +02:00
|
|
|
args = [*args].compact
|
|
|
|
args.any? { |arg| arg.match?(regex) }
|
2018-06-05 14:21:05 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def search_string(string)
|
|
|
|
simplified_string = simplify_string(string)
|
|
|
|
select do |*args|
|
|
|
|
args = yield(*args) if block_given?
|
2018-07-22 21:50:54 +02:00
|
|
|
args = [*args].compact
|
|
|
|
args.any? { |arg| simplify_string(arg).include?(simplified_string) }
|
2018-06-05 14:21:05 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|