Module: TinyTemplate::Base

Included in:
TinyTemplate
Defined in:
lib/tiny-template/base.rb

Instance Method Summary collapse

Instance Method Details

#parse(str) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/tiny-template/base.rb', line 2

def parse(str)
  TinyTemplate::Node::Tag.new.tap do |node|
    str.split(/(?<!\\)<(.+?)>/).zip([:text, :tag].cycle).each do |content, type|
      content = content.strip
      next if content.empty?

      case type
      when :text
        node << TinyTemplate::Node::Text.new(content)

      when :tag
        if /\/(?<name>.*)/ =~ content
          # Simple recovery; close tags until we see the close tag we expect
          until name == node.name || node.parent.nil?
            node = node.parent
          end

          unless name == node.name
            raise TinyTemplate::Node::MismatchedTag.new
          end

          node = node.parent
        else
          node << (node = TinyTemplate::Node::Tag.new(content))
        end
      end
    end
  end
end