class HtmlBeautifier::Parser

Public Class Methods

new() { |self| ... } click to toggle source
# File lib/htmlbeautifier/parser.rb, line 7
def initialize
  @maps = []
  yield self if block_given?
end

Public Instance Methods

map(pattern, method) click to toggle source
# File lib/htmlbeautifier/parser.rb, line 12
def map(pattern, method)
  @maps << [pattern, method]
end
scan(subject, receiver) click to toggle source
# File lib/htmlbeautifier/parser.rb, line 16
def scan(subject, receiver)
  @scanner = StringScanner.new(subject)
  dispatch(receiver) until @scanner.eos?
end
source_line_number() click to toggle source
# File lib/htmlbeautifier/parser.rb, line 25
def source_line_number
  [source_so_far.chomp.split(%r{\n}).count, 1].max
end
source_so_far() click to toggle source
# File lib/htmlbeautifier/parser.rb, line 21
def source_so_far
  @scanner.string[0...@scanner.pos]
end

Private Instance Methods

dispatch(receiver) click to toggle source
# File lib/htmlbeautifier/parser.rb, line 31
def dispatch(receiver)
  _, method = @maps.find { |pattern, _| @scanner.scan(pattern) }
  raise "Unmatched sequence" unless method

  receiver.__send__(method, *extract_params(@scanner))
rescue StandardError => e
  raise "#{e.message} on line #{source_line_number}"
end
extract_params(scanner) click to toggle source
# File lib/htmlbeautifier/parser.rb, line 40
def extract_params(scanner)
  return [scanner[0]] unless scanner[1]

  params = []
  i = 1
  while scanner[i]
    params << scanner[i]
    i += 1
  end
  params
end