vedeu 0.4.14 → 0.4.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -3
  3. data/README.md +47 -35
  4. data/docs/views.md +1 -1
  5. data/examples/material_colours_app.rb +0 -5
  6. data/lib/vedeu/cursor/cursor.rb +4 -5
  7. data/lib/vedeu/cursor/move.rb +52 -84
  8. data/lib/vedeu/cursor/refresh_cursor.rb +12 -18
  9. data/lib/vedeu/debug.rb +3 -1
  10. data/lib/vedeu/geometry/area.rb +0 -2
  11. data/lib/vedeu/geometry/coordinate.rb +10 -0
  12. data/lib/vedeu/geometry/dimension.rb +34 -18
  13. data/lib/vedeu/geometry/null_geometry.rb +10 -1
  14. data/lib/vedeu/geometry/position.rb +1 -1
  15. data/lib/vedeu/geometry/position_validator.rb +2 -2
  16. data/lib/vedeu/input/mapper.rb +4 -18
  17. data/lib/vedeu/main_loop.rb +1 -3
  18. data/lib/vedeu/models/cell.rb +11 -17
  19. data/lib/vedeu/models/interface.rb +0 -7
  20. data/lib/vedeu/output/border.rb +34 -61
  21. data/lib/vedeu/output/clear.rb +39 -14
  22. data/lib/vedeu/output/colour.rb +15 -15
  23. data/lib/vedeu/output/esc.rb +1 -1
  24. data/lib/vedeu/output/html_char.rb +18 -24
  25. data/lib/vedeu/output/null_border.rb +14 -10
  26. data/lib/vedeu/output/presentation.rb +32 -8
  27. data/lib/vedeu/output/renderers/all.rb +1 -0
  28. data/lib/vedeu/output/renderers/text_renderer.rb +40 -0
  29. data/lib/vedeu/output/translator.rb +2 -4
  30. data/lib/vedeu/output/viewport.rb +22 -13
  31. data/lib/vedeu/output/virtual_terminal.rb +0 -1
  32. data/lib/vedeu/repositories/repositories/borders.rb +3 -4
  33. data/lib/vedeu/repositories/repositories/cursors.rb +13 -1
  34. data/lib/vedeu/repositories/repositories/geometries.rb +1 -1
  35. data/lib/vedeu/support/all.rb +1 -0
  36. data/lib/vedeu/support/options.rb +65 -0
  37. data/lib/vedeu/support/terminal.rb +3 -5
  38. data/test/lib/vedeu/cursor/cursor_test.rb +0 -5
  39. data/test/lib/vedeu/cursor/move_test.rb +87 -92
  40. data/test/lib/vedeu/geometry/null_geometry_test.rb +3 -1
  41. data/test/lib/vedeu/models/cell_test.rb +13 -16
  42. data/test/lib/vedeu/models/interface_test.rb +0 -17
  43. data/test/lib/vedeu/output/border_test.rb +0 -22
  44. data/test/lib/vedeu/output/clear_test.rb +4 -2
  45. data/test/lib/vedeu/output/null_border_test.rb +8 -4
  46. data/test/lib/vedeu/output/renderers/text_renderer_test.rb +24 -0
  47. data/test/lib/vedeu/repositories/repositories/borders_test.rb +1 -13
  48. data/test/lib/vedeu/support/options_test.rb +70 -0
  49. data/vedeu.gemspec +1 -1
  50. metadata +8 -2
@@ -4,6 +4,22 @@ module Vedeu
4
4
  #
5
5
  class Clear
6
6
 
7
+ extend Forwardable
8
+
9
+ def_delegators :border,
10
+ :bx,
11
+ :by
12
+
13
+ def_delegators :geometry,
14
+ :x,
15
+ :y
16
+
17
+ def_delegators :interface,
18
+ :colour,
19
+ :name,
20
+ :style,
21
+ :visible?
22
+
7
23
  class << self
8
24
 
9
25
  # Clears the area defined by the interface.
@@ -42,14 +58,14 @@ module Vedeu
42
58
  #
43
59
  # @return [Array<Array<Vedeu::Char>>]
44
60
  def clear
45
- if interface.visible?
46
- Vedeu.log(type: :output, message: "Clearing: '#{interface.name}'")
61
+ if visible?
62
+ Vedeu.log(type: :output, message: "Clearing: '#{name}'")
47
63
 
48
64
  @clear ||= Array.new(height) do |iy|
