diff --git a/lib/liquid.rb b/lib/liquid.rb index 82676d0e8..28338d76b 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -30,8 +30,7 @@ module Liquid VariableSegment = /[\w\-]/ VariableStart = /\{\{/ VariableEnd = /\}\}/ - VariableIncompleteEnd = /\}\}?/ - QuotedString = /"[^"]*"|'[^']*'/ + QuotedString = /(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/ QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o StrictQuotedFragment = /"[^"]+"|'[^']+'|[^\s|:,]+/ FirstFilterArgument = /#{FilterArgumentSeparator}(?:#{StrictQuotedFragment})/o @@ -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}(?:#{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 f5c4426e5..cea31b040 100644 --- a/test/liquid/parsing_quirks_test.rb +++ b/test/liquid/parsing_quirks_test.rb @@ -49,4 +49,54 @@ 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 + + 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}\" }}") + + assert_equal text, template.render + + text = 'test \\\' escaping' + template = Template.parse("{{ '#{text}' }}") + + assert_equal text, template.render + end + end # ParsingQuirksTest