aboutsummaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/search.rb27
1 files changed, 26 insertions, 1 deletions
diff --git a/app/models/search.rb b/app/models/search.rb
index 7823a74..053e641 100644
--- a/app/models/search.rb
+++ b/app/models/search.rb
@@ -31,7 +31,7 @@ class Search < ApplicationRecord
def parse_body
res = { tag: [], plain: [] }
- body.split.each do |part|
+ split_body.each do |part|
if part.include?(':')
parts = part.split(':', 2)
parts[1] = clean_clause(part: parts[1])
@@ -47,6 +47,31 @@ class Search < ApplicationRecord
res
end
+ # Returns the body split into its constituents. Note that we cannot mindlessly
+ # do something like `body.split` because that would ignore quotes that are not
+ # to be split among other things.
+ def split_body
+ cur = ''
+ res = []
+ co = ''
+
+ body.each_char do |c|
+ if c.match?(/\s/) && co == ''
+ res << cur if cur.present?
+ cur = ''
+ else
+ # If it is a quote character, check whether it's being opened or
+ # closed.
+ co = c == co ? '' : c if c == '"' || c == "'"
+
+ cur += c
+ end
+ end
+
+ res << cur if cur.present? && co.blank?
+ res
+ end
+
# Returns the argument without any leading/trailing quotes.
def clean_clause(part:)
part.gsub(/^("|')+/, '').gsub(/("|')+$/, '')