vedeu 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/docs/dsl.md +3 -3
  3. data/examples/borders_app.rb +2 -0
  4. data/examples/colours_app.rb +2 -0
  5. data/examples/configuration_app.rb +2 -0
  6. data/examples/drb_app.rb +2 -0
  7. data/examples/focus_app.rb +2 -0
  8. data/examples/hello_world.rb +2 -0
  9. data/examples/material_colours_app.rb +2 -0
  10. data/lib/vedeu.rb +2 -0
  11. data/lib/vedeu/all.rb +4 -13
  12. data/lib/vedeu/api.rb +7 -6
  13. data/lib/vedeu/borders/border.rb +1 -1
  14. data/lib/vedeu/borders/render_border.rb +18 -18
  15. data/lib/vedeu/buffers/buffer.rb +18 -28
  16. data/lib/vedeu/colours/colour.rb +1 -1
  17. data/lib/vedeu/colours/colour_translator.rb +1 -1
  18. data/lib/vedeu/cursor/cursor.rb +9 -6
  19. data/lib/vedeu/dsl/border.rb +1 -1
  20. data/lib/vedeu/dsl/composition.rb +5 -5
  21. data/lib/vedeu/dsl/geometry.rb +1 -1
  22. data/lib/vedeu/dsl/group.rb +1 -1
  23. data/lib/vedeu/dsl/interface.rb +69 -93
  24. data/lib/vedeu/dsl/keymap.rb +1 -1
  25. data/lib/vedeu/dsl/line.rb +11 -11
  26. data/lib/vedeu/dsl/shared.rb +81 -0
  27. data/lib/vedeu/dsl/stream.rb +3 -3
  28. data/lib/vedeu/dsl/view.rb +76 -64
  29. data/lib/vedeu/models/escape.rb +1 -1
  30. data/lib/vedeu/models/interface.rb +3 -57
  31. data/lib/vedeu/models/menu.rb +1 -1
  32. data/lib/vedeu/models/views/all.rb +22 -0
  33. data/lib/vedeu/models/views/char.rb +175 -0
  34. data/lib/vedeu/models/views/chars.rb +13 -0
  35. data/lib/vedeu/models/views/composition.rb +73 -0
  36. data/lib/vedeu/models/views/line.rb +111 -0
  37. data/lib/vedeu/models/views/lines.rb +13 -0
  38. data/lib/vedeu/models/views/stream.rb +122 -0
  39. data/lib/vedeu/models/views/streams.rb +13 -0
  40. data/lib/vedeu/models/views/view.rb +157 -0
  41. data/lib/vedeu/models/views/view_collection.rb +13 -0
  42. data/lib/vedeu/null/view.rb +67 -0
  43. data/lib/vedeu/output/clear/named_interface.rb +4 -4
  44. data/lib/vedeu/output/compressor.rb +6 -6
  45. data/lib/vedeu/output/html_char.rb +6 -6
  46. data/lib/vedeu/output/output.rb +3 -3
  47. data/lib/vedeu/output/presentation.rb +1 -1
  48. data/lib/vedeu/output/renderers/escape_sequence.rb +1 -1
  49. data/lib/vedeu/output/renderers/file.rb +1 -1
  50. data/lib/vedeu/output/renderers/html.rb +3 -3
  51. data/lib/vedeu/output/renderers/json.rb +4 -4
  52. data/lib/vedeu/output/renderers/null.rb +1 -1
  53. data/lib/vedeu/output/renderers/terminal.rb +5 -5
  54. data/lib/vedeu/output/renderers/text.rb +3 -3
  55. data/lib/vedeu/output/style.rb +1 -1
  56. data/lib/vedeu/output/text.rb +20 -15
  57. data/lib/vedeu/output/viewport.rb +16 -23
  58. data/lib/vedeu/output/virtual_buffer.rb +9 -8
  59. data/lib/vedeu/output/virtual_terminal.rb +11 -11
  60. data/lib/vedeu/output/wordwrap.rb +5 -5
  61. data/lib/vedeu/runtime/application.rb +1 -1
  62. data/lib/vedeu/runtime/main_loop.rb +1 -1
  63. data/lib/vedeu/templating/helpers.rb +11 -10
  64. data/lib/vedeu/templating/template.rb +1 -1
  65. data/lib/vedeu/templating/view_template.rb +6 -6
  66. data/lib/vedeu/version.rb +1 -2
  67. data/test/lib/vedeu/api_test.rb +30 -30
  68. data/test/lib/vedeu/buffers/buffer_test.rb +5 -139
  69. data/test/lib/vedeu/colours/colour_translator_test.rb +3 -3
  70. data/test/lib/vedeu/configuration/api_test.rb +3 -3
  71. data/test/lib/vedeu/cursor/refresh_cursor_test.rb +1 -1
  72. data/test/lib/vedeu/dsl/composition_test.rb +7 -7
  73. data/test/lib/vedeu/dsl/group_test.rb +2 -2
  74. data/test/lib/vedeu/dsl/interface_test.rb +31 -21
  75. data/test/lib/vedeu/dsl/keymap_test.rb +4 -4
  76. data/test/lib/vedeu/dsl/line_test.rb +8 -8
  77. data/test/lib/vedeu/dsl/stream_test.rb +4 -4
  78. data/test/lib/vedeu/dsl/text_test.rb +11 -11
  79. data/test/lib/vedeu/dsl/view_test.rb +24 -29
  80. data/test/lib/vedeu/geometry/grid_test.rb +4 -4
  81. data/test/lib/vedeu/input/key_test.rb +1 -1
  82. data/test/lib/vedeu/internal_api_test.rb +18 -18
  83. data/test/lib/vedeu/models/focus_test.rb +54 -54
  84. data/test/lib/vedeu/models/interface_test.rb +11 -105
  85. data/test/lib/vedeu/models/menu_test.rb +1 -1
  86. data/test/lib/vedeu/models/views/char_test.rb +257 -0
  87. data/test/lib/vedeu/models/views/chars_test.rb +22 -0
  88. data/test/lib/vedeu/models/views/composition_test.rb +61 -0
  89. data/test/lib/vedeu/models/views/line_test.rb +189 -0
  90. data/test/lib/vedeu/models/views/lines_test.rb +22 -0
  91. data/test/lib/vedeu/models/views/stream_test.rb +138 -0
  92. data/test/lib/vedeu/models/views/streams_test.rb +22 -0
  93. data/test/lib/vedeu/models/views/view_test.rb +40 -0
  94. data/test/lib/vedeu/null/view_test.rb +12 -0
  95. data/test/lib/vedeu/output/clear/named_interface_test.rb +4 -4
  96. data/test/lib/vedeu/output/compressor_test.rb +28 -28
  97. data/test/lib/vedeu/output/html_char_test.rb +2 -2
  98. data/test/lib/vedeu/output/presentation_test.rb +10 -14
  99. data/test/lib/vedeu/output/renderers/escape_sequence_test.rb +20 -4
  100. data/test/lib/vedeu/output/renderers/html_test.rb +4 -4
  101. data/test/lib/vedeu/output/renderers/json_test.rb +3 -3
  102. data/test/lib/vedeu/output/text_test.rb +10 -10
  103. data/test/lib/vedeu/output/viewport_test.rb +21 -23
  104. data/test/lib/vedeu/output/virtual_buffer_test.rb +1 -1
  105. data/test/lib/vedeu/output/virtual_terminal_test.rb +1 -1
  106. data/test/lib/vedeu/output/wordwrap_test.rb +9 -9
  107. data/test/lib/vedeu/repositories/repository_test.rb +2 -2
  108. data/test/lib/vedeu/templating/helpers_test.rb +6 -39
  109. data/test/lib/vedeu/templating/template_test.rb +2 -2
  110. data/test/lib/vedeu/templating/view_template_test.rb +91 -91
  111. data/test/lib/vedeu/terminal_test.rb +1 -1
  112. metadata +33 -27
  113. data/lib/vedeu/buffers/display_buffer.rb +0 -39
  114. data/lib/vedeu/models/char.rb +0 -170
  115. data/lib/vedeu/models/chars.rb +0 -9
  116. data/lib/vedeu/models/composition.rb +0 -66
  117. data/lib/vedeu/models/line.rb +0 -112
  118. data/lib/vedeu/models/lines.rb +0 -9
  119. data/lib/vedeu/models/stream.rb +0 -122
  120. data/lib/vedeu/models/streams.rb +0 -9
  121. data/test/lib/vedeu/buffers/display_buffer_test.rb +0 -61
  122. data/test/lib/vedeu/models/char_test.rb +0 -253
  123. data/test/lib/vedeu/models/chars_test.rb +0 -18
  124. data/test/lib/vedeu/models/composition_test.rb +0 -57
  125. data/test/lib/vedeu/models/line_test.rb +0 -189
  126. data/test/lib/vedeu/models/lines_test.rb +0 -18
  127. data/test/lib/vedeu/models/stream_test.rb +0 -141
  128. data/test/lib/vedeu/models/streams_test.rb +0 -18
