term-ansicolor 1.1.1 → 1.1.2
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.
- checksums.yaml +4 -4
- data/CHANGES +8 -0
- data/Rakefile +4 -1
- data/VERSION +1 -1
- data/bin/colortab +50 -0
- data/lib/term/ansicolor.rb +147 -83
- data/lib/term/ansicolor/attribute.rb +83 -0
- data/lib/term/ansicolor/rgb_triple.rb +91 -0
- data/lib/term/ansicolor/version.rb +2 -2
- data/term-ansicolor.gemspec +14 -10
- data/tests/ansicolor_test.rb +32 -6
- data/tests/rgb_triple_test.rb +29 -0
- data/tests/test_helper.rb +8 -0
- metadata +32 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c9a92f957cb6c294806caa9b03a2c04445d76a9
|
4
|
+
data.tar.gz: 5eac0662983ec23f174bd5d0af4687120fd49cb9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e633cda3e9d3b749c7c3a5282012e0f9f0bda78c1674c8de081461b4df16719e7916191c4d7bb57eefa0817c13c7bafc6557a303fdcab8c635c7c786f8598663
|
7
|
+
data.tar.gz: ec810aa236b5ff82b942de368b30f262b82189423afb3abcbc1ade2f6f3673794b29564799008fbf4b2d753f6fe02c20534dff3b530155240f9e52f7b9e55263
|
data/CHANGES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
2013-03-25 - 1.1.2 * Change the API: color0 - color255 to color(:color0) -
|
2
|
+
color(:color255), and on_color0 to on_color(:color0) -
|
3
|
+
on_color(:color255); the previous way caused some
|
4
|
+
failures, sorry. On the plus side you can now do
|
5
|
+
color('#4a6ab4') and get the nearest terminal color to
|
6
|
+
this html color.
|
7
|
+
* Add colortab executable to display the 255 colors and
|
8
|
+
related HTML colors.
|
1
9
|
2013-03-08 - 1.1.1 * Avoid possible conflicts with other people's attributes
|
2
10
|
methods.
|
3
11
|
* Cache attributes globally, also fix caching for frozen
|
data/Rakefile
CHANGED
@@ -10,12 +10,15 @@ GemHadar do
|
|
10
10
|
email 'flori@ping.de'
|
11
11
|
homepage "http://flori.github.com/#{name}"
|
12
12
|
summary 'Ruby library that colors strings using ANSI escape sequences'
|
13
|
-
description ''
|
13
|
+
description 'This library uses ANSI escape sequences to control the attributes of terminal output'
|
14
|
+
licenses << 'GPL-2'
|
14
15
|
test_dir 'tests'
|
15
16
|
ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', '.rvmrc', 'coverage'
|
16
17
|
readme 'README.rdoc'
|
17
18
|
executables << 'cdiff' << 'decolor'
|
18
19
|
|
20
|
+
development_dependency 'simplecov'
|
21
|
+
|
19
22
|
install_library do
|
20
23
|
destdir = "#{ENV['DESTDIR']}"
|
21
24
|
libdir = CONFIG["sitelibdir"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.2
|
data/bin/colortab
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'term/ansicolor'
|
4
|
+
|
5
|
+
class String
|
6
|
+
include Term::ANSIColor
|
7
|
+
end
|
8
|
+
|
9
|
+
$colors = Term::ANSIColor::Attribute.rgb_colors.to_a
|
10
|
+
|
11
|
+
def print_color(c)
|
12
|
+
color = $colors[c]
|
13
|
+
text = [
|
14
|
+
Term::ANSIColor::Attribute.nearest_rgb_color('#000'),
|
15
|
+
Term::ANSIColor::Attribute.nearest_rgb_color('#fff'),
|
16
|
+
].max_by { |t| t.distance_to(color) }
|
17
|
+
print ("%3u #{color.rgb.html} " % c).on_color(color.name).color(text.name)
|
18
|
+
end
|
19
|
+
|
20
|
+
for c in 0..3
|
21
|
+
print_color c
|
22
|
+
end
|
23
|
+
puts
|
24
|
+
|
25
|
+
for c in 4..7
|
26
|
+
print_color c
|
27
|
+
end
|
28
|
+
puts
|
29
|
+
|
30
|
+
for c in 8..11
|
31
|
+
print_color c
|
32
|
+
end
|
33
|
+
puts
|
34
|
+
|
35
|
+
for c in 12..15
|
36
|
+
print_color c
|
37
|
+
end
|
38
|
+
puts
|
39
|
+
|
40
|
+
for c in 16..231
|
41
|
+
(c - 16) % 6 == 0 and puts
|
42
|
+
print_color c
|
43
|
+
end
|
44
|
+
puts
|
45
|
+
|
46
|
+
for c in 232..255
|
47
|
+
(c - 16) % 6 == 0 and puts
|
48
|
+
print_color c
|
49
|
+
end
|
50
|
+
puts
|
data/lib/term/ansicolor.rb
CHANGED
@@ -4,56 +4,122 @@ module Term
|
|
4
4
|
# classes.
|
5
5
|
module ANSIColor
|
6
6
|
require 'term/ansicolor/version'
|
7
|
+
require 'term/ansicolor/attribute'
|
8
|
+
require 'term/ansicolor/rgb_triple'
|
9
|
+
|
10
|
+
Attribute.set :clear , 0 # String#clear is already used to empty string in Ruby 1.9
|
11
|
+
Attribute.set :reset , 0 # synonym for :clear
|
12
|
+
Attribute.set :bold , 1
|
13
|
+
Attribute.set :dark , 2
|
14
|
+
Attribute.set :italic , 3 # not widely implemented
|
15
|
+
Attribute.set :underline , 4
|
16
|
+
Attribute.set :underscore , 4 # synonym for :underline
|
17
|
+
Attribute.set :blink , 5
|
18
|
+
Attribute.set :rapid_blink , 6 # not widely implemented
|
19
|
+
Attribute.set :negative , 7 # no reverse because of String#reverse
|
20
|
+
Attribute.set :concealed , 8
|
21
|
+
Attribute.set :strikethrough , 9 # not widely implemented
|
22
|
+
|
23
|
+
Attribute.set :black , 30
|
24
|
+
Attribute.set :red , 31
|
25
|
+
Attribute.set :green , 32
|
26
|
+
Attribute.set :yellow , 33
|
27
|
+
Attribute.set :blue , 34
|
28
|
+
Attribute.set :magenta , 35
|
29
|
+
Attribute.set :cyan , 36
|
30
|
+
Attribute.set :white , 37
|
31
|
+
|
32
|
+
Attribute.set :on_black , 40
|
33
|
+
Attribute.set :on_red , 41
|
34
|
+
Attribute.set :on_green , 42
|
35
|
+
Attribute.set :on_yellow , 43
|
36
|
+
Attribute.set :on_blue , 44
|
37
|
+
Attribute.set :on_magenta , 45
|
38
|
+
Attribute.set :on_cyan , 46
|
39
|
+
Attribute.set :on_white , 47
|
40
|
+
|
41
|
+
Attribute.set :intense_black , 90 # High intensity, aixterm (works in OS X)
|
42
|
+
Attribute.set :intense_red , 91
|
43
|
+
Attribute.set :intense_green , 92
|
44
|
+
Attribute.set :intense_yellow , 93
|
45
|
+
Attribute.set :intense_blue , 94
|
46
|
+
Attribute.set :intense_magenta , 95
|
47
|
+
Attribute.set :intense_cyan , 96
|
48
|
+
Attribute.set :intense_white , 97
|
49
|
+
|
50
|
+
Attribute.set :on_intense_black , 100 # High intensity background, aixterm (works in OS X)
|
51
|
+
Attribute.set :on_intense_red , 101
|
52
|
+
Attribute.set :on_intense_green , 102
|
53
|
+
Attribute.set :on_intense_yellow , 103
|
54
|
+
Attribute.set :on_intense_blue , 104
|
55
|
+
Attribute.set :on_intense_magenta, 105
|
56
|
+
Attribute.set :on_intense_cyan , 106
|
57
|
+
Attribute.set :on_intense_white , 107
|
58
|
+
|
59
|
+
Attribute.set :color0, 0, :html => '#000000'
|
60
|
+
Attribute.set :color1, 1, :html => '#800000'
|
61
|
+
Attribute.set :color2, 2, :html => '#808000'
|
62
|
+
Attribute.set :color3, 3, :html => '#808000'
|
63
|
+
Attribute.set :color4, 4, :html => '#000080'
|
64
|
+
Attribute.set :color5, 5, :html => '#800080'
|
65
|
+
Attribute.set :color6, 6, :html => '#008080'
|
66
|
+
Attribute.set :color7, 7, :html => '#c0c0c0'
|
67
|
+
|
68
|
+
Attribute.set :color8, 8, :html => '#808080'
|
69
|
+
Attribute.set :color9, 9, :html => '#ff0000'
|
70
|
+
Attribute.set :color10, 10, :html => '#00ff00'
|
71
|
+
Attribute.set :color11, 11, :html => '#ffff00'
|
72
|
+
Attribute.set :color12, 12, :html => '#0000ff'
|
73
|
+
Attribute.set :color13, 13, :html => '#ff00ff'
|
74
|
+
Attribute.set :color14, 14, :html => '#00ffff'
|
75
|
+
Attribute.set :color15, 15, :html => '#ffffff'
|
76
|
+
|
77
|
+
steps = [ 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff ]
|
78
|
+
|
79
|
+
for i in 16..231
|
80
|
+
red, green, blue = (i - 16).to_s(6).rjust(3, '0').each_char.map { |c| steps[c.to_i] }
|
81
|
+
Attribute.set "color#{i}", i, :red => red, :green => green, :blue => blue
|
82
|
+
end
|
83
|
+
|
84
|
+
grey = 8
|
85
|
+
for i in 232..255
|
86
|
+
Attribute.set "color#{i}", i, :red => grey, :green => grey, :blue => grey
|
87
|
+
grey += 10
|
88
|
+
end
|
89
|
+
|
90
|
+
Attribute.set :on_color0, 0, :html => '#000000'
|
91
|
+
Attribute.set :on_color1, 1, :html => '#800000'
|
92
|
+
Attribute.set :on_color2, 2, :html => '#808000'
|
93
|
+
Attribute.set :on_color3, 3, :html => '#808000'
|
94
|
+
Attribute.set :on_color4, 4, :html => '#000080'
|
95
|
+
Attribute.set :on_color5, 5, :html => '#800080'
|
96
|
+
Attribute.set :on_color6, 6, :html => '#008080'
|
97
|
+
Attribute.set :on_color7, 7, :html => '#c0c0c0'
|
98
|
+
|
99
|
+
Attribute.set :on_color8, 8, :html => '#808080'
|
100
|
+
Attribute.set :on_color9, 9, :html => '#ff0000'
|
101
|
+
Attribute.set :on_color10, 10, :html => '#00ff00'
|
102
|
+
Attribute.set :on_color11, 11, :html => '#ffff00'
|
103
|
+
Attribute.set :on_color12, 12, :html => '#0000ff'
|
104
|
+
Attribute.set :on_color13, 13, :html => '#ff00ff'
|
105
|
+
Attribute.set :on_color14, 14, :html => '#00ffff'
|
106
|
+
Attribute.set :on_color15, 15, :html => '#ffffff'
|
107
|
+
|
108
|
+
steps = [ 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff ]
|
109
|
+
|
110
|
+
for i in 16..231
|
111
|
+
red, green, blue = (i - 16).to_s(6).rjust(3, '0').each_char.map { |c| steps[c.to_i] }
|
112
|
+
Attribute.set "on_color#{i}", i, :red => red, :green => green, :blue => blue
|
113
|
+
end
|
114
|
+
|
115
|
+
grey = 8
|
116
|
+
for i in 232..255
|
117
|
+
Attribute.set "on_color#{i}", i, :red => grey, :green => grey, :blue => grey
|
118
|
+
grey += 10
|
119
|
+
end
|
7
120
|
|
8
121
|
# :stopdoc:
|
9
|
-
|
10
|
-
[ :clear , 0 ], # String#clear is already used to empty string in Ruby 1.9
|
11
|
-
[ :reset , 0 ], # synonym for :clear
|
12
|
-
[ :bold , 1 ],
|
13
|
-
[ :dark , 2 ],
|
14
|
-
[ :italic , 3 ], # not widely implemented
|
15
|
-
[ :underline , 4 ],
|
16
|
-
[ :underscore , 4 ], # synonym for :underline
|
17
|
-
[ :blink , 5 ],
|
18
|
-
[ :rapid_blink , 6 ], # not widely implemented
|
19
|
-
[ :negative , 7 ], # no reverse because of String#reverse
|
20
|
-
[ :concealed , 8 ],
|
21
|
-
[ :strikethrough , 9 ], # not widely implemented
|
22
|
-
[ :black , 30 ],
|
23
|
-
[ :red , 31 ],
|
24
|
-
[ :green , 32 ],
|
25
|
-
[ :yellow , 33 ],
|
26
|
-
[ :blue , 34 ],
|
27
|
-
[ :magenta , 35 ],
|
28
|
-
[ :cyan , 36 ],
|
29
|
-
[ :white , 37 ],
|
30
|
-
[ :on_black , 40 ],
|
31
|
-
[ :on_red , 41 ],
|
32
|
-
[ :on_green , 42 ],
|
33
|
-
[ :on_yellow , 43 ],
|
34
|
-
[ :on_blue , 44 ],
|
35
|
-
[ :on_magenta , 45 ],
|
36
|
-
[ :on_cyan , 46 ],
|
37
|
-
[ :on_white , 47 ],
|
38
|
-
[ :intense_black , 90 ], # High intensity, aixterm (works in OS X)
|
39
|
-
[ :intense_red , 91 ],
|
40
|
-
[ :intense_green , 92 ],
|
41
|
-
[ :intense_yellow , 93 ],
|
42
|
-
[ :intense_blue , 94 ],
|
43
|
-
[ :intense_magenta , 95 ],
|
44
|
-
[ :intense_cyan , 96 ],
|
45
|
-
[ :intense_white , 97 ],
|
46
|
-
[ :on_intense_black , 100 ], # High intensity background, aixterm (works in OS X)
|
47
|
-
[ :on_intense_red , 101 ],
|
48
|
-
[ :on_intense_green , 102 ],
|
49
|
-
[ :on_intense_yellow , 103 ],
|
50
|
-
[ :on_intense_blue , 104 ],
|
51
|
-
[ :on_intense_magenta , 105 ],
|
52
|
-
[ :on_intense_cyan , 106 ],
|
53
|
-
[ :on_intense_white , 107 ]
|
54
|
-
]
|
55
|
-
|
56
|
-
ATTRIBUTE_NAMES = ATTRIBUTES.transpose.first
|
122
|
+
ATTRIBUTE_NAMES = Attribute.named_attributes.map(&:name)
|
57
123
|
# :startdoc:
|
58
124
|
|
59
125
|
# Returns true if Term::ANSIColor supports the +feature+.
|
@@ -84,41 +150,15 @@ module Term
|
|
84
150
|
|
85
151
|
def self.create_color_method(color_name, color_value)
|
86
152
|
module_eval <<-EOT
|
87
|
-
def #{color_name}(string = nil)
|
88
|
-
|
89
|
-
result << "\e[#{color_value}m" if Term::ANSIColor.coloring?
|
90
|
-
if block_given?
|
91
|
-
result << yield
|
92
|
-
elsif string.respond_to?(:to_str)
|
93
|
-
result << string.to_str
|
94
|
-
elsif respond_to?(:to_str)
|
95
|
-
result << to_str
|
96
|
-
else
|
97
|
-
return result #only switch on
|
98
|
-
end
|
99
|
-
result << "\e[0m" if Term::ANSIColor.coloring?
|
100
|
-
result
|
153
|
+
def #{color_name}(string = nil, &block)
|
154
|
+
color(:#{color_name}, string, &block)
|
101
155
|
end
|
102
156
|
EOT
|
103
157
|
self
|
104
158
|
end
|
105
159
|
|
106
|
-
|
107
|
-
|
108
|
-
if color_name
|
109
|
-
::Term::ANSIColor.create_color_method(name, color_value)
|
110
|
-
return __send__(color_name, *args, &block)
|
111
|
-
end
|
112
|
-
color_name = name.to_s
|
113
|
-
if color_name =~ /\A(?:(on_)?color)(\d+)\z/
|
114
|
-
code = $1 ? 48 : 38
|
115
|
-
index = $2.to_i
|
116
|
-
if (0..255).include?(index)
|
117
|
-
::Term::ANSIColor.create_color_method($&, "#{code};5;#{index}")
|
118
|
-
return __send__(color_name, *args, &block)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
super
|
160
|
+
for attribute in Attribute.named_attributes
|
161
|
+
create_color_method(attribute.name, attribute.code)
|
122
162
|
end
|
123
163
|
|
124
164
|
module RespondTo
|
@@ -129,12 +169,12 @@ module Term
|
|
129
169
|
include RespondTo
|
130
170
|
extend RespondTo
|
131
171
|
|
132
|
-
# Regular expression that is used to scan for ANSI-
|
172
|
+
# Regular expression that is used to scan for ANSI-Attributes while
|
133
173
|
# uncoloring strings.
|
134
174
|
COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9]|[34]8;5;\d{1,3})?m/
|
135
175
|
|
136
176
|
# Returns an uncolored version of the string, that is all
|
137
|
-
# ANSI-
|
177
|
+
# ANSI-Attributes are stripped from the string.
|
138
178
|
def uncolor(string = nil) # :yields:
|
139
179
|
if block_given?
|
140
180
|
yield.to_str.gsub(COLORED_REGEXP, '')
|
@@ -149,17 +189,41 @@ module Term
|
|
149
189
|
|
150
190
|
alias uncolored uncolor
|
151
191
|
|
192
|
+
# Return +string+ or the result string of the given +block+ colored with
|
193
|
+
# color +name+. If string isn't a string only the escape sequence to switch
|
194
|
+
# on the color +name+ is returned.
|
195
|
+
def color(name, string = nil, &block)
|
196
|
+
attribute = Attribute.get(name) || Attribute.nearest_rgb(name) or
|
197
|
+
raise ArgumentError, "unknown attribute #{name.inspect}"
|
198
|
+
result = ''
|
199
|
+
result << "\e[#{attribute.code}m" if Term::ANSIColor.coloring?
|
200
|
+
if block_given?
|
201
|
+
result << yield
|
202
|
+
elsif string.respond_to?(:to_str)
|
203
|
+
result << string.to_str
|
204
|
+
elsif respond_to?(:to_str)
|
205
|
+
result << to_str
|
206
|
+
else
|
207
|
+
return result #only switch on
|
208
|
+
end
|
209
|
+
result << "\e[0m" if Term::ANSIColor.coloring?
|
210
|
+
result
|
211
|
+
end
|
212
|
+
|
213
|
+
def on_color(name, string = nil, &block)
|
214
|
+
color("on_#{name}", string, &block)
|
215
|
+
end
|
216
|
+
|
152
217
|
class << self
|
153
218
|
# Returns an array of all Term::ANSIColor attributes as symbols.
|
154
219
|
def term_ansicolor_attributes
|
155
|
-
@term_ansicolor_attributes ||= Term::ANSIColor::ATTRIBUTE_NAMES
|
156
|
-
(0..255).map { |index| "color#{index}".to_sym } +
|
157
|
-
(0..255).map { |index| "on_color#{index}".to_sym }
|
220
|
+
@term_ansicolor_attributes ||= Term::ANSIColor::ATTRIBUTE_NAMES
|
158
221
|
end
|
159
222
|
|
160
223
|
alias attributes term_ansicolor_attributes
|
161
224
|
end
|
162
225
|
|
226
|
+
# Returns an array of all Term::ANSIColor attributes as symbols.
|
163
227
|
def term_ansicolor_attributes
|
164
228
|
::Term::ANSIColor.term_ansicolor_attributes
|
165
229
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Term
|
2
|
+
module ANSIColor
|
3
|
+
class Attribute
|
4
|
+
@__store__ = {}
|
5
|
+
|
6
|
+
def self.set(name, code, options = {})
|
7
|
+
name = name.to_sym
|
8
|
+
result = @__store__[name] = new(name, code, options)
|
9
|
+
@rgb_colors = nil
|
10
|
+
result
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.get(name)
|
14
|
+
@__store__[name.to_sym]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.attributes(&block)
|
18
|
+
@__store__.each_value(&block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.rgb_colors(&block)
|
22
|
+
@rgb_colors ||= attributes.select(&:rgb_color?).each(&block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.named_attributes(&block)
|
26
|
+
@named_attributes ||= attributes.reject(&:rgb_color?).each(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.nearest_rgb_color(color)
|
30
|
+
rgb = RGBTriple[color]
|
31
|
+
rgb_colors.reject(&:background?).min_by { |c| c.distance_to(rgb) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.nearest_rgb_on_color(color)
|
35
|
+
rgb = RGBTriple[color]
|
36
|
+
rgb_colors.select(&:background?).min_by { |c| c.distance_to(rgb) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize(name, code, options = {})
|
40
|
+
@name = name.to_sym
|
41
|
+
@code = code.to_s
|
42
|
+
if html = options[:html]
|
43
|
+
@rgb = RGBTriple.from_html(html)
|
44
|
+
elsif !options.empty?
|
45
|
+
@rgb = RGBTriple.from_hash(options)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
attr_reader :name
|
50
|
+
|
51
|
+
def code
|
52
|
+
if rgb_color?
|
53
|
+
background? ? "48;5;#{@code}" : "38;5;#{@code}"
|
54
|
+
else
|
55
|
+
@code
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def background?
|
60
|
+
@name.to_s.start_with?('on_')
|
61
|
+
end
|
62
|
+
|
63
|
+
attr_reader :rgb
|
64
|
+
|
65
|
+
def rgb_color?
|
66
|
+
!!@rgb
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_rgb_triple
|
70
|
+
@rgb
|
71
|
+
end
|
72
|
+
|
73
|
+
def distance_to(other)
|
74
|
+
if our_rgb = to_rgb_triple and
|
75
|
+
other.respond_to?(:to_rgb_triple) and
|
76
|
+
other_rgb = other.to_rgb_triple
|
77
|
+
then
|
78
|
+
our_rgb.distance_to other_rgb
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Term
|
2
|
+
module ANSIColor
|
3
|
+
class RGBTriple
|
4
|
+
def self.convert_value(color)
|
5
|
+
color.nil? and raise ArgumentError, "missing color value"
|
6
|
+
color = Integer(color)
|
7
|
+
(0..0xff) === color or raise ArgumentError,
|
8
|
+
"color value #{color.inspect} not between 0 and 255"
|
9
|
+
color
|
10
|
+
end
|
11
|
+
|
12
|
+
private_class_method :convert_value
|
13
|
+
|
14
|
+
def self.from_html(html)
|
15
|
+
case html
|
16
|
+
when /\A#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\z/i
|
17
|
+
new(*$~.captures.map { |c| convert_value(c.to_i(16)) })
|
18
|
+
when /\A#([0-9a-f])([0-9a-f])([0-9a-f])\z/i
|
19
|
+
new(*$~.captures.map { |c| convert_value(c.to_i(16) << 4) })
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.from_hash(options)
|
24
|
+
new(
|
25
|
+
convert_value(options[:red]),
|
26
|
+
convert_value(options[:green]),
|
27
|
+
convert_value(options[:blue])
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.from_array(array)
|
32
|
+
new(*array)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.[](thing)
|
36
|
+
case
|
37
|
+
when thing.respond_to?(:to_rgb_triple) then thing
|
38
|
+
when thing.respond_to?(:to_ary) then RGBTriple.from_array(thing.to_ary)
|
39
|
+
when thing.respond_to?(:to_str) then RGBTriple.from_html(thing.to_str)
|
40
|
+
when thing.respond_to?(:to_hash) then RGBTriple.from_hash(thing.to_hash)
|
41
|
+
else raise ArgumentError, "cannot convert #{thing.inspect} into #{self}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize(red, green, blue)
|
46
|
+
@values = [ red, green, blue ]
|
47
|
+
end
|
48
|
+
|
49
|
+
def red
|
50
|
+
@values[0]
|
51
|
+
end
|
52
|
+
|
53
|
+
def green
|
54
|
+
@values[1]
|
55
|
+
end
|
56
|
+
|
57
|
+
def blue
|
58
|
+
@values[2]
|
59
|
+
end
|
60
|
+
|
61
|
+
def html
|
62
|
+
s = '#'
|
63
|
+
@values.each { |c| s << '%02x' % c }
|
64
|
+
s
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_rgb_triple
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
71
|
+
attr_reader :values
|
72
|
+
protected :values
|
73
|
+
|
74
|
+
def to_a
|
75
|
+
@values.dup
|
76
|
+
end
|
77
|
+
|
78
|
+
def ==(other)
|
79
|
+
@values == other.values
|
80
|
+
end
|
81
|
+
|
82
|
+
def distance_to(other)
|
83
|
+
Math.sqrt(
|
84
|
+
((red - other.red) * 0.299) ** 2 +
|
85
|
+
((green - other.green) * 0.587) ** 2 +
|
86
|
+
((blue - other.blue) * 0.114) ** 2
|
87
|
+
)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Term::ANSIColor
|
2
2
|
# Term::ANSIColor version
|
3
|
-
VERSION = '1.1.
|
4
|
-
VERSION_ARRAY = VERSION.split(
|
3
|
+
VERSION = '1.1.2'
|
4
|
+
VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
|
5
5
|
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
|
6
6
|
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
|
7
7
|
VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
|
data/term-ansicolor.gemspec
CHANGED
@@ -2,32 +2,36 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "term-ansicolor"
|
5
|
-
s.version = "1.1.
|
5
|
+
s.version = "1.1.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Florian Frank"]
|
9
|
-
s.date = "2013-03-
|
10
|
-
s.description = ""
|
9
|
+
s.date = "2013-03-26"
|
10
|
+
s.description = "This library uses ANSI escape sequences to control the attributes of terminal output"
|
11
11
|
s.email = "flori@ping.de"
|
12
12
|
s.executables = ["cdiff", "decolor"]
|
13
|
-
s.extra_rdoc_files = ["README.rdoc", "lib/term/ansicolor.rb", "lib/term/ansicolor/version.rb"]
|
14
|
-
s.files = [".gitignore", ".travis.yml", "CHANGES", "COPYING", "Gemfile", "README.rdoc", "Rakefile", "VERSION", "bin/cdiff", "bin/decolor", "examples/example.rb", "lib/term/ansicolor.rb", "lib/term/ansicolor/.keep", "lib/term/ansicolor/version.rb", "term-ansicolor.gemspec", "tests/ansicolor_test.rb"]
|
13
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/term/ansicolor.rb", "lib/term/ansicolor/attribute.rb", "lib/term/ansicolor/rgb_triple.rb", "lib/term/ansicolor/version.rb"]
|
14
|
+
s.files = [".gitignore", ".travis.yml", "CHANGES", "COPYING", "Gemfile", "README.rdoc", "Rakefile", "VERSION", "bin/cdiff", "bin/colortab", "bin/decolor", "examples/example.rb", "lib/term/ansicolor.rb", "lib/term/ansicolor/.keep", "lib/term/ansicolor/attribute.rb", "lib/term/ansicolor/rgb_triple.rb", "lib/term/ansicolor/version.rb", "term-ansicolor.gemspec", "tests/ansicolor_test.rb", "tests/rgb_triple_test.rb", "tests/test_helper.rb"]
|
15
15
|
s.homepage = "http://flori.github.com/term-ansicolor"
|
16
|
+
s.licenses = ["GPL-2"]
|
16
17
|
s.rdoc_options = ["--title", "Term-ansicolor - Ruby library that colors strings using ANSI escape sequences", "--main", "README.rdoc"]
|
17
18
|
s.require_paths = ["lib"]
|
18
|
-
s.rubygems_version = "2.0.
|
19
|
+
s.rubygems_version = "2.0.3"
|
19
20
|
s.summary = "Ruby library that colors strings using ANSI escape sequences"
|
20
|
-
s.test_files = ["tests/ansicolor_test.rb"]
|
21
|
+
s.test_files = ["tests/ansicolor_test.rb", "tests/rgb_triple_test.rb", "tests/test_helper.rb"]
|
21
22
|
|
22
23
|
if s.respond_to? :specification_version then
|
23
24
|
s.specification_version = 4
|
24
25
|
|
25
26
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
-
s.add_development_dependency(%q<gem_hadar>, ["~> 0.
|
27
|
+
s.add_development_dependency(%q<gem_hadar>, ["~> 0.3.0"])
|
28
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
27
29
|
else
|
28
|
-
s.add_dependency(%q<gem_hadar>, ["~> 0.
|
30
|
+
s.add_dependency(%q<gem_hadar>, ["~> 0.3.0"])
|
31
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
29
32
|
end
|
30
33
|
else
|
31
|
-
s.add_dependency(%q<gem_hadar>, ["~> 0.
|
34
|
+
s.add_dependency(%q<gem_hadar>, ["~> 0.3.0"])
|
35
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
32
36
|
end
|
33
37
|
end
|
data/tests/ansicolor_test.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require 'term/ansicolor'
|
1
|
+
require File.expand_path('test_helper', File.dirname(__FILE__))
|
5
2
|
|
6
3
|
class String
|
7
4
|
include Term::ANSIColor
|
@@ -51,6 +48,25 @@ class ANSIColorTest < Test::Unit::TestCase
|
|
51
48
|
assert_equal string_red_on_green, on_green { red { string } }
|
52
49
|
end
|
53
50
|
|
51
|
+
def test_color
|
52
|
+
assert_equal "\e[38;5;128mfoo\e[0m", Color.color(:color128, "foo")
|
53
|
+
assert_equal "\e[38;5;128mfoo\e[0m", "foo".color(:color128)
|
54
|
+
assert_equal "\e[38;5;128mfoo\e[0m", color(:color128, "foo")
|
55
|
+
assert_equal "\e[38;5;128mfoo\e[0m", Color.color(:color128) { "foo" }
|
56
|
+
assert_equal "\e[38;5;128mfoo\e[0m", "foo".color(:color128) { "foo" }
|
57
|
+
assert_equal "\e[38;5;128mfoo\e[0m", color(:color128) { "foo" }
|
58
|
+
assert_equal "\e[38;5;128mfoo\e[0m", color(:color128) + "foo" + color(:reset)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_on_color
|
62
|
+
assert_equal "\e[48;5;128mfoo\e[0m", Color.on_color(:color128, "foo")
|
63
|
+
assert_equal "\e[48;5;128mfoo\e[0m", "foo".on_color(:color128)
|
64
|
+
assert_equal "\e[48;5;128mfoo\e[0m", on_color(:color128, "foo")
|
65
|
+
assert_equal "\e[48;5;128mfoo\e[0m", Color.on_color(:color128) { "foo" }
|
66
|
+
assert_equal "\e[48;5;128mfoo\e[0m", "foo".on_color(:color128) { "foo" }
|
67
|
+
assert_equal "\e[48;5;128mfoo\e[0m", on_color(:color128) { "foo" }
|
68
|
+
assert_equal "\e[48;5;128mfoo\e[0m", on_color(:color128) + "foo" + color(:reset)
|
69
|
+
end
|
54
70
|
|
55
71
|
def test_uncolor
|
56
72
|
assert_equal string, string_red.uncolor
|
@@ -64,8 +80,8 @@ class ANSIColorTest < Test::Unit::TestCase
|
|
64
80
|
assert_equal string, uncolor { string_like_red }
|
65
81
|
assert_equal "", uncolor(Object.new)
|
66
82
|
for index in 0..255
|
67
|
-
assert_equal "foo", Color.uncolor(Color.
|
68
|
-
assert_equal "foo", Color.uncolor(Color.
|
83
|
+
assert_equal "foo", Color.uncolor(Color.color("color#{index}", "foo"))
|
84
|
+
assert_equal "foo", Color.uncolor(Color.on_color("color#{index}", "foo"))
|
69
85
|
end
|
70
86
|
end
|
71
87
|
|
@@ -99,4 +115,14 @@ class ANSIColorTest < Test::Unit::TestCase
|
|
99
115
|
assert string.frozen?
|
100
116
|
assert_equal red, string.red
|
101
117
|
end
|
118
|
+
|
119
|
+
def test_nearest_rgb_color
|
120
|
+
assert_equal Term::ANSIColor::Attribute.get(:color0).rgb, Term::ANSIColor::Attribute.nearest_rgb_color('#000').rgb
|
121
|
+
assert_equal Term::ANSIColor::Attribute.get(:color15).rgb, Term::ANSIColor::Attribute.nearest_rgb_color('#ffffff').rgb
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_nearest_rgb_color
|
125
|
+
assert_equal Term::ANSIColor::Attribute.get(:on_color0).rgb, Term::ANSIColor::Attribute.nearest_rgb_on_color('#000').rgb
|
126
|
+
assert_equal Term::ANSIColor::Attribute.get(:on_color15).rgb, Term::ANSIColor::Attribute.nearest_rgb_on_color('#ffffff').rgb
|
127
|
+
end
|
102
128
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('test_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class RgbTripleTest < Test::Unit::TestCase
|
4
|
+
include Term::ANSIColor
|
5
|
+
|
6
|
+
def test_rgb_cast
|
7
|
+
rgb = RGBTriple.new(128, 0, 255)
|
8
|
+
assert_equal '#8000ff', RGBTriple[ rgb ].html
|
9
|
+
assert_equal '#8000ff', RGBTriple[ [ 128, 0, 255 ] ].html
|
10
|
+
assert_equal '#8000ff', RGBTriple[ :red => 128, :green => 0, :blue => 255 ].html
|
11
|
+
assert_raise ArgumentError do
|
12
|
+
RGBTriple[ nil ]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_rgb_to_a
|
17
|
+
rgb = RGBTriple.new(128, 0, 255)
|
18
|
+
assert_equal [ 128, 0, 255 ], rgb.to_a
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_rgb_distace
|
22
|
+
rgb1 = RGBTriple.new(128, 0, 255)
|
23
|
+
rgb2 = RGBTriple.new(128, 200, 64)
|
24
|
+
assert_in_delta 0.0, rgb1.distance_to(rgb1), 1e-3
|
25
|
+
assert_in_delta 170.481, RGBTriple.new(0, 0, 0).distance_to(RGBTriple.new(255, 255, 255)), 1e-3
|
26
|
+
assert_in_delta 119.402, rgb1.distance_to(rgb2), 1e-3
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: term-ansicolor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|
@@ -16,15 +16,30 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.3.0
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
27
|
-
|
26
|
+
version: 0.3.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simplecov
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: This library uses ANSI escape sequences to control the attributes of
|
42
|
+
terminal output
|
28
43
|
email: flori@ping.de
|
29
44
|
executables:
|
30
45
|
- cdiff
|
@@ -33,6 +48,8 @@ extensions: []
|
|
33
48
|
extra_rdoc_files:
|
34
49
|
- README.rdoc
|
35
50
|
- lib/term/ansicolor.rb
|
51
|
+
- lib/term/ansicolor/attribute.rb
|
52
|
+
- lib/term/ansicolor/rgb_triple.rb
|
36
53
|
- lib/term/ansicolor/version.rb
|
37
54
|
files:
|
38
55
|
- .gitignore
|
@@ -44,15 +61,21 @@ files:
|
|
44
61
|
- Rakefile
|
45
62
|
- VERSION
|
46
63
|
- bin/cdiff
|
64
|
+
- bin/colortab
|
47
65
|
- bin/decolor
|
48
66
|
- examples/example.rb
|
49
67
|
- lib/term/ansicolor.rb
|
50
68
|
- lib/term/ansicolor/.keep
|
69
|
+
- lib/term/ansicolor/attribute.rb
|
70
|
+
- lib/term/ansicolor/rgb_triple.rb
|
51
71
|
- lib/term/ansicolor/version.rb
|
52
72
|
- term-ansicolor.gemspec
|
53
73
|
- tests/ansicolor_test.rb
|
74
|
+
- tests/rgb_triple_test.rb
|
75
|
+
- tests/test_helper.rb
|
54
76
|
homepage: http://flori.github.com/term-ansicolor
|
55
|
-
licenses:
|
77
|
+
licenses:
|
78
|
+
- GPL-2
|
56
79
|
metadata: {}
|
57
80
|
post_install_message:
|
58
81
|
rdoc_options:
|
@@ -74,9 +97,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
97
|
version: '0'
|
75
98
|
requirements: []
|
76
99
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.0.
|
100
|
+
rubygems_version: 2.0.3
|
78
101
|
signing_key:
|
79
102
|
specification_version: 4
|
80
103
|
summary: Ruby library that colors strings using ANSI escape sequences
|
81
104
|
test_files:
|
82
105
|
- tests/ansicolor_test.rb
|
106
|
+
- tests/rgb_triple_test.rb
|
107
|
+
- tests/test_helper.rb
|