aboutsummaryrefslogtreecommitdiff
path: root/app/models/search.rb
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <msabate@suse.com>2024-03-15 10:38:05 +0100
committerMiquel Sabaté Solà <msabate@suse.com>2024-03-15 10:38:05 +0100
commit002371920d6f9acedaf987f273bb138a95353ffd (patch)
tree40a99ed7db2814504d056ee535460f2b0a301d21 /app/models/search.rb
parente46f849f1f8b3e2a002ac3b124331011a86f9ea3 (diff)
downloadoperum-002371920d6f9acedaf987f273bb138a95353ffd.tar.gz
operum-002371920d6f9acedaf987f273bb138a95353ffd.zip
Fixed search for tags with spaces
We should not split the body mindlessly, but we have to be more careful about it. Moreover, this commit also polishes the order for tags inside of comments. Signed-off-by: Miquel Sabaté Solà <msabate@suse.com>
Diffstat (limited to 'app/models/search.rb')
-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(/("|')+$/, '')