Sha256: 8a9c78064fb485b1cd8e1c3e81dd0d6f0f183b4a40b14e56ea0ee8406b11bde5

Contents?: true

Size: 1007 Bytes

Versions: 3

Compression:

Stored size: 1007 Bytes

Contents

require "strscan"

module HtmlFormatter
  class Parser
    def initialize
      @maps = []
      yield self if block_given?
    end

    def map(pattern, method)
      @maps << [pattern, method]
    end

    def scan(subject, receiver)
      @scanner = StringScanner.new(subject)
      dispatch(receiver) until @scanner.eos?
    end

    def source_so_far
      @scanner.string[0...@scanner.pos]
    end

    def source_line_number
      [source_so_far.chomp.split(%r{\n}).count, 1].max
    end

  private

    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

    def extract_params(scanner)
      return [scanner[0]] unless scanner[1]
      params = []
      i = 1
      while scanner[i]
        params << scanner[i]
        i += 1
      end
      params
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
htmlformatter-1.5.3 lib/htmlformatter/parser.rb
htmlformatter-1.5.1 lib/htmlformatter/parser.rb
htmlformatter-1.5.0 lib/htmlformatter/parser.rb