wcwidth 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/wcwidth.rb +127 -0
  2. 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: []