Sha256: cf69b73c41489c316eb9928658bb00967d918d45f65373de538df158465d305d

Contents?: true

Size: 1.73 KB

Versions: 2

Compression:

Stored size: 1.73 KB

Contents

#--
# Ruby Whois
#
# An intelligent pure Ruby WHOIS client and parser.
#
# Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
#++


module Whois
  class Record
    class Parser
      module Scanners

        class Base

          class_attribute :tokenizers
          self.tokenizers = []

          def self.tokenizer(name, &block)
            define_method(name, &block)
          end


          def initialize(content)
            @input = StringScanner.new(content)
          end

          def parse
            # The temporary store.
            # Scanners may use this to store pointers, states or other flags.
            @tmp = {}

            # A super-simple AST store.
            @ast = {}

            tokenize until @input.eos?

            @ast
          end


          tokenizer :skip_empty_line do
            @input.skip(/^\n/)
          end

          tokenizer :skip_newline do
            @input.skip(/\n/)
          end

          tokenizer :scan_keyvalue do
            if @input.scan(/(.+?):(.*?)\n/)
              key, value = @input[1].strip, @input[2].strip
              if @ast[key].nil?
                @ast[key] = value
              else
                @ast[key] = [@ast[key]] unless @ast[key].is_a?(Array)
                @ast[key] << value
              end
            end
          end

          private

          def tokenize
            tokenizers.each do |tokenizer|
              return if send(tokenizer)
            end
            unexpected_token
          end

          def unexpected_token
            error!("Unexpected token")
          end

          def error!(message)
            raise ParserError, "#{message}: #{@input.peek(@input.string.length)}"
          end

        end

      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
whois-2.4.0 lib/whois/record/parser/scanners/base.rb
whois-2.3.0 lib/whois/record/parser/scanners/base.rb