Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions spec/integration/golden_liquid.pending
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ liquid.golden.date_filter timestamp integer
liquid.golden.date_filter timestamp string
liquid.golden.date_filter undefined argument
liquid.golden.date_filter well formed string
liquid.golden.decrement_tag increment and decrement named counter
liquid.golden.decrement_tag named counter
liquid.golden.default_filter missing argument
liquid.golden.echo_tag access an array item by index
liquid.golden.echo_tag access an array item by negative index
Expand Down Expand Up @@ -134,11 +132,6 @@ liquid.golden.include_tag some keyword arguments without leading comma
liquid.golden.include_tag some keyword arguments with range literal
liquid.golden.include_tag string literal name
liquid.golden.include_tag use globals from outer scope
liquid.golden.increment_tag assign and increment
liquid.golden.increment_tag incrementing counter renders before incrementing
liquid.golden.increment_tag multiple named counters
liquid.golden.increment_tag named counter
liquid.golden.increment_tag named counters are in scope for subsequent expressions
liquid.golden.inline_comment_tag can't comment tags
liquid.golden.inline_comment_tag empty
liquid.golden.inline_comment_tag liquid tag
Expand Down
8 changes: 8 additions & 0 deletions src/liquid/codegen_visitor.cr
Original file line number Diff line number Diff line change
Expand Up @@ -154,5 +154,13 @@ module Liquid
node.children.each &.accept self
pop
end

def visit(node : Increment)
to_io %(Liquid::Block::Increment.new("#{escape node.var_name}"))
end

def visit(node : Decrement)
to_io %(Liquid::Block::Decrement.new("#{escape node.var_name}"))
end
end
end
20 changes: 20 additions & 0 deletions src/liquid/context.cr
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ module Liquid
end

@data : Hash(String, Any)
@counters = Hash(String, Int32).new(0)

# :nodoc:
# These values are used/reused when calling filters in a expression using this context.
Expand Down Expand Up @@ -80,12 +81,31 @@ module Liquid
Any.new(nil)
end

def increment_counter(name : String) : Int32
val = @counters[name]
@counters[name] = val + 1
val
end

def decrement_counter(name : String) : Int32
@counters[name] -= 1
@counters[name]
end

def counter(name : String) : Int32
@counters[name]
Comment on lines +95 to +96
end

# Fetch a variable from context, add `UndefinedVariable` error if the variable isn't found and behave according the
# error mode.
def get(var : String) : Any
value = @data[var]?
return value if value

if @counters.has_key?(var)
return Any.new(@counters[var])
end
Comment on lines +105 to +107
Comment on lines 99 to +107

add_error(UndefinedVariable.new(var))
end

Expand Down
14 changes: 2 additions & 12 deletions src/liquid/render_visitor.cr
Original file line number Diff line number Diff line change
Expand Up @@ -91,21 +91,11 @@ module Liquid
end

def visit(node : Increment)
var = @data.get node.var_name
if var && (num = var.as_i?)
@data.set node.var_name, num + 1
else
@data.set node.var_name, 1
end
@io << @data.increment_counter(node.var_name)
end

def visit(node : Decrement)
var = @data.get node.var_name
if var && (num = var.as_i?)
@data.set node.var_name, num - 1
else
@data.set node.var_name, -1
end
@io << @data.decrement_counter(node.var_name)
end

def visit(node : ExpressionNode)
Expand Down