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
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
|