epitools 0.3.0 → 0.3.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{epitools}
8
- s.version = "0.3.0"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["epitron"]
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  "lib/epitools/browser.rb",
29
29
  "lib/epitools/browser/browser_cache.rb",
30
30
  "lib/epitools/browser/mechanize_progressbar.rb",
31
+ "lib/epitools/colored.rb",
31
32
  "lib/epitools/hexdump.rb",
32
33
  "lib/epitools/highlight.rb",
33
34
  "lib/epitools/http.rb",
@@ -0,0 +1,224 @@
1
+ require 'Win32/Console/ANSI' if RUBY_PLATFORM =~ /win32/
2
+ require 'set'
3
+
4
+ ##
5
+ # cute.
6
+ #
7
+ # >> "this is red".red
8
+ #
9
+ # >> "this is red with a blue background (read: ugly)".red_on_blue
10
+ #
11
+ # >> "this is red with an underline".red.underline
12
+ #
13
+ # >> "this is really bold and really blue".bold.blue
14
+ #
15
+ # >> Colored.red "This is red" # but this part is mostly untested
16
+ module Colored
17
+ extend self
18
+
19
+ ###########################################################################
20
+
21
+ @@is_tty = STDOUT.isatty
22
+
23
+ COLORS = {
24
+ 'black' => 30,
25
+ 'red' => 31,
26
+ 'green' => 32,
27
+ 'yellow' => 33,
28
+ 'blue' => 34,
29
+ 'magenta' => 35,
30
+ 'cyan' => 36,
31
+ 'white' => 37
32
+ }
33
+
34
+ EXTRAS = {
35
+ 'clear' => 0,
36
+ 'bold' => 1,
37
+ 'light' => 1,
38
+ 'underline' => 4,
39
+ 'reversed' => 7
40
+ }
41
+
42
+ #
43
+ # BBS-style numeric color codes.
44
+ #
45
+ BBS_COLOR_TABLE = {
46
+ 0 => :black,
47
+ 1 => :blue,
48
+ 2 => :green,
49
+ 3 => :cyan,
50
+ 4 => :red,
51
+ 5 => :magenta,
52
+ 6 => :yellow,
53
+ 7 => :white,
54
+ 8 => :light_black,
55
+ 9 => :light_blue,
56
+ 10 => :light_green,
57
+ 11 => :light_cyan,
58
+ 12 => :light_red,
59
+ 13 => :light_magenta,
60
+ 14 => :light_yellow,
61
+ 15 => :light_white,
62
+ }
63
+
64
+ VALID_COLORS = Set.new(
65
+ COLORS.keys +
66
+ COLORS.map { |k,v| "light_#{k}" } +
67
+ COLORS.map { |k,v| "bold_#{k}" }
68
+ )
69
+
70
+ ###########################################################################
71
+
72
+ COLORS.each do |color, value|
73
+ define_method(color) do
74
+ colorize(self, :foreground => color)
75
+ end
76
+
77
+ define_method("on_#{color}") do
78
+ colorize(self, :background => color)
79
+ end
80
+
81
+ define_method("light_#{color}") do
82
+ colorize(self, :foreground => color, :extra => 'bold')
83
+ end
84
+
85
+ COLORS.each do |highlight, value|
86
+ next if color == highlight
87
+ define_method("#{color}_on_#{highlight}") do
88
+ colorize(self, :foreground => color, :background => highlight)
89
+ end
90
+ end
91
+ end
92
+
93
+ EXTRAS.each do |extra, value|
94
+ next if extra == 'clear'
95
+ define_method(extra) do
96
+ colorize(self, :extra => extra)
97
+ end
98
+ end
99
+
100
+ define_method(:to_eol) do
101
+ tmp = sub(/^(\e\[[\[\e0-9;m]+m)/, "\\1\e[2K")
102
+ if tmp == self
103
+ return "\e[2K" << self
104
+ end
105
+ tmp
106
+ end
107
+
108
+ ###########################################################################
109
+
110
+ def colorize(string=nil, options = {})
111
+ if string == nil
112
+ return tagged_colors(self)
113
+ end
114
+
115
+ if @@is_tty
116
+ colored = [color(options[:foreground]), color("on_#{options[:background]}"), extra(options[:extra])].compact * ''
117
+ colored << string
118
+ colored << extra(:clear)
119
+ else
120
+ string
121
+ end
122
+ end
123
+
124
+ def colors
125
+ @@colors ||= COLORS.keys.sort
126
+ end
127
+
128
+ def extra(extra_name)
129
+ extra_name = extra_name.to_s
130
+ "\e[#{EXTRAS[extra_name]}m" if EXTRAS[extra_name]
131
+ end
132
+
133
+ def color(color_name)
134
+ background = color_name.to_s =~ /on_/
135
+ color_name = color_name.to_s.sub('on_', '')
136
+ return unless color_name && COLORS[color_name]
137
+ "\e[#{COLORS[color_name] + (background ? 10 : 0)}m"
138
+ end
139
+
140
+ ###########################################################################
141
+
142
+ def enable!
143
+ @@is_tty = true
144
+ end
145
+
146
+ alias_method :force!, :enable!
147
+
148
+ def disable!
149
+ @@is_tty = false
150
+ end
151
+
152
+ def is_tty?
153
+ @@is_tty
154
+ end
155
+
156
+ #
157
+ # Is this string legal?
158
+ #
159
+ def valid_tag?(tag)
160
+ VALID_COLORS.include?(tag) or
161
+ (
162
+ string =~ /^\d+$/ and
163
+ BBS_COLOR_TABLE.include?(tag.to_i)
164
+ )
165
+ end
166
+
167
+ #
168
+ # Colorize a string that has "color tags".
169
+ #
170
+ # Examples:
171
+ #
172
+ # Colors as words:
173
+ # puts "<light_yellow><light_white>*</light_white> Hey mom! I am <light_green>SO</light_green> colourized right now.</light_yellow>".colorize
174
+ #
175
+ # Numeric ANSI colors (from the BBS days):
176
+ # puts "<10><5>*</5> Hey mom! I am <9>SO</9> colourized right now.</10>".colorize
177
+ #
178
+ def tagged_colors(string)
179
+ stack = []
180
+
181
+ # split the string into tags and literal strings
182
+ tokens = string.split(/(<\/?[\w\d_]+>)/)
183
+ tokens.delete_if { |token| token.size == 0 }
184
+
185
+ result = ""
186
+
187
+ tokens.each do |token|
188
+
189
+ # token is an opening tag!
190
+
191
+ if /<([\w\d_]+)>/ =~ token and valid_tag?($1)
192
+ stack.push $1
193
+
194
+ # token is a closing tag!
195
+
196
+ elsif /<\/([\w\d_]+)>/ =~ token and valid_tag?($1)
197
+
198
+ # if this color is on the stack somwehere...
199
+ if pos = stack.rindex($1)
200
+ # close the tag by removing it from the stack
201
+ stack.delete_at pos
202
+ else
203
+ raise "Error: tried to close an unopened color tag -- #{token}"
204
+ end
205
+
206
+ # token is a literal string!
207
+
208
+ else
209
+
210
+ color = (stack.last || "white")
211
+ color = BBS_COLOR_TABLE[color.to_i] if color =~ /^\d+$/
212
+ result << token.send(color)
213
+
214
+ end
215
+
216
+ end
217
+
218
+ result
219
+ end
220
+
221
+
222
+ end unless Object.const_defined? :Colored
223
+
224
+ String.send(:include, Colored)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 0
9
- version: 0.3.0
8
+ - 1
9
+ version: 0.3.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - epitron
@@ -81,6 +81,7 @@ files:
81
81
  - lib/epitools/browser.rb
82
82
  - lib/epitools/browser/browser_cache.rb
83
83
  - lib/epitools/browser/mechanize_progressbar.rb
84
+ - lib/epitools/colored.rb
84
85
  - lib/epitools/hexdump.rb
85
86
  - lib/epitools/highlight.rb
86
87
  - lib/epitools/http.rb