class Reciter::Parser

Public Class Methods

config() click to toggle source
# File lib/reciter/parser.rb, line 46
def self.config
  @config ||= Reciter::Config.new
end

Public Instance Methods

parse(sequence) click to toggle source
# File lib/reciter/parser.rb, line 3
def parse(sequence)
  return [] if sequence.nil? || sequence == ''
  validate_format(sequence)
  sequence.
  split(';').
  map {|subsequence|
    if subsequence.include?('-')
      r = Range.new(*subsequence.split('-').map(&:to_i))
      raise InvalidInput unless r.begin <= r.end
      r.to_a
    else
      subsequence
    end
  }.
  flatten.
  uniq.
  map(&:to_i).
  sort
end
unparse(*sequence) click to toggle source
# File lib/reciter/parser.rb, line 23
def unparse(*sequence)
  mechanic, sequence = handle_unparse_params(sequence)
  ranges = []
  last = nil
  sequence.sort.each do |n|
    if last.nil? || n != last + 1
      ranges << Range.new(n, n)
    else
      ranges[-1] = Range.new(ranges[-1].begin, n)
    end
    last = n
  end
  ranges.map {|r|
    if r.end == r.begin || r.end == r.begin + 1
      r.to_a
    else
      "%s%s%s" % [r.begin, mechanic ? '-' : " #{config.text_for_to} ", r.end]
    end
  }.
  flatten.
  join(mechanic ? ';' : ', ')
end

Private Instance Methods

config() click to toggle source
# File lib/reciter/parser.rb, line 70
def config
  self.class.config
end
handle_unparse_params(params) click to toggle source
# File lib/reciter/parser.rb, line 52
def handle_unparse_params(params)
  if params[0].is_a? Symbol
    [params[0] == :mechanic, handle_unparse_params_list(params[1..-1])]
  else
    [false, handle_unparse_params_list(params)]
  end
end
handle_unparse_params_list(list) click to toggle source
# File lib/reciter/parser.rb, line 60
def handle_unparse_params_list(list)
  list[0].is_a?(Array) ? list[0] : list
end
validate_format(sequence) click to toggle source
# File lib/reciter/parser.rb, line 64
def validate_format(sequence)
  subsequences = sequence.split(';')
  raise InvalidInput unless !subsequences.empty? &&
    subsequences.all? {|subsequence| subsequence =~ /^(\d+\-\d+)$|^\d+$/ }
end