ansi-sys 0.3.0 → 0.4.0

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/ChangeLog CHANGED
@@ -1,3 +1,17 @@
1
+ * 2007-10-27 zunda <zunda at freeshell.org>
2
+ - (0.4.0)
3
+ - lib/ansisys.rb: implemented SU, SD, SCP, and RCP onto Terminal
4
+ - not to be implemented: DSR
5
+
6
+ * 2007-10-26 zunda <zunda at freeshell.org>
7
+ - lib/ansisys.rb: implemented ED and EL onto Terminal
8
+ - more to be done: SU SD DSR SCP RCP
9
+
10
+ * 2007-10-26 zunda <zunda at freeshell.org>
11
+ - lib/ansisys.rb: modified arguments of apply_code! to avoid
12
+ decoding of arguments into a letter and parameters
13
+ - spec/attach/test_utf8.txt: added
14
+
1
15
  * 2007-10-23 zunda <zunda at freeshell.org>
2
16
  - (0.3.0)
3
17
  - lib/ansisys.rb: convert string to EUC as a Hiki plugin
data/Manifest.txt CHANGED
@@ -17,6 +17,7 @@ script/txt2html
17
17
  setup.rb
18
18
  spec/attach/test_data.html
19
19
  spec/attach/test_data.txt
20
+ spec/attach/test_utf8.txt
20
21
  spec/character_screen_spec.rb
21
22
  spec/character_spec.rb
22
23
  spec/cursor_spec.rb
data/lib/ansisys.rb CHANGED
@@ -11,7 +11,7 @@ require 'webrick'
11
11
  module AnsiSys
12
12
  module VERSION #:nodoc:
13
13
  MAJOR = 0
14
- MINOR = 3
14
+ MINOR = 4
15
15
  TINY = 0
16
16
 
17
17
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -136,18 +136,7 @@ module AnsiSys
136
136
  @max_row = max_row
137
137
  end
138
138
 
139
- def apply_code!(args)
140
- letter = args.pop
141
- pars = args.map do |arg|
142
- case arg
143
- when nil
144
- nil
145
- when ''
146
- nil
147
- else
148
- Integer(arg)
149
- end
150
- end
139
+ def apply_code!(letter, *pars)
151
140
  case letter
152
141
  when 'A'
153
142
  @cur_row -= pars[0] ? pars[0] : 1
@@ -229,14 +218,12 @@ module AnsiSys
229
218
  end
230
219
 
231
220
  def reset!
232
- apply_code!(%w(0 m))
221
+ apply_code!('m', 0)
233
222
  end
234
223
 
235
- def apply_code!(args = %w(0 m))
236
- letter = args.pop
237
- raise AnsiSysError, "Invalid code for SGR" unless 'm' == letter
238
- pars = args.map{|arg| arg.to_i}
239
- pars = [0] if pars.empty?
224
+ def apply_code!(letter = 'm', *pars)
225
+ raise AnsiSysError, "Invalid code for SGR: #{letter.inspect}" unless 'm' == letter
226
+ pars = [0] unless pars
240
227
  pars.each do |code|
241
228
  case code
242
229
  when 0
@@ -435,6 +422,8 @@ module AnsiSys
435
422
  return "pre.screen {\n\t" + CSSFormatter.hash_to_styles(self.css_styles(*args), ";\n\t") + ";\n}\n"
436
423
  end
437
424
 
425
+ attr_reader :lines
426
+
438
427
  def initialize(colors = Screen.default_css_colors, max_col = nil, max_row = nil)
439
428
  @colors = colors
440
429
  @max_col = max_col
@@ -501,13 +490,13 @@ module AnsiSys
501
490
  return result
502
491
  end
503
492
 
504
- def apply_code!(args) # TODO - some codes
493
+ def apply_code!(letter, *pars) # TODO - some codes
505
494
  return self
506
495
  end
507
496
  end
508
497
 
509
498
  class Terminal
