Merge pull request #56 from oozou/for-else

For-else !!!
This commit is contained in:
Tobias Lütke 2011-07-01 11:42:17 -07:00
commit 410cce9740
2 changed files with 25 additions and 4 deletions

View File

@ -13,6 +13,8 @@ module Liquid
# <div {% if forloop.first %}class="first"{% endif %}>
# Item {{ forloop.index }}: {{ item.name }}
# </div>
# {% else %}
# There is nothing in the collection.
# {% endfor %}
#
# You can also define a limit and offset much like SQL. Remember
@ -58,8 +60,14 @@ module Liquid
raise SyntaxError.new("Syntax Error in 'for loop' - Valid syntax: for [item] in [collection]")
end
@nodelist = @for_block = []
super
end
def unknown_tag(tag, markup, tokens)
return super unless tag == 'else'
@nodelist = @else_block = []
end
def render(context)
context.registers[:for] ||= Hash.new(0)
@ -67,7 +75,7 @@ module Liquid
collection = context[@collection_name]
collection = collection.to_a if collection.is_a?(Range)
return '' unless collection.respond_to?(:each)
return render_else(context) unless collection.respond_to?(:each)
from = if @attributes['offset'] == 'continue'
context.registers[:for][@name].to_i
@ -81,7 +89,7 @@ module Liquid
segment = slice_collection_using_each(collection, from, to)
return '' if segment.empty?
return render_else(context) if segment.empty?
segment.reverse! if @reversed
@ -105,7 +113,7 @@ module Liquid
'first' => (index == 0),
'last' => (index == length - 1) }
result << render_all(@nodelist, context)
result << render_all(@for_block, context)
end
end
result
@ -130,7 +138,14 @@ module Liquid
segments
end
private
def render_else(context)
return @else_block ? [render_all(@else_block, context)] : ''
end
end
Template.register_tag('for', For)
end
end

View File

@ -102,6 +102,12 @@ HERE
assigns)
end
def test_for_else
assert_template_result('+++', '{%for item in array%}+{%else%}-{%endfor%}', 'array'=>[1,2,3])
assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array'=>[])
assert_template_result('-', '{%for item in array%}+{%else%}-{%endfor%}', 'array'=>nil)
end
def test_limiting
assigns = {'array' => [1,2,3,4,5,6,7,8,9,0]}
assert_template_result('12', '{%for i in array limit:2 %}{{ i }}{%endfor%}', assigns)