From 48d2931d31fad503974e933dcc26f25f85294b2f Mon Sep 17 00:00:00 2001 From: Stefan Bauckmeier Date: Wed, 23 Jan 2013 18:10:32 +0100 Subject: [PATCH 1/3] allow curly brackets in variables (and get rid of unnecessary VariableIncompleteEnd) --- lib/liquid.rb | 3 +-- test/liquid/parsing_quirks_test.rb | 7 +++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/liquid.rb b/lib/liquid.rb index 82676d0e8..68b348366 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -30,7 +30,6 @@ module Liquid VariableSegment = /[\w\-]/ VariableStart = /\{\{/ VariableEnd = /\}\}/ - VariableIncompleteEnd = /\}\}?/ QuotedString = /"[^"]*"|'[^']*'/ QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o StrictQuotedFragment = /"[^"]+"|'[^']+'|[^\s|:,]+/ @@ -40,7 +39,7 @@ module Liquid Expression = /(?:#{QuotedFragment}(?:#{SpacelessFilter})*)/o TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/o AnyStartingTag = /\{\{|\{\%/ - PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/o + PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableEnd}/o TemplateParser = /(#{PartialTemplateParser}|#{AnyStartingTag})/o VariableParser = /\[[^\]]+\]|#{VariableSegment}+\??/o end diff --git a/test/liquid/parsing_quirks_test.rb b/test/liquid/parsing_quirks_test.rb index f5c4426e5..37206e7da 100644 --- a/test/liquid/parsing_quirks_test.rb +++ b/test/liquid/parsing_quirks_test.rb @@ -49,4 +49,11 @@ def test_unexpected_characters_silently_eat_logic markup = "false || true" assert_template_result('',"{% if #{markup} %} YES {% endif %}") end + + def test_error_on_variables_containing_curly_bracket + assert_nothing_raised do + Template.parse("{{ '{test}' }}") + end + end + end # ParsingQuirksTest From d61c1cb04383a5822b07a82f41f9b97455a0f8c3 Mon Sep 17 00:00:00 2001 From: Stefan Bauckmeier Date: Wed, 23 Jan 2013 18:32:16 +0100 Subject: [PATCH 2/3] allow escaped quotes in variables --- lib/liquid.rb | 2 +- test/liquid/parsing_quirks_test.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/liquid.rb b/lib/liquid.rb index 68b348366..4a42c739c 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -30,7 +30,7 @@ module Liquid VariableSegment = /[\w\-]/ VariableStart = /\{\{/ VariableEnd = /\}\}/ - QuotedString = /"[^"]*"|'[^']*'/ + QuotedString = /(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/ QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o StrictQuotedFragment = /"[^"]+"|'[^']+'|[^\s|:,]+/ FirstFilterArgument = /#{FilterArgumentSeparator}(?:#{StrictQuotedFragment})/o diff --git a/test/liquid/parsing_quirks_test.rb b/test/liquid/parsing_quirks_test.rb index 37206e7da..ff709e60f 100644 --- a/test/liquid/parsing_quirks_test.rb +++ b/test/liquid/parsing_quirks_test.rb @@ -56,4 +56,16 @@ def test_error_on_variables_containing_curly_bracket end end + def test_error_on_variables_with_escaped_quotes + text = 'test \" escaping' + template = Template.parse("{{ \"#{text}\" }}") + + assert_equal text, template.render + + text = 'test \\\' escaping' + template = Template.parse("{{ '#{text}' }}") + + assert_equal text, template.render + end + end # ParsingQuirksTest From 01cc24dec585aa61ad3fce1cd733a94833d58815 Mon Sep 17 00:00:00 2001 From: Stefan Bauckmeier Date: Thu, 24 Jan 2013 15:42:13 +0100 Subject: [PATCH 3/3] allow double curly brackets in variables --- lib/liquid.rb | 2 +- test/liquid/parsing_quirks_test.rb | 33 +++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/liquid.rb b/lib/liquid.rb index 4a42c739c..28338d76b 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -39,7 +39,7 @@ module Liquid Expression = /(?:#{QuotedFragment}(?:#{SpacelessFilter})*)/o TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/o AnyStartingTag = /\{\{|\{\%/ - PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableEnd}/o + PartialTemplateParser = /#{TagStart}(?:#{QuotedString}|.*?)*#{TagEnd}|#{VariableStart}(?:#{QuotedString}|.*?)*#{VariableEnd}/o TemplateParser = /(#{PartialTemplateParser}|#{AnyStartingTag})/o VariableParser = /\[[^\]]+\]|#{VariableSegment}+\??/o end diff --git a/test/liquid/parsing_quirks_test.rb b/test/liquid/parsing_quirks_test.rb index ff709e60f..cea31b040 100644 --- a/test/liquid/parsing_quirks_test.rb +++ b/test/liquid/parsing_quirks_test.rb @@ -56,7 +56,38 @@ def test_error_on_variables_containing_curly_bracket end end - def test_error_on_variables_with_escaped_quotes + def test_variables_containing_single_curly_bracket + text = '{test}' + + template = '' + assert_nothing_raised do + template = Template.parse("{{ '#{text}' }}") + end + + assert_equal text, template.render + end + + def test_variables_containing_double_curly_bracket + + text = "{\"foo\":{\"bar\":\"rab\"}}" + template = '' + assert_nothing_raised do + template = Template.parse("{{ '#{text}' }}") + end + + assert_equal text, template.render + + + text = "{{fancy{{\\'user\\'}}name}}" + template = '' + assert_nothing_raised do + template = Template.parse("{{ '#{text}' | remove:'{{just{{CurlyBrackets}}Again}}' }}") + end + + assert_equal text, template.render + end + + def test_variables_with_escaped_quotes text = 'test \" escaping' template = Template.parse("{{ \"#{text}\" }}")