510
- CODE_LETTERS = [] # TODO - make a new screen
499
+ CODE_LETTERS = %w(J K S T n s u)
511
500
 
512
501
  def initialize(csis = ["\x1b["])
513
502
  @lexer = Lexer.new(csis)
@@ -539,38 +528,101 @@ module AnsiSys
539
528
  return screens.map{|screen| screen.render(format, css_class, css_style)}.join(separator)
540
529
  end
541
530
 
531
+ def apply_code!(letter, *pars)
532
+ case letter
533
+ when 'J'
534
+ cur_col = @cursor.cur_col
535
+ cur_row = @cursor.cur_row
536
+ lines = @screens[-1].lines
537
+ if pars.empty? or 0 == pars[0]
538
+ rs = lines.keys.select{|r| r > cur_row}
539
+ cs = lines[cur_row].keys.select{|c| c >= cur_col}
540
+ elsif 1 == pars[0]
541
+ rs = lines.keys.select{|r| r < cur_row}
542
+ cs = lines[cur_row].keys.select{|c| c <= cur_col}
543
+ elsif 2 == pars[0]
544
+ rs = lines.keys
545
+ cs = []
546
+ @cursor.apply_code!('H', 1, 1)
547
+ end
548
+ rs.each do |r|
549
+ lines.delete(r)
550
+ end
551
+ cs.each do |c|
552
+ lines[cur_row].delete(c)
553
+ end
554
+ when 'K'
555
+ cur_col = @cursor.cur_col
556
+ cur_row = @cursor.cur_row
557
+ line = @screens[-1].lines[cur_row]
558
+ if pars.empty? or 0 == pars[0]
559
+ cs = line.keys.select{|c| c >= cur_col}
560
+ elsif 1 == pars[0]
561
+ cs = line.keys.select{|c| c <= cur_col}
562
+ elsif 2 == pars[0]
563
+ cs = line.keys
564
+ end
565
+ cs.each do |c|
566
+ line.delete(c)
567
+ end
568
+ when 'S'
569
+ lines = @screens[-1].lines
570
+ n = pars.empty? ? 1 : pars[0]
571
+ n.times do |l|
572
+ lines.delete(l)
573
+ end
574
+ rs = lines.keys.sort
575
+ rs.each do |r|
576
+ lines[r-n] = lines[r]
577
+ lines.delete(r)
578
+ end
579
+ @cursor.apply_code!('H', rs[-1] - n + 1, 1)
580
+ when 'T'
581
+ lines = @screens[-1].lines
582
+ n = pars.empty? ? 1 : pars[0]
583
+ rs = lines.keys.sort_by{|a| -a} # sort.reverse
584
+ rs.each do |r|
585
+ lines[r+n] = lines[r]
586
+ lines.delete(r)
587
+ end
588
+ @cursor.apply_code!('H', rs[-1] - n + 1, 1)
589
+ when 's'
590
+ @stored_cursor = @cursor.dup
591
+ when 'u'
592
+ @cursor = @stored_cursor.dup if @stored_cursor
593
+ end
594
+
595
+ return self
596
+ end
597
+
542
598
  private
543
599
  def populate(format = :html, max_col = 80, max_row = nil, colors = Screen.default_css_colors)
544
- cursor = Cursor.new(1, 1, max_col, max_row)
545
- screens = [Screen.new(colors, max_col, max_row)]
546
- sgr = SGR.new
600
+ @cursor = Cursor.new(1, 1, max_col, max_row)
601
+ @stored_cursor = nil
602
+ @screens = [Screen.new(colors, max_col, max_row)]
603
+ @sgr = SGR.new
547
604
  @stream += @lexer.lex!
548
605
  @stream.each do |type, payload|
549
606
  case type
550
607
  when :string
551
- Characters.new(payload, sgr).echo_on(screens[-1], cursor)
608
+ Characters.new(payload, @sgr).echo_on(@screens[-1], @cursor)
552
609
  when :code
553
610
  unless Lexer::PARAMETER_AND_LETTER =~ payload
