ansi 1.4.3 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.index +77 -0
- data/DEMO.md +451 -0
- data/{HISTORY.rdoc → HISTORY.md} +35 -15
- data/LICENSE.txt +23 -0
- data/NOTICE.md +170 -0
- data/{README.rdoc → README.md} +34 -30
- data/demo/01_ansicode.md +65 -0
- data/demo/{02_core.rdoc → 02_core.md} +4 -4
- data/demo/03_logger.md +30 -0
- data/demo/04_progressbar.md +62 -0
- data/demo/{05_mixin.rdoc → 05_mixin.md} +11 -11
- data/demo/{06_string.rdoc → 06_string.md} +18 -18
- data/demo/07_columns.md +89 -0
- data/demo/08_table.md +28 -0
- data/demo/09_diff.md +47 -0
- data/demo/10_bbcode.md +24 -0
- data/demo/11_terminal.md +8 -0
- data/lib/ansi.yml +57 -43
- data/lib/ansi/chart.rb +12 -10
- data/lib/ansi/code.rb +78 -82
- data/lib/ansi/columns.rb +0 -1
- data/lib/ansi/terminal.rb +1 -1
- data/lib/ansi/terminal/curses.rb +1 -2
- data/lib/ansi/terminal/stty.rb +2 -2
- data/test/case_ansicode.rb +29 -17
- data/test/case_mixin.rb +18 -12
- data/test/case_progressbar.rb +11 -9
- metadata +90 -53
- data/.ruby +0 -63
- data/COPYING.rdoc +0 -612
- data/Config.rb +0 -13
- data/DEMO.rdoc +0 -455
- data/demo/01_ansicode.rdoc +0 -49
- data/demo/03_logger.rdoc +0 -31
- data/demo/04_progressbar.rdoc +0 -63
- data/demo/07_columns.rdoc +0 -90
- data/demo/08_table.rdoc +0 -28
- data/demo/09_diff.rdoc +0 -47
- data/demo/10_bbcode.rdoc +0 -24
- data/demo/11_terminal.rdoc +0 -8
data/demo/10_bbcode.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# ANSI::BBCode
|
2
|
+
|
3
|
+
The BBCode module provides methods for converting between
|
4
|
+
BBCodes, basic HTML and ANSI codes.
|
5
|
+
|
6
|
+
require 'ansi/bbcode'
|
7
|
+
|
8
|
+
BBCodes are color and style codes in square brackets, quite
|
9
|
+
popular with on line forums.
|
10
|
+
|
11
|
+
bbcode = "this is [COLOR=red]red[/COLOR], this is [B]bold[/B]"
|
12
|
+
|
13
|
+
We can convert this to ANSI code simply enough:
|
14
|
+
|
15
|
+
ansi = ANSI::BBCode.bbcode_to_ansi(bbcode)
|
16
|
+
|
17
|
+
ansi.assert == "this is \e[0;31mred\e[0m, this is \e[1mbold\e[0m\n"
|
18
|
+
|
19
|
+
In addition the BBCode module supports conversion to simple HTML.
|
20
|
+
|
21
|
+
html = ANSI::BBCode.bbcode_to_html(bbcode)
|
22
|
+
|
23
|
+
html.assert == "this is <font color=\"red\">red</font>, this is <strong>bold</strong><br />\n"
|
24
|
+
|
data/demo/11_terminal.md
ADDED
data/lib/ansi.yml
CHANGED
@@ -1,63 +1,77 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
|
2
|
+
revision: 2013
|
3
|
+
type: ruby
|
4
|
+
sources:
|
5
|
+
- INDEX.yml
|
4
6
|
authors:
|
5
7
|
- name: Thomas Sawyer
|
6
8
|
email: transfire@gmail.com
|
7
9
|
- name: Florian Frank
|
8
|
-
|
9
|
-
- holder: Rubyworks
|
10
|
-
year: '2009'
|
10
|
+
organizations: []
|
11
11
|
requirements:
|
12
|
-
-
|
13
|
-
groups:
|
12
|
+
- groups:
|
14
13
|
- build
|
15
14
|
development: true
|
16
|
-
|
17
|
-
|
15
|
+
name: mast
|
16
|
+
- groups:
|
17
|
+
- build
|
18
|
+
development: true
|
19
|
+
name: indexer
|
20
|
+
- groups:
|
21
|
+
- build
|
22
|
+
development: true
|
23
|
+
name: ergo
|
24
|
+
- groups:
|
18
25
|
- test
|
19
26
|
development: true
|
20
|
-
|
21
|
-
|
27
|
+
name: qed
|
28
|
+
- groups:
|
22
29
|
- test
|
23
30
|
development: true
|
24
|
-
|
25
|
-
|
31
|
+
name: ae
|
32
|
+
- groups:
|
33
|
+
- test
|
34
|
+
development: true
|
35
|
+
name: lemon
|
26
36
|
conflicts: []
|
27
|
-
|
28
|
-
- uri: git://github.com/rubyworks/ansi.git
|
29
|
-
scm: git
|
30
|
-
name: upstream
|
37
|
+
alternatives: []
|
31
38
|
resources:
|
32
|
-
-
|
33
|
-
|
34
|
-
|
35
|
-
-
|
36
|
-
|
37
|
-
type: code
|
38
|
-
- uri: http://rubydoc.info/gems/ansi/frames
|
39
|
+
- type: home
|
40
|
+
uri: http://rubyworks.github.com/ansi
|
41
|
+
label: Homepage
|
42
|
+
- type: docs
|
43
|
+
uri: http://rubydoc.info/gems/ansi/frames
|
39
44
|
label: Documentation
|
40
|
-
|
41
|
-
|
45
|
+
- type: code
|
46
|
+
uri: http://github.com/rubyworks/ansi
|
47
|
+
label: Source Code
|
48
|
+
- type: bugs
|
49
|
+
uri: http://github.com/rubyworks/ansi/issues
|
50
|
+
label: Issue Tracker
|
51
|
+
- type: mail
|
52
|
+
uri: http://groups.google.com/group/rubyworks-mailinglist
|
42
53
|
label: Mailing List
|
43
|
-
|
54
|
+
repositories:
|
55
|
+
- name: upstream
|
56
|
+
scm: git
|
57
|
+
uri: git://github.com/rubyworks/ansi.git
|
44
58
|
categories: []
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
59
|
+
copyrights:
|
60
|
+
- holder: Rubyworks
|
61
|
+
year: '2009'
|
62
|
+
license: BSD-2-Clause
|
63
|
+
customs: []
|
64
|
+
paths:
|
65
|
+
lib:
|
66
|
+
- lib
|
49
67
|
name: ansi
|
50
68
|
title: ANSI
|
51
|
-
|
69
|
+
version: 1.5.0
|
52
70
|
summary: ANSI at your fingertips!
|
53
|
-
description:
|
54
|
-
libraries
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
language.'
|
61
|
-
organization: Rubyworks
|
62
|
-
version: 1.4.3
|
63
|
-
date: '2012-06-28'
|
71
|
+
description: The ANSI project is a superlative collection of ANSI escape code related
|
72
|
+
libraries eabling ANSI colorization and stylization of console output. Byte for
|
73
|
+
byte ANSI is the best ANSI code library available for the Ruby programming language.
|
74
|
+
orgranizations:
|
75
|
+
- Rubyworks
|
76
|
+
created: '2009-08-01'
|
77
|
+
date: '2015-01-16'
|
data/lib/ansi/chart.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module ANSI
|
2
2
|
|
3
|
-
require 'ansi/version'
|
4
|
-
|
5
3
|
# Table of codes used throughout the system.
|
6
4
|
#
|
7
5
|
# @see http://en.wikipedia.org/wiki/ANSI_escape_code
|
@@ -9,7 +7,7 @@ module ANSI
|
|
9
7
|
:clear => 0,
|
10
8
|
:reset => 0,
|
11
9
|
:bright => 1,
|
12
|
-
:bold => 1,
|
10
|
+
:bold => 1,
|
13
11
|
:faint => 2,
|
14
12
|
:dark => 2,
|
15
13
|
:italic => 3,
|
@@ -23,7 +21,6 @@ module ANSI
|
|
23
21
|
:inverse => 7,
|
24
22
|
:reverse => 7,
|
25
23
|
:negative => 7,
|
26
|
-
:concealed => 8,
|
27
24
|
:swap => 7,
|
28
25
|
:conceal => 8,
|
29
26
|
:concealed => 8,
|
@@ -87,12 +84,17 @@ module ANSI
|
|
87
84
|
|
88
85
|
#
|
89
86
|
SPECIAL_CHART = {
|
90
|
-
:save => "\e[s",
|
91
|
-
:restore => "\e[u",
|
92
|
-
:
|
93
|
-
:clr => "\e[K",
|
94
|
-
:
|
95
|
-
:
|
87
|
+
:save => "\e[s", # Save current cursor positon.
|
88
|
+
:restore => "\e[u", # Restore saved cursor positon.
|
89
|
+
:clear_eol => "\e[K", # Clear to the end of the current line.
|
90
|
+
:clr => "\e[K", # Clear to the end of the current line.
|
91
|
+
:clear_right => "\e[0K", # Clear to the end of the current line.
|
92
|
+
:clear_left => "\e[1K", # Clear to the start of the current line.
|
93
|
+
:clear_line => "\e[2K", # Clear the entire current line.
|
94
|
+
:clear_screen => "\e[2J", # Clear the screen and move cursor to home.
|
95
|
+
:cls => "\e[2J", # Clear the screen and move cursor to home.
|
96
|
+
:cursor_hide => "\e[?25l", # Hide the cursor.
|
97
|
+
:cursor_show => "\e[?25h" # Show the cursor.
|
96
98
|
}
|
97
99
|
|
98
100
|
end
|
data/lib/ansi/code.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
module ANSI
|
2
2
|
|
3
|
+
# Global variable can be used to prevent ANSI codes
|
4
|
+
# from being used in ANSI's methods that do so to string.
|
5
|
+
#
|
6
|
+
# NOTE: This has no effect on methods that return ANSI codes.
|
7
|
+
$ansi = true
|
8
|
+
|
3
9
|
if RUBY_PLATFORM =~ /(win32|w32)/
|
4
10
|
begin
|
5
11
|
require 'Win32/Console/ANSI'
|
@@ -11,18 +17,12 @@ module ANSI
|
|
11
17
|
|
12
18
|
require 'ansi/constants'
|
13
19
|
|
14
|
-
# Global variialbe can be used to prevent ANSI codes
|
15
|
-
# from being used in ANSI's methods that do so to string.
|
16
|
-
#
|
17
|
-
# NOTE: This has no effect of methods that return ANSI codes.
|
18
|
-
$ansi = true
|
19
|
-
|
20
20
|
# TODO: up, down, right, left, etc could have yielding methods too?
|
21
21
|
|
22
22
|
# ANSI Codes
|
23
23
|
#
|
24
24
|
# Ansi::Code module makes it very easy to use ANSI codes.
|
25
|
-
# These are
|
25
|
+
# These are especially nice for beautifying shell output.
|
26
26
|
#
|
27
27
|
# Ansi::Code.red + "Hello" + Ansi::Code.blue + "World"
|
28
28
|
# => "\e[31mHello\e[34mWorld"
|
@@ -32,7 +32,7 @@ module ANSI
|
|
32
32
|
#
|
33
33
|
# IMPORTANT! Do not mixin Ansi::Code, instead use {ANSI::Mixin}.
|
34
34
|
#
|
35
|
-
# See {ANSI::
|
35
|
+
# See {ANSI::CHART} for list of all supported codes.
|
36
36
|
#
|
37
37
|
module Code
|
38
38
|
extend self
|
@@ -56,59 +56,6 @@ module ANSI
|
|
56
56
|
%w{black red green yellow blue magenta cyan white}
|
57
57
|
end
|
58
58
|
|
59
|
-
=begin
|
60
|
-
styles.each do |style|
|
61
|
-
module_eval <<-END, __FILE__, __LINE__
|
62
|
-
def #{style}(string=nil)
|
63
|
-
if string
|
64
|
-
return string unless $ansi
|
65
|
-
#warn "use ANSI block notation for future versions"
|
66
|
-
return "\#{#{style.upcase}}\#{string}\#{ENDCODE}"
|
67
|
-
end
|
68
|
-
if block_given?
|
69
|
-
return yield unless $ansi
|
70
|
-
return "\#{#{style.upcase}}\#{yield}\#{ENDCODE}"
|
71
|
-
end
|
72
|
-
#{style.upcase}
|
73
|
-
end
|
74
|
-
END
|
75
|
-
end
|
76
|
-
=end
|
77
|
-
|
78
|
-
=begin
|
79
|
-
# Dynamically create color methods.
|
80
|
-
|
81
|
-
colors.each do |color|
|
82
|
-
module_eval <<-END, __FILE__, __LINE__
|
83
|
-
def #{color}(string=nil)
|
84
|
-
if string
|
85
|
-
return string unless $ansi
|
86
|
-
#warn "use ANSI block notation for future versions"
|
87
|
-
return "\#{#{color.upcase}}\#{string}\#{ENDCODE}"
|
88
|
-
end
|
89
|
-
if block_given?
|
90
|
-
return yield unless $ansi
|
91
|
-
return "\#{#{color.upcase}}\#{yield}\#{ENDCODE}"
|
92
|
-
end
|
93
|
-
#{color.upcase}
|
94
|
-
end
|
95
|
-
|
96
|
-
def on_#{color}(string=nil)
|
97
|
-
if string
|
98
|
-
return string unless $ansi
|
99
|
-
#warn "use ANSI block notation for future versions"
|
100
|
-
return "\#{ON_#{color.upcase}}\#{string}\#{ENDCODE}"
|
101
|
-
end
|
102
|
-
if block_given?
|
103
|
-
return yield unless $ansi
|
104
|
-
return "\#{ON_#{color.upcase}}\#{yield}\#{ENDCODE}"
|
105
|
-
end
|
106
|
-
ON_#{color.upcase}
|
107
|
-
end
|
108
|
-
END
|
109
|
-
end
|
110
|
-
=end
|
111
|
-
|
112
59
|
# Return ANSI code given a list of symbolic names.
|
113
60
|
def [](*codes)
|
114
61
|
code(*codes)
|
@@ -165,10 +112,10 @@ module ANSI
|
|
165
112
|
end
|
166
113
|
|
167
114
|
# TODO: How to deal with position codes when $ansi is false?
|
168
|
-
# Should we
|
115
|
+
# Should we raise an error or just not push the codes?
|
169
116
|
# For now, we will leave this it as is.
|
170
117
|
|
171
|
-
# Like +move+ but returns to original
|
118
|
+
# Like +move+ but returns to original position after
|
172
119
|
# yielding the block.
|
173
120
|
def display(line, column=0) #:yield:
|
174
121
|
result = "\e[s"
|
@@ -188,25 +135,27 @@ module ANSI
|
|
188
135
|
"\e[#{line.to_i};#{column.to_i}H"
|
189
136
|
end
|
190
137
|
|
191
|
-
# Move cursor up a
|
138
|
+
# Move cursor up a specified number of spaces.
|
192
139
|
def up(spaces=1)
|
193
140
|
"\e[#{spaces.to_i}A"
|
194
141
|
end
|
195
142
|
|
196
|
-
# Move cursor down a
|
143
|
+
# Move cursor down a specified number of spaces.
|
197
144
|
def down(spaces=1)
|
198
145
|
"\e[#{spaces.to_i}B"
|
199
146
|
end
|
200
147
|
|
201
|
-
# Move cursor left a
|
148
|
+
# Move cursor left a specified number of spaces.
|
202
149
|
def left(spaces=1)
|
203
150
|
"\e[#{spaces.to_i}D"
|
204
151
|
end
|
152
|
+
alias :back :left
|
205
153
|
|
206
|
-
# Move cursor right a
|
154
|
+
# Move cursor right a specified number of spaces.
|
207
155
|
def right(spaces=1)
|
208
156
|
"\e[#{spaces.to_i}C"
|
209
157
|
end
|
158
|
+
alias :forward :right
|
210
159
|
|
211
160
|
##
|
212
161
|
#def position
|
@@ -228,6 +177,7 @@ module ANSI
|
|
228
177
|
if block_given?
|
229
178
|
string = yield.to_s
|
230
179
|
else
|
180
|
+
# first argument must be the string
|
231
181
|
string = codes.shift.to_s
|
232
182
|
end
|
233
183
|
|
@@ -260,7 +210,7 @@ module ANSI
|
|
260
210
|
# Alias for #ansi method.
|
261
211
|
#
|
262
212
|
# @deprecated
|
263
|
-
# Here for backward
|
213
|
+
# Here for backward compatibility.
|
264
214
|
alias_method :style, :ansi
|
265
215
|
|
266
216
|
# Alias for #unansi method.
|
@@ -285,7 +235,7 @@ module ANSI
|
|
285
235
|
# Also resolves :random and :on_random.
|
286
236
|
#
|
287
237
|
# @param codes [Array<Symbol,Integer]
|
288
|
-
# Symbols or integers to
|
238
|
+
# Symbols or integers to convert to ANSI code.
|
289
239
|
#
|
290
240
|
# @return [String] ANSI code
|
291
241
|
def code(*codes)
|
@@ -296,11 +246,18 @@ module ANSI
|
|
296
246
|
when Integer
|
297
247
|
code
|
298
248
|
when Array
|
299
|
-
|
300
|
-
when :random
|
249
|
+
rgb_code(*code)
|
250
|
+
when :random, 'random'
|
301
251
|
random
|
302
|
-
when :on_random
|
252
|
+
when :on_random, 'on_random'
|
303
253
|
random(true)
|
254
|
+
when String
|
255
|
+
# TODO: code =~ /\d\d\d\d\d\d/ ?
|
256
|
+
if code.start_with?('#')
|
257
|
+
hex_code(code)
|
258
|
+
else
|
259
|
+
CHART[code.to_sym]
|
260
|
+
end
|
304
261
|
else
|
305
262
|
CHART[code.to_sym]
|
306
263
|
end
|
@@ -318,30 +275,69 @@ module ANSI
|
|
318
275
|
(background ? 40 : 30) + rand(8)
|
319
276
|
end
|
320
277
|
|
278
|
+
# Creates an XTerm 256 color escape code from RGB value(s). The
|
279
|
+
# RGB value can be three arguments red, green and blue respectively
|
280
|
+
# each from 0 to 255, or the RGB value can be a single CSS-style
|
281
|
+
# hex string.
|
282
|
+
#
|
283
|
+
# @param background [Boolean]
|
284
|
+
# Use `true` for background color, otherwise foreground color.
|
285
|
+
#
|
286
|
+
def rgb(*args)
|
287
|
+
case args.size
|
288
|
+
when 1, 2
|
289
|
+
hex, background = *args
|
290
|
+
esc = "\e[" + hex_code(hex, background) + "m"
|
291
|
+
when 3, 4
|
292
|
+
red, green, blue, background = *args
|
293
|
+
esc = "\e[" + rgb_code(red, green, blue, background) + "m"
|
294
|
+
else
|
295
|
+
raise ArgumentError
|
296
|
+
end
|
297
|
+
|
298
|
+
if block_given?
|
299
|
+
return yield.to_s unless $ansi
|
300
|
+
return "#{esc}#{yield}#{ENDCODE}"
|
301
|
+
else
|
302
|
+
return esc
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
#private
|
307
|
+
|
321
308
|
# Creates an xterm-256 color from rgb value.
|
322
309
|
#
|
323
310
|
# @param background [Boolean]
|
324
311
|
# Use `true` for background color, otherwise foreground color.
|
325
312
|
#
|
326
|
-
def
|
327
|
-
"#{background ? 48 : 38};5;#{
|
313
|
+
def rgb_code(red, green, blue, background=false)
|
314
|
+
"#{background ? 48 : 38};5;#{rgb_256(red, green, blue)}"
|
328
315
|
end
|
329
316
|
|
330
|
-
# Creates an xterm-256 color from a CSS-style color string.
|
331
|
-
|
317
|
+
# Creates an xterm-256 color code from a CSS-style color string.
|
318
|
+
#
|
319
|
+
# @param string [String]
|
320
|
+
# Hex string in CSS style, .e.g. `#5FA0C2`.
|
321
|
+
#
|
322
|
+
# @param background [Boolean]
|
323
|
+
# Use `true` for background color, otherwise foreground color.
|
324
|
+
#
|
325
|
+
def hex_code(string, background=false)
|
332
326
|
string.tr!('#','')
|
333
327
|
x = (string.size == 6 ? 2 : 1)
|
334
328
|
r, g, b = [0,1,2].map{ |i| string[i*x,2].to_i(16) }
|
335
|
-
|
329
|
+
rgb_code(r, g, b, background)
|
336
330
|
end
|
337
331
|
|
338
|
-
|
339
|
-
|
340
|
-
#
|
332
|
+
# Given red, green and blue values between 0 and 255, this method
|
333
|
+
# returns the closest XTerm 256 color value.
|
334
|
+
#
|
341
335
|
def rgb_256(r, g, b)
|
342
|
-
|
336
|
+
# TODO: what was rgb_valid for?
|
337
|
+
#r, g, b = [r, g, b].map{ |c| rgb_valid(c); (6 * (c.to_f / 256.0)).to_i }
|
338
|
+
r, g, b = [r, g, b].map{ |c| (6 * (c.to_f / 256.0)).to_i }
|
343
339
|
v = (r * 36 + g * 6 + b + 16).abs
|
344
|
-
raise ArgumentError, "RGB value outside 0-255 range" if v > 255
|
340
|
+
raise ArgumentError, "RGB value is outside 0-255 range -- #{v}" if v > 255
|
345
341
|
v
|
346
342
|
end
|
347
343
|
|