Class: Liquid::Block

Inherits:
Tag
  • Object
show all
Defined in:
lib/liquid/block.rb

Direct Known Subclasses

Capture, Case, Comment, Document, For, If, Ifchanged, Raw, TableRow

Constant Summary collapse

IsTag =
/^#{TagStart}/
IsVariable =
/^#{VariableStart}/
FullToken =
/^#{TagStart}\s*(\w+)\s*(.*)?#{TagEnd}$/
ContentOfVariable =
/^#{VariableStart}(.*)#{VariableEnd}$/

Instance Attribute Summary

Attributes inherited from Tag

#nodelist

Instance Method Summary collapse

Methods inherited from Tag

#initialize, #name

Constructor Details

This class inherits a constructor from Liquid::Tag

Instance Method Details

#block_delimiterObject



66
67
68
# File 'lib/liquid/block.rb', line 66

def block_delimiter
  "end#{block_name}"
end

#block_nameObject



70
71
72
# File 'lib/liquid/block.rb', line 70

def block_name
  @tag_name
end

#create_variable(token) ⇒ Object

Raises:



74
75
76
77
78
79
# File 'lib/liquid/block.rb', line 74

def create_variable(token)
  token.scan(ContentOfVariable) do |content|
    return Variable.new(content.first)
  end
  raise SyntaxError.new("Variable '#{token}' was not properly terminated with regexp: #{VariableEnd.inspect} ")
end

#end_tagObject



52
53
# File 'lib/liquid/block.rb', line 52

def end_tag
end

#parse(tokens) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/liquid/block.rb', line 9

def parse(tokens)
  @nodelist ||= []
  @nodelist.clear

  while token = tokens.shift

    case token
    when IsTag
      if token =~ FullToken

        # if we found the proper block delimitor just end parsing here and let the outer block
        # proceed
        if block_delimiter == $1
          end_tag
          return
        end

        # fetch the tag from registered blocks
        if tag = Template.tags[$1]
          @nodelist << tag.new($1, $2, tokens)
        else
          # this tag is not registered with the system
          # pass it to the current block for special handling or error reporting
          unknown_tag($1, $2, tokens)
        end
      else
        raise SyntaxError, "Tag '#{token}' was not properly terminated with regexp: #{TagEnd.inspect} "
      end
    when IsVariable
      @nodelist << create_variable(token)
    when ''
      # pass
    else
      @nodelist << token
    end
  end

  # Make sure that its ok to end parsing in the current block.
  # Effectively this method will throw and exception unless the current block is
  # of type Document
  assert_missing_delimitation!
end

#render(context) ⇒ Object



81
82
83
# File 'lib/liquid/block.rb', line 81

def render(context)
  render_all(@nodelist, context)
end

#unknown_tag(tag, params, tokens) ⇒ Object



55
56
57
58
59
60
61
62
63
64
# File 'lib/liquid/block.rb', line 55

def unknown_tag(tag, params, tokens)
  case tag
  when 'else'
    raise SyntaxError, "#{block_name} tag does not expect else tag"
  when 'end'
    raise SyntaxError, "'end' is not a valid delimiter for #{block_name} tags. use #{block_delimiter}"
  else
    raise SyntaxError, "Unknown tag '#{tag}'"
  end
end