554
611
  raise AnsiSysError, "Invalid code: #{payload.inspect}"
555
612
  end
556
- parameters = $1
557
613
  letter = $2
558
- args = parameters.split(/;/) + [letter]
614
+ pars = $1.split(/;/).map{|i| i.to_i}
559
615
  applied = false
560
- [sgr, cursor, screens[-1], self].each do |recv|
616
+ [@sgr, @cursor, @screens[-1], self].each do |recv|
561
617
  if recv.class.const_get(:CODE_LETTERS).include?(letter)
562
- recv.apply_code!(args)
618
+ recv.apply_code!(letter, *pars)
563
619
  applied = true
564
620
  end
565
621
  end
566
622
  raise AnsiSysError, "Invalid code or not implemented: #{payload.inspect}" unless applied
567
623
  end
568
624
  end
569
- return screens
570
- end
571
-
572
- def apply_code!(args) # TODO - make a new screen
573
- return self
625
+ return @screens
574
626
  end
575
627
  end
576
628
  end
@@ -0,0 +1 @@
1
+ 日本語でUTF-8のテキストファイル。
data/spec/cursor_spec.rb CHANGED
@@ -26,46 +26,46 @@ describe Cursor, 'when moved normally' do
26
26
  end
27
27
 
28
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)
29
+ lambda{@cursor.apply_code!('A')}.should change(@cursor, :cur_row).by(-1)
30
+ lambda{@cursor.apply_code!('A', 1)}.should change(@cursor, :cur_row).by(-1)
31
+ lambda{@cursor.apply_code!('A', 2)}.should change(@cursor, :cur_row).by(-2)
32
32
  end
33
33
 
34
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)
35
+ lambda{@cursor.apply_code!('B')}.should change(@cursor, :cur_row).by(1)
36
+ lambda{@cursor.apply_code!('B', 1)}.should change(@cursor, :cur_row).by(1)
37
+ lambda{@cursor.apply_code!('B', 2)}.should change(@cursor, :cur_row).by(2)
38
38
  end
39
39
 
40
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)
41
+ lambda{@cursor.apply_code!('C')}.should change(@cursor, :cur_col).by(1)
42
+ lambda{@cursor.apply_code!('C', 1)}.should change(@cursor, :cur_col).by(1)
43
+ lambda{@cursor.apply_code!('C', 2)}.should change(@cursor, :cur_col).by(2)
44
44
  end
45
45
 
46
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)
47
+ lambda{@cursor.apply_code!('D')}.should change(@cursor, :cur_col).by(-1)
48
+ lambda{@cursor.apply_code!('D', 1)}.should change(@cursor, :cur_col).by(-1)
49
+ lambda{@cursor.apply_code!('D', 2)}.should change(@cursor, :cur_col).by(-2)
50
50
  end
51
51
 
52
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)
53
+ [[1, 'E'], [1, ['E', 1]], [2, ['E', 2]]].each do |d, code|
54
+ lambda{@cursor.apply_code!(*code)}.should change(@cursor, :cur_row).by(d)
55
55
  @cursor.cur_col.should == 1
56
56
  end
57
57
  end
58
58
 
59
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)
60
+ [[-1, ['F']], [-1, ['F', 1]], [-2, ['F', 2]]].each do |d, code|
61
+ lambda{@cursor.apply_code!(*code)}.should change(@cursor, :cur_row).by(d)
62
62
  @cursor.cur_col.should == 1
63
63
  end
64
64
  end
65
65
 
66
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)
67
+ [[1, ['G']], [1, ['G', 1]], [2, ['G', 2]]].each do |c, code|
68
+ lambda{@cursor.apply_code!(*code)}.should_not change(@cursor, :cur_row)
69
69
  @cursor.cur_col.should == c
70
70
  end
71
71
  end
@@ -73,16 +73,14 @@ describe Cursor, 'when moved normally' do
73
73
  it "should move to specified position with CUP and HVP" do
