module Unicode::DisplayWidth

Constants

DATA_DIRECTORY
INDEX
INDEX_FILENAME
NO_STRING_EXT
UNICODE_VERSION
VERSION

Public Class Methods

of(string, ambiguous = 1, overwrite = {}) click to toggle source
# File lib/unicode/display_width.rb, line 5
def self.of(string, ambiguous = 1, overwrite = {})
  require_relative 'display_width/index' unless defined? ::Unicode::DisplayWidth::INDEX

  res = string.unpack('U*').inject(0){ |total_width, codepoint|
    index_or_value = INDEX
    codepoint_depth_offset = codepoint
    [0x10000, 0x1000, 0x100, 0x10].each{ |depth|
      index_or_value         = index_or_value[codepoint_depth_offset / depth]
      codepoint_depth_offset = codepoint_depth_offset % depth
      break unless index_or_value.is_a? Array
    }
    width = index_or_value.is_a?(Array) ? index_or_value[codepoint_depth_offset] : index_or_value
    width = ambiguous if width == :A
    total_width + (overwrite[codepoint] || width || 1)
  }

  res < 0 ? 0 : res
end