class Drawght::Parser
Constants
- EOL
- INDEX
- ITEM_PATTERN
- KEY_PATTERN
- LIST_PATTERN
Public Class Methods
new(template)
click to toggle source
# File lib/drawght/parser.rb, line 10 def initialize(template) @template = template end
Public Instance Methods
parse(data)
click to toggle source
# File lib/drawght/parser.rb, line 14 def parse(data) self.parse_keys(self.parse_queries(@template, data), data) end
parse_keys(template, data)
click to toggle source
# File lib/drawght/parser.rb, line 33 def parse_keys(template, data) template.split(EOL).map do |line| parse_template(line, data) end.join("\n"); end
parse_queries(template, data)
click to toggle source
# File lib/drawght/parser.rb, line 18 def parse_queries(template, data) template.split(EOL).map do |line| result = line line.scan LIST_PATTERN do |(list, key)| value = value_from_key(list, data) if value && (value.kind_of? Array) && key partial = line.gsub("#{list}#{QUERY}", "") parsed_lines = value.map { |item| parse_template(partial, item) } result = result.gsub(line, parsed_lines.join("\n")) end end result end.join("\n") end
parse_template(template, data)
click to toggle source
# File lib/drawght/parser.rb, line 39 def parse_template(template, data) result = template template.scan KEY_PATTERN do |(key)| template_key = "#{PREFIX}#{key}#{SUFFIX}" value = value_from_key(key, data) || template_key if value.kind_of? Array result = value.map { |item| template.gsub(template_key, item) }.join("\n") else result = result.gsub(template_key, value.to_s) end end result end
Private Instance Methods
value_from_key(nested_key, data)
click to toggle source
# File lib/drawght/parser.rb, line 55 def value_from_key(nested_key, data) item = nested_key.match ITEM_PATTERN if item list, index, key = item.captures index = index && (index.to_i) value = data.dig *list.split(ATTRIBUTE) if value && (value.kind_of? Array) && index key ? value[index - 1][key] : value[index - 1] end else data.dig *nested_key.split(ATTRIBUTE) end end