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