From 673826630c50d99270a87143e3b6de202d5398b9 Mon Sep 17 00:00:00 2001 From: Tristan Hume Date: Fri, 26 Jul 2013 09:32:08 -0400 Subject: [PATCH] Unfinished if statement parser. --- lib/liquid/parser.rb | 9 +++++++ lib/liquid/tags/if.rb | 55 ++++++++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 17 deletions(-) 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)