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.

Defined Under Namespace

Classes: ParseTreeVisitor

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.



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

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

#fromObject (readonly)

Returns the value of attribute from.



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

def from
  @from
end

#limitObject (readonly)

Returns the value of attribute limit.



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

def limit
  @limit
end

#variable_nameObject (readonly)

Returns the value of attribute variable_name.



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

def variable_name
  @variable_name
end

Instance Method Details

#nodelistObject



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

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

#parse(tokens) ⇒ Object



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

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

#render(context) ⇒ Object



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

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



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

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