ansi 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.ruby +43 -38
- data/.yardopts +9 -0
- data/HISTORY.rdoc +26 -10
- data/LICENSE.rdoc +450 -0
- data/NOTICE.rdoc +36 -10
- data/QED.rdoc +398 -0
- data/README.rdoc +8 -6
- data/lib/ansi.rb +1 -16
- data/lib/ansi.yml +43 -38
- data/lib/ansi/chart.rb +2 -0
- data/lib/ansi/code.rb +8 -1
- data/lib/ansi/hexdump.rb +122 -0
- data/lib/ansi/table.rb +34 -19
- data/lib/ansi/version.rb +16 -0
- data/test/case_ansicode.rb +1 -0
- data/test/case_bbcode.rb +24 -16
- data/test/case_mixin.rb +1 -0
- data/test/case_progressbar.rb +1 -0
- data/test/test_helper.rb +3 -0
- metadata +65 -64
- data/LICENSE/BSD-2-Clause.txt +0 -25
- data/LICENSE/GPL-2.0.txt +0 -339
- data/LICENSE/MIT.txt +0 -21
- data/LICENSE/RUBY.txt +0 -60
data/README.rdoc
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
= ANSI
|
2
2
|
|
3
|
+
{Home}[http://rubyworks.github.com/ansi] |
|
4
|
+
{API}[http://rubydoc.info/gems/ansi/frames] |
|
5
|
+
{Code}[http://github.com/rubyworks/ansi] |
|
6
|
+
{Mail}[http://googlegroups.com/group/rubyworks-mailinglist]
|
7
|
+
|
8
|
+
{<img src="http://travis-ci.org/rubyworks/ansi.png" />}[http://travis-ci.org/rubyworks/ansi]
|
9
|
+
|
10
|
+
|
3
11
|
== DESCRIPTION
|
4
12
|
|
5
13
|
The ANSI project is a collection of ANSI escape code related libraries
|
@@ -21,12 +29,6 @@ device.
|
|
21
29
|
* Very Good coverage of standard ANSI codes.
|
22
30
|
|
23
31
|
|
24
|
-
== RESOURCES
|
25
|
-
|
26
|
-
* home: http://rubyworks.github.com/ansi
|
27
|
-
* code: http://github.com/rubyworks/ansi
|
28
|
-
|
29
|
-
|
30
32
|
== RELEASE NOTES
|
31
33
|
|
32
34
|
Please see HISTORY file.
|
data/lib/ansi.rb
CHANGED
@@ -1,19 +1,4 @@
|
|
1
|
-
|
2
|
-
module ANSI
|
3
|
-
# Returns Hash table of project metadata.
|
4
|
-
def self.meta
|
5
|
-
@spec ||= (
|
6
|
-
require 'yaml'
|
7
|
-
YAML.load(File.new(File.dirname(__FILE__) + '/ansi.yml'))
|
8
|
-
)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Check metadata for missing constants.
|
12
|
-
def self.const_missing(name)
|
13
|
-
meta[name.to_s.downcase] || super(name)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
1
|
+
require 'ansi/version'
|
17
2
|
require 'ansi/core'
|
18
3
|
require 'ansi/code'
|
19
4
|
require 'ansi/bbcode'
|
data/lib/ansi.yml
CHANGED
@@ -1,47 +1,52 @@
|
|
1
|
-
---
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
-
|
9
|
-
|
10
|
-
|
1
|
+
---
|
2
|
+
source:
|
3
|
+
- meta
|
4
|
+
authors:
|
5
|
+
- name: Thomas Sawyer
|
6
|
+
- name: Florian Frank
|
7
|
+
copyrights:
|
8
|
+
- holder: Rubyworks
|
9
|
+
year: '2009'
|
10
|
+
replacements: []
|
11
|
+
alternatives: []
|
12
|
+
requirements:
|
11
13
|
- name: detroit
|
12
|
-
|
13
|
-
group:
|
14
|
+
groups:
|
14
15
|
- build
|
16
|
+
development: true
|
15
17
|
- name: qed
|
16
|
-
|
17
|
-
group:
|
18
|
+
groups:
|
18
19
|
- test
|
20
|
+
development: true
|
19
21
|
- name: lemon
|
20
|
-
|
21
|
-
group:
|
22
|
+
groups:
|
22
23
|
- test
|
24
|
+
development: true
|
25
|
+
dependencies: []
|
23
26
|
conflicts: []
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
organization: RubyWorks
|
30
|
-
contact: rubyworks-mailinglist@googlegroups.com
|
31
|
-
created: 2004-08-01
|
32
|
-
copyright: Copyright (c) 2009 Thomas Sawyer
|
33
|
-
licenses:
|
34
|
-
- Apache 2.0
|
35
|
-
authors:
|
36
|
-
- Thomas Sawyer
|
37
|
-
- Florian Frank
|
38
|
-
maintainers: []
|
39
|
-
|
40
|
-
resources:
|
27
|
+
repositories:
|
28
|
+
- uri: git://github.com/rubyworks/ansi.git
|
29
|
+
scm: git
|
30
|
+
name: upstream
|
31
|
+
resources:
|
41
32
|
home: http://rubyworks.github.com/ansi
|
42
|
-
|
43
|
-
|
33
|
+
code: http://github.com/rubyworks/ansi
|
34
|
+
docs: http://rubydoc.info/gems/ansi
|
44
35
|
mail: http://groups.google.com/group/rubyworks-mailinglist
|
45
|
-
|
46
|
-
|
47
|
-
|
36
|
+
extra: {}
|
37
|
+
load_path:
|
38
|
+
- lib
|
39
|
+
revision: 0
|
40
|
+
created: '2009-08-01'
|
41
|
+
summary: ANSI at your fingertips!
|
42
|
+
title: ANSI
|
43
|
+
version: 1.4.0
|
44
|
+
name: ansi
|
45
|
+
description: ! 'The ANSI project is a collection of ANSI escape code related libraries
|
46
|
+
enabling
|
47
|
+
|
48
|
+
ANSI code based colorization and stylization of output. It is very nice for
|
49
|
+
|
50
|
+
beautifying shell output.'
|
51
|
+
organization: Rubyworks
|
52
|
+
date: '2011-11-05'
|
data/lib/ansi/chart.rb
CHANGED
data/lib/ansi/code.rb
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
module ANSI
|
2
2
|
|
3
|
-
|
3
|
+
if RUBY_PLATFORM =~ /(win32|w32)/
|
4
|
+
begin
|
5
|
+
require 'Win32/Console/ANSI'
|
6
|
+
rescue
|
7
|
+
warn "ansi: 'gem install win32console' to use color on Windows"
|
8
|
+
$ansi = false
|
9
|
+
end
|
10
|
+
end
|
4
11
|
|
5
12
|
require 'ansi/constants'
|
6
13
|
|
data/lib/ansi/hexdump.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
module ANSI
|
2
|
+
|
3
|
+
require 'ansi/code'
|
4
|
+
|
5
|
+
# TODO: split dump method into two parts, the first should create a hex table
|
6
|
+
# then the second, #dump method, will print it out.
|
7
|
+
|
8
|
+
# Create a colorized hex dump of byte string.
|
9
|
+
#
|
10
|
+
# Output looks something like the following, but colorized.
|
11
|
+
#
|
12
|
+
# 000352c0: ed 33 8c 85 6e cc f6 f7 72 79 1c e3 3a b4 c2 c6 |.3..n...ry..:...|
|
13
|
+
# 000352d0: c8 8d d6 ee 3e 68 a1 a5 ae b2 b7 97 a4 1d 5f a7 |....>h........_.|
|
14
|
+
# 000352e0: d8 7d 28 db f6 8a e7 8a 7b 8d 0b bd 35 7d 25 3c |.}(.....{...5}%<|
|
15
|
+
# 000352f0: 8b 3c c8 9d ec 04 85 54 92 a0 f7 a8 ed cf 05 7d |.<.....T.......}|
|
16
|
+
# 00035300: b5 e3 9e 35 f0 79 9f 51 74 e3 60 ee 0f 03 8e 3f |...5.y.Qt.`....?|
|
17
|
+
# 00035310: 05 5b 91 87 e6 48 48 ee a3 77 ae ad 5e 2a 56 a2 |.[...HH..w..^*V.|
|
18
|
+
# 00035320: b6 96 86 f3 3c 92 b3 c8 62 4a 6f 96 10 5c 9c bb |....<...bJo..\..|
|
19
|
+
#
|
20
|
+
# In the future, we will make the colorization more customizable and
|
21
|
+
# allow the groupings to be selectable at 2, 4, 8 or 16.
|
22
|
+
#
|
23
|
+
class HexDump
|
24
|
+
|
25
|
+
# Printable ASCII codes.
|
26
|
+
ASCII_PRINTABLE = (33..126)
|
27
|
+
|
28
|
+
#
|
29
|
+
def initialize(options={})
|
30
|
+
@offset = 0
|
31
|
+
|
32
|
+
options.each do |k,v|
|
33
|
+
__send__("#{k}=", v)
|
34
|
+
end
|
35
|
+
|
36
|
+
@color = true if color.nil?
|
37
|
+
end
|
38
|
+
|
39
|
+
# Use color?
|
40
|
+
attr_accessor :color
|
41
|
+
|
42
|
+
# Show index?
|
43
|
+
attr_accessor :index
|
44
|
+
|
45
|
+
# Offset byte count.
|
46
|
+
attr_accessor :offset
|
47
|
+
|
48
|
+
# Dump data string as colorized hex table.
|
49
|
+
#
|
50
|
+
# @param data [String]
|
51
|
+
# String to convert to hex and display.
|
52
|
+
#
|
53
|
+
def dump(data)
|
54
|
+
lines = data.to_s.scan(/.{1,16}/m)
|
55
|
+
max_offset = (offset + data.size) / 256 #16 * 16
|
56
|
+
max_offset_width = max_offset.to_s.size + 1
|
57
|
+
max_hex_width = 49 #3 * 16 + 1
|
58
|
+
|
59
|
+
out = template()
|
60
|
+
off = offset()
|
61
|
+
|
62
|
+
if index?
|
63
|
+
puts((' ' * max_offset_width) + " 0 1 2 3 4 5 6 7 8 9 A B C D E F\n")
|
64
|
+
end
|
65
|
+
|
66
|
+
lines.each_with_index do |line, n|
|
67
|
+
offset = off + n * 16
|
68
|
+
bytes = line.unpack("C*")
|
69
|
+
hex = bytes.map{ |c| "%0.2x" % c }.insert(8, '').join(' ')
|
70
|
+
|
71
|
+
plain = bytes.map do |c|
|
72
|
+
if ASCII_PRINTABLE.include?(c)
|
73
|
+
c = c.chr
|
74
|
+
else
|
75
|
+
color ? Code::WHITE + Code::STRIKE + '.' + Code::CLEAR : '.'
|
76
|
+
end
|
77
|
+
end.join('')
|
78
|
+
|
79
|
+
fill = [offset.to_s.rjust(max_offset_width), hex.ljust(max_hex_width), plain]
|
80
|
+
|
81
|
+
puts(out % fill)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Hex dump a random string.
|
86
|
+
#
|
87
|
+
def dump_random(size=64)
|
88
|
+
data = (0..size).map{ rand(255).chr }.join('')
|
89
|
+
dump(data)
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
def index?
|
94
|
+
@index
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
# Hex dump line template.
|
100
|
+
#
|
101
|
+
# @return [String] hex dump line template
|
102
|
+
def template
|
103
|
+
if color
|
104
|
+
Code::CYAN +
|
105
|
+
"%s: " +
|
106
|
+
Code::YELLOW +
|
107
|
+
"%s " +
|
108
|
+
Code::BLUE +
|
109
|
+
"|" +
|
110
|
+
Code::CLEAR +
|
111
|
+
"%s" +
|
112
|
+
Code::BLUE +
|
113
|
+
"|" +
|
114
|
+
Code::CLEAR
|
115
|
+
else
|
116
|
+
"%s: %s |%s|"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
data/lib/ansi/table.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'ansi'
|
1
|
+
require 'ansi/core'
|
2
2
|
require 'ansi/terminal'
|
3
3
|
|
4
4
|
module ANSI
|
@@ -70,7 +70,8 @@ module ANSI
|
|
70
70
|
body_row = []
|
71
71
|
row.each_with_index do |cell, c|
|
72
72
|
t = cell_template(max[c])
|
73
|
-
|
73
|
+
s = t % cell.to_s
|
74
|
+
body_row << apply_format(s, cell, c, r)
|
74
75
|
end
|
75
76
|
body << "| " + body_row.join(' | ') + " |"
|
76
77
|
end
|
@@ -84,7 +85,7 @@ module ANSI
|
|
84
85
|
"#{top}\n#{body}\n#{bot}\n"
|
85
86
|
end
|
86
87
|
|
87
|
-
|
88
|
+
private
|
88
89
|
|
89
90
|
# TODO: look at the lines and figure out how many columns will fit
|
90
91
|
def fit_width
|
@@ -92,12 +93,15 @@ module ANSI
|
|
92
93
|
((width.to_f / column_size) - (padding + 3)).to_i
|
93
94
|
end
|
94
95
|
|
96
|
+
# Calculate the maximun column sizes.
|
95
97
|
#
|
98
|
+
# @return [Array] maximum size for each column
|
96
99
|
def max_columns(fit=false)
|
97
100
|
max = Array.new(column_size, 0)
|
98
101
|
table.each do |row|
|
99
102
|
row.each_with_index do |col, index|
|
100
103
|
col = col.to_s
|
104
|
+
col = col.unansi
|
101
105
|
if fit
|
102
106
|
max[index] = [max[index], col.size, fit_width].max
|
103
107
|
else
|
@@ -108,7 +112,9 @@ module ANSI
|
|
108
112
|
max
|
109
113
|
end
|
110
114
|
|
111
|
-
# Number of columns.
|
115
|
+
# Number of columns based on the first row of table.
|
116
|
+
#
|
117
|
+
# @return [Integer] number of columns
|
112
118
|
def column_size
|
113
119
|
table.first.size
|
114
120
|
end
|
@@ -123,6 +129,30 @@ module ANSI
|
|
123
129
|
end
|
124
130
|
end
|
125
131
|
|
132
|
+
# TODO: make more efficient
|
133
|
+
def dividing_line
|
134
|
+
tmp = max_columns(fit).map{ |m| "%#{m}s" }.join(" | ")
|
135
|
+
tmp = "| #{tmp} |"
|
136
|
+
lin = (tmp % (['-'] * column_size)).gsub(/[^\|]/, '-').gsub('|', '+')
|
137
|
+
end
|
138
|
+
|
139
|
+
#def dividing_line_top
|
140
|
+
# dividing_line.gsub('+', '.')
|
141
|
+
#end
|
142
|
+
|
143
|
+
#def dividing_line_bottom
|
144
|
+
# dividing_line.gsub('+', "'")
|
145
|
+
#end
|
146
|
+
|
147
|
+
#
|
148
|
+
def apply_format(str, cell, col, row)
|
149
|
+
if @format
|
150
|
+
str.ansi(*ansi_formating(cell, col, row))
|
151
|
+
else
|
152
|
+
str
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
126
156
|
#
|
127
157
|
def ansi_formating(cell, col, row)
|
128
158
|
if @format
|
@@ -142,21 +172,6 @@ module ANSI
|
|
142
172
|
[f].flatten.compact
|
143
173
|
end
|
144
174
|
|
145
|
-
# TODO: make more efficient
|
146
|
-
def dividing_line
|
147
|
-
tmp = max_columns(fit).map{ |m| "%#{m}s" }.join(" | ")
|
148
|
-
tmp = "| #{tmp} |"
|
149
|
-
lin = (tmp % (['-'] * column_size)).gsub(/[^\|]/, '-').gsub('|', '+')
|
150
|
-
end
|
151
|
-
|
152
|
-
#def dividing_line_top
|
153
|
-
# dividing_line.gsub('+', '.')
|
154
|
-
#end
|
155
|
-
|
156
|
-
#def dividing_line_bottom
|
157
|
-
# dividing_line.gsub('+', "'")
|
158
|
-
#end
|
159
|
-
|
160
175
|
end
|
161
176
|
|
162
177
|
end
|
data/lib/ansi/version.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# ANSI module contains all the ANSI related classes.
|
2
|
+
module ANSI
|
3
|
+
# Returns Hash table of project metadata.
|
4
|
+
def self.meta
|
5
|
+
@spec ||= (
|
6
|
+
require 'yaml'
|
7
|
+
YAML.load(File.new(File.dirname(__FILE__) + '/../ansi.yml'))
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Check metadata for missing constants.
|
12
|
+
def self.const_missing(name)
|
13
|
+
meta[name.to_s.downcase] || super(name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
data/test/case_ansicode.rb
CHANGED
data/test/case_bbcode.rb
CHANGED
@@ -1,27 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
1
2
|
require 'ansi/bbcode'
|
2
3
|
|
3
4
|
testcase ANSI::BBCode do
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
class_method :bbcode_to_ansi do
|
7
|
+
test do
|
8
|
+
str = "this is [COLOR=red]red[/COLOR], this is [B]bold[/B]"
|
9
|
+
out = "this is \e[0;31mred\e[0m, this is \e[1mbold\e[0m\n"
|
10
|
+
out.assert == ANSI::BBCode.bbcode_to_ansi(str)
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
class_method :bbcode_to_html do
|
15
|
+
test do
|
16
|
+
str = "this is [COLOR=red]red[/COLOR], this is [B]bold[/B]"
|
17
|
+
out = "this is <font color=\"red\">red</font>, this is <strong>bold</strong><br />\n"
|
18
|
+
out.assert == ANSI::BBCode.bbcode_to_html(str)
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
class_method :ansi_to_html do
|
23
|
+
test do
|
24
|
+
str = "this is \e[0;31mred\e[0m, this is \e[1mbold\e[0m\n" +
|
25
|
+
"this is a line without any ansi code\n" +
|
26
|
+
"this is \e[0;31mred\e[0m, this is \e[1mbold\e[0m\n"
|
27
|
+
out = "this is <font color=\"red\">red</font>, this is <strong>bold</strong><br />\n" +
|
28
|
+
"this is a line without any ansi code<br />\n" +
|
29
|
+
"this is <font color=\"red\">red</font>, this is <strong>bold</strong><br />\n"
|
30
|
+
out.assert == ANSI::BBCode.ansi_to_html(str)
|
31
|
+
end
|
25
32
|
end
|
26
33
|
|
27
34
|
end
|
35
|
+
|