74
74
  %w(H f).each do |letter|
75
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])
76
+ # row, column, pars
77
+ [1, 5, [nil, 5]],
78
+ [1, 5, [1, 5]],
79
+ [17, 1, [17, nil]],
80
+ [17, 1, [17, 1]],
81
+ [9, 8, [9, 8]],
82
+ ].each do |r, c, pars|
83
+ @cursor.apply_code!(letter, *pars)
86
84
  @cursor.cur_col.should == c
87
85
  @cursor.cur_row.should == r
88
86
  end
@@ -98,36 +96,36 @@ describe Cursor, 'when tried to be moved beyond edge' do
98
96
 
99
97
  it "should not move with code CUU" do
100
98
  @cursor.instance_variable_set('@cur_row', 1)
101
- lambda{@cursor.apply_code!(%w(1 A))}.should_not change(@cursor, :cur_row)
99
+ lambda{@cursor.apply_code!('A', 1)}.should_not change(@cursor, :cur_row)
102
100
  end
103
101
 
104
102
  it "should not move with code CUD" do
105
103
  @cursor.instance_variable_set('@cur_row', @cursor.max_row)
106
- lambda{@cursor.apply_code!(%w(1 B))}.should_not change(@cursor, :cur_row)
104
+ lambda{@cursor.apply_code!('B', 1)}.should_not change(@cursor, :cur_row)
107
105
  end
108
106
 
109
107
  it "should not move with code CUF" do
110
108
  @cursor.instance_variable_set('@cur_col', @cursor.max_col)
111
- lambda{@cursor.apply_code!(%w(1 C))}.should_not change(@cursor, :cur_col)
109
+ lambda{@cursor.apply_code!('C', 1)}.should_not change(@cursor, :cur_col)
112
110
  end
113
111
 
114
112
  it "should not move with code CUB" do
115
113
  @cursor.instance_variable_set('@cur_col', 1)
116
- lambda{@cursor.apply_code!(%w(1 D))}.should_not change(@cursor, :cur_col)
114
+ lambda{@cursor.apply_code!('D', 1)}.should_not change(@cursor, :cur_col)
117
115
  end
118
116
 
119
117
  it "should make screen longer with code CNL" do
120
118
  @cursor.instance_variable_set('@cur_row', @cursor.max_row)
121
- lambda{@cursor.apply_code!(%w(1 E))}.should change(@cursor, :max_row).by(1)
119
+ lambda{@cursor.apply_code!('E', 1)}.should change(@cursor, :max_row).by(1)
122
120
  end
123
121
 
124
122
  it "should not change row with code CNL" do
125
123
  @cursor.instance_variable_set('@cur_row', 1)
126
- lambda{@cursor.apply_code!(%w(1 F))}.should_not change(@cursor, :cur_row)
124
+ lambda{@cursor.apply_code!('F', 1)}.should_not change(@cursor, :cur_row)
127
125
  end
128
126
 
129
127
  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)
128
+ lambda{@cursor.apply_code!('G', 99)}.should change(@cursor, :cur_col).to(@cursor.max_col)
131
129
  end
132
130
 
133
131
  end
data/spec/screen_spec.rb CHANGED
@@ -73,7 +73,7 @@ _SCREEN
73
73
  end
74
74
 
75
75
  it "should change colors" do
76
- @sgr.apply_code!(%w(32 m))
76
+ @sgr.apply_code!('m', 32)
77
77
  @screen.write(':', 1, 1, 1, @sgr)
78
78
  @screen.write(')', 1, 2, 1, @sgr)
79
79
  @screen.render(:html).should == <<_SCREEN.chomp
@@ -99,7 +99,7 @@ describe Screen, "with default colors" do
99
99
  @screen.write('l', 1, 5, 1, @sgr)
100
100
  @screen.write('l', 1, 6, 1, @sgr)
101
101
  @screen.write('o', 1, 7, 1, @sgr)
