6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# File 'lib/unicode/display_width.rb', line 6
def self.of(string, ambiguous = 1, overwrite = {})
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
|