mirror of
https://github.com/Shopify/liquid.git
synced 2025-09-21 00:00:32 -04:00
commit
410cce9740
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user