102
- @sgr.apply_code!(%w(32 m))
102
+ @sgr.apply_code!('m', 32)
103
103
  @screen.write(':', 1, 1, 1, @sgr)
104
104
  @screen.write(')', 1, 2, 1, @sgr)
105
105
  end
@@ -122,7 +122,7 @@ describe Screen, "with inverted colors" do
122
122
  @screen.write('l', 1, 5, 1, @sgr)
123
123
  @screen.write('l', 1, 6, 1, @sgr)
124
124
  @screen.write('o', 1, 7, 1, @sgr)
125
- @sgr.apply_code!(%w(32 m))
125
+ @sgr.apply_code!('m', 32)
126
126
  @screen.write(':', 1, 1, 1, @sgr)
127
127
  @screen.write(')', 1, 2, 1, @sgr)
128
128
  end
@@ -145,7 +145,7 @@ describe Screen, "with bright colors" do
145
145
  @screen.write('l', 1, 5, 1, @sgr)
146
146
  @screen.write('l', 1, 6, 1, @sgr)
147
147
  @screen.write('o', 1, 7, 1, @sgr)
148
- @sgr.apply_code!(%w(32 m))
148
+ @sgr.apply_code!('m', 32)
149
149
  @screen.write(':', 1, 1, 1, @sgr)
150
150
  @screen.write(')', 1, 2, 1, @sgr)
151
151
  end
data/spec/sgr_spec.rb CHANGED
@@ -25,7 +25,7 @@ describe SGR, 'when two are initialized' do
25
25
 
26
26
  it 'should be equal when initialized' do @sgr1.should == @sgr2; end
27
27
  it 'should be different after a code is executed' do
28
- @sgr2.apply_code!(%w(1 m))
28
+ @sgr2.apply_code!('m', 1)
29
29
  @sgr1.should_not == @sgr2
30
30
  end
31
31
  end
@@ -46,64 +46,64 @@ describe SGR, 'when a code is executed' do
46
46
  end
47
47
 
48
48
  it 'should treat empty parameter as a code 0' do
49
- @sgr.apply_code!(['m'])
49
+ @sgr.apply_code!('m')
50
50
  @sgr.should == SGR.new
51
51
  end
52
52
  it 'should have bold intensity with a code 1' do
53
- @sgr.change_only(:intensity, :bold){|x| x.apply_code!(%w(1 m))}
53
+ @sgr.change_only(:intensity, :bold){|x| x.apply_code!('m', 1)}
54
54
  end
55
55
  it 'should have faint intensity with a code 2' do
56
- @sgr.change_only(:intensity, :faint){|x| x.apply_code!(%w(2 m))}
56
+ @sgr.change_only(:intensity, :faint){|x| x.apply_code!('m', 2)}
57
57
  end
58
58
  it 'should be italic with a code 3' do
59
- @sgr.change_only(:italic, :on){|x| x.apply_code!(%w(3 m))}
59
+ @sgr.change_only(:italic, :on){|x| x.apply_code!('m', 3)}
60
60
  end
61
61
  it 'should have single underline with a code 4' do
62
- @sgr.change_only(:underline, :single){|x| x.apply_code!(%w(4 m))}
62
+ @sgr.change_only(:underline, :single){|x| x.apply_code!('m', 4)}
63
63
  end
64
64
  it 'should be concealed with a code 8' do
65
- @sgr.change_only(:conceal, :on){|x| x.apply_code!(%w(8 m))}
65
+ @sgr.change_only(:conceal, :on){|x| x.apply_code!('m', 8)}
66
66
  end
67
67
  it 'should be revealed with a code 28' do
68
68
  @sgr.change_only(:conceal, :off) do |x|
69
- x.apply_code!(%w(8 m))
70
- x.apply_code!(%w(28 m))
69
+ x.apply_code!('m', 8)
70
+ x.apply_code!('m', 28)
71
71
  end
72
72
  end
73
73
  it 'should have green foreground with normal intensity with a code 32' do
