Class: Liquid::For

Inherits:
Block show all
Defined in:
lib/liquid/tags/for.rb

Overview

“For” iterates over an array or collection. Several useful variables are available to you within the loop.

Basic usage:

{% for item in collection %}
  {{ forloop.index }}: {{ item.name }}
{% endfor %}

Advanced usage:

{% for item in collection %}
  <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 that offset starts at 0 for the first item.

  {% for item in collection limit:5 offset:10 %}
    {{ item.name }}
  {% end %}

To reverse the for loop simply use {% for item in collection reversed %} (note that the flag's spelling is different to the filter `reverse`)

Available variables:

forloop.name

‘item-collection’

forloop.length

Length of the loop

forloop.index

The current item’s position in the collection; forloop.index starts at 1. This is helpful for non-programmers who start believe the first item in an array is 1, not 0.

forloop.index0

The current item’s position in the collection where the first item is 0

forloop.rindex

Number of items remaining in the loop (length - index) where 1 is the last item.

forloop.rindex0

Number of items remaining in the loop where 0 is the last item.

forloop.first

Returns true if the item is the first item.

forloop.last

Returns true if the item is the last item.

forloop.parentloop

Provides access to the parent loop, if present.

Constant Summary collapse

Syntax =
/\A(#{VariableSegment}+)\s+in\s+(#{QuotedFragment}+)\s*(reversed)?/o

Constants inherited from Block

Block::MAX_DEPTH

Instance Attribute Summary collapse

Attributes inherited from Tag

#line_number, #parse_context, #tag_name

Instance Method Summary collapse

Methods inherited from Block

#blank?, #block_delimiter, #block_name

Methods inherited from Tag

#blank?, #name, parse, #raw

Methods included from ParserSwitching

#parse_with_selected_parser

Constructor Details

#initialize(tag_name, markup, options) ⇒ For

Returns a new instance of For.



52
53
54
55
56
57
58
# File 'lib/liquid/tags/for.rb', line 52

def initialize(tag_name, markup, options)
  super
  @from = @limit = nil
  parse_with_selected_parser(markup)
  @for_block = BlockBody.new
  @else_block = nil
end

Instance Attribute Details

#collection_nameObject (readonly)

Returns the value of attribute collection_name.



49
50
51
# File 'lib/liquid/tags/for.rb', line 49

def collection_name
  @collection_name
end

#variable_nameObject (readonly)

Returns the value of attribute variable_name.



50
51
52
# File 'lib/liquid/tags/for.rb', line 50

def variable_name
  @variable_name
end

Instance Method Details

#nodelistObject



65
66
67
# File 'lib/liquid/tags/for.rb', line 65

def nodelist
  @else_block ? [@for_block, @else_block] : [@for_block]
end

#parse(tokens) ⇒ Object



60
61
62
63
# File 'lib/liquid/tags/for.rb', line 60

def parse(tokens)
  return unless parse_body(@for_block, tokens)
  parse_body(@else_block, tokens)
end

#render(context) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'lib/liquid/tags/for.rb', line 74

def render(context)
  segment = collection_segment(context)

  if segment.empty?
    render_else(context)
  else
    render_segment(context, segment)
  end
end

#unknown_tag(tag, markup, tokens) ⇒ Object



69
70
71
72
# File 'lib/liquid/tags/for.rb', line 69

def unknown_tag(tag, markup, tokens)
  return super unless tag == 'else'.freeze
  @else_block = BlockBody.new
end