module Unicode::Confusable

Constants

DATA_DIRECTORY
INDEX
INDEX_FILENAME
UNICODE_VERSION
VERSION

Public Class Methods

confusable?(string1, string2) click to toggle source
# File lib/unicode/confusable.rb, line 7
def self.confusable?(string1, string2)
  skeleton(string1) == skeleton(string2)
end
list(char, partial_mapping_allowed = true) click to toggle source
# File lib/unicode/confusable.rb, line 20
def self.list(char, partial_mapping_allowed = true)
  require_relative 'confusable/index' unless defined? ::Unicode::Confusable::INDEX
  codepoint = char.codepoints.first or raise ArgumentError, "no data given to Unicode::Confusable.list"
  if partial_mapping_allowed
    INDEX.select{ |k,v| v == codepoint || v.is_a?(Array) && v.include?(codepoint) }.keys.map{ |codepoint| [codepoint].pack("U*") }
  else
    INDEX.select{ |k,v| v == codepoint }.keys.map{ |codepoint| [codepoint].pack("U") }
  end
end
skeleton(string) click to toggle source
# File lib/unicode/confusable.rb, line 11
def self.skeleton(string)
  require_relative 'confusable/index' unless defined? ::Unicode::Confusable::INDEX
  UnicodeNormalize.normalize(
    UnicodeNormalize.normalize(string, :nfd).each_codepoint.map{ |codepoint|
      INDEX[codepoint] || codepoint
    }.flatten.pack("U*"), :nfd
  )
end