diff options
| author | Miquel Sabaté Solà <msabate@suse.com> | 2024-03-15 10:38:05 +0100 |
|---|---|---|
| committer | Miquel Sabaté Solà <msabate@suse.com> | 2024-03-15 10:38:05 +0100 |
| commit | 002371920d6f9acedaf987f273bb138a95353ffd (patch) | |
| tree | 40a99ed7db2814504d056ee535460f2b0a301d21 /app/models/search.rb | |
| parent | e46f849f1f8b3e2a002ac3b124331011a86f9ea3 (diff) | |
| download | operum-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.rb | 27 |
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(/("|')+$/, '') |
