diff --git a/lib/liquid.rb b/lib/liquid.rb index 679d1c2b..316af002 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -22,7 +22,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) module Liquid - FilterSeparator = /\|/ + FilterSperator = /\|/ ArgumentSeparator = ',' FilterArgumentSeparator = ':' VariableAttributeSeparator = '.' @@ -33,13 +33,7 @@ module Liquid VariableStart = /\{\{/ VariableEnd = /\}\}/ VariableIncompleteEnd = /\}\}?/ - QuotedString = /"[^"]+"|'[^']+'/ - QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/ - StrictQuotedFragment = /"[^"]+"|'[^']+'|[^\s,\|,\:,\,]+/ - FirstFilterArgument = /#{FilterArgumentSeparator}(?:#{StrictQuotedFragment})/ - OtherFilterArgument = /#{ArgumentSeparator}(?:#{StrictQuotedFragment})/ - SpacelessFilter = /#{FilterSeparator}(?:#{StrictQuotedFragment})(?:#{FirstFilterArgument}(?:#{OtherFilterArgument})*)?/ - Expression = /(?:#{QuotedFragment}(?:#{SpacelessFilter})*)/ + QuotedFragment = /"[^"]+"|'[^']+'|[^\s,|]+/ TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/ AnyStartingTag = /\{\{|\{\%/ PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/ diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index d1ca1092..69b76643 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -133,9 +133,6 @@ module Liquid :blank? when 'empty' :empty? - # filtered variables - when SpacelessFilter - filtered_variable(key) # Single quoted strings when /^'(.*)'$/ $1.to_s @@ -224,9 +221,5 @@ module Liquid object end - - def filtered_variable(markup) - Variable.new(markup).render(self) - end end end diff --git a/lib/liquid/tags/assign.rb b/lib/liquid/tags/assign.rb index 7b48b84f..a68cf30d 100644 --- a/lib/liquid/tags/assign.rb +++ b/lib/liquid/tags/assign.rb @@ -9,7 +9,7 @@ module Liquid # {{ monkey }} # class Assign < Tag - Syntax = /(#{VariableSignature}+)\s*=\s*(#{Expression}+)/ + Syntax = /(#{VariableSignature}+)\s*=\s*(#{QuotedFragment}+)/ def initialize(tag_name, markup, tokens) if markup =~ Syntax diff --git a/lib/liquid/tags/case.rb b/lib/liquid/tags/case.rb index f6f24d4d..0733c51a 100644 --- a/lib/liquid/tags/case.rb +++ b/lib/liquid/tags/case.rb @@ -1,7 +1,7 @@ module Liquid class Case < Block - Syntax = /(#{Expression})/ - WhenSyntax = /(#{Expression})(?:(?:\s+or\s+|\s*\,\s*)(#{Expression}.*))?/ + Syntax = /(#{QuotedFragment})/ + WhenSyntax = /(#{QuotedFragment})(?:(?:\s+or\s+|\s*\,\s*)(#{QuotedFragment}.*))?/ def initialize(tag_name, markup, tokens) @blocks = [] diff --git a/lib/liquid/tags/cycle.rb b/lib/liquid/tags/cycle.rb index bc39d3fe..aa7f64ce 100644 --- a/lib/liquid/tags/cycle.rb +++ b/lib/liquid/tags/cycle.rb @@ -13,8 +13,8 @@ module Liquid #
Item five
# class Cycle < Tag - SimpleSyntax = /^#{Expression}/ - NamedSyntax = /^(#{Expression})\s*\:\s*(.*)/ + SimpleSyntax = /^#{QuotedFragment}/ + NamedSyntax = /^(#{QuotedFragment})\s*\:\s*(.*)/ def initialize(tag_name, markup, tokens) case markup @@ -48,7 +48,7 @@ module Liquid def variables_from_string(markup) markup.split(',').collect do |var| - var =~ /\s*(#{Expression})\s*/ + var =~ /\s*(#{QuotedFragment})\s*/ $1 ? $1 : nil end.compact end diff --git a/lib/liquid/tags/for.rb b/lib/liquid/tags/for.rb index 4ff86713..b17a3320 100644 --- a/lib/liquid/tags/for.rb +++ b/lib/liquid/tags/for.rb @@ -42,7 +42,7 @@ module Liquid # forloop.last:: Returns true if the item is the last item. # class For < Block - Syntax = /(\w+)\s+in\s+(#{Expression}+)\s*(reversed)?/ + Syntax = /(\w+)\s+in\s+(#{QuotedFragment}+)\s*(reversed)?/ def initialize(tag_name, markup, tokens) if markup =~ Syntax diff --git a/lib/liquid/tags/if.rb b/lib/liquid/tags/if.rb index a84d5677..8ff47088 100644 --- a/lib/liquid/tags/if.rb +++ b/lib/liquid/tags/if.rb @@ -13,7 +13,7 @@ module Liquid # class If < Block SyntaxHelp = "Syntax Error in tag 'if' - Valid syntax: if [expression]" - Syntax = /(#{Expression})\s*([=!<>a-z_]+)?\s*(#{Expression})?/ + Syntax = /(#{QuotedFragment})\s*([=!<>a-z_]+)?\s*(#{QuotedFragment})?/ def initialize(tag_name, markup, tokens) diff --git a/lib/liquid/variable.rb b/lib/liquid/variable.rb index cf585186..39eb6e20 100644 --- a/lib/liquid/variable.rb +++ b/lib/liquid/variable.rb @@ -19,8 +19,9 @@ module Liquid @filters = [] if match = markup.match(/\s*(#{QuotedFragment})/) @name = match[1] - if markup.match(/#{FilterSeparator}\s*(.*)/) - filters = Regexp.last_match(1).split(/#{FilterSeparator}/) + if markup.match(/#{FilterSperator}\s*(.*)/) + filters = Regexp.last_match(1).split(/#{FilterSperator}/) + filters.each do |f| if matches = f.match(/\s*(\w+)/) filtername = matches[1] diff --git a/test/assign_test.rb b/test/assign_test.rb index 15d00e53..9bf6f2fb 100644 --- a/test/assign_test.rb +++ b/test/assign_test.rb @@ -1,11 +1,10 @@ require File.dirname(__FILE__) + '/helper' -class IfElseTest < Test::Unit::TestCase +class AssignTest < Test::Unit::TestCase include Liquid - def test_with_filtered_expressions - assert_template_result('foo','{% assign foo = values|sort|last %}{{ foo }}', 'values' => %w{foo bar baz}) - assert_template_result('foo','{% assign sorted = values|sort %}{{ sorted | last }}', 'values' => %w{foo bar baz}) + def test_assigned_variable + assert_template_result('.foo.','{% assign foo = values %}.{{ foo }}.', 'values' => %w{foo bar baz}) end end \ No newline at end of file diff --git a/test/if_else_test.rb b/test/if_else_test.rb index 8e52d00a..5daef3f1 100644 --- a/test/if_else_test.rb +++ b/test/if_else_test.rb @@ -112,25 +112,6 @@ class IfElseTest < Test::Unit::TestCase assert_template_result('elsif','{% if false %}if{% elsif true %}elsif{% endif %}') end - def test_with_filtered_expressions - assert_template_result('yes','{% if "BLAH"|downcase == "blah" %}yes{% endif %}') - assert_template_result('yes','{% if "FOO BAR"|truncatewords:1,"--" == "FOO--" %}yes{% endif %}') - assert_template_result('yes','{% if "FOO BAR"|truncatewords:1,"--"|downcase == "foo--" %}yes{% endif %}') - assert_template_result('yes','{% if "foo--" == "FOO BAR"|truncatewords:1,"--"|downcase %}yes{% endif %}') - # array transformation, to make sure we aren't converting arrays to strings somewhere along the way: - assert_template_result('yes','{% if values|sort == sorted %}yes{% endif %}', 'values' => %w{foo bar baz}, 'sorted' => %w{bar baz foo}) - end - - def test_allow_no_spaces_in_filtered_expressions - assert_template_result('','{% if "foo--" == "FOO BAR" |truncatewords:1,"--"|downcase %}yes{% endif %}') - assert_template_result('','{% if "foo--" == "FOO BAR"| truncatewords:1,"--"|downcase %}yes{% endif %}') - assert_template_result('','{% if "foo--" == "FOO BAR"|truncatewords :1,"--"|downcase %}yes{% endif %}') - assert_template_result('','{% if "foo--" == "FOO BAR"|truncatewords: 1,"--"|downcase %}yes{% endif %}') - assert_template_result('','{% if "foo--" == "FOO BAR"|truncatewords:1 ,"--"|downcase %}yes{% endif %}') - assert_template_result('','{% if "foo--" == "FOO BAR"|truncatewords:1, "--"|downcase %}yes{% endif %}') - assert_template_result('','{% if "foo--" == "FOO BAR"|truncatewords:1,"--" |downcase %}yes{% endif %}') - end - def test_syntax_error_no_variable assert_raise(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}')} end diff --git a/test/standard_tag_test.rb b/test/standard_tag_test.rb index abb84570..e2255793 100644 --- a/test/standard_tag_test.rb +++ b/test/standard_tag_test.rb @@ -98,11 +98,7 @@ HERE assigns = {'array' => [1,2,3] } assert_template_result('+--', '{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}', assigns) end - - def test_for_with_filtered_expressions - assert_template_result('abc','{% for letter in letters|sort %}{{ letter }}{% endfor %}', 'letters' => %w{c b a}) - end - + def test_limiting assigns = {'array' => [1,2,3,4,5,6,7,8,9,0]} assert_template_result('12','{%for i in array limit:2 %}{{ i }}{%endfor%}',assigns) @@ -353,10 +349,10 @@ HERE assert_template_result('one two one','{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}') - assert_template_result('text-align: left text-align: right','{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}') + assert_template_result('text-align: left,text-align: right','{%cycle "text-align: left", "text-align: right" %},{%cycle "text-align: left", "text-align: right"%}') - assert_template_result(' ','{% cycle "", "", "" %}') - assert_template_result(' ','{% cycle "", "", "" %} {% cycle "", "", "" %} {% cycle "", "", "" %} {% cycle "", "", "" %}') + assert_template_result('.','.{% cycle "", "", "" %}') + assert_template_result('... ','.{% cycle "", "", "" %}.{% cycle "", "", "" %}.{% cycle "", "", "" %} {% cycle "", "", "" %}') end