49
65
  Array.new(width) do |ix|
50
66
  Vedeu::Char.new(value: ' ',
51
- colour: colour,
52
- style: interface.style,
67
+ colour: clear_colour,
68
+ style: style,
53
69
  position: position(iy, ix))
54
70
  end
55
71
  end
@@ -80,6 +96,11 @@ module Vedeu
80
96
  # @return [Interface]
81
97
  attr_reader :interface
82
98
 
99
+ # @return (see Vedeu::Borders#by_name)
100
+ def border
101
+ @border ||= Vedeu.borders.by_name(name)
102
+ end
103
+
83
104
  # @return [Boolean] Indicates whether the area occupied by the border of the
84
105
  # interface should be cleared also.
85
106
  def clear_border?
@@ -88,12 +109,12 @@ module Vedeu
88
109
 
89
110
  # @return [Vedeu::Colour] The default background and foreground colours for
90
111
  # the terminal, or the colours of the interface.
91
- def colour
112
+ def clear_colour
92
113
  if use_terminal_colours?
93
- Colour.new(background: :default, foreground: :default)
114
+ Vedeu::Colour.new(background: :default, foreground: :default)
94
115
 
95
116
  else
96
- interface.colour
117
+ colour
97
118
 
98
119
  end
99
120
  end
@@ -106,15 +127,20 @@ module Vedeu
106
127
  }
107
128
  end
108
129
 
130
+ # @return (see Vedeu::Geometries#by_name)
131
+ def geometry
132
+ @geometry ||= Vedeu.geometries.by_name(name)
133
+ end
134
+
109
135
  # Returns the height of the area to be cleared.
110
136
  #
111
137
  # @return [Fixnum]
112
138
  def height
113
139
  if clear_border?
114
- interface.height
140
+ geometry.height
115
141
 
116
142
  else
117
- interface.border.height
143
+ border.height
118
144
 
119
145
  end
120
146
  end
@@ -129,10 +155,10 @@ module Vedeu
129
155
  # @return [Vedeu::IndexPosition]
130
156
  def position(iy, ix)
131
157
  if clear_border?
132
- Vedeu::IndexPosition[iy, ix, interface.y, interface.x]
158
+ Vedeu::IndexPosition[iy, ix, y, x]
133
159
 
134
160
  else
135
- Vedeu::IndexPosition[iy, ix, interface.border.by, interface.border.bx]
161
+ Vedeu::IndexPosition[iy, ix, by, bx]
136
162
 
137
163
  end
138
164
  end
@@ -148,10 +174,10 @@ module Vedeu
148
174
  # @return [Fixnum]
149
175
  def width
150
176
  if clear_border?
151
- interface.width
177
+ geometry.width
152
178
 
153
179
  else
154
- interface.border.width
180
+ border.width
155
181
 
156
182
  end
157
183
  end
@@ -159,4 +185,3 @@ module Vedeu
159
185
  end # Clear
160
186
 
161
187
  end # Vedeu
162
-
@@ -23,21 +23,10 @@ module Vedeu
23
23
  # @return [Hash]
24
24
  attr_reader :attributes
25
25
 
26
- # @!attribute [r] background
27
- # @return [Background|String]
28
- attr_reader :background
29
-
30
- # @!attribute [r] foreground
31
- # @return [Foreground|String]
32
- attr_reader :foreground
33
-
34
26
  # @param value []
35
27
  # @return [Object]
36
28
  def self.coerce(value)
37
- if value.nil?
38
- new
39
-
40
- elsif value.is_a?(self)
29
+ if value.is_a?(self)
41
30
  value
42
31
 
43
32
  elsif value.is_a?(Hash)
@@ -53,7 +42,7 @@ module Vedeu
53
42
  end
54
43
 
55
44
  else
56
- new(value)
45
+ new
57
46
 
58
47
  end
59
48
  end
@@ -66,9 +55,13 @@ module Vedeu
66
55
  # @return [Colour]
67
56
  def initialize(attributes = {})
68
57
  @attributes = defaults.merge!(attributes)
58
+ end
69
59
 
70
- @background = Vedeu::Background.coerce(@attributes[:background])
71
- @foreground = Vedeu::Foreground.coerce(@attributes[:foreground])
60
+ # Returns the background colour as a Vedeu::Background.
61
+ #
62
+ # @return [Vedeu::Background]
63
+ def background
64
+ @background ||= Vedeu::Background.coerce(attributes[:background])
72
65
  end
