Sha256: 0b2a8304c5cf1e33450bd5e98c699f6e7b7fc39d6ec888db628678acc18bc3e7

Contents?: true

Size: 1.23 KB

Versions: 2

Compression:

Stored size: 1.23 KB

Contents

module Recog
class Fingerprint
  attr_reader :name, :regex, :params, :tests

  def initialize(xml)
    @name   = description(xml)
    @regex  = create_regexp(xml)
    @params = parse_params(xml)
    @tests  = examples(xml)
  end

  private

  def description(xml)
    element = xml.xpath('description')
    element.empty? ? '' : element.first.content 
  end

  def create_regexp(xml)
    pattern = xml['pattern']
    flags   = xml['flags'].to_s.split(',')
    RegexpFactory.build(pattern, flags)
  end

  def parse_params(xml)
    {}.tap do |h|
      xml.xpath('param').each do |e|
        name  = e['name']
        pos   = e['pos'].to_i
        value = e['value'].to_s
        h[name] = [pos, value]
      end
    end
  end

  def examples(xml)
    xml.xpath('example').collect(&:content)
  end

  module RegexpFactory
    def self.build(pattern, flags)
      options = build_options(flags)
      Regexp.new(pattern, options)
    end

    def self.build_options(flags)
      rflags = Regexp::NOENCODING
      flags.each do |flag|
        case flag
        when 'REG_DOT_NEWLINE', 'REG_LINE_ANY_CRLF'
          rflags |= Regexp::MULTILINE
        when 'REG_ICASE'
          rflags |= Regexp::IGNORECASE 
        end
      end
      rflags
    end
  end
end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
recog-0.02 lib/recog/fingerprint.rb
recog-0.01 lib/recog/fingerprint.rb