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