wcwidth 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []