ansi-sys 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +188 -0
- data/History.txt +7 -0
- data/License.txt +34 -0
- data/Makefile +56 -0
- data/Manifest.txt +38 -0
- data/README.txt +37 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +70 -0
- data/config/requirements.rb +17 -0
- data/gpl.rd.txt +674 -0
- data/lgpl.rd.txt +512 -0
- data/lib/ansisys.rb +595 -0
- data/log/debug.log +0 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1637 -0
- data/spec/attach/test_data.html +17 -0
- data/spec/attach/test_data.txt +16 -0
- data/spec/character_screen_spec.rb +32 -0
- data/spec/character_spec.rb +45 -0
- data/spec/cursor_spec.rb +165 -0
- data/spec/hiki_spec.rb +39 -0
- data/spec/lexer_spec.rb +95 -0
- data/spec/screen_spec.rb +164 -0
- data/spec/sgr_spec.rb +172 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/terminal_spec.rb +82 -0
- data/tasks/deployment.rake +27 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/website.rake +17 -0
- data/website/index.html +113 -0
- data/website/index.txt +57 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +132 -0
- data/website/template.rhtml +48 -0
- metadata +91 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
<pre class="screen" style="background-color: black; padding: 0.5em; color: white; width: 40.0em">
|
2
|
+
|
3
|
+
As a Hiki plugin
|
4
|
+
<span style="color: fuchsia">- should render an HTML fragment as expected (ERROR - 1)
|
5
|
+
|
6
|
+
</span>1)
|
7
|
+
<span style="color: fuchsia">NoMethodError in 'As a Hiki plugin should render an HTML fragment as expected'
|
8
|
+
undefined method `join' for 114:Fixnum
|
9
|
+
</span>lib/ansisys.rb:23:in `hash_to_styles'
|
10
|
+
./spec/hiki_spec.rb:27:in `map'
|
11
|
+
lib/ansisys.rb:23:in `hash_to_styles'
|
12
|
+
lib/ansisys.rb:589:in `ansi_screen'
|
13
|
+
./spec/hiki_spec.rb:37:
|
14
|
+
|
15
|
+
Finished in 0.158791 seconds
|
16
|
+
|
17
|
+
<span style="color: red">1 example, 1 failure</span></pre>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
As a Hiki plugin
|
3
|
+
[35m- should render an HTML fragment as expected (ERROR - 1)[0m
|
4
|
+
|
5
|
+
1)
|
6
|
+
[35mNoMethodError in 'As a Hiki plugin should render an HTML fragment as expected'
|
7
|
+
undefined method `join' for 114:Fixnum[0m
|
8
|
+
lib/ansisys.rb:23:in `hash_to_styles'
|
9
|
+
./spec/hiki_spec.rb:27:in `map'
|
10
|
+
lib/ansisys.rb:23:in `hash_to_styles'
|
11
|
+
lib/ansisys.rb:589:in `ansi_screen'
|
12
|
+
./spec/hiki_spec.rb:37:
|
13
|
+
|
14
|
+
Finished in 0.158791 seconds
|
15
|
+
|
16
|
+
[31m1 example, 1 failure[0m
|
@@ -0,0 +1,32 @@
|
|
1
|
+
$:.unshift('lib')
|
2
|
+
require 'ansisys'
|
3
|
+
|
4
|
+
unless defined?(:SGR)
|
5
|
+
class SGR
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
include AnsiSys
|
10
|
+
describe "Normal characters echoed on a Screen" do
|
11
|
+
before do
|
12
|
+
@string = "Test string <HELLO>"
|
13
|
+
@char = Characters.new(@string, SGR.new)
|
14
|
+
@screen = Screen.new
|
15
|
+
@cursor = Cursor.new
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should usually be distributed identical string onto screen" do
|
19
|
+
@char.echo_on(@screen, @cursor)
|
20
|
+
@screen.render(:text).should == <<_SCREEN.chomp
|
21
|
+
Test string <HELLO>
|
22
|
+
_SCREEN
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be HTML escaped when rendered as an HTML fragment" do
|
26
|
+
@char.echo_on(@screen, @cursor)
|
27
|
+
@screen.render(:html).should == <<_SCREEN.chomp
|
28
|
+
<pre class="screen">\nTest string <HELLO></pre>
|
29
|
+
_SCREEN
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
$:.unshift('lib')
|
2
|
+
require 'ansisys'
|
3
|
+
|
4
|
+
include AnsiSys
|
5
|
+
# This spec is dependent upon Screen, Cursor, and SGR
|
6
|
+
|
7
|
+
def echo(string, col, row)
|
8
|
+
@screen = Screen.new
|
9
|
+
@char = Characters.new(string, SGR.new)
|
10
|
+
@cursor = Cursor.new(col, row, 80, 25)
|
11
|
+
@char.echo_on(@screen, @cursor)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe Characters, "when rendered at the right edge" do
|
15
|
+
before do
|
16
|
+
echo("Test string <HELLO>", 75, 1)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should fold the string at the right edge" do
|
20
|
+
@cursor.cur_row.should == 2
|
21
|
+
@cursor.cur_col.should == 14
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe Characters, "with Japanese characters" do
|
26
|
+
before do
|
27
|
+
$KCODE = 'u'
|
28
|
+
echo("\346\227\245\346\234\254\350\252\236", 1, 1) # `Nihongo' in UTF-8
|
29
|
+
end
|
30
|
+
|
31
|
+
it "sohuld assume each occupies 2 columns" do
|
32
|
+
@cursor.cur_col.should == 7
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe Characters, "with tab" do
|
37
|
+
before do
|
38
|
+
echo("\t", 1, 1)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "sohuld assume it occupies 8 columns" do
|
42
|
+
@cursor.cur_col.should == 9
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
data/spec/cursor_spec.rb
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
$:.unshift('lib')
|
2
|
+
require 'ansisys'
|
3
|
+
|
4
|
+
include AnsiSys
|
5
|
+
describe Cursor, 'when initialized' do
|
6
|
+
before do
|
7
|
+
@cursor = Cursor.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be at (1,1) on screen" do
|
11
|
+
@cursor.cur_col.should == 1
|
12
|
+
@cursor.cur_row.should == 1
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be in (80,25) screen" do
|
16
|
+
@cursor.max_col.should == 80
|
17
|
+
@cursor.max_row.should == 25
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Cursor, 'when moved normally' do
|
22
|
+
before do
|
23
|
+
@cursor = Cursor.new
|
24
|
+
@cursor.instance_variable_set('@cur_col', 5)
|
25
|
+
@cursor.instance_variable_set('@cur_row', 5)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should move up with code CUU" do
|
29
|
+
lambda{@cursor.apply_code!(%w(A))}.should change(@cursor, :cur_row).by(-1)
|
30
|
+
lambda{@cursor.apply_code!(%w(1 A))}.should change(@cursor, :cur_row).by(-1)
|
31
|
+
lambda{@cursor.apply_code!(%w(2 A))}.should change(@cursor, :cur_row).by(-2)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should move down with code CUD" do
|
35
|
+
lambda{@cursor.apply_code!(%w(B))}.should change(@cursor, :cur_row).by(1)
|
36
|
+
lambda{@cursor.apply_code!(%w(1 B))}.should change(@cursor, :cur_row).by(1)
|
37
|
+
lambda{@cursor.apply_code!(%w(2 B))}.should change(@cursor, :cur_row).by(2)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should move to right with code CUF" do
|
41
|
+
lambda{@cursor.apply_code!(%w(C))}.should change(@cursor, :cur_col).by(1)
|
42
|
+
lambda{@cursor.apply_code!(%w(1 C))}.should change(@cursor, :cur_col).by(1)
|
43
|
+
lambda{@cursor.apply_code!(%w(2 C))}.should change(@cursor, :cur_col).by(2)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should move to left with code CUB" do
|
47
|
+
lambda{@cursor.apply_code!(%w(D))}.should change(@cursor, :cur_col).by(-1)
|
48
|
+
lambda{@cursor.apply_code!(%w(1 D))}.should change(@cursor, :cur_col).by(-1)
|
49
|
+
lambda{@cursor.apply_code!(%w(2 D))}.should change(@cursor, :cur_col).by(-2)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should move to beggining of lower line with CNL" do
|
53
|
+
[[1, %w(E)], [1, %w(1 E)], [2, %w(2 E)]].each do |d, code|
|
54
|
+
lambda{@cursor.apply_code!(code)}.should change(@cursor, :cur_row).by(d)
|
55
|
+
@cursor.cur_col.should == 1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should move to beggining of upper line with CPL" do
|
60
|
+
[[-1, %w(F)], [-1, %w(1 F)], [-2, %w(2 F)]].each do |d, code|
|
61
|
+
lambda{@cursor.apply_code!(code)}.should change(@cursor, :cur_row).by(d)
|
62
|
+
@cursor.cur_col.should == 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should move to specified column with CHA" do
|
67
|
+
[[1, %w(G)], [1, %w(1 G)], [2, %w(2 G)]].each do |c, code|
|
68
|
+
lambda{@cursor.apply_code!(code)}.should_not change(@cursor, :cur_row)
|
69
|
+
@cursor.cur_col.should == c
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should move to specified position with CUP and HVP" do
|
74
|
+
%w(H f).each do |letter|
|
75
|
+
[
|
76
|
+
# row, column, code
|
77
|
+
[1, 5, [nil, '5']],
|
78
|
+
[1, 5, ['', '5']],
|
79
|
+
[1, 5, ['1', '5']],
|
80
|
+
[17, 1, ['17', nil]],
|
81
|
+
[17, 1, ['17', '']],
|
82
|
+
[17, 1, ['17', '1']],
|
83
|
+
[9, 8, ['9', '8']],
|
84
|
+
].each do |r, c, code|
|
85
|
+
@cursor.apply_code!(code + [letter])
|
86
|
+
@cursor.cur_col.should == c
|
87
|
+
@cursor.cur_row.should == r
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
describe Cursor, 'when tried to be moved beyond edge' do
|
95
|
+
before do
|
96
|
+
@cursor = Cursor.new
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should not move with code CUU" do
|
100
|
+
@cursor.instance_variable_set('@cur_row', 1)
|
101
|
+
lambda{@cursor.apply_code!(%w(1 A))}.should_not change(@cursor, :cur_row)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should not move with code CUD" do
|
105
|
+
@cursor.instance_variable_set('@cur_row', @cursor.max_row)
|
106
|
+
lambda{@cursor.apply_code!(%w(1 B))}.should_not change(@cursor, :cur_row)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should not move with code CUF" do
|
110
|
+
@cursor.instance_variable_set('@cur_col', @cursor.max_col)
|
111
|
+
lambda{@cursor.apply_code!(%w(1 C))}.should_not change(@cursor, :cur_col)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should not move with code CUB" do
|
115
|
+
@cursor.instance_variable_set('@cur_col', 1)
|
116
|
+
lambda{@cursor.apply_code!(%w(1 D))}.should_not change(@cursor, :cur_col)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should make screen longer with code CNL" do
|
120
|
+
@cursor.instance_variable_set('@cur_row', @cursor.max_row)
|
121
|
+
lambda{@cursor.apply_code!(%w(1 E))}.should change(@cursor, :max_row).by(1)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should not change row with code CNL" do
|
125
|
+
@cursor.instance_variable_set('@cur_row', 1)
|
126
|
+
lambda{@cursor.apply_code!(%w(1 F))}.should_not change(@cursor, :cur_row)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should move to edge column with code CHA" do
|
130
|
+
lambda{@cursor.apply_code!(%w(99 G))}.should change(@cursor, :cur_col).to(@cursor.max_col)
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
describe Cursor, 'when advanced' do
|
136
|
+
it "should move to the next column for a usual move" do
|
137
|
+
cursor = Cursor.new(1, 1, 80, 25)
|
138
|
+
lambda{cursor.advance!}.should change(cursor, :cur_col).by(1)
|
139
|
+
[1, 2, 3].each do |w|
|
140
|
+
lambda{cursor.advance!(w)}.should change(cursor, :cur_col).by(w)
|
141
|
+
end
|
142
|
+
cursor = Cursor.new(79, 1, 80, 25)
|
143
|
+
lambda{cursor.advance!}.should change(cursor, :cur_col).by(1)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should move to the next row from the right edge" do
|
147
|
+
cursor = Cursor.new(80, 1, 80, 25)
|
148
|
+
lambda{cursor.advance!(1)}.should change(cursor, :cur_row).by(1)
|
149
|
+
cursor.cur_col.should == 1
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should return nil for a usual move" do
|
153
|
+
cursor = Cursor.new(1, 1, 80, 25)
|
154
|
+
[1, 2, 3].each do |w|
|
155
|
+
cursor.advance!(w).should == nil
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should return \"\\n\" going beyond the right edge" do
|
160
|
+
cursor = Cursor.new(80, 1, 80, 25)
|
161
|
+
cursor.advance!(1).should == "\n"
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
data/spec/hiki_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
describe "As a Hiki plugin" do
|
2
|
+
before do
|
3
|
+
include 'webrick'
|
4
|
+
class String
|
5
|
+
def escape
|
6
|
+
WEBrick::HTTPUtils.escape(self)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Hiki
|
11
|
+
class Conf
|
12
|
+
def cache_path
|
13
|
+
'./spec'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class PluginError < StandardError; end
|
18
|
+
|
19
|
+
class Plugin
|
20
|
+
def initialize
|
21
|
+
@page = '.'
|
22
|
+
@conf = Conf.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def load_plugin
|
26
|
+
lib = 'lib/ansisys.rb'
|
27
|
+
instance_eval(File.read(lib), lib, 1)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
@plugin = Hiki::Plugin.new
|
33
|
+
@plugin.load_plugin
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should render an HTML fragment as expected" do
|
37
|
+
@plugin.ansi_screen('test_data.txt').should == File.read('spec/attach/test_data.html')
|
38
|
+
end
|
39
|
+
end
|
data/spec/lexer_spec.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
$:.unshift('lib')
|
2
|
+
require 'ansisys'
|
3
|
+
|
4
|
+
include AnsiSys
|
5
|
+
describe Lexer::PARAMETER_AND_LETTER, "a regexp for parameters and a letter" do
|
6
|
+
it 'should not match partial code' do
|
7
|
+
m = Lexer::PARAMETER_AND_LETTER.match("32")
|
8
|
+
m.should == nil
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should match a code without parameter' do
|
12
|
+
m = Lexer::PARAMETER_AND_LETTER.match("m")
|
13
|
+
m.should_not == nil
|
14
|
+
m[2].should == 'm'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should match a code with a parameter' do
|
18
|
+
m = Lexer::PARAMETER_AND_LETTER.match("32m")
|
19
|
+
m.should_not == nil
|
20
|
+
m[1].should == '32'
|
21
|
+
m[2].should == 'm'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should match a code with two parameters' do
|
25
|
+
m = Lexer::PARAMETER_AND_LETTER.match("32;0m")
|
26
|
+
m.should_not == nil
|
27
|
+
m[1].should == '32;0'
|
28
|
+
m[2].should == 'm'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should match a code with three parameters' do
|
32
|
+
m = Lexer::PARAMETER_AND_LETTER.match("32;0;1m")
|
33
|
+
m.should_not == nil
|
34
|
+
m[1].should == '32;0;1'
|
35
|
+
m[2].should == 'm'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should match a code with three and omitted parameters' do
|
39
|
+
m = Lexer::PARAMETER_AND_LETTER.match("32;;1m")
|
40
|
+
m.should_not == nil
|
41
|
+
m[1].should == '32;;1'
|
42
|
+
m[2].should == 'm'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe Lexer do
|
47
|
+
before do
|
48
|
+
@lexer = Lexer.new(["\x1b["])
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should return usual string as it is' do
|
52
|
+
x = 'Usual string.'
|
53
|
+
@lexer.push(x)
|
54
|
+
@lexer.buffer.should == x
|
55
|
+
@lexer.lex!.should == [[:string, x]]
|
56
|
+
@lexer.buffer.should be_empty
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should return nothing if a code is not complete' do
|
60
|
+
@lexer.push("\x1b[32")
|
61
|
+
@lexer.lex!.should be_empty
|
62
|
+
@lexer.buffer.should_not be_empty
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should return string and code' do
|
66
|
+
@lexer.push("string one\x1b[32mstring two")
|
67
|
+
@lexer.lex!.should == [[:string, 'string one'], [:code, '32m'], [:string, 'string two']]
|
68
|
+
@lexer.buffer.should be_empty
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should translate LF to a codes E' do
|
72
|
+
@lexer.push("line one\nline two\n")
|
73
|
+
@lexer.lex!.should == [[:string, 'line one'], [:code, 'E'], [:string, 'line two'], [:code, 'E']]
|
74
|
+
@lexer.buffer.should be_empty
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should translate CRLF to a code E' do
|
78
|
+
@lexer.push("line one\r\nline two\r\n")
|
79
|
+
@lexer.lex!.should == [[:string, 'line one'], [:code, 'E'], [:string, 'line two'], [:code, 'E']]
|
80
|
+
@lexer.buffer.should be_empty
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should translate LFCR to a coden E' do
|
84
|
+
@lexer.push("line one\n\rline two\n\r")
|
85
|
+
@lexer.lex!.should == [[:string, 'line one'], [:code, 'E'], [:string, 'line two'], [:code, 'E']]
|
86
|
+
@lexer.buffer.should be_empty
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should translate CR to a code B' do
|
90
|
+
@lexer.push("line one\rline two\r")
|
91
|
+
@lexer.lex!.should == [[:string, 'line one'], [:code, 'B'], [:string, 'line two'], [:code, 'B']]
|
92
|
+
@lexer.buffer.should be_empty
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
data/spec/screen_spec.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
$:.unshift('lib')
|
2
|
+
require 'ansisys'
|
3
|
+
unless defined?(:SGR)
|
4
|
+
class SGR
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
include AnsiSys
|
9
|
+
describe Screen, "when rendered as a plain text" do
|
10
|
+
before do
|
11
|
+
@screen = Screen.new
|
12
|
+
@sgr = SGR.new
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should store character at the given location" do
|
16
|
+
@screen.write('t', 1, 3, 5, @sgr)
|
17
|
+
@screen.instance_variable_get(:@lines)[5][3].should == ['t', 1, SGR.new]
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should overwrite character" do
|
21
|
+
@screen.write('t', 1, 3, 5, @sgr)
|
22
|
+
@screen.write('u', 1, 3, 5, @sgr)
|
23
|
+
@screen.instance_variable_get(:@lines)[5][3].should == ['u', 1, SGR.new]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe Screen, "when rendered" do
|
28
|
+
before do
|
29
|
+
@screen = Screen.new
|
30
|
+
@sgr = SGR.new
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should render Ascii characters" do
|
34
|
+
@screen.write('h', 1, 3, 2, @sgr)
|
35
|
+
@screen.write('e', 1, 4, 2, @sgr)
|
36
|
+
@screen.write('l', 1, 5, 2, @sgr)
|
37
|
+
@screen.write('l', 1, 6, 2, @sgr)
|
38
|
+
@screen.write('o', 1, 7, 2, @sgr)
|
39
|
+
@screen.render(:text).should == <<_SCREEN.chomp
|
40
|
+
|
41
|
+
hello
|
42
|
+
_SCREEN
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should render wide characters" do
|
46
|
+
@screen.write('h-', 2, 3, 2, @sgr)
|
47
|
+
@screen.write('e-', 2, 5, 2, @sgr)
|
48
|
+
@screen.write('l-', 2, 7, 2, @sgr)
|
49
|
+
@screen.write('l-', 2, 9, 2, @sgr)
|
50
|
+
@screen.write('o-', 2, 11, 2, @sgr)
|
51
|
+
@screen.render(:text).should == <<_SCREEN.chomp
|
52
|
+
|
53
|
+
h-e-l-l-o-
|
54
|
+
_SCREEN
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe Screen, "when rendered as an HTML fragment" do
|
59
|
+
before do
|
60
|
+
@screen = Screen.new
|
61
|
+
@sgr = SGR.new
|
62
|
+
@screen.write('h', 1, 3, 1, @sgr)
|
63
|
+
@screen.write('e', 1, 4, 1, @sgr)
|
64
|
+
@screen.write('l', 1, 5, 1, @sgr)
|
65
|
+
@screen.write('l', 1, 6, 1, @sgr)
|
66
|
+
@screen.write('o', 1, 7, 1, @sgr)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should be surrounded with <pre>" do
|
70
|
+
@screen.render(:html).should == <<_SCREEN.chomp
|
71
|
+
<pre class="screen">\n hello</pre>
|
72
|
+
_SCREEN
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should change colors" do
|
76
|
+
@sgr.apply_code!(%w(32 m))
|
77
|
+
@screen.write(':', 1, 1, 1, @sgr)
|
78
|
+
@screen.write(')', 1, 2, 1, @sgr)
|
79
|
+
@screen.render(:html).should == <<_SCREEN.chomp
|
80
|
+
<pre class="screen">\n<span style="color: green">:)</span>hello</pre>
|
81
|
+
_SCREEN
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "screen with default colors set", :shared => true do
|
86
|
+
it "should only specify colors of special color letters" do
|
87
|
+
@screen.render(:html).should == <<_SCREEN.chomp
|
88
|
+
<pre class="screen">\n<span style="color: green">:)</span>hello</pre>
|
89
|
+
_SCREEN
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe Screen, "with default colors" do
|
94
|
+
before do
|
95
|
+
@screen = Screen.new
|
96
|
+
@sgr = SGR.new
|
97
|
+
@screen.write('h', 1, 3, 1, @sgr)
|
98
|
+
@screen.write('e', 1, 4, 1, @sgr)
|
99
|
+
@screen.write('l', 1, 5, 1, @sgr)
|
100
|
+
@screen.write('l', 1, 6, 1, @sgr)
|
101
|
+
@screen.write('o', 1, 7, 1, @sgr)
|
102
|
+
@sgr.apply_code!(%w(32 m))
|
103
|
+
@screen.write(':', 1, 1, 1, @sgr)
|
104
|
+
@screen.write(')', 1, 2, 1, @sgr)
|
105
|
+
end
|
106
|
+
|
107
|
+
it_should_behave_like "screen with default colors set"
|
108
|
+
|
109
|
+
it "should have default css style with silver letters on black background" do
|
110
|
+
css = @screen.css_style
|
111
|
+
css.should include('color: silver;')
|
112
|
+
css.should include('background-color: black;')
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe Screen, "with inverted colors" do
|
117
|
+
before do
|
118
|
+
@screen = Screen.new(Screen.default_css_colors(true))
|
119
|
+
@sgr = SGR.new
|
120
|
+
@screen.write('h', 1, 3, 1, @sgr)
|
121
|
+
@screen.write('e', 1, 4, 1, @sgr)
|
122
|
+
@screen.write('l', 1, 5, 1, @sgr)
|
123
|
+
@screen.write('l', 1, 6, 1, @sgr)
|
124
|
+
@screen.write('o', 1, 7, 1, @sgr)
|
125
|
+
@sgr.apply_code!(%w(32 m))
|
126
|
+
@screen.write(':', 1, 1, 1, @sgr)
|
127
|
+
@screen.write(')', 1, 2, 1, @sgr)
|
128
|
+
end
|
129
|
+
|
130
|
+
it_should_behave_like "screen with default colors set"
|
131
|
+
|
132
|
+
it "should have default css style with black letters on white background" do
|
133
|
+
css = @screen.css_style
|
134
|
+
css.should include('color: black;')
|
135
|
+
css.should include('background-color: silver;')
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe Screen, "with bright colors" do
|
140
|
+
before do
|
141
|
+
@screen = Screen.new(Screen.default_css_colors(false, true))
|
142
|
+
@sgr = SGR.new
|
143
|
+
@screen.write('h', 1, 3, 1, @sgr)
|
144
|
+
@screen.write('e', 1, 4, 1, @sgr)
|
145
|
+
@screen.write('l', 1, 5, 1, @sgr)
|
146
|
+
@screen.write('l', 1, 6, 1, @sgr)
|
147
|
+
@screen.write('o', 1, 7, 1, @sgr)
|
148
|
+
@sgr.apply_code!(%w(32 m))
|
149
|
+
@screen.write(':', 1, 1, 1, @sgr)
|
150
|
+
@screen.write(')', 1, 2, 1, @sgr)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should have colors as specified" do
|
154
|
+
@screen.render(:html).should == <<_SCREEN.chomp
|
155
|
+
<pre class="screen">\n<span style="color: lime">:)</span>hello</pre>
|
156
|
+
_SCREEN
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should have default css style with black letters on white background" do
|
160
|
+
css = @screen.css_style
|
161
|
+
css.should include('color: white;')
|
162
|
+
css.should include('background-color: black;')
|
163
|
+
end
|
164
|
+
end
|