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
2 changed files with 25 additions and 4 deletions
+18 -3
View File
@@ -13,6 +13,8 @@ module Liquid
# <div {% if forloop.first %}class="first"{% endif %}> # <div {% if forloop.first %}class="first"{% endif %}>
# Item {{ forloop.index }}: {{ item.name }} # Item {{ forloop.index }}: {{ item.name }}
# </div> # </div>
# {% else %}
# There is nothing in the collection.
# {% endfor %} # {% endfor %}
# #
# You can also define a limit and offset much like SQL. Remember # You can also define a limit and offset much like SQL. Remember
@@ -58,16 +60,22 @@ module Liquid
raise SyntaxError.new("Syntax Error in 'for loop' - Valid syntax: for [item] in [collection]") raise SyntaxError.new("Syntax Error in 'for loop' - Valid syntax: for [item] in [collection]")
end end
@nodelist = @for_block = []
super super
end end
def unknown_tag(tag, markup, tokens)
return super unless tag == 'else'
@nodelist = @else_block = []
end
def render(context) def render(context)
context.registers[:for] ||= Hash.new(0) context.registers[:for] ||= Hash.new(0)
collection = context[@collection_name] collection = context[@collection_name]
collection = collection.to_a if collection.is_a?(Range) 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' from = if @attributes['offset'] == 'continue'
context.registers[:for][@name].to_i context.registers[:for][@name].to_i
@@ -81,7 +89,7 @@ module Liquid
segment = slice_collection_using_each(collection, from, to) segment = slice_collection_using_each(collection, from, to)
return '' if segment.empty? return render_else(context) if segment.empty?
segment.reverse! if @reversed segment.reverse! if @reversed
@@ -105,7 +113,7 @@ module Liquid
'first' => (index == 0), 'first' => (index == 0),
'last' => (index == length - 1) } 'last' => (index == length - 1) }
result << render_all(@nodelist, context) result << render_all(@for_block, context)
end end
end end
result result
@@ -130,6 +138,13 @@ module Liquid
segments segments
end end
private
def render_else(context)
return @else_block ? [render_all(@else_block, context)] : ''
end
end end
Template.register_tag('for', For) Template.register_tag('for', For)
@@ -102,6 +102,12 @@ HERE
assigns) assigns)
end 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 def test_limiting
assigns = {'array' => [1,2,3,4,5,6,7,8,9,0]} 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) assert_template_result('12', '{%for i in array limit:2 %}{{ i }}{%endfor%}', assigns)