wcwidth 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/wcwidth.rb +127 -0
- metadata +45 -0
data/lib/wcwidth.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
6
|
+
#
|
7
|
+
# Everyone is permitted to copy and distribute verbatim or modified
|
8
|
+
# copies of this license document, and changing it is allowed as long
|
9
|
+
# as the name is changed.
|
10
|
+
#
|
11
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
12
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
13
|
+
#
|
14
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
15
|
+
# Thanks to http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
|
16
|
+
#++
|
17
|
+
|
18
|
+
class String
|
19
|
+
COMBINING = [0x0300..0x036F, 0x0483..0x0486, 0x0488..0x0489,
|
20
|
+
0x0591..0x05BD, 0x05BF..0x05BF, 0x05C1..0x05C2,
|
21
|
+
0x05C4..0x05C5, 0x05C7..0x05C7, 0x0600..0x0603,
|
22
|
+
0x0610..0x0615, 0x064B..0x065E, 0x0670..0x0670,
|
23
|
+
0x06D6..0x06E4, 0x06E7..0x06E8, 0x06EA..0x06ED,
|
24
|
+
0x070F..0x070F, 0x0711..0x0711, 0x0730..0x074A,
|
25
|
+
0x07A6..0x07B0, 0x07EB..0x07F3, 0x0901..0x0902,
|
26
|
+
0x093C..0x093C, 0x0941..0x0948, 0x094D..0x094D,
|
27
|
+
0x0951..0x0954, 0x0962..0x0963, 0x0981..0x0981,
|
28
|
+
0x09BC..0x09BC, 0x09C1..0x09C4, 0x09CD..0x09CD,
|
29
|
+
0x09E2..0x09E3, 0x0A01..0x0A02, 0x0A3C..0x0A3C,
|
30
|
+
0x0A41..0x0A42, 0x0A47..0x0A48, 0x0A4B..0x0A4D,
|
31
|
+
0x0A70..0x0A71, 0x0A81..0x0A82, 0x0ABC..0x0ABC,
|
32
|
+
0x0AC1..0x0AC5, 0x0AC7..0x0AC8, 0x0ACD..0x0ACD,
|
33
|
+
0x0AE2..0x0AE3, 0x0B01..0x0B01, 0x0B3C..0x0B3C,
|
34
|
+
0x0B3F..0x0B3F, 0x0B41..0x0B43, 0x0B4D..0x0B4D,
|
35
|
+
0x0B56..0x0B56, 0x0B82..0x0B82, 0x0BC0..0x0BC0,
|
36
|
+
0x0BCD..0x0BCD, 0x0C3E..0x0C40, 0x0C46..0x0C48,
|
37
|
+
0x0C4A..0x0C4D, 0x0C55..0x0C56, 0x0CBC..0x0CBC,
|
38
|
+
0x0CBF..0x0CBF, 0x0CC6..0x0CC6, 0x0CCC..0x0CCD,
|
39
|
+
0x0CE2..0x0CE3, 0x0D41..0x0D43, 0x0D4D..0x0D4D,
|
40
|
+
0x0DCA..0x0DCA, 0x0DD2..0x0DD4, 0x0DD6..0x0DD6,
|
41
|
+
0x0E31..0x0E31, 0x0E34..0x0E3A, 0x0E47..0x0E4E,
|
42
|
+
0x0EB1..0x0EB1, 0x0EB4..0x0EB9, 0x0EBB..0x0EBC,
|
43
|
+
0x0EC8..0x0ECD, 0x0F18..0x0F19, 0x0F35..0x0F35,
|
44
|
+
0x0F37..0x0F37, 0x0F39..0x0F39, 0x0F71..0x0F7E,
|
45
|
+
0x0F80..0x0F84, 0x0F86..0x0F87, 0x0F90..0x0F97,
|
46
|
+
0x0F99..0x0FBC, 0x0FC6..0x0FC6, 0x102D..0x1030,
|
47
|
+
0x1032..0x1032, 0x1036..0x1037, 0x1039..0x1039,
|
48
|
+
0x1058..0x1059, 0x1160..0x11FF, 0x135F..0x135F,
|
49
|
+
0x1712..0x1714, 0x1732..0x1734, 0x1752..0x1753,
|
50
|
+
0x1772..0x1773, 0x17B4..0x17B5, 0x17B7..0x17BD,
|
51
|
+
0x17C6..0x17C6, 0x17C9..0x17D3, 0x17DD..0x17DD,
|
52
|
+
0x180B..0x180D, 0x18A9..0x18A9, 0x1920..0x1922,
|
53
|
+
0x1927..0x1928, 0x1932..0x1932, 0x1939..0x193B,
|
54
|
+
0x1A17..0x1A18, 0x1B00..0x1B03, 0x1B34..0x1B34,
|
55
|
+
0x1B36..0x1B3A, 0x1B3C..0x1B3C, 0x1B42..0x1B42,
|
56
|
+
0x1B6B..0x1B73, 0x1DC0..0x1DCA, 0x1DFE..0x1DFF,
|
57
|
+
0x200B..0x200F, 0x202A..0x202E, 0x2060..0x2063,
|
58
|
+
0x206A..0x206F, 0x20D0..0x20EF, 0x302A..0x302F,
|
59
|
+
0x3099..0x309A, 0xA806..0xA806, 0xA80B..0xA80B,
|
60
|
+
0xA825..0xA826, 0xFB1E..0xFB1E, 0xFE00..0xFE0F,
|
61
|
+
0xFE20..0xFE23, 0xFEFF..0xFEFF, 0xFFF9..0xFFFB,
|
62
|
+
0x10A01..0x10A03, 0x10A05..0x10A06, 0x10A0C..0x10A0F,
|
63
|
+
0x10A38..0x10A3A, 0x10A3F..0x10A3F, 0x1D167..0x1D169,
|
64
|
+
0x1D173..0x1D182, 0x1D185..0x1D18B, 0x1D1AA..0x1D1AD,
|
65
|
+
0x1D242..0x1D244, 0xE0001..0xE0001, 0xE0020..0xE007F,
|
66
|
+
0xE0100..0xE01EF]
|
67
|
+
|
68
|
+
protected
|
69
|
+
def bisearch(table)
|
70
|
+
max, min, mid = table.size - 1, 0, 0
|
71
|
+
|
72
|
+
return false if self.ord < table.first.begin or self.ord > table.last.end
|
73
|
+
|
74
|
+
while max >= min
|
75
|
+
mid = (min + max) / 2
|
76
|
+
|
77
|
+
if self.ord > table[mid].end
|
78
|
+
min = mid + 1
|
79
|
+
elsif (self.ord < table[mid].first)
|
80
|
+
max = mid - 1
|
81
|
+
else
|
82
|
+
return true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
false
|
87
|
+
end
|
88
|
+
|
89
|
+
def mk_wcwidth
|
90
|
+
return 0 if self.ord == 0
|
91
|
+
|
92
|
+
return -1 if self.ord < 32 or (self.ord >= 0x7f and self.ord < 0xa0)
|
93
|
+
|
94
|
+
return 0 if bisearch(COMBINING)
|
95
|
+
|
96
|
+
1 + self.ord.tap {|ucs|
|
97
|
+
break (ucs >= 0x1100 and # Hangul Jamu init. consonants
|
98
|
+
(ucs <= 0x115f or
|
99
|
+
ucs == 0x2329 or ucs == 0x232a or
|
100
|
+
(ucs >= 0x2e80 and ucs <= 0xa4cf &&
|
101
|
+
ucs != 0x303f) or # CJK ... Yi
|
102
|
+
(ucs >= 0xac00 and ucs <= 0xd7a3) or # Hangul Syllables
|
103
|
+
(ucs >= 0xf900 and ucs <= 0xfaff) or # CJK Compatibility Ideographs
|
104
|
+
(ucs >= 0xfe10 and ucs <= 0xfe19) or # Vertical forms
|
105
|
+
(ucs >= 0xfe30 and ucs <= 0xfe6f) or # CJK Compatibility Forms
|
106
|
+
(ucs >= 0xff00 and ucs <= 0xff60) or # Fullwidth Forms
|
107
|
+
(ucs >= 0xffe0 and ucs <= 0xffe6) or
|
108
|
+
(ucs >= 0x20000 and ucs <= 0x2fffd) or
|
109
|
+
(ucs >= 0x30000 and ucs <= 0x3fffd))) ? 1 : 0
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
def mk_wcswidth
|
114
|
+
ws = self.each_char.map(&:width)
|
115
|
+
return -1 unless ws.select {|x| x < 0 }.empty?
|
116
|
+
ws.inject(:+)
|
117
|
+
end
|
118
|
+
|
119
|
+
public
|
120
|
+
def width
|
121
|
+
if self.size == 1
|
122
|
+
self.mk_wcwidth
|
123
|
+
else
|
124
|
+
self.mk_wcswidth
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wcwidth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- shura
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-13 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: wcwidth ruby implementation
|
15
|
+
email: shura1991@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/wcwidth.rb
|
21
|
+
homepage: http://github.com/shurizzle/ruby-wcwidth
|
22
|
+
licenses: []
|
23
|
+
post_install_message:
|
24
|
+
rdoc_options: []
|
25
|
+
require_paths:
|
26
|
+
- lib
|
27
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 1.8.23
|
42
|
+
signing_key:
|
43
|
+
specification_version: 3
|
44
|
+
summary: wcwidth ruby implementation
|
45
|
+
test_files: []
|