Sha256: a592b52652d416633cc2bad556d154ac85c14e21ec4b5433b7f0992e23584d28

Contents?: true

Size: 1008 Bytes

Versions: 7

Compression:

Stored size: 1008 Bytes

Contents

require "strscan"

module HtmlBeautifier
  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

7 entries across 7 versions & 2 rubygems

Version Path
zine_brewer-1.5.0 vendor/bundle/ruby/2.7.0/gems/htmlbeautifier-1.3.1/lib/htmlbeautifier/parser.rb
zine_brewer-1.3.0 vendor/bundle/ruby/2.7.0/gems/htmlbeautifier-1.3.1/lib/htmlbeautifier/parser.rb
htmlbeautifier-1.3.1 lib/htmlbeautifier/parser.rb
htmlbeautifier-1.3.0 lib/htmlbeautifier/parser.rb
htmlbeautifier-1.2.1 lib/htmlbeautifier/parser.rb
htmlbeautifier-1.2.0 lib/htmlbeautifier/parser.rb
htmlbeautifier-1.1.1 lib/htmlbeautifier/parser.rb