class HtmlBeautifier::Parser

Public Class Methods

new() { |self| ... } click to toggle source
# File lib/htmlbeautifier/parser.rb, line 5
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 10
def map(pattern, method)
  @maps << [pattern, method]
end
scan(subject, receiver) click to toggle source
# File lib/htmlbeautifier/parser.rb, line 14
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 23
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 19
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 29
def dispatch(receiver)
  _, method = @maps.find { |pattern, _| @scanner.scan(pattern) }
  raise "Unmatched sequence" unless method
  receiver.__send__(method, *extract_params(@scanner))
rescue => ex
  raise "#{ex.message} on line #{source_line_number}"
end
extract_params(scanner) click to toggle source
# File lib/htmlbeautifier/parser.rb, line 37
def extract_params(scanner)
  return [scanner[0]] unless scanner[1]
  params = []
  i = 1
  while scanner[i]
    params << scanner[i]
    i += 1
  end
  params
end