mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-04 01:25:14 -07:00
+18
-3
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user