From caf59940d34c98d66ca8ae22142a9adca7e7f000 Mon Sep 17 00:00:00 2001 From: Prathan Thananart Date: Thu, 28 Apr 2011 13:07:41 +0700 Subject: [PATCH] Added code to make for-else work --- lib/liquid/tags/for.rb | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/liquid/tags/for.rb b/lib/liquid/tags/for.rb index b17a332..810eb0f 100644 --- a/lib/liquid/tags/for.rb +++ b/lib/liquid/tags/for.rb @@ -58,8 +58,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 +73,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 +87,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 +111,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 +136,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