73
66
 
74
67
  # Converts the value into a Vedeu::Background.
@@ -87,6 +80,13 @@ module Vedeu
87
80
  end
88
81
  alias_method :==, :eql?
89
82
 
83
+ # Returns the foreground colour as a Vedeu::Foreground.
84
+ #
85
+ # @return [Vedeu::Foreground]
86
+ def foreground
87
+ @foreground ||= Vedeu::Foreground.coerce(attributes[:foreground])
88
+ end
89
+
90
90
  # Converts the value into a Vedeu::Foreground.
91
91
  #
92
92
  # @param value [String]
@@ -118,7 +118,7 @@ module Vedeu
118
118
  #
119
119
  # @param block [Proc]
120
120
  # @return [String]
121
- def border(&block)
121
+ def border
122
122
  return '' unless block_given?
123
123
 
124
124
  [border_on, yield, border_off].join
@@ -54,7 +54,6 @@ module Vedeu
54
54
  # @return [String]
55
55
  def border_style
56
56
  case border
57
- when nil then ''
58
57
  when :top_horizontal then border_css('top')
59
58
  when :left_vertical then border_css('left')
60
59
  when :right_vertical then border_css('right')
@@ -63,10 +62,7 @@ module Vedeu
63
62
  when :top_right then [border_css('top'), border_css('right')].join
64
63
  when :bottom_left then [border_css('bottom'), border_css('left')].join
65
64
  when :bottom_right then [border_css('bottom'), border_css('right')].join
66
- when :horizontal then ''
67
- when :vertical then ''
68
65
  else
69
- # ... should not get here
70
66
  ''
71
67
  end
72
68
  end
@@ -78,41 +74,39 @@ module Vedeu
78
74
 
79
75
  # @return [String]
80
76
  def fg
81
- @fg ||= colour_fg || parent_fg || '#222'
77
+ @fg ||= colour_fg
82
78
  end
83
79
 
84
80
  # @return [String]
85
81
  def bg
86
- @bg ||= colour_bg || parent_bg || '#000'
82
+ @bg ||= colour_bg
87
83
  end
88
84
 
89
- # @return [String|NilClass]
85
+ # @return [String]
90
86
  def colour_bg
91
- if char.background && defined_value?(char.background.to_html)
87
+ if defined_value?(char.background.to_html)
92
88
  char.background.to_html
89
+
90
+ elsif defined_value?(char.parent_background.to_html)
91
+ char.parent_background.to_html
92
+
93
+ else
94
+ '#000'
95
+
93
96
  end
94
97
  end
95
98
 
96
- # @return [String|NilClass]
99
+ # @return [String]
97
100
  def colour_fg
98
- if char.foreground && defined_value?(char.foreground.to_html)
101
+ if defined_value?(char.foreground.to_html)
99
102
  char.foreground.to_html
100
- end
101
- end
102
-
103
- # @return [String|NilClass]
104
- def parent_bg
105
- if char.parent_background &&
106
- defined_value?(char.parent_background.to_html)
107
- char.parent_background.to_html
108
- end
109
- end
110
103
 
111
- # @return [String|NilClass]
112
- def parent_fg
113
- if char.parent_foreground &&
114
- defined_value?(char.parent_foreground.to_html)
104
+ elsif defined_value?(char.parent_foreground.to_html)
115
105
  char.parent_foreground.to_html
106
+
107
+ else
108
+ '#222'
109
+
116
110
  end
117
111
  end
118
112
 
@@ -5,33 +5,41 @@ module Vedeu
5
5
  #
6
6
  class NullBorder
7
7
 
8
+ # @!attribute [r] name
9
+ # @return [String|NilClass]
10
+ attr_reader :name
11
+
8
12
  # Returns a new instance of Vedeu::NullBorder.
9
13
  #
10
- # @param interface [Vedeu::Interface]
11
- # @return [Vedeu::NullBorder]
12
- def initialize(interface)
13
- @interface = interface
14
+ # @param name [String|NilClass]
15
+ # @return [Vedeu::NullBorder]S
16
+ def initialize(name = nil)
17
+ @name = name
14
18
  end
15
19
 
16
20
  # @return [Fixnum]
17
21
  def bx
18
22
  geometry.x
19
23
  end
24
+ alias_method :x, :bx
20
25
 
21
26
  # @return [Fixnum]
22
27
  def bxn
23
28
  geometry.xn
24
29
  end
