Class: AdHocTemplate::Parser

Inherits:
TreeStack
  • Object
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

.remove_indent_before_iteration_tags(template_source, tag_type) ⇒ Object



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

#parseObject



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