diff --git a/lib/liquid/parser.rb b/lib/liquid/parser.rb index b803edb3..fd578428 100644 --- a/lib/liquid/parser.rb +++ b/lib/liquid/parser.rb @@ -31,6 +31,15 @@ module Liquid token.contents end + # Like consume? Except for an :id token of a certain name + def id?(str) + token = @tokens[@p] + return false unless token && token.type == :id + return false unless token.contents == str + @p += 1 + token.contents + end + def cur_token() tok = @tokens[@p] raise SyntaxError, 'Expected more input.' unless tok diff --git a/lib/liquid/tags/if.rb b/lib/liquid/tags/if.rb index c7b55beb..e495a6bb 100644 --- a/lib/liquid/tags/if.rb +++ b/lib/liquid/tags/if.rb @@ -45,28 +45,49 @@ module Liquid block = if tag == 'else' ElseCondition.new else - - expressions = markup.scan(ExpressionsAndOperators).reverse - raise(SyntaxError, SyntaxHelp) unless expressions.shift =~ Syntax - - condition = Condition.new($1, $2, $3) - - while not expressions.empty? - operator = (expressions.shift).to_s.strip - - raise(SyntaxError, SyntaxHelp) unless expressions.shift.to_s =~ Syntax - - new_condition = Condition.new($1, $2, $3) - new_condition.send(operator.to_sym, condition) - condition = new_condition - end - - condition + old_parse(markup) end @blocks.push(block) @nodelist = block.attach(Array.new) end + + def old_parse(markup) + expressions = markup.scan(ExpressionsAndOperators).reverse + raise(SyntaxError, SyntaxHelp) unless expressions.shift =~ Syntax + + condition = Condition.new($1, $2, $3) + + while not expressions.empty? + operator = (expressions.shift).to_s.strip + + raise(SyntaxError, SyntaxHelp) unless expressions.shift.to_s =~ Syntax + + new_condition = Condition.new($1, $2, $3) + new_condition.send(operator.to_sym, condition) + condition = new_condition + end + + condition + end + + def parse_condition(markup) + p = Parser.new(markup) + + condition = parse_comparison(p) + + while op = (p.id?('and') || p.id?('or')) + new_cond = parse_comparison(p) + new_cond.send(op.to_sym, condition) + condition = new_cond + end + + condition + end + + def parse_comparison(p) + + end end Template.register_tag('if', If)