diff --git a/lib/liquid/tags/for.rb b/lib/liquid/tags/for.rb index 3028efa..ec475d2 100644 --- a/lib/liquid/tags/for.rb +++ b/lib/liquid/tags/for.rb @@ -13,6 +13,8 @@ module Liquid #
# Item {{ forloop.index }}: {{ item.name }} #
+ # {% 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 \ No newline at end of file +end diff --git a/test/lib/liquid/tags/standard_tag_test.rb b/test/lib/liquid/tags/standard_tag_test.rb index 4e14949..46c1a7f 100644 --- a/test/lib/liquid/tags/standard_tag_test.rb +++ b/test/lib/liquid/tags/standard_tag_test.rb @@ -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)