vedeu 0.4.14 → 0.4.15

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.
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