ansi-sys 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +7 -0
- data/History.txt +3 -0
- data/lib/ansisys.rb +91 -24
- data/website/index.html +7 -7
- data/website/index.txt +5 -5
- data/website/stylesheets/screen.css +15 -15
- metadata +3 -3
data/ChangeLog
CHANGED
data/History.txt
CHANGED
data/lib/ansisys.rb
CHANGED
@@ -11,13 +11,14 @@ require 'webrick'
|
|
11
11
|
module AnsiSys
|
12
12
|
module VERSION #:nodoc:
|
13
13
|
MAJOR = 0
|
14
|
-
MINOR =
|
15
|
-
TINY =
|
14
|
+
MINOR = 5
|
15
|
+
TINY = 0
|
16
16
|
|
17
17
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
18
18
|
end
|
19
19
|
|
20
20
|
module CSSFormatter
|
21
|
+
# make a CSS style-let from a Hash of CSS settings
|
21
22
|
def hash_to_styles(hash, separator = '; ')
|
22
23
|
unless hash.empty?
|
23
24
|
return hash.map{|e| "#{e[0]}: #{e[1].join(' ')}"}.join(separator)
|
@@ -40,16 +41,19 @@ module AnsiSys
|
|
40
41
|
|
41
42
|
attr_reader :buffer
|
42
43
|
|
44
|
+
# _csis_ is an Array of Code Sequence Introducers
|
45
|
+
# which can be \e[, \x9B, or both
|
43
46
|
def initialize(csis = ["\x1b["]) # CSI can also be "\x9B"
|
44
47
|
@code_start_re = Regexp.union(*(CODE_EQUIVALENT.keys + csis))
|
45
48
|
@buffer = ''
|
46
49
|
end
|
47
50
|
|
51
|
+
# add the String (clear text with some or no escape sequences) to buffer
|
48
52
|
def push(string)
|
49
53
|
@buffer += string
|
50
54
|
end
|
51
55
|
|
52
|
-
# returns array of tokens while deleting the tokenized part
|
56
|
+
# returns array of tokens while deleting the tokenized part from buffer
|
53
57
|
def lex!
|
54
58
|
r = Array.new
|
55
59
|
@buffer.gsub!(/(?:\r\n|\n\r)/, "\n")
|
@@ -79,19 +83,21 @@ module AnsiSys
|
|
79
83
|
end
|
80
84
|
|
81
85
|
class Characters
|
86
|
+
# widths of characters
|
82
87
|
WIDTHS = {
|
83
88
|
"\t" => 8,
|
84
89
|
}
|
85
90
|
|
86
|
-
attr_reader :string
|
87
|
-
attr_reader :sgr
|
88
|
-
attr_reader :initial_cursor
|
91
|
+
attr_reader :string # clear text
|
92
|
+
attr_reader :sgr # Select Graphic Rendition associated with the text
|
89
93
|
|
90
94
|
def initialize(string, sgr)
|
91
95
|
@string = string
|
92
96
|
@sgr = sgr
|
93
97
|
end
|
94
98
|
|
99
|
+
# echo the string onto the _screen_ with initial cursor as _cursor_
|
100
|
+
# _cursor_ position will be changed as the string is echoed
|
95
101
|
def echo_on(screen, cursor)
|
96
102
|
each_char do |c|
|
97
103
|
w = width(c)
|
@@ -102,12 +108,14 @@ module AnsiSys
|
|
102
108
|
end
|
103
109
|
|
104
110
|
private
|
111
|
+
# iterator on each character
|
105
112
|
def each_char(&block)
|
106
113
|
@string.scan(/./).each do |c|
|
107
114
|
yield(c)
|
108
115
|
end
|
109
116
|
end
|
110
117
|
|
118
|
+
# width of a character
|
111
119
|
def width(char)
|
112
120
|
if WIDTHS.has_key?(char)
|
113
121
|
return WIDTHS[char]
|
@@ -122,12 +130,13 @@ module AnsiSys
|
|
122
130
|
end
|
123
131
|
|
124
132
|
class Cursor
|
133
|
+
# Escape sequence codes processed in this Class
|
125
134
|
CODE_LETTERS = %w(A B C D E F G H f)
|
126
135
|
|
127
|
-
attr_reader :cur_col
|
128
|
-
attr_reader :cur_row
|
129
|
-
attr_accessor :max_col
|
130
|
-
attr_accessor :max_row
|
136
|
+
attr_reader :cur_col # current column number (1-)
|
137
|
+
attr_reader :cur_row # current row number (1-)
|
138
|
+
attr_accessor :max_col # maximum column number
|
139
|
+
attr_accessor :max_row # maximum row number
|
131
140
|
|
132
141
|
def initialize(cur_col = 1, cur_row = 1, max_col = 80, max_row = 25)
|
133
142
|
@cur_col = cur_col
|
@@ -136,6 +145,8 @@ module AnsiSys
|
|
136
145
|
@max_row = max_row
|
137
146
|
end
|
138
147
|
|
148
|
+
# applies self an escape sequence code that ends with _letter_ as String
|
149
|
+
# and with some _pars_ as Integers
|
139
150
|
def apply_code!(letter, *pars)
|
140
151
|
case letter
|
141
152
|
when 'A'
|
@@ -178,6 +189,7 @@ module AnsiSys
|
|
178
189
|
return self
|
179
190
|
end
|
180
191
|
|
192
|
+
# changes current location for a character with _width_ to be echoed
|
181
193
|
def advance!(width = 1)
|
182
194
|
r = nil
|
183
195
|
@cur_col += width
|
@@ -195,21 +207,38 @@ module AnsiSys
|
|
195
207
|
class SGR
|
196
208
|
extend CSSFormatter
|
197
209
|
|
210
|
+
# Escape sequence codes processed in this Class
|
198
211
|
CODE_LETTERS = %w(m)
|
199
212
|
|
200
|
-
|
201
|
-
attr_reader :
|
202
|
-
|
203
|
-
|
204
|
-
attr_reader :
|
205
|
-
|
206
|
-
|
207
|
-
attr_reader :
|
213
|
+
# :normal, :bold, or :faint
|
214
|
+
attr_reader :intensity
|
215
|
+
|
216
|
+
# :off or :on
|
217
|
+
attr_reader :italic
|
218
|
+
|
219
|
+
# :none, :single, or :double
|
220
|
+
attr_reader :underline
|
221
|
+
|
222
|
+
# :off, :slow, or :rapid
|
223
|
+
attr_reader :blink
|
224
|
+
|
225
|
+
# :positive or :negative
|
226
|
+
attr_reader :image
|
227
|
+
|
228
|
+
# :off or :on
|
229
|
+
attr_reader :conceal
|
230
|
+
|
231
|
+
# :black, :red, :green, :yellow, :blue, :magenta, :cyan, or :white
|
232
|
+
attr_reader :foreground
|
233
|
+
|
234
|
+
# :black, :red, :green, :yellow, :blue, :magenta, :cyan, or :white
|
235
|
+
attr_reader :background
|
208
236
|
|
209
237
|
def initialize
|
210
238
|
reset!
|
211
239
|
end
|
212
240
|
|
241
|
+
# true if all the attributes are same
|
213
242
|
def ==(other)
|
214
243
|
instance_variables.each do |ivar|
|
215
244
|
return false unless instance_eval(ivar) == other.instance_eval(ivar)
|
@@ -217,10 +246,13 @@ module AnsiSys
|
|
217
246
|
return true
|
218
247
|
end
|
219
248
|
|
249
|
+
# resets attributes
|
220
250
|
def reset!
|
221
251
|
apply_code!('m', 0)
|
222
252
|
end
|
223
253
|
|
254
|
+
# applies self an escape sequence code that ends with _letter_ as String
|
255
|
+
# and with some _pars_ as Integers
|
224
256
|
def apply_code!(letter = 'm', *pars)
|
225
257
|
raise AnsiSysError, "Invalid code for SGR: #{letter.inspect}" unless 'm' == letter
|
226
258
|
pars = [0] unless pars
|
@@ -264,6 +296,8 @@ module AnsiSys
|
|
264
296
|
return self
|
265
297
|
end
|
266
298
|
|
299
|
+
# renders self as :html or :text _format_ - makes a <span> html scriptlet.
|
300
|
+
# _colors_ can be Screen.default_css_colors(_inverted_, _bright_).
|
267
301
|
def render(format = :html, position = :prefix, colors = Screen.default_css_colors)
|
268
302
|
case format
|
269
303
|
when :html
|
@@ -288,10 +322,12 @@ module AnsiSys
|
|
288
322
|
end
|
289
323
|
end
|
290
324
|
|
325
|
+
# CSS stylelet
|
291
326
|
def css_style(colors = Screen.default_css_colors)
|
292
327
|
return CSSFormatter.hash_to_styles(css_styles(colors))
|
293
328
|
end
|
294
329
|
|
330
|
+
# a Hash of CSS stylelet
|
295
331
|
def css_styles(colors = Screen.default_css_colors)
|
296
332
|
r = Hash.new{|h, k| h[k] = Array.new}
|
297
333
|
# intensity is not (yet) implemented
|
@@ -335,7 +371,7 @@ module AnsiSys
|
|
335
371
|
25 => [:blink, :off],
|
336
372
|
27 => [:image, :positive],
|
337
373
|
28 => [:conceal, :off],
|
338
|
-
}
|
374
|
+
} # :nodoc:
|
339
375
|
|
340
376
|
COLOR = {
|
341
377
|
0 => :black,
|
@@ -346,17 +382,18 @@ module AnsiSys
|
|
346
382
|
5 => :magenta,
|
347
383
|
6 => :cyan,
|
348
384
|
7 => :white,
|
349
|
-
}
|
385
|
+
} # :nodoc:
|
350
386
|
|
351
387
|
end
|
352
388
|
|
353
389
|
class Screen
|
354
|
-
|
390
|
+
# Escape sequence codes processed in this Class
|
391
|
+
CODE_LETTERS = %w() # :nodoc:
|
355
392
|
|
356
393
|
def self.default_foreground; :white; end
|
357
394
|
def self.default_background; :black; end
|
358
395
|
|
359
|
-
#
|
396
|
+
# a Hash of color names for each intensity
|
360
397
|
def self.default_css_colors(inverted = false, bright = false)
|
361
398
|
r = {
|
362
399
|
:normal => {
|
@@ -407,6 +444,7 @@ module AnsiSys
|
|
407
444
|
return r
|
408
445
|
end
|
409
446
|
|
447
|
+
# a Hash of CSS stylelet to be used in <head>
|
410
448
|
def self.css_styles(colors = Screen.default_css_colors, max_col = nil, max_row = nil)
|
411
449
|
h = {
|
412
450
|
'color' => [colors[:normal][:white]],
|
@@ -418,12 +456,17 @@ module AnsiSys
|
|
418
456
|
return h
|
419
457
|
end
|
420
458
|
|
459
|
+
# CSS stylelet to be used in <head>
|
421
460
|
def self.css_style(*args)
|
422
461
|
return "pre.screen {\n\t" + CSSFormatter.hash_to_styles(self.css_styles(*args), ";\n\t") + ";\n}\n"
|
423
462
|
end
|
424
463
|
|
464
|
+
# a Hash of keys as rows,
|
465
|
+
# which each value a Hash of keys columns and each value as
|
466
|
+
# an Array of character, its width, and associated SGR
|
425
467
|
attr_reader :lines
|
426
468
|
|
469
|
+
# a Screen
|
427
470
|
def initialize(colors = Screen.default_css_colors, max_col = nil, max_row = nil)
|
428
471
|
@colors = colors
|
429
472
|
@max_col = max_col
|
@@ -431,14 +474,19 @@ module AnsiSys
|
|
431
474
|
@lines = Hash.new{|hash, key| hash[key] = Hash.new}
|
432
475
|
end
|
433
476
|
|
477
|
+
# CSS stylelet to be used in <head>
|
434
478
|
def css_style
|
435
479
|
self.class.css_style(@colors, @max_col, @max_row)
|
436
480
|
end
|
437
481
|
|
482
|
+
# register the _char_ at a specific location on Screen
|
438
483
|
def write(char, char_width, col, row, sgr)
|
439
484
|
@lines[Integer(row)][Integer(col)] = [char, char_width, sgr.dup]
|
440
485
|
end
|
441
486
|
|
487
|
+
# render the characters into :html or :text
|
488
|
+
# Class name in CSS can be specified as _css_class_.
|
489
|
+
# Additional stylelet can be specified as _css_style_.
|
442
490
|
def render(format = :html, css_class = 'screen', css_style = nil)
|
443
491
|
result = case format
|
444
492
|
when :text
|
@@ -490,24 +538,33 @@ module AnsiSys
|
|
490
538
|
return result
|
491
539
|
end
|
492
540
|
|
493
|
-
|
541
|
+
# applies self an escape sequence code that ends with _letter_ as String
|
542
|
+
# and with some _pars_ as Integers
|
543
|
+
def apply_code!(letter, *pars)
|
494
544
|
return self
|
495
|
-
end
|
545
|
+
end # :nodoc:
|
496
546
|
end
|
497
547
|
|
498
548
|
class Terminal
|
549
|
+
# Escape sequence codes processed in this Class
|
499
550
|
CODE_LETTERS = %w(J K S T n s u)
|
500
551
|
|
552
|
+
# _csis_ is an Array of Code Sequence Introducers
|
553
|
+
# which can be \e[, \x9B, or both
|
501
554
|
def initialize(csis = ["\x1b["])
|
502
555
|
@lexer = Lexer.new(csis)
|
503
556
|
@stream = Array.new
|
504
557
|
end
|
505
558
|
|
559
|
+
# echoes _data_, a String of characters or escape sequences
|
560
|
+
# to the Terminal.
|
561
|
+
# This method actually just buffers the echoed data.
|
506
562
|
def echo(data)
|
507
563
|
@lexer.push(data)
|
508
564
|
return self
|
509
565
|
end
|
510
566
|
|
567
|
+
# CSS stylelet to be used in <head>
|
511
568
|
def css_style(format = :html, max_col = 80, max_row = nil, colors = Screen.default_css_colors)
|
512
569
|
case format
|
513
570
|
when :html
|
@@ -517,6 +574,9 @@ module AnsiSys
|
|
517
574
|
end
|
518
575
|
end
|
519
576
|
|
577
|
+
# renders the echoed data as _format_ of :html or :text.
|
578
|
+
# _max_col_, _max_row_ can be specified as Integer.
|
579
|
+
# _colors_ can be Screen.default_css_colors(_inverted_, _bright_).
|
520
580
|
def render(format = :html, max_col = 80, max_row = nil, colors = Screen.default_css_colors, css_class = 'screen', css_style = nil)
|
521
581
|
screens = populate(format, max_col, max_row, colors)
|
522
582
|
separator = case format
|
@@ -528,6 +588,8 @@ module AnsiSys
|
|
528
588
|
return screens.map{|screen| screen.render(format, css_class, css_style)}.join(separator)
|
529
589
|
end
|
530
590
|
|
591
|
+
# applies self an escape sequence code that ends with _letter_ as String
|
592
|
+
# and with some _pars_ as Integers
|
531
593
|
def apply_code!(letter, *pars)
|
532
594
|
case letter
|
533
595
|
when 'J'
|
@@ -628,6 +690,11 @@ module AnsiSys
|
|
628
690
|
end
|
629
691
|
|
630
692
|
if defined?(Hiki) and Hiki::Plugin == self.class
|
693
|
+
# a Hiki plugin method to render a file of text with ANSI escape sequences.
|
694
|
+
# Attached file name should be specified as _file_name_.
|
695
|
+
# _max_row_ can be specified.
|
696
|
+
# _invert_ and _bright_ can be specified to change colors.
|
697
|
+
# _page_ can be specified to show a file attached to another page.
|
631
698
|
def ansi_screen(file_name, max_row = 80, invert = false, bright = true, page = @page)
|
632
699
|
return '' unless file_name =~ /\.(txt|rd|rb|c|pl|py|sh|java|html|htm|css|xml|xsl|sql|yaml)\z/i
|
633
700
|
page_file_name = "#{page.untaint.escape}/#{file_name.untaint.escape}"
|
data/website/index.html
CHANGED
@@ -35,10 +35,7 @@
|
|
35
35
|
<p>Get Version</p>
|
36
36
|
<a href="http://rubyforge.org/projects/ansi-sys" class="numbers">0.4.1</a>
|
37
37
|
</div>
|
38
|
-
<
|
39
|
-
|
40
|
-
|
41
|
-
<h2>What</h2>
|
38
|
+
<h2>What</h2>
|
42
39
|
|
43
40
|
|
44
41
|
<p>MS-DOS console (with <code>DEVICE=ANSI.SYS</code>), Linux
|
@@ -85,9 +82,12 @@ misc/plugin directory and configure Hiki to enable the plugin.</p>
|
|
85
82
|
<p>As a Ruby library:</p>
|
86
83
|
|
87
84
|
|
88
|
-
<pre>
|
85
|
+
<pre>
|
86
|
+
require 'ansisys'
|
87
|
+
terminal = AnsiSys::Terminal.new
|
89
88
|
terminal.echo("ansi-escaped-text")
|
90
|
-
terminal.render #=> HTML fragment
|
89
|
+
terminal.render #=> HTML fragment
|
90
|
+
</pre>
|
91
91
|
|
92
92
|
<p>As a Hiki plugin:</p>
|
93
93
|
|
@@ -110,7 +110,7 @@ terminal.render #=> HTML fragment</pre>
|
|
110
110
|
<p>Please refer
|
111
111
|
<a href="rdoc/files/License_txt.html">License.txt</a></p>
|
112
112
|
<p class="coda">
|
113
|
-
zunda,
|
113
|
+
zunda, 3rd November 2007<br>
|
114
114
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
115
115
|
</p>
|
116
116
|
</div>
|
data/website/index.txt
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
h1. Ruby-ANSI.SYS
|
2
2
|
|
3
|
-
h1. → 'ansi-sys'
|
4
|
-
|
5
|
-
|
6
3
|
h2. What
|
7
4
|
|
8
5
|
MS-DOS console (with <code>DEVICE=ANSI.SYS</code>), Linux
|
@@ -41,9 +38,12 @@ h2. Usage
|
|
41
38
|
|
42
39
|
As a Ruby library:
|
43
40
|
|
44
|
-
<pre>
|
41
|
+
<pre>
|
42
|
+
require 'ansisys'
|
43
|
+
terminal = AnsiSys::Terminal.new
|
45
44
|
terminal.echo("ansi-escaped-text")
|
46
|
-
terminal.render #=> HTML fragment
|
45
|
+
terminal.render #=> HTML fragment
|
46
|
+
</pre>
|
47
47
|
|
48
48
|
As a Hiki plugin:
|
49
49
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
body {
|
2
|
-
background-color: #
|
2
|
+
background-color: #FFB;
|
3
3
|
font-family: "Georgia", sans-serif;
|
4
4
|
line-height: 1.6em;
|
5
5
|
padding: 1.6em 0 0 0;
|
6
|
-
color: #
|
6
|
+
color: #000;
|
7
7
|
}
|
8
8
|
h1, h2, h3, h4, h5, h6 {
|
9
|
-
color: #
|
9
|
+
color: #008;
|
10
10
|
}
|
11
11
|
h1 {
|
12
12
|
font-family: sans-serif;
|
@@ -22,7 +22,7 @@ li {
|
|
22
22
|
list-style-type: square;
|
23
23
|
}
|
24
24
|
a {
|
25
|
-
color: #
|
25
|
+
color: #008;
|
26
26
|
font-weight: normal;
|
27
27
|
text-decoration: underline;
|
28
28
|
}
|
@@ -45,14 +45,14 @@ blockquote {
|
|
45
45
|
|
46
46
|
table {
|
47
47
|
line-height: 1.4em;
|
48
|
-
color: #
|
48
|
+
color: #008;
|
49
49
|
background-color: #111;
|
50
50
|
padding: 2px 10px 2px 10px;
|
51
51
|
border-style: dashed;
|
52
52
|
}
|
53
53
|
|
54
54
|
th {
|
55
|
-
color: #
|
55
|
+
color: #008;
|
56
56
|
}
|
57
57
|
|
58
58
|
td {
|
@@ -75,8 +75,8 @@ pre, code {
|
|
75
75
|
line-height: 1.4em;
|
76
76
|
}
|
77
77
|
pre {
|
78
|
-
color: #
|
79
|
-
background-color: #
|
78
|
+
color: #0F0;
|
79
|
+
background-color: #010;
|
80
80
|
padding: 2px 10px 2px 10px;
|
81
81
|
}
|
82
82
|
.comment { color: #aaa; font-style: italic; }
|
@@ -95,12 +95,12 @@ pre {
|
|
95
95
|
text-align: right;
|
96
96
|
font-family: sans-serif;
|
97
97
|
font-weight: normal;
|
98
|
-
background-color: #
|
99
|
-
color: #
|
98
|
+
background-color: #FFF;
|
99
|
+
color: #008;
|
100
100
|
padding: 15px 20px 10px 20px;
|
101
101
|
margin: 0 auto;
|
102
102
|
margin-top: 15px;
|
103
|
-
border: 3px solid #
|
103
|
+
border: 3px solid #000;
|
104
104
|
}
|
105
105
|
|
106
106
|
#version .numbers {
|
@@ -113,16 +113,16 @@ pre {
|
|
113
113
|
|
114
114
|
#version p {
|
115
115
|
text-decoration: none;
|
116
|
-
color: #
|
117
|
-
background-color: #
|
116
|
+
color: #008;
|
117
|
+
background-color: #FFF;
|
118
118
|
margin: 0;
|
119
119
|
padding: 0;
|
120
120
|
}
|
121
121
|
|
122
122
|
#version a {
|
123
123
|
text-decoration: none;
|
124
|
-
color: #
|
125
|
-
background-color: #
|
124
|
+
color: #008;
|
125
|
+
background-color: #FFF;
|
126
126
|
}
|
127
127
|
|
128
128
|
.clickable {
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: ansi-sys
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.5.0
|
7
|
+
date: 2007-11-03 00:00:00 -10:00
|
8
8
|
summary: Ruby-ANSI.SYS is a library to render texts with ANSI escape sequences.
|
9
9
|
require_paths:
|
10
10
|
- lib
|