74
- @sgr.apply_code!(%w(1 m))
75
- @sgr.apply_code!(%w(32 m))
74
+ @sgr.apply_code!('m', 1)
75
+ @sgr.apply_code!('m', 32)
76
76
  @sgr.foreground.should == :green
77
77
  @sgr.intensity.should == :normal
78
78
  end
79
79
  it 'should have white foreground with normal intensity with a code 39' do
80
- @sgr.apply_code!(%w(32 m))
81
- @sgr.apply_code!(%w(1 m))
82
- @sgr.apply_code!(%w(39 m))
80
+ @sgr.apply_code!('m', 32)
81
+ @sgr.apply_code!('m', 1)
82
+ @sgr.apply_code!('m', 39)
83
83
  @sgr.foreground.should == :white
84
84
  @sgr.intensity.should == :normal
85
85
  end
86
86
  it 'should have yellow background with normal intensity with a code 43' do
87
- @sgr.apply_code!(%w(1 m))
88
- @sgr.apply_code!(%w(43 m))
87
+ @sgr.apply_code!('m', 1)
88
+ @sgr.apply_code!('m', 43)
89
89
  @sgr.background.should == :yellow
90
90
  @sgr.intensity.should == :normal
91
91
  end
92
92
  it 'should have blue foreground with bold intensity with a code 94' do
93
- @sgr.apply_code!(%w(1 m))
94
- @sgr.apply_code!(%w(94 m))
93
+ @sgr.apply_code!('m', 1)
94
+ @sgr.apply_code!('m', 94)
95
95
  @sgr.foreground.should == :blue
96
96
  @sgr.intensity.should == :bold
97
97
  end
98
98
  it 'should have magenta background with bold intensity with a code 105' do
99
- @sgr.apply_code!(%w(1 m))
100
- @sgr.apply_code!(%w(105 m))
99
+ @sgr.apply_code!('m', 1)
100
+ @sgr.apply_code!('m', 105)
101
101
  @sgr.background.should == :magenta
102
102
  @sgr.intensity.should == :bold
103
103
  end
104
104
  it 'should have white background with bold intensity with a code 107' do
105
- @sgr.apply_code!(%w(1 m))
106
- @sgr.apply_code!(%w(107 m))
105
+ @sgr.apply_code!('m', 1)
106
+ @sgr.apply_code!('m', 107)
107
107
  @sgr.background.should == :white
108
108
  @sgr.intensity.should == :bold
109
109
  end
@@ -131,42 +131,42 @@ describe SGR, 'to be rendered in HTML' do
131
131
  end
132
132
 
133
133
  it "should change foreground color" do
134
- @sgr.apply_code!(%w(32 m))
134
+ @sgr.apply_code!('m', 32)
135
135
  @sgr.css_styles.should == {'color' => ['green']}
136
136
  end
137
137
 
138
138
  it "shuold show underline for ANSI single underline" do
139
- @sgr.apply_code!(%w(4 m))
139
+ @sgr.apply_code!('m', 4)
140
140
  @sgr.css_styles.should == {'text-decoration' => ['underline']}
141
141
  end
142
142
 
143
143
  it "shuold show underline for ANSI double underline" do
144
- @sgr.apply_code!(%w(4 m))
144
+ @sgr.apply_code!('m', 4)
145
145
  @sgr.css_styles.should == {'text-decoration' => ['underline']}
146
146
  end
147
147
 
148
148
  it "should switch foreground and background colors with reverse video" do
149
- @sgr.apply_code!(%w(7 m))
149
+ @sgr.apply_code!('m', 7)
150
150
  @sgr.css_styles.should == {'color' => ['black'], 'background-color' => ['silver']}
151
151
  end
152
152
 
153
153
  it "should blink for ANSI slow blink" do
154
- @sgr.apply_code!(%w(5 m))
154
+ @sgr.apply_code!('m', 5)
155
155
  @sgr.css_styles.should == {'text-decoration' => ['blink']}
156
156
  end
157
157
 
158
158
  it "should blink for ANSI fast blink" do
