From 783419bcd7229aa38250796a40b08ca1deceda32 Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 4 Apr 2022 18:53:58 -0500 Subject: [PATCH] post queries: support single-quoted strings in metatags. --- app/logical/post_query/ast.rb | 2 +- app/logical/post_query/parser.rb | 5 +++++ test/unit/post_query_parser_test.rb | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/logical/post_query/ast.rb b/app/logical/post_query/ast.rb index c1ab42aa5..284b23997 100644 --- a/app/logical/post_query/ast.rb +++ b/app/logical/post_query/ast.rb @@ -358,7 +358,7 @@ class PostQuery def quoted_value return nil unless metatag? - if value.include?(" ") || value.starts_with?('"') || value.empty? + if value.include?(" ") || value.starts_with?('"') || value.starts_with?("'") || value.empty? %Q{"#{value.gsub(/"/, '\\"')}"} else value diff --git a/app/logical/post_query/parser.rb b/app/logical/post_query/parser.rb index 02029d6e9..bbf380087 100644 --- a/app/logical/post_query/parser.rb +++ b/app/logical/post_query/parser.rb @@ -24,6 +24,7 @@ require "strscan" # metatag = metatag_name ":" quoted_string # metatag_name = "user" | "fav" | "pool" | "order" | ... # quoted_string = '"' /[^"]+/ '"' +# | "'" /[^']+/ "'" # tag = /[^ *]+/ # wildcard = /[^ ]+/ # @@ -172,6 +173,10 @@ class PostQuery a = accept(/([^"\\]|\\")*/).gsub(/\\"/, '"') # handle backslash escaped quotes expect('"') a + elsif accept("'") + a = accept(/([^'\\]|\\')*/).gsub(/\\'/, "'") # handle backslash escaped quotes + expect("'") + a else string(/[^ ]+/) end diff --git a/test/unit/post_query_parser_test.rb b/test/unit/post_query_parser_test.rb index 4f812da83..e6434d94e 100644 --- a/test/unit/post_query_parser_test.rb +++ b/test/unit/post_query_parser_test.rb @@ -70,6 +70,13 @@ class PostQueryParserTest < ActiveSupport::TestCase assert_parse_equals('source:"\""', 'source:"\""') assert_parse_equals(%q{source:"don't say \"lazy\" okay"}, %q{source:"don't say \"lazy\" okay"}) assert_parse_equals(%q{(and source:foo)bar a)}, %q{(a (source:"foo)bar"))}) + + assert_parse_equals('source:"foo bar"', "source:'foo bar'") + assert_parse_equals("source:foobar'(", "source:foobar'(") + assert_parse_equals('source:""', "source:''") + assert_parse_equals('source:"\'"', "source:'\\''") + assert_parse_equals(%q{source:"don't say \"lazy\" okay"}, %q{source:'don\'t say "lazy" okay'}) + assert_parse_equals(%q{(and source:foo)bar a)}, %q{(a (source:'foo)bar'))}) end should "parse wildcard tags correctly" do