@@ -31,7 +31,7 @@ module Vedeu
31
31
  context 'when the block is not given' do
32
32
  subject { described.menu }
33
33
 
34
- it { proc { subject }.must_raise(InvalidSyntax) }
34
+ it { proc { subject }.must_raise(Vedeu::InvalidSyntax) }
35
35
  end
36
36
  end
37
37
 
@@ -0,0 +1,257 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ module Views
6
+
7
+ describe Char do
8
+
9
+ let(:described) { Vedeu::Views::Char }
10
+ let(:instance) { described.new(attributes) }
11
+ let(:attributes) {
12
+ {
13
+ border: border,
14
+ colour: colour,
15
+ parent: parent,
16
+ position: position,
17
+ style: style,
18
+ value: _value,
19
+ }
20
+ }
21
+ let(:_value) { 'a' }
22
+ let(:parent) { Vedeu::Views::Line.new(parent_attributes) }
23
+ let(:parent_attributes) {
24
+ {
25
+ streams: [],
26
+ parent: nil,
27
+ colour: parent_colour,
28
+ style: parent_style,
29
+ }
30
+ }
31
+ let(:border) { nil }
32
+ let(:colour) { nil }
33
+ let(:style) { nil }
34
+ let(:position) { nil }
35
+ let(:parent_colour) { nil }
36
+ let(:parent_style) { nil }
37
+
38
+ describe '#initialize' do
39
+ it { instance.must_be_instance_of(described) }
40
+ it { instance.instance_variable_get('@border').must_equal(border) }
41
+ it { instance.instance_variable_get('@parent').must_equal(parent) }
42
+ it { instance.instance_variable_get('@value').must_equal(_value) }
43
+
44
+ it { instance.must_respond_to(:value) }
45
+ end
46
+
47
+ describe 'accessors' do
48
+ it { instance.must_respond_to(:border) }
49
+ it { instance.must_respond_to(:border=) }
50
+ it { instance.must_respond_to(:parent) }
51
+ it { instance.must_respond_to(:parent=) }
52
+ it { instance.must_respond_to(:attributes) }
53
+ it { instance.must_respond_to(:value=) }
54
+ end
55
+
56
+ describe '#chars' do
57
+ subject { instance.chars }
58
+
59
+ it { subject.must_be_instance_of(Array) }
60
+ end
61
+
62
+ describe '#eql?' do
63
+ let(:other) { instance }
64
+
65
+ subject { instance.eql?(other) }
66
+
67
+ it { subject.must_equal(true) }
68
+
69
+ context 'when different to other' do
70
+ let(:other) { described.new(value: 'b') }
71
+
72
+ it { subject.must_equal(false) }
73
+ end
74
+ end
75
+
76
+ describe '#inspect' do
77
+ let(:colour) { Vedeu::Colour.new(foreground: '#00ff00',
78
+ background: '#005500') }
79
+ let(:position) { Vedeu::Position[17, 2] }
80
+ let(:style) { Vedeu::Style.new('underline') }
81
+
82
+
83
+ subject { instance.inspect }
84
+
85
+ it { subject.must_equal(
86
+ "<Vedeu::Views::Char '" \
87
+ "\\e[17;2H" \
88
+ "\\e[38;2;0;255;0m" \
89
+ "\\e[48;2;0;85;0m" \
90
+ "\\e[4ma" \
91
+ "'>"
92
+ ) }
93
+ end
94
+
95
+ describe '#position' do
96
+ subject { instance.position }
97
+ end
98
+
99
+ describe '#position=' do
100
+ subject { instance.position=(value) }
101
+ end
102
+
103
+ describe '#to_hash' do
104
+ subject { instance.to_hash }
105
+
106
+ it { subject.must_be_instance_of(Hash) }
107
+
108
+ it { subject.must_equal(
109
+ border: '',
110
+ colour: {
111
+ background: '',
112
+ foreground: '',
113
+ },
114
+ parent: {
115
+ background: '',
116
+ foreground: '',
117
+ style: '',
118
+ },
119
+ position: {
120
+ y: nil,
121
+ x: nil
122
+ },
123
+ style: '',
124
+ value: 'a')
125
+ }
126
+ end
127
+
128
+ describe '#to_html' do
129
+ subject { instance.to_html }
130
+
131
+ it { subject.must_be_instance_of(String) }
132
+ end
133
+
134
+ describe '#to_s' do
135
+ subject { instance.to_s }
136
+
137
+ it { subject.must_be_instance_of(String) }
138
+
139
+ context 'when a position is specified' do
140
+ let(:position) { Vedeu::Position[17, 2] }
141
+
142
+ it { subject.must_equal("\e[17;2Ha") }
143
+ end
144
+
145
+ context 'when a position is not specified' do
146
+ let(:position) {}
147
+
148
+ it { subject.must_equal('a') }
149
+ end
150
+
151
+ context 'when a colour is specified' do
152
+ let(:colour) { Vedeu::Colour.new(foreground: '#00ff00',
153
+ background: '#005500') }
154
+
155
+ context 'and a parent colour is specified' do
156
+ let(:parent_colour) { Vedeu::Colour.new(foreground: '#ff0000',
157
+ background: '#550000') }
158
+
159
+ it { subject.must_equal("\e[38;2;0;255;0m\e[48;2;0;85;0ma") }
160
+ end
161
+
162
+ context 'and a parent colour is not specified' do
163
+ let(:parent_colour) {}
164
+
165
+ it { subject.must_equal("\e[38;2;0;255;0m\e[48;2;0;85;0ma") }
166
+ end
167
+ end
168
+
169
+ context 'when a colour is not specified' do
170
+ let(:colour) {}
171
+
172
+ it { subject.must_equal('a') }
173
+ end
174
+
175
+ context 'when a style is specified' do
176
+ let(:style) { Vedeu::Style.new('underline') }
177
+
178
+ context 'when a parent style is specified' do
179
+ let(:parent_style) { Vedeu::Style.new('bold') }
180
+
181
+ it { subject.must_equal("\e[4ma") }
182
+ end
183
+
184
+ context 'when a parent style is not specified' do
185
+ let(:parent_style) {}
186
+
187
+ it { subject.must_equal("\e[4ma") }
188
+ end
189
+ end
190
+
191
+ context 'when a style is not specified' do
192
+ let(:style) {}
193
+
194
+ it { subject.must_equal('a') }
195
+ end
196
+
197
+ context 'when the value is nil' do
198
+ let(:_value) {}
199
+
200
+ it { subject.must_equal('') }
201
+ end
202
+ end
203
+
204
+ describe '#value' do
205
+ subject { instance.value }
206
+
207
+ it { subject.must_be_instance_of(String) }
208
+
209
+ context 'when the border attribute is defined' do
210
+ let(:border) { :top_left }
211
+ let(:_value) { "\x6C" }
212
+
213
+ it { subject.must_equal("\e(0l\e(B") }
214
+ end
215
+
216
+ context 'when the border attributes is not defined' do
217
+ it { subject.must_equal('a') }
218
+ end
219
+ end
220
+
221
+ describe '#x' do
222
+ let(:position) { Vedeu::Position[17, 2] }
223
+
224
+ subject { instance.x }
225
+
226
+ context 'when a position is set' do
227
+ it { subject.must_equal(2) }
228
+ end
229
+
230
+ context 'when a position is not set' do
231
+ let(:position) {}
232
+
233
+ it { subject.must_equal(nil) }
234
+ end
235
+ end
236
+
237
+ describe '#y' do
238
+ let(:position) { Vedeu::Position[17, 2] }
239
+
240
+ subject { instance.y }
241
+
242
+ context 'when a position is set' do
243
+ it { subject.must_equal(17) }
244
+ end
245
+
246
+ context 'when a position is not set' do
247
+ let(:position) {}
248
+
249
+ it { subject.must_equal(nil) }
250
+ end
251
+ end
252
+
253
+ end # Char
254
+
255
+ end # Views
256
+
257
+ end # Vedeu
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ module Views
6
+
7
+ describe Chars do
8
+
9
+ let(:described) { Vedeu::Views::Chars }
10
+ let(:instance) { described.new }
11
+
12
+ it { described.superclass.must_equal(Vedeu::Collection) }
13
+
14
+ describe '#initialize' do
15
+ it { instance.must_be_instance_of(described) }
16
+ end
17
+
18
+ end # Chars
19
+
20
+ end # Views
21
+
22
+ end # Vedeu
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ module Views
6
+
7
+ describe Composition do
8
+
9
+ let(:described) { Vedeu::Views::Composition }
10
+ let(:instance) { described.new(attributes) }
11
+ let(:attributes) {
12
+ {
13
+ views: views,
14
+ colour: colour,
15
+ style: style,
16
+ }
17
+ }
18
+ let(:views) { [] }
19
+ let(:colour) {}
20
+ let(:style) {}
21
+
22
+ describe '.build' do
23
+ subject {
24
+ described.build({}) do
25
+ # ...
26
+ end
27
+ }
28
+
29
+ it { subject.must_be_instance_of(described) }
30
+ end
31
+
32
+ describe '#initialize' do
33
+ it { instance.must_be_instance_of(described) }
34
+ it { instance.instance_variable_get('@views').must_equal(views) }
35
+ end
36
+
37
+ describe '#add' do
38
+ let(:child) { Vedeu::Views::View.new }
39
+
40
+ subject { instance.add(child) }
41
+
42
+ it { subject.must_be_instance_of(Vedeu::Views::ViewCollection) }
43
+ end
44
+
45
+ describe '#views' do
46
+ subject { instance.views }
47
+
48
+ it { subject.must_be_instance_of(Vedeu::Views::ViewCollection) }
49
+ end
50
+
51
+ describe '#parent' do
52
+ subject { instance.parent }
53
+
54
+ it { subject.must_be_instance_of(NilClass) }
55
+ end
56
+
57
+ end # Composition
58
+
59
+ end # Views
60
+
61
+ end # Vedeu
@@ -0,0 +1,189 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ module Views
6
+
7
+ describe Line do
8
+
9
+ let(:described) { Vedeu::Views::Line }
10
+ let(:instance) { described.new(attributes) }
11
+ let(:attributes) {
12
+ {
13
+ streams: streams,
14
+ parent: parent,
15
+ colour: colour,
16
+ style: style,
17
+ }
18
+ }
19
+ let(:streams) {
20
+ [
21
+ Vedeu::Views::Stream.new(value: 'Something interesting ',
22
+ parent: streams_parent,
23
+ colour: Vedeu::Colour.new(foreground: '#ffff00'),
24
+ style: Vedeu::Style.new('normal')),
25
+ Vedeu::Views::Stream.new(value: 'on this line ',
26
+ parent: streams_parent,
27
+ colour: Vedeu::Colour.new(foreground: '#00ff00'),
28
+ style: Vedeu::Style.new('normal')),
29
+ Vedeu::Views::Stream.new(value: 'would be cool, eh?',
30
+ parent: streams_parent,
31
+ colour: Vedeu::Colour.new(foreground: '#0000ff'),
32
+ style: Vedeu::Style.new('normal'))
33
+ ]
34
+ }
35
+
36
+ let(:streams_parent) {
37
+ Vedeu::Views::Line.new(streams: nil,
38
+ parent: parent,
39
+ colour: colour,
40
+ style: style)
41
+ }
42
+
43
+ let(:parent) { Vedeu::Views::View.new(name: 'Vedeu::Line') }
44
+ let(:colour) {
45
+ Vedeu::Colour.new(foreground: '#ff0000', background: '#000000')
46
+ }
47
+ let(:style) { Vedeu::Style.new('normal') }
48
+
49
+ describe '#initialize' do
50
+ it { instance.must_be_instance_of(described) }
51
+ it { instance.instance_variable_get('@streams').must_equal(streams) }
52
+ it { instance.instance_variable_get('@parent').must_equal(parent) }
53
+ end
54
+
55
+ describe 'accessors' do
56
+ it { instance.must_respond_to(:parent) }
57
+ it { instance.must_respond_to(:parent=) }
58
+ it { instance.must_respond_to(:attributes) }
59
+ end
60
+
61
+ describe '#add' do
62
+ subject { instance.add(child) }
63
+
64
+ it { instance.must_respond_to(:add) }
65
+
66
+ it { instance.must_respond_to(:<<) }
67
+ end
68
+
69
+ describe '#chars' do
70
+ subject { instance.chars }
71
+
72
+ it { subject.must_be_instance_of(Array) }
73
+
74
+ context 'when there is no content' do
75
+ let(:streams) { [] }
76
+
77
+ it { subject.must_equal([]) }
78
+ end
79
+
80
+ context 'when there is content' do
81
+ it { subject.size.must_equal(53) }
82
+ end
83
+ end
84
+
85
+ describe '#empty?' do
86
+ subject { instance.empty? }
87
+
88
+ context 'when there is no content' do
89
+ let(:streams) { [] }
90
+
91
+ it { subject.must_be_instance_of(TrueClass) }
92
+ end
93
+
94
+ context 'when there is content' do
95
+ it { subject.must_be_instance_of(FalseClass) }
96
+ end
97
+ end
98
+
99
+ describe '#eql?' do
100
+ let(:other) { instance }
101
+
102
+ subject { instance.eql?(other) }
103
+
104
+ it { subject.must_equal(true) }
105
+
106
+ context 'when different to other' do
107
+ let(:other) { described.new(streams: [:other]) }
108
+
109
+ it { subject.must_equal(false) }
110
+ end
111
+ end
112
+
113
+ describe '#name' do
114
+ subject { instance.name }
115
+
116
+ context 'when a parent is defined' do
117
+ it { subject.must_be_instance_of(String) }
118
+ end
119
+
120
+ context 'when a parent is not defined' do
121
+ before { instance.stubs(:parent) }
122
+
123
+ it { subject.must_be_instance_of(NilClass) }
124
+ end
125
+ end
126
+
127
+ describe '#size' do
128
+ subject { instance.size }
129
+
130
+ it { subject.must_be_instance_of(Fixnum) }
131
+
132
+ it 'returns the size of the line' do
133
+ subject.must_equal(53)
134
+ end
135
+ end
136
+
137
+ describe '#streams' do
138
+ subject { instance.streams }
139
+
140
+ it { instance.must_respond_to(:value) }
141
+
142
+ it { subject.must_be_instance_of(Vedeu::Views::Streams) }
143
+ end
144
+
145
+ describe '#to_s' do
146
+ subject { instance.to_s }
147
+
148
+ it { subject.must_be_instance_of(String) }
149
+
150
+ it 'returns the line complete with formatting' do
151
+ # (starts in Line colour)
152
+ # (starts in Line style)
153
+ # Stream 1 colour
154
+ # Stream 1 style
155
+ # Stream 1 value
156
+ # (resets style to Line style)
157
+ # (resets colour to Line colour)
158
+ # Stream 2 colour
159
+ # Stream 2 style
160
+ # Stream 2 value
161
+ # (resets style to Line style)
162
+ # (resets colour to Line colour)
163
+ # Stream 3 colour
164
+ # Stream 3 style
165
+ # Stream 3 value
166
+ # (resets style to Line style)
167
+ # (resets colour to Line colour)
168
+
169
+ subject.must_equal(
170
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m" \
171
+ "\e[24m\e[22m\e[27m" \
172
+ "\e[38;2;255;255;0m" \
173
+ "\e[24m\e[22m\e[27m" \
174
+ 'Something interesting ' \
175
+ "\e[38;2;0;255;0m" \
176
+ "\e[24m\e[22m\e[27m" \
177
+ 'on this line ' \
178
+ "\e[38;2;0;0;255m" \
179
+ "\e[24m\e[22m\e[27m" \
180
+ 'would be cool, eh?'
181
+ )
182
+ end
183
+ end
184
+
185
+ end # Line
186
+
187
+ end # Views
188
+
189
+ end # Vedeu