term-ansicolor 1.7.1 → 1.10.4
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/.all_images.yml +27 -0
- data/.gitignore +1 -0
- data/.utilsrc +26 -0
- data/README.md +5 -3
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/bin/term_colortab +27 -1
- data/bin/term_display +5 -3
- data/bin/term_mandel +30 -24
- data/bin/term_snow +13 -13
- data/examples/example.rb +31 -1
- data/lib/term/ansicolor/attribute/color256.rb +38 -36
- data/lib/term/ansicolor/attribute/color8.rb +16 -16
- data/lib/term/ansicolor/attribute/intense_color8.rb +32 -34
- data/lib/term/ansicolor/attribute/text.rb +18 -15
- data/lib/term/ansicolor/attribute/underline.rb +34 -0
- data/lib/term/ansicolor/attribute.rb +86 -45
- data/lib/term/ansicolor/hsl_triple.rb +2 -2
- data/lib/term/ansicolor/hyperlink.rb +34 -0
- data/lib/term/ansicolor/ppm_reader.rb +9 -4
- data/lib/term/ansicolor/rgb_triple.rb +1 -3
- data/lib/term/ansicolor/version.rb +1 -1
- data/lib/term/ansicolor.rb +46 -42
- data/term-ansicolor.gemspec +16 -29
- data/tests/ansicolor_test.rb +69 -2
- data/tests/attribute_test.rb +45 -6
- data/tests/hsl_triple_test.rb +2 -2
- data/tests/hyperlink_test.rb +58 -0
- data/tests/ppm_reader_test.rb +8 -0
- data/tests/rgb_triple_test.rb +1 -1
- metadata +50 -15
- data/.travis.yml +0 -15
@@ -0,0 +1,34 @@
|
|
1
|
+
module Term
|
2
|
+
module ANSIColor
|
3
|
+
class Attribute
|
4
|
+
module Underline
|
5
|
+
Attribute.set :underline, 4, skip_definition: true
|
6
|
+
Attribute.set :underscore, 4, skip_definition: true # synonym for :underline
|
7
|
+
|
8
|
+
def underline(string = nil, color: nil, type: nil, &block)
|
9
|
+
code = {
|
10
|
+
nil => 4,
|
11
|
+
default: '4:1',
|
12
|
+
double: '4:2',
|
13
|
+
curly: '4:3',
|
14
|
+
dotted: '4:4',
|
15
|
+
dashed: '4:5',
|
16
|
+
}.fetch(type) { raise ArgumentError, "invalid line type" }
|
17
|
+
if color
|
18
|
+
a = Term::ANSIColor::Attribute[color]
|
19
|
+
color_code =
|
20
|
+
if rgb = a.ask_and_send(:to_rgb_triple).full?(:to_a)
|
21
|
+
"\e[58;2;#{rgb * ?;}"
|
22
|
+
else
|
23
|
+
raise ArgumentError, "invalid color #{a&.name.inspect}"
|
24
|
+
end
|
25
|
+
code = "#{code}m#{color_code}"
|
26
|
+
end
|
27
|
+
apply_code(code, string, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
alias underscore underline
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -3,42 +3,45 @@ module Term
|
|
3
3
|
class Attribute
|
4
4
|
@__store__ = {}
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.attributes(&block)
|
18
|
-
@__order__.map { |name| @__store__[name] }
|
19
|
-
end
|
20
|
-
else
|
21
|
-
def self.set(name, code, options = {})
|
22
|
-
name = name.to_sym
|
23
|
-
result = @__store__[name] = new(name, code, options)
|
24
|
-
@rgb_colors = nil
|
25
|
-
result
|
6
|
+
def self.set(name, code, **options)
|
7
|
+
name = name.to_sym
|
8
|
+
result = @__store__[name] = new(name, code, options)
|
9
|
+
unless options[:skip_definition]
|
10
|
+
::Term::ANSIColor.class_eval do
|
11
|
+
define_method(name) do |string = nil, &block|
|
12
|
+
apply_attribute(name, string, &block)
|
13
|
+
end
|
14
|
+
end
|
26
15
|
end
|
16
|
+
result
|
17
|
+
end
|
27
18
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
19
|
+
def self.attributes(&block)
|
20
|
+
@__store__.each_value(&block)
|
31
21
|
end
|
32
22
|
|
33
|
-
def self.[](name)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
23
|
+
def self.[](name, true_coloring: false)
|
24
|
+
true_coloring ||= Term::ANSIColor.true_coloring?
|
25
|
+
if true_coloring
|
26
|
+
case
|
27
|
+
when self === name then name
|
28
|
+
when Array === name then true_color name
|
29
|
+
when name.respond_to?(:to_rgb_triple) then true_color(name.to_rgb_triple.to_a)
|
30
|
+
when name.to_s =~ /\A(on_)?(\d+)\z/ then get "#$1color#$2"
|
31
|
+
when name.to_s =~ /\A#([0-9a-f]{3}){1,2}\z/i then true_color name
|
32
|
+
when name.to_s =~ /\Aon_#([0-9a-f]{3}){1,2}\z/i then on_true_color name
|
33
|
+
else get name
|
34
|
+
end
|
35
|
+
else
|
36
|
+
case
|
37
|
+
when self === name then name
|
38
|
+
when Array === name then nearest_rgb_color name
|
39
|
+
when name.respond_to?(:to_rgb_triple) then nearest_rgb_color(name.to_rgb_triple.to_a)
|
40
|
+
when name.to_s =~ /\A(on_)?(\d+)\z/ then get "#$1color#$2"
|
41
|
+
when name.to_s =~ /\A#([0-9a-f]{3}){1,2}\z/i then nearest_rgb_color name
|
42
|
+
when name.to_s =~ /\Aon_#([0-9a-f]{3}){1,2}\z/i then nearest_rgb_on_color name
|
43
|
+
else get name
|
44
|
+
end
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
@@ -47,7 +50,7 @@ module Term
|
|
47
50
|
end
|
48
51
|
|
49
52
|
def self.rgb_colors(options = {}, &block)
|
50
|
-
colors =
|
53
|
+
colors = attributes.select(&:rgb_color?)
|
51
54
|
if options.key?(:gray) && !options[:gray]
|
52
55
|
colors = colors.reject(&:gray?)
|
53
56
|
end
|
@@ -70,12 +73,31 @@ module Term
|
|
70
73
|
colors.select(&:background?).min_by { |c| c.distance_to(rgb, options) }
|
71
74
|
end
|
72
75
|
|
76
|
+
def self.true_color(color, options = {})
|
77
|
+
rgb = RGBTriple[color]
|
78
|
+
new(:true, "", { true_color: rgb, background: false })
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.on_true_color(color, options = {})
|
82
|
+
rgb = RGBTriple[color]
|
83
|
+
new(:on_true, "", { true_color: rgb, background: true })
|
84
|
+
end
|
85
|
+
|
73
86
|
def initialize(name, code, options = {})
|
74
|
-
@name
|
75
|
-
@
|
76
|
-
|
87
|
+
@name = name.to_sym
|
88
|
+
@background = !!options[:background]
|
89
|
+
@code = code.to_s
|
90
|
+
@direct = false
|
91
|
+
@true_color = false
|
92
|
+
if rgb = options[:true_color]
|
93
|
+
@true_color = true
|
94
|
+
@rgb = rgb
|
95
|
+
elsif rgb = options[:direct]
|
96
|
+
@direct = true
|
97
|
+
@rgb = RGBTriple.from_html(rgb)
|
98
|
+
elsif html = options[:html]
|
77
99
|
@rgb = RGBTriple.from_html(html)
|
78
|
-
elsif
|
100
|
+
elsif options.slice(:red, :green, :blue).size == 3
|
79
101
|
@rgb = RGBTriple.from_hash(options)
|
80
102
|
else
|
81
103
|
@rgb = nil # prevent instance variable not initialized warnings
|
@@ -85,25 +107,39 @@ module Term
|
|
85
107
|
attr_reader :name
|
86
108
|
|
87
109
|
def code
|
88
|
-
if
|
110
|
+
if true_color?
|
111
|
+
background? ? "48;2;#{@rgb.to_a * ?;}" : "38;2;#{@rgb.to_a * ?;}"
|
112
|
+
elsif rgb_color?
|
89
113
|
background? ? "48;5;#{@code}" : "38;5;#{@code}"
|
114
|
+
elsif direct?
|
115
|
+
background? ? (@code.to_i + 10).to_s : @code
|
90
116
|
else
|
91
117
|
@code
|
92
118
|
end
|
93
119
|
end
|
94
120
|
|
95
121
|
def apply(string = nil, &block)
|
96
|
-
::Term::ANSIColor.
|
122
|
+
::Term::ANSIColor.apply_attribute(self, string, &block)
|
97
123
|
end
|
98
124
|
|
99
125
|
def background?
|
100
|
-
|
126
|
+
!!@background
|
101
127
|
end
|
102
128
|
|
129
|
+
def direct?
|
130
|
+
!!@direct
|
131
|
+
end
|
132
|
+
|
133
|
+
attr_writer :background
|
134
|
+
|
103
135
|
attr_reader :rgb
|
104
136
|
|
105
137
|
def rgb_color?
|
106
|
-
!!@rgb
|
138
|
+
!!@rgb && !@true_color && !@direct
|
139
|
+
end
|
140
|
+
|
141
|
+
def true_color?
|
142
|
+
!!(@rgb && @true_color)
|
107
143
|
end
|
108
144
|
|
109
145
|
def gray?
|
@@ -127,11 +163,16 @@ module Term
|
|
127
163
|
|
128
164
|
def gradient_to(other, options = {})
|
129
165
|
if our_rgb = to_rgb_triple and
|
130
|
-
|
131
|
-
|
132
|
-
|
166
|
+
other.respond_to?(:to_rgb_triple) and
|
167
|
+
other_rgb = other.to_rgb_triple
|
168
|
+
then
|
169
|
+
true_coloring = options[:true_coloring] || Term::ANSIColor.true_coloring?
|
133
170
|
our_rgb.gradient_to(other_rgb, options).map do |rgb_triple|
|
134
|
-
|
171
|
+
if true_coloring
|
172
|
+
self.class.true_color(rgb_triple, options)
|
173
|
+
else
|
174
|
+
self.class.nearest_rgb_color(rgb_triple, options)
|
175
|
+
end
|
135
176
|
end
|
136
177
|
else
|
137
178
|
[]
|
@@ -72,8 +72,8 @@ module Term
|
|
72
72
|
|
73
73
|
def initialize(hue, saturation, lightness)
|
74
74
|
@hue = Float(hue) % 360
|
75
|
-
@saturation =
|
76
|
-
@lightness =
|
75
|
+
@saturation = Float(saturation).clamp(0, 100)
|
76
|
+
@lightness = Float(lightness).clamp(0, 100)
|
77
77
|
end
|
78
78
|
|
79
79
|
attr_reader :hue
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'tins/terminal'
|
2
|
+
|
3
|
+
module Term
|
4
|
+
module ANSIColor
|
5
|
+
module Hyperlink
|
6
|
+
def hyperlink(link, string = nil, id: nil, as_link: false)
|
7
|
+
block_given? && string != nil && !respond_to?(:to_str) and
|
8
|
+
raise ArgumentError,
|
9
|
+
"Require either the string argument or a block argument"
|
10
|
+
if link.nil?
|
11
|
+
link = ''
|
12
|
+
end
|
13
|
+
if as_link && !link.empty?
|
14
|
+
string ||= link
|
15
|
+
end
|
16
|
+
result = ''
|
17
|
+
if Term::ANSIColor.coloring?
|
18
|
+
result = "\e]8;#{"id=#{id}" unless id.nil?};" << link.to_str << "\e\\"
|
19
|
+
end
|
20
|
+
if block_given?
|
21
|
+
result << yield.to_s
|
22
|
+
elsif string.respond_to?(:to_str)
|
23
|
+
result << string.to_str
|
24
|
+
elsif respond_to?(:to_str)
|
25
|
+
result << to_str
|
26
|
+
else
|
27
|
+
return result # only switch on
|
28
|
+
end
|
29
|
+
result << "\e]8;;\e\\" if Term::ANSIColor.coloring?
|
30
|
+
result
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -4,9 +4,10 @@ module Term
|
|
4
4
|
include Term::ANSIColor
|
5
5
|
|
6
6
|
def initialize(io, options = {})
|
7
|
-
@io
|
8
|
-
@options
|
9
|
-
@buffer
|
7
|
+
@io = io
|
8
|
+
@options = options
|
9
|
+
@buffer = ''
|
10
|
+
@true_coloring = options[:true_coloring]
|
10
11
|
end
|
11
12
|
|
12
13
|
def reset_io
|
@@ -34,7 +35,11 @@ module Term
|
|
34
35
|
last_pixel = nil
|
35
36
|
for pixel in row
|
36
37
|
if pixel != last_pixel
|
37
|
-
color =
|
38
|
+
color = if @true_coloring
|
39
|
+
Attribute.true_color(pixel, @options)
|
40
|
+
else
|
41
|
+
Attribute.nearest_rgb_color(pixel, @options)
|
42
|
+
end
|
38
43
|
result << on_color(color)
|
39
44
|
last_pixel = pixel
|
40
45
|
end
|
data/lib/term/ansicolor.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'tins/xt/full'
|
2
|
+
require 'tins/xt/ask_and_send'
|
3
|
+
require 'mize'
|
2
4
|
|
3
5
|
module Term
|
4
6
|
|
@@ -15,25 +17,11 @@ module Term
|
|
15
17
|
require 'term/ansicolor/attribute/intense_color8'
|
16
18
|
require 'term/ansicolor/attribute/color256'
|
17
19
|
require 'term/ansicolor/movement'
|
18
|
-
|
19
20
|
include Term::ANSIColor::Movement
|
21
|
+
require 'term/ansicolor/hyperlink'
|
22
|
+
include Term::ANSIColor::Hyperlink
|
23
|
+
include Term::ANSIColor::Attribute::Underline
|
20
24
|
|
21
|
-
# :stopdoc:
|
22
|
-
ATTRIBUTE_NAMES = Attribute.named_attributes.map(&:name)
|
23
|
-
# :startdoc:
|
24
|
-
|
25
|
-
# Returns true if Term::ANSIColor supports the +feature+.
|
26
|
-
#
|
27
|
-
# The feature :clear, that is mixing the clear color attribute into String,
|
28
|
-
# is only supported on ruby implementations, that do *not* already
|
29
|
-
# implement the String#clear method. It's better to use the reset color
|
30
|
-
# attribute instead.
|
31
|
-
def support?(feature)
|
32
|
-
case feature
|
33
|
-
when :clear
|
34
|
-
!String.instance_methods(false).map(&:to_sym).include?(:clear)
|
35
|
-
end
|
36
|
-
end
|
37
25
|
# Returns true, if the coloring function of this module
|
38
26
|
# is switched on, false otherwise.
|
39
27
|
def self.coloring?
|
@@ -42,31 +30,32 @@ module Term
|
|
42
30
|
|
43
31
|
# Turns the coloring on or off globally, so you can easily do
|
44
32
|
# this for example:
|
45
|
-
#
|
33
|
+
# Term::ANSIColor::coloring = STDOUT.isatty
|
46
34
|
def self.coloring=(val)
|
47
|
-
@coloring = val
|
35
|
+
@coloring = !!val
|
48
36
|
end
|
49
37
|
self.coloring = true
|
50
38
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
EOT
|
57
|
-
self
|
39
|
+
# Returns true, if the tue coloring mode of this module is switched on,
|
40
|
+
# false otherwise.
|
41
|
+
def self.true_coloring?
|
42
|
+
@true_coloring
|
58
43
|
end
|
59
44
|
|
60
|
-
|
61
|
-
|
45
|
+
# Turns the true coloring mode on or off globally, that will display 24-bit
|
46
|
+
# colors if your terminal supports it:
|
47
|
+
# Term::ANSIColor::true_coloring = ENV['COLORTERM'] =~ /\A(truecolor|24bit)\z/
|
48
|
+
def self.true_coloring=(val)
|
49
|
+
@true_coloring = !!val
|
62
50
|
end
|
51
|
+
self.true_coloring = false
|
63
52
|
|
64
53
|
# Regular expression that is used to scan for ANSI-Attributes while
|
65
54
|
# uncoloring strings.
|
66
|
-
COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9]|[34]8;5;\d{1,3})?m/
|
55
|
+
COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9]|[34]8;(5;\d{1,3}|2;\d{1,3}(;\d{1,3}){2})|4:\d|53)?m/
|
67
56
|
|
68
|
-
# Returns an uncolored version of the string, that is all
|
69
|
-
#
|
57
|
+
# Returns an uncolored version of the string, that is all ANSI-Attributes
|
58
|
+
# are stripped from the string.
|
70
59
|
def uncolor(string = nil) # :yields:
|
71
60
|
if block_given?
|
72
61
|
yield.to_str.gsub(COLORED_REGEXP, '')
|
@@ -81,13 +70,9 @@ module Term
|
|
81
70
|
|
82
71
|
alias uncolored uncolor
|
83
72
|
|
84
|
-
|
85
|
-
# color +name+. If string isn't a string only the escape sequence to switch
|
86
|
-
# on the color +name+ is returned.
|
87
|
-
def color(name, string = nil, &block)
|
88
|
-
attribute = Attribute[name] or raise ArgumentError, "unknown attribute #{name.inspect}"
|
73
|
+
def apply_code(code, string = nil, &block)
|
89
74
|
result = ''
|
90
|
-
result << "\e[#{
|
75
|
+
result << "\e[#{code}m" if Term::ANSIColor.coloring?
|
91
76
|
if block_given?
|
92
77
|
result << yield.to_s
|
93
78
|
elsif string.respond_to?(:to_str)
|
@@ -95,21 +80,40 @@ module Term
|
|
95
80
|
elsif respond_to?(:to_str)
|
96
81
|
result << to_str
|
97
82
|
else
|
98
|
-
return result #only switch on
|
83
|
+
return result # only switch on
|
99
84
|
end
|
100
85
|
result << "\e[0m" if Term::ANSIColor.coloring?
|
101
86
|
result.extend(Term::ANSIColor)
|
102
87
|
end
|
103
88
|
|
89
|
+
def apply_attribute(name, string = nil, &block)
|
90
|
+
attribute = Attribute[name] or
|
91
|
+
raise ArgumentError, "unknown attribute #{name.inspect}"
|
92
|
+
apply_code(attribute.code, string, &block)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Return +string+ or the result string of the given +block+ colored with
|
96
|
+
# color +name+. If string isn't a string only the escape sequence to switch
|
97
|
+
# on the color +name+ is returned.
|
98
|
+
def color(name, string = nil, &block)
|
99
|
+
apply_attribute(name, string, &block)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Return +string+ or the result string of the given +block+ with a
|
103
|
+
# background colored with color +name+. If string isn't a string only the
|
104
|
+
# escape sequence to switch on the color +name+ is returned.
|
104
105
|
def on_color(name, string = nil, &block)
|
105
|
-
attribute = Attribute[name] or
|
106
|
-
|
106
|
+
attribute = Attribute[name] or
|
107
|
+
raise ArgumentError, "unknown attribute #{name.inspect}"
|
108
|
+
attribute = attribute.dup
|
109
|
+
attribute.background = true
|
110
|
+
apply_attribute(attribute, string, &block)
|
107
111
|
end
|
108
112
|
|
109
113
|
class << self
|
110
114
|
# Returns an array of all Term::ANSIColor attributes as symbols.
|
111
|
-
def term_ansicolor_attributes
|
112
|
-
::Term::ANSIColor::
|
115
|
+
memoize method: def term_ansicolor_attributes
|
116
|
+
::Term::ANSIColor::Attribute.attributes.map(&:name)
|
113
117
|
end
|
114
118
|
|
115
119
|
alias attributes term_ansicolor_attributes
|
data/term-ansicolor.gemspec
CHANGED
@@ -1,45 +1,32 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: term-ansicolor 1.
|
2
|
+
# stub: term-ansicolor 1.10.4 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "term-ansicolor".freeze
|
6
|
-
s.version = "1.
|
6
|
+
s.version = "1.10.4".freeze
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Florian Frank".freeze]
|
11
|
-
s.date = "
|
11
|
+
s.date = "2024-07-15"
|
12
12
|
s.description = "This library uses ANSI escape sequences to control the attributes of terminal output".freeze
|
13
13
|
s.email = "flori@ping.de".freeze
|
14
|
-
s.executables = ["
|
15
|
-
s.extra_rdoc_files = ["README.md".freeze, "lib/term/ansicolor.rb".freeze, "lib/term/ansicolor/attribute.rb".freeze, "lib/term/ansicolor/attribute/color256.rb".freeze, "lib/term/ansicolor/attribute/color8.rb".freeze, "lib/term/ansicolor/attribute/intense_color8.rb".freeze, "lib/term/ansicolor/attribute/text.rb".freeze, "lib/term/ansicolor/hsl_triple.rb".freeze, "lib/term/ansicolor/movement.rb".freeze, "lib/term/ansicolor/ppm_reader.rb".freeze, "lib/term/ansicolor/rgb_color_metrics.rb".freeze, "lib/term/ansicolor/rgb_triple.rb".freeze, "lib/term/ansicolor/version.rb".freeze]
|
16
|
-
s.files = [".
|
17
|
-
s.homepage = "
|
14
|
+
s.executables = ["term_cdiff".freeze, "term_colortab".freeze, "term_decolor".freeze, "term_display".freeze, "term_mandel".freeze, "term_snow".freeze]
|
15
|
+
s.extra_rdoc_files = ["README.md".freeze, "lib/term/ansicolor.rb".freeze, "lib/term/ansicolor/attribute.rb".freeze, "lib/term/ansicolor/attribute/color256.rb".freeze, "lib/term/ansicolor/attribute/color8.rb".freeze, "lib/term/ansicolor/attribute/intense_color8.rb".freeze, "lib/term/ansicolor/attribute/text.rb".freeze, "lib/term/ansicolor/attribute/underline.rb".freeze, "lib/term/ansicolor/hsl_triple.rb".freeze, "lib/term/ansicolor/hyperlink.rb".freeze, "lib/term/ansicolor/movement.rb".freeze, "lib/term/ansicolor/ppm_reader.rb".freeze, "lib/term/ansicolor/rgb_color_metrics.rb".freeze, "lib/term/ansicolor/rgb_triple.rb".freeze, "lib/term/ansicolor/version.rb".freeze]
|
16
|
+
s.files = [".all_images.yml".freeze, ".gitignore".freeze, ".utilsrc".freeze, "CHANGES".freeze, "COPYING".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/term_cdiff".freeze, "bin/term_colortab".freeze, "bin/term_decolor".freeze, "bin/term_display".freeze, "bin/term_mandel".freeze, "bin/term_snow".freeze, "examples/example.rb".freeze, "examples/lambda-red-plain.ppm".freeze, "examples/lambda-red.png".freeze, "examples/lambda-red.ppm".freeze, "lib/term/ansicolor.rb".freeze, "lib/term/ansicolor/.keep".freeze, "lib/term/ansicolor/attribute.rb".freeze, "lib/term/ansicolor/attribute/color256.rb".freeze, "lib/term/ansicolor/attribute/color8.rb".freeze, "lib/term/ansicolor/attribute/intense_color8.rb".freeze, "lib/term/ansicolor/attribute/text.rb".freeze, "lib/term/ansicolor/attribute/underline.rb".freeze, "lib/term/ansicolor/hsl_triple.rb".freeze, "lib/term/ansicolor/hyperlink.rb".freeze, "lib/term/ansicolor/movement.rb".freeze, "lib/term/ansicolor/ppm_reader.rb".freeze, "lib/term/ansicolor/rgb_color_metrics.rb".freeze, "lib/term/ansicolor/rgb_triple.rb".freeze, "lib/term/ansicolor/version.rb".freeze, "term-ansicolor.gemspec".freeze, "tests/ansicolor_test.rb".freeze, "tests/attribute_test.rb".freeze, "tests/hsl_triple_test.rb".freeze, "tests/hyperlink_test.rb".freeze, "tests/ppm_reader_test.rb".freeze, "tests/rgb_color_metrics_test.rb".freeze, "tests/rgb_triple_test.rb".freeze, "tests/test_helper.rb".freeze]
|
17
|
+
s.homepage = "https://github.com/flori/term-ansicolor".freeze
|
18
18
|
s.licenses = ["Apache-2.0".freeze]
|
19
19
|
s.rdoc_options = ["--title".freeze, "Term-ansicolor - Ruby library that colors strings using ANSI escape sequences".freeze, "--main".freeze, "README.md".freeze]
|
20
|
-
s.
|
21
|
-
s.rubygems_version = "3.0.1".freeze
|
20
|
+
s.rubygems_version = "3.5.11".freeze
|
22
21
|
s.summary = "Ruby library that colors strings using ANSI escape sequences".freeze
|
23
|
-
s.test_files = ["tests/ansicolor_test.rb".freeze, "tests/attribute_test.rb".freeze, "tests/hsl_triple_test.rb".freeze, "tests/ppm_reader_test.rb".freeze, "tests/rgb_color_metrics_test.rb".freeze, "tests/rgb_triple_test.rb".freeze, "tests/test_helper.rb".freeze]
|
22
|
+
s.test_files = ["tests/ansicolor_test.rb".freeze, "tests/attribute_test.rb".freeze, "tests/hsl_triple_test.rb".freeze, "tests/hyperlink_test.rb".freeze, "tests/ppm_reader_test.rb".freeze, "tests/rgb_color_metrics_test.rb".freeze, "tests/rgb_triple_test.rb".freeze, "tests/test_helper.rb".freeze]
|
24
23
|
|
25
|
-
|
26
|
-
s.specification_version = 4
|
24
|
+
s.specification_version = 4
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
|
35
|
-
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
36
|
-
s.add_dependency(%q<test-unit>.freeze, [">= 0"])
|
37
|
-
s.add_dependency(%q<tins>.freeze, ["~> 1.0"])
|
38
|
-
end
|
39
|
-
else
|
40
|
-
s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
|
41
|
-
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
42
|
-
s.add_dependency(%q<test-unit>.freeze, [">= 0"])
|
43
|
-
s.add_dependency(%q<tins>.freeze, ["~> 1.0"])
|
44
|
-
end
|
26
|
+
s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.16.0".freeze])
|
27
|
+
s.add_development_dependency(%q<simplecov>.freeze, [">= 0".freeze])
|
28
|
+
s.add_development_dependency(%q<test-unit>.freeze, [">= 0".freeze])
|
29
|
+
s.add_development_dependency(%q<utils>.freeze, [">= 0".freeze])
|
30
|
+
s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.0".freeze])
|
31
|
+
s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.5".freeze])
|
45
32
|
end
|
data/tests/ansicolor_test.rb
CHANGED
@@ -103,9 +103,22 @@ class ANSIColorTest < Test::Unit::TestCase
|
|
103
103
|
|
104
104
|
def test_attributes
|
105
105
|
foo = 'foo'
|
106
|
-
|
106
|
+
attributes = %i[
|
107
|
+
clear reset bold dark faint italic underline underscore
|
108
|
+
blink rapid_blink reverse negative concealed conceal strikethrough black
|
109
|
+
red green yellow blue magenta cyan white on_black on_red on_green on_yellow
|
110
|
+
on_blue on_magenta on_cyan on_white intense_black bright_black intense_red
|
111
|
+
bright_red intense_green bright_green intense_yellow bright_yellow
|
112
|
+
intense_blue bright_blue intense_magenta bright_magenta intense_cyan
|
113
|
+
bright_cyan intense_white bright_white on_intense_black on_bright_black
|
114
|
+
on_intense_red on_bright_red on_intense_green on_bright_green
|
115
|
+
on_intense_yellow on_bright_yellow on_intense_blue on_bright_blue
|
116
|
+
on_intense_magenta on_bright_magenta on_intense_cyan on_bright_cyan
|
117
|
+
on_intense_white on_bright_white
|
118
|
+
]
|
119
|
+
for a in attributes
|
107
120
|
# skip :clear and :reverse b/c Ruby implements them on string
|
108
|
-
if a != :clear && a != :reverse
|
121
|
+
if a != :clear && a != :reverse
|
109
122
|
refute_equal foo, foo_colored = foo.__send__(a)
|
110
123
|
assert_equal foo, foo_colored.uncolor
|
111
124
|
end
|
@@ -121,6 +134,44 @@ class ANSIColorTest < Test::Unit::TestCase
|
|
121
134
|
assert_equal Term::ANSIColor.attributes, 'foo'.attributes
|
122
135
|
end
|
123
136
|
|
137
|
+
def test_underline_invalid_type
|
138
|
+
assert_raises(ArgumentError) { Term::ANSIColor.underline(type: :nix) { 'foo' } }
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_underline_invalid_color
|
142
|
+
assert_raises(ArgumentError) { Term::ANSIColor.underline(color: :nix) { 'foo' } }
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_underline
|
146
|
+
foo = 'foo'
|
147
|
+
assert_equal "\e[4mfoo\e[0m", Term::ANSIColor.underline { foo }
|
148
|
+
assert_equal "\e[4m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(color: '#ff8040') { foo }
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_underline_double
|
152
|
+
foo = 'foo'
|
153
|
+
assert_equal "\e[4:2mfoo\e[0m", Term::ANSIColor.underline(type: :double) { foo }
|
154
|
+
assert_equal "\e[4:2m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :double, color: '#ff8040') { foo }
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_underline_curly
|
158
|
+
foo = 'foo'
|
159
|
+
assert_equal "\e[4:3mfoo\e[0m", Term::ANSIColor.underline(type: :curly) { foo }
|
160
|
+
assert_equal "\e[4:3m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :curly, color: '#ff8040') { foo }
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_underline_dotted
|
164
|
+
foo = 'foo'
|
165
|
+
assert_equal "\e[4:4mfoo\e[0m", Term::ANSIColor.underline(type: :dotted) { foo }
|
166
|
+
assert_equal "\e[4:4m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :dotted, color: '#ff8040') { foo }
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_underline_dashed
|
170
|
+
foo = 'foo'
|
171
|
+
assert_equal "\e[4:5mfoo\e[0m", Term::ANSIColor.underline(type: :dashed) { foo }
|
172
|
+
assert_equal "\e[4:5m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :dashed, color: '#ff8040') { foo }
|
173
|
+
end
|
174
|
+
|
124
175
|
def test_move_to
|
125
176
|
string_23_23 = "\e[23;23Hred"
|
126
177
|
assert_equal string_23_23, string.move_to(23, 23)
|
@@ -157,4 +208,20 @@ class ANSIColorTest < Test::Unit::TestCase
|
|
157
208
|
string = Color.red(string)
|
158
209
|
assert_kind_of Term::ANSIColor, 'new'
|
159
210
|
end
|
211
|
+
|
212
|
+
def test_coloring
|
213
|
+
assert Term::ANSIColor.coloring?
|
214
|
+
Term::ANSIColor.coloring = false
|
215
|
+
assert_false Term::ANSIColor.coloring?
|
216
|
+
ensure
|
217
|
+
Term::ANSIColor.coloring = true
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_true_coloring
|
221
|
+
assert_false Term::ANSIColor.true_coloring?
|
222
|
+
Term::ANSIColor.true_coloring = true
|
223
|
+
assert Term::ANSIColor.true_coloring?
|
224
|
+
ensure
|
225
|
+
Term::ANSIColor.true_coloring = false
|
226
|
+
end
|
160
227
|
end
|