class Nodaire::Tablatal::Parser

@private

Constants

Key

Attributes

data[R]
symbolize_names[R]

Public Class Methods

new(string, strict, options = {}) click to toggle source
Calls superclass method Nodaire::Parser::new
# File lib/nodaire/tablatal/parser.rb, line 11
def initialize(string, strict, options = {})
  super(strict, options)

  @symbolize_names = option(:symbolize_names, false)
  @data = []
  @keys = []

  parse! string
end

Public Instance Methods

keys() click to toggle source
# File lib/nodaire/tablatal/parser.rb, line 21
def keys
  @keys.map(&:name)
end

Private Instance Methods

filter_keys(keys) click to toggle source
# File lib/nodaire/tablatal/parser.rb, line 52
def filter_keys(keys)
  result = []
  keys.each do |key|
    if result.any? { |k| k.name == key.name }
      oops! "Duplicate key #{key.name}", 1
    else
      result << key
    end
  end
  result
end
make_keys(segs) click to toggle source
# File lib/nodaire/tablatal/parser.rb, line 40
def make_keys(segs)
  keys = []
  start = 0
  segs.each_with_index do |seg, idx|
    len = seg.size if idx < segs.size - 1
    range_end = len ? start + len - 1 : -1
    keys << Key.new(name: normalize_key(seg), range: start..range_end)
    start += len if len
  end
  keys
end
make_line(line) click to toggle source
# File lib/nodaire/tablatal/parser.rb, line 64
def make_line(line)
  @keys.map { |key| [key.name, Nodaire.squeeze(line[key.range])] }.to_h
end
normalize_key(string) click to toggle source
# File lib/nodaire/tablatal/parser.rb, line 68
def normalize_key(string)
  if symbolize_names
    Nodaire.symbolize(string)
  else
    Nodaire.squeeze(string).upcase
  end
end
parse!(string) click to toggle source
# File lib/nodaire/tablatal/parser.rb, line 31
def parse!(string)
  lines = (string || '').strip.split("\n")
                        .reject { |line| line.match(/^\s*(;.*)?$/) }
  return if lines.empty?

  @keys = filter_keys(make_keys(lines.shift.scan(/(\S+\s*)/).flatten))
  @data = lines.map { |line| make_line(line) }.compact
end