class Stringprep::Table::Map

Public Class Methods

new(data) click to toggle source
# File lib/stringprep/table/map.rb, line 6
def initialize(data)
  @codes = Map.parse(data)
end

Private Class Methods

parse(data) click to toggle source
# File lib/stringprep/table/map.rb, line 27
def self.parse(data)
  Hash[ data.map { |line|
    parse_line(line).tap { |x|
      raise "Parse error '#{line}'" if x.nil?
    }
  }]
end
parse_case_map(line) click to toggle source
# File lib/stringprep/table/map.rb, line 45
def self.parse_case_map(line)
  if r = line.match(/([[:xdigit:]]+);(?:[[:space:]]*([[:xdigit:]]+))+;[[:space:]]*/)
    [ r[1].to_i(16), r[2..-1].map { |x| x.to_i(16) } ]
  end
end
parse_line(line) click to toggle source
# File lib/stringprep/table/map.rb, line 35
def self.parse_line(line)
  parse_map_to_nothing(line) || parse_case_map(line)
end
parse_map_to_nothing(line) click to toggle source
# File lib/stringprep/table/map.rb, line 39
def self.parse_map_to_nothing(line)
  if line =~ /([[:xdigit:]]+);[[:space:]]*;[[:space:]]*/
    [ $1.to_i(16), nil ]
  end
end

Public Instance Methods

map(code) click to toggle source
# File lib/stringprep/table/map.rb, line 10
def map(code)
  if string_char = ((code.is_a?(String)) && (code.length == 1))
    code = code.unpack('U')[0]
  end
  return unless code.class < Integer
  new_code = @codes[code] || code
  if string_char
    if new_code.is_a?(Array)
      new_code = new_code.pack('U*')
    else
      new_code = [new_code].pack('U') if !new_code.nil?
    end
  end
  new_code
end