30
+ alias_method :xn, :bxn
25
31
 
26
32
  # @return [Fixnum]
27
33
  def by
28
34
  geometry.y
29
35
  end
36
+ alias_method :y, :by
30
37
 
31
38
  # @return [Fixnum]
32
39
  def byn
33
40
  geometry.yn
34
41
  end
42
+ alias_method :yn, :byn
35
43
 
36
44
  # @return [FalseClass]
37
45
  def enabled?
@@ -55,15 +63,11 @@ module Vedeu
55
63
 
56
64
  private
57
65
 
58
- # @!attribute [r] interface
59
- # @return [Vedeu::Interface]
60
- attr_reader :interface
61
-
62
66
  # Returns the geometry for the interface.
63
67
  #
64
- # @return [Vedeu::Geometry]
68
+ # @return (see Vedeu::Geometries#by_name)
65
69
  def geometry
66
- interface.geometry
70
+ @geometry ||= Vedeu.geometries.by_name(name)
67
71
  end
68
72
 
69
73
  end # NullBorder
@@ -5,9 +5,15 @@ module Vedeu
5
5
  #
6
6
  module Presentation
7
7
 
8
- # @return [Vedeu::Background|NilClass]
8
+ # @return [Vedeu::Background]
9
9
  def background
10
- colour.background if colour
10
+ if colour
11
+ colour.background
12
+
13
+ else
14
+ Vedeu::Background.new
15
+
16
+ end
11
17
  end
12
18
 
13
19
  # @return [Vedeu::Colour]
@@ -29,14 +35,26 @@ module Vedeu
29
35
  @colour = Vedeu::Colour.coerce(value)
30
36
  end
31
37
 
32
- # @return [Vedeu::Foreground|NilClass]
38
+ # @return [Vedeu::Foreground]
33
39
  def foreground
34
- colour.foreground if colour
40
+ if colour
41
+ colour.foreground
42
+
43
+ else
44
+ Vedeu::Foreground.new
45
+
46
+ end
35
47
  end
36
48
 
37
- # @return [Vedeu::Background|NilClass]
49
+ # @return [Vedeu::Background]
38
50
  def parent_background
39
- parent_colour.background if parent_colour
51
+ if parent_colour
52
+ parent_colour.background
53
+
54
+ else
55
+ Vedeu::Background.new
56
+
57
+ end
40
58
  end
41
59
 
42
60
  # @return [String|NilClass]
@@ -44,9 +62,15 @@ module Vedeu
44
62
  parent.colour if parent
45
63
  end
46
64
 
47
- # @return [Vedeu::Foreground|NilClass]
65
+ # @return [Vedeu::Foreground]
48
66
  def parent_foreground
49
- parent_colour.foreground if parent_colour
67
+ if parent_colour
68
+ parent_colour.foreground
69
+
70
+ else
71
+ Vedeu::Foreground.new
72
+
73
+ end
50
74
  end
51
75
 
52
76
  # @return [String|NilClass]
@@ -3,6 +3,7 @@ require_relative 'html_renderer'
3
3
  require_relative 'json_renderer'
4
4
  require_relative 'null_renderer'
5
5
  require_relative 'terminal_renderer'
6
+ require_relative 'text_renderer'
6
7
 
7
8
  module Vedeu
8
9
 
@@ -0,0 +1,40 @@
1
+ module Vedeu
2
+
3
+ # Converts a grid of {Vedeu::Char} objects into a stream of escape sequences
4
+ # and content.
5
+ #
6
+ class TextRenderer
7
+
8
+ # @param output [Array<Array<Vedeu::Char>>]
9
+ # @return [String]
10
+ def self.render(*output)
11
+ new(*output).render
12
+ end
13
+
14
+ # Returns a new instance of Vedeu::TextRenderer.
15
+ #
16
+ # @param output [Array<Array<Vedeu::Char>>]
17
+ # @return [Vedeu::TextRenderer]
18
+ def initialize(*output)
19
+ @output = output
20
+ end
21
+
22
+ # @return [String]
23
+ def render
24
+ parsed
25
+ end
26
+
27
+ private
28
+
29
+ # @!attribute [r] output
30
+ # @return [Array<Array<Vedeu::Char>>]
31
+ attr_reader :output
32
+
33
+ # @return [String]
34
+ def parsed
35
+ Vedeu::Compressor.new(output).render
36
+ end
37
+
38
+ end # TextRenderer
39
+
40
+ end # Vedeu