From 282786d7e2deb728f82977d4db38b0f7a05e7e76 Mon Sep 17 00:00:00 2001 From: James MacAulay Date: Wed, 15 Oct 2008 15:06:58 -0400 Subject: [PATCH] if blocks work with filtered variables --- lib/liquid.rb | 9 +++++++-- lib/liquid/context.rb | 7 +++++++ lib/liquid/tags/if.rb | 2 +- lib/liquid/variable.rb | 4 ++-- test/if_else_test.rb | 7 +++++++ 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/liquid.rb b/lib/liquid.rb index 12b8f23..642598d 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -22,7 +22,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) module Liquid - FilterSperator = /\|/ + FilterSeparator = /\|/ ArgumentSeparator = ',' FilterArgumentSeparator = ':' VariableAttributeSeparator = '.' @@ -33,7 +33,12 @@ module Liquid VariableStart = /\{\{/ VariableEnd = /\}\}/ VariableIncompleteEnd = /\}\}?/ - QuotedFragment = /"[^"]+"|'[^']+'|[^\s,|]+/ + QuotedFragment = /"[^"]+"|'[^']+'|[^\s,\|]+/ + StrictQuotedFragment = /"[^"]+"|'[^']+'|[^\s,\|,\:,\,]+/ + FirstFilterArgument = /#{FilterArgumentSeparator}(?:#{StrictQuotedFragment})/ + OtherFilterArgument = /#{ArgumentSeparator}(?:#{StrictQuotedFragment})/ + SpacelessFilter = /#{FilterSeparator}(?:#{StrictQuotedFragment})(?:#{FirstFilterArgument}(?:#{OtherFilterArgument})*)?/ + Expression = /(?:#{QuotedFragment}(?:#{SpacelessFilter})*)/ TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/ TemplateParser = /(#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd})/ VariableParser = /\[[^\]]+\]|#{VariableSegment}+/ diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index 69b7664..d1ca109 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -133,6 +133,9 @@ module Liquid :blank? when 'empty' :empty? + # filtered variables + when SpacelessFilter + filtered_variable(key) # Single quoted strings when /^'(.*)'$/ $1.to_s @@ -221,5 +224,9 @@ module Liquid object end + + def filtered_variable(markup) + Variable.new(markup).render(self) + end end end diff --git a/lib/liquid/tags/if.rb b/lib/liquid/tags/if.rb index 8ff4708..a84d567 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 = /(#{QuotedFragment})\s*([=!<>a-z_]+)?\s*(#{QuotedFragment})?/ + Syntax = /(#{Expression})\s*([=!<>a-z_]+)?\s*(#{Expression})?/ def initialize(tag_name, markup, tokens) diff --git a/lib/liquid/variable.rb b/lib/liquid/variable.rb index 16d7f99..5074d1f 100644 --- a/lib/liquid/variable.rb +++ b/lib/liquid/variable.rb @@ -19,8 +19,8 @@ module Liquid @filters = [] if match = markup.match(/\s*(#{QuotedFragment})/) @name = match[1] - if markup.match(/#{FilterSperator}\s*(.*)/) - filters = Regexp.last_match(1).split(/#{FilterSperator}/) + if markup.match(/#{FilterSeparator}\s*(.*)/) + filters = Regexp.last_match(1).split(/#{FilterSeparator}/) filters.each do |f| if matches = f.match(/\s*(\w+)/) diff --git a/test/if_else_test.rb b/test/if_else_test.rb index 5daef3f..538c785 100644 --- a/test/if_else_test.rb +++ b/test/if_else_test.rb @@ -112,6 +112,13 @@ 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 %}') + end + def test_syntax_error_no_variable assert_raise(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}')} end