Class: AdHocTemplate::Parser
- Inherits:
-
TreeStack
- Object
- TreeStack
- AdHocTemplate::Parser
show all
- Defined in:
- lib/ad_hoc_template/parser.rb
Defined Under Namespace
Classes: IterationTagNode, Leaf, TagNode, TagType, UserDefinedTagTypeConfigError
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(str, tag) ⇒ Parser
Returns a new instance of Parser.
137
138
139
140
141
142
|
# File 'lib/ad_hoc_template/parser.rb', line 137
def initialize(str, tag)
@tag = tag
str = remove_trailing_newline_of_iteration_end_tag(str, @tag.iteration_end)
@tokens = PseudoHiki.split_into_tokens(str, @tag.token_pat)
super()
end
|
Class Method Details
.parse(str, tag_name = :default) ⇒ Object
108
109
110
111
112
113
|
# File 'lib/ad_hoc_template/parser.rb', line 108
def self.parse(str, tag_name=:default)
if TagType[tag_name].remove_iteration_indent
str = remove_indent_before_iteration_tags(str, TagType[tag_name])
end
new(str, TagType[tag_name]).parse.tree
end
|
.register_user_defined_tag_type(config_source) ⇒ Object
124
125
126
127
128
129
130
131
132
133
134
135
|
# File 'lib/ad_hoc_template/parser.rb', line 124
def self.register_user_defined_tag_type(config_source)
config = YAML.load(config_source)
%w(tag_name tag iteration_tag).each do |item|
config[item] || raise(UserDefinedTagTypeConfigError,
"\"#{item}\" should be defined.")
end
TagType.register(registered_tag_name = config["tag_name"].to_sym,
config["tag"],
config["iteration_tag"],
config["remove_indent"] || false)
registered_tag_name
end
|
115
116
117
118
119
120
121
122
|
# File 'lib/ad_hoc_template/parser.rb', line 115
def self.remove_indent_before_iteration_tags(template_source, tag_type)
[
tag_type.iteration_start,
tag_type.iteration_end
].inject(template_source) do |s, tag|
s.gsub(/^([ \t]+#{Regexp.escape(tag)}(?:\r?\n|\r))/) { $1.lstrip }
end
end
|
Instance Method Details
#parse ⇒ Object
144
145
146
147
148
149
150
151
152
|
# File 'lib/ad_hoc_template/parser.rb', line 144
def parse
while token = @tokens.shift
next if @tag.tail[token] == current_node.class and self.pop
next if @tag.head[token] and self.push @tag.head[token].new
self.push Leaf.create(token)
end
self
end
|