if blocks work with filtered variables

This commit is contained in:
James MacAulay
2008-10-15 17:02:26 -04:00
parent 69bc84b777
commit 282786d7e2
5 changed files with 24 additions and 5 deletions
+7 -2
View File
@@ -22,7 +22,7 @@
$LOAD_PATH.unshift(File.dirname(__FILE__)) $LOAD_PATH.unshift(File.dirname(__FILE__))
module Liquid module Liquid
FilterSperator = /\|/ FilterSeparator = /\|/
ArgumentSeparator = ',' ArgumentSeparator = ','
FilterArgumentSeparator = ':' FilterArgumentSeparator = ':'
VariableAttributeSeparator = '.' VariableAttributeSeparator = '.'
@@ -33,7 +33,12 @@ module Liquid
VariableStart = /\{\{/ VariableStart = /\{\{/
VariableEnd = /\}\}/ VariableEnd = /\}\}/
VariableIncompleteEnd = /\}\}?/ 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})/ TagAttributes = /(\w+)\s*\:\s*(#{QuotedFragment})/
TemplateParser = /(#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd})/ TemplateParser = /(#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd})/
VariableParser = /\[[^\]]+\]|#{VariableSegment}+/ VariableParser = /\[[^\]]+\]|#{VariableSegment}+/
+7
View File
@@ -133,6 +133,9 @@ module Liquid
:blank? :blank?
when 'empty' when 'empty'
:empty? :empty?
# filtered variables
when SpacelessFilter
filtered_variable(key)
# Single quoted strings # Single quoted strings
when /^'(.*)'$/ when /^'(.*)'$/
$1.to_s $1.to_s
@@ -221,5 +224,9 @@ module Liquid
object object
end end
def filtered_variable(markup)
Variable.new(markup).render(self)
end
end end
end end
+1 -1
View File
@@ -13,7 +13,7 @@ module Liquid
# #
class If < Block class If < Block
SyntaxHelp = "Syntax Error in tag 'if' - Valid syntax: if [expression]" 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) def initialize(tag_name, markup, tokens)
+2 -2
View File
@@ -19,8 +19,8 @@ module Liquid
@filters = [] @filters = []
if match = markup.match(/\s*(#{QuotedFragment})/) if match = markup.match(/\s*(#{QuotedFragment})/)
@name = match[1] @name = match[1]
if markup.match(/#{FilterSperator}\s*(.*)/) if markup.match(/#{FilterSeparator}\s*(.*)/)
filters = Regexp.last_match(1).split(/#{FilterSperator}/) filters = Regexp.last_match(1).split(/#{FilterSeparator}/)
filters.each do |f| filters.each do |f|
if matches = f.match(/\s*(\w+)/) if matches = f.match(/\s*(\w+)/)
+7
View File
@@ -112,6 +112,13 @@ class IfElseTest < Test::Unit::TestCase
assert_template_result('elsif','{% if false %}if{% elsif true %}elsif{% endif %}') assert_template_result('elsif','{% if false %}if{% elsif true %}elsif{% endif %}')
end 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 def test_syntax_error_no_variable
assert_raise(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}')} assert_raise(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}')}
end end