159
- @sgr.apply_code!(%w(6 m))
159
+ @sgr.apply_code!('m', 6)
160
160
  @sgr.css_styles.should == {'text-decoration' => ['blink']}
161
161
  end
162
162
 
163
163
  it "should be able to be italic" do
164
- @sgr.apply_code!(%w(3 m))
164
+ @sgr.apply_code!('m', 3)
165
165
  @sgr.css_styles.should == {'font-style' => ['italic']}
166
166
  end
167
167
 
168
168
  it "should be able to be invisible" do
169
- @sgr.apply_code!(%w(8 m))
169
+ @sgr.apply_code!('m', 8)
170
170
  @sgr.css_styles.should == {'color' => ['black']}
171
171
  end
172
172
  end
@@ -80,3 +80,147 @@ _CSS
80
80
  end
81
81
  end
82
82
  end
83
+
84
+ describe Terminal, 'when code ED is sent' do
85
+ before do
86
+ @terminal = Terminal.new
87
+ @terminal.echo("Hello\nand\ngood bye\nworld\e[2;2H")
88
+ end
89
+
90
+ it 'should clear from cursor to end of screen with J' do
91
+ @terminal.echo("\e[J")
92
+ @terminal.render(:text).should == "Hello\na"
93
+ end
94
+
95
+ it 'should clear from cursor to end of screen with 0J' do
96
+ @terminal.echo("\e[0J")
97
+ @terminal.render(:text).should == "Hello\na"
98
+ end
99
+
100
+ it 'should clear from cursor to beggining of screen with 1J' do
101
+ @terminal.echo("\e[1J")
102
+ @terminal.render(:text).should == "\n d\ngood bye\nworld"
103
+ end
104
+
105
+ it 'should clear entier screen with 2J' do
106
+ @terminal.echo("\e[2J")
107
+ @terminal.render(:text).should == ""
108
+ end
109
+
110
+ it 'should move cursor to top left with 2J' do
111
+ @terminal.echo("\e[2JX")
112
+ @terminal.render(:text).should == "X"
113
+ end
114
+ end
115
+
116
+ describe Terminal, 'when code EL is sent' do
117
+ before do
118
+ @terminal = Terminal.new
119
+ @terminal.echo("red\ngreen\nrefactor\e[2;2H")
120
+ end
121
+
122
+ it 'should clear from cursor to end of line with K' do
123
+ @terminal.echo("\e[K")
124
+ @terminal.render(:text).should == "red\ng\nrefactor"
125
+ end
126
+
127
+ it 'should clear from cursor to end of line with K' do
128
+ @terminal.echo("\e[0K")
129
+ @terminal.render(:text).should == "red\ng\nrefactor"
130
+ end
131
+
132
+ it 'should clear from cursor to beginning of line with K' do
133
+ @terminal.echo("\e[1K")
134
+ @terminal.render(:text).should == "red\n een\nrefactor"
135
+ end
136
+
137
+ it 'should clear entier line with 2K' do
138
+ @terminal.echo("\e[2K")
139
+ @terminal.render(:text).should == "red\n\nrefactor"
140
+ end
141
+
142
+ it 'should not move cursor with 2K' do
143
+ @terminal.echo("\e[2KX")
144
+ @terminal.render(:text).should == "red\n X\nrefactor"
145
+ end
146
+ end
147
+
148
+ describe Terminal, 'when code SU is sent' do
149
+ before do
150
+ @terminal = Terminal.new
151
+ @terminal.echo("red\ngreen\n\nrefactor\e[2;2H")
152
+ end
153
+
154
+ it 'shuold scroll down by one line with S' do
155
+ @terminal.echo("\e[S")
156
+ @terminal.render(:text).should == "green\n\nrefactor"
157
+ end
158
+
159
+ it 'shuold scroll down by one line with 1S' do
160
+ @terminal.echo("\e[1S")
161
+ @terminal.render(:text).should == "green\n\nrefactor"
162
+ end
163
+
164
+ it 'shuold scroll down by two lines with 2S' do
165
+ @terminal.echo("\e[2S")
166
+ @terminal.render(:text).should == "\nrefactor"
167
+ end
168
+
169
+ it 'shuold append a line at the bottom after S' do
170
+ @terminal.echo("\e[2SX")
171
+ @terminal.render(:text).should == "\nrefactor\nX"
172
+ end
173
+ end
174
+
175
+ describe Terminal, 'when code SD is sent' do
176
+ before do
177
+ @terminal = Terminal.new
178
+ @terminal.echo("red\ngreen\n\nrefactor\e[2;2H")
179
+ end
180
+
181
+ it 'shuold scroll up by one line with T' do
182
+ @terminal.echo("\e[T")
183
+ @terminal.render(:text).should == "\nred\ngreen\n\nrefactor"
184
+ end
185
+
186
+ it 'shuold scroll up by one line with 1T' do
187
+ @terminal.echo("\e[1T")
188
+ @terminal.render(:text).should == "\nred\ngreen\n\nrefactor"
189
+ end
190
+
191
+ it 'shuold scroll up by two lines with 2T' do
192
+ @terminal.echo("\e[2T")
193
+ @terminal.render(:text).should == "\n\nred\ngreen\n\nrefactor"
194
+ end
195
+
196
+ it 'shuold append a line at the top after T' do
197
+ @terminal.echo("\e[2TX")
198
+ @terminal.render(:text).should == "X\n\nred\ngreen\n\nrefactor"
199
+ end
200
+ end
201
+
202
+ describe Terminal, 'when code SCP and RCP is sent' do
203
+ before do
204
+ @terminal = Terminal.new
205
+ @terminal.echo("red\ngreen\nrefactor\e[2;2H")
206
+ end
207
+
208
+ it 'should save and restore the cursor position' do
209
+ @terminal.echo("\e[sXX\nY\e[uZ")
210
+ @terminal.render(:text).should == "red\ngZXen\nYefactor"
211
+ @terminal.echo("\e[uz")
212
+ @terminal.render(:text).should == "red\ngzXen\nYefactor"
213
+ end
214
+ end
215
+
216
+ describe Terminal, 'when only code RCP is sent' do
217
+ before do
218
+ @terminal = Terminal.new
219
+ @terminal.echo("red\ngreen\nrefactor\n\e[2;2H")
220
+ end
221
+
222
+ it 'should ignore the code' do
223
+ @terminal.echo("\e[udone")
224
+ @terminal.render(:text).should == "red\ngdone\nrefactor"
225
+ end
226
+ end
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>Ruby-ANSI.SYS</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/ansi-sys"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/ansi-sys" class="numbers">0.3.0</a>
36
+ <a href="http://rubyforge.org/projects/ansi-sys" class="numbers">0.4.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;ansi-sys&#8217;</h1>
39
39
 
@@ -110,7 +110,7 @@ terminal.render #=&gt; 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, 23rd October 2007<br>
113
+ zunda, 21st October 2007<br>
114
114
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
115
115
  </p>
116
116
  </div>
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ansi-sys
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.0
7
- date: 2007-10-23 00:00:00 -10:00
6
+ version: 0.4.0
7
+ date: 2007-10-27 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
@@ -48,6 +48,7 @@ files:
48
48
  - setup.rb
49
49
  - spec/attach/test_data.html
50
50
  - spec/attach/test_data.txt
51
+ - spec/attach/test_utf8.txt
51
52
  - spec/character_screen_spec.rb
52
53
  - spec/character_spec.rb
53
54
  - spec/cursor_spec.rb
@@ -80,6 +81,7 @@ extra_rdoc_files:
80
81
  - gpl.rd.txt
81
82
  - lgpl.rd.txt
82
83
  - spec/attach/test_data.txt
84
+ - spec/attach/test_utf8.txt
83
85
  - website/index.txt
84
86
  executables: []
85
87