vedeu 0.4.9 → 0.4.10

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/lib/vedeu/api.rb +8 -0
  3. data/lib/vedeu/application.rb +2 -0
  4. data/lib/vedeu/bindings.rb +3 -0
  5. data/lib/vedeu/configuration/configuration.rb +1 -1
  6. data/lib/vedeu/cursor/cursor.rb +1 -1
  7. data/lib/vedeu/cursor/move.rb +1 -1
  8. data/lib/vedeu/cursor/refresh_cursor.rb +2 -0
  9. data/lib/vedeu/cursor/toggle.rb +1 -1
  10. data/lib/vedeu/debug.rb +36 -1
  11. data/lib/vedeu/distributed/client.rb +2 -0
  12. data/lib/vedeu/distributed/subprocess.rb +2 -0
  13. data/lib/vedeu/distributed/test_application.rb +2 -0
  14. data/lib/vedeu/distributed/uri.rb +2 -0
  15. data/lib/vedeu/events/event.rb +1 -1
  16. data/lib/vedeu/events/trigger.rb +2 -0
  17. data/lib/vedeu/geometry/all.rb +0 -1
  18. data/lib/vedeu/geometry/area.rb +22 -0
  19. data/lib/vedeu/geometry/centre.rb +2 -0
  20. data/lib/vedeu/geometry/content.rb +2 -0
  21. data/lib/vedeu/geometry/coordinate.rb +2 -0
  22. data/lib/vedeu/geometry/dimension.rb +2 -0
  23. data/lib/vedeu/geometry/geometry.rb +8 -3
  24. data/lib/vedeu/geometry/grid.rb +2 -0
  25. data/lib/vedeu/geometry/index_position.rb +21 -0
  26. data/lib/vedeu/geometry/limit.rb +2 -0
  27. data/lib/vedeu/geometry/position.rb +1 -1
  28. data/lib/vedeu/geometry/position_index.rb +2 -0
  29. data/lib/vedeu/geometry/position_validator.rb +2 -0
  30. data/lib/vedeu/input/input.rb +1 -1
  31. data/lib/vedeu/input/key.rb +1 -1
  32. data/lib/vedeu/input/keymap.rb +2 -0
  33. data/lib/vedeu/input/mapper.rb +8 -0
  34. data/lib/vedeu/launcher.rb +2 -0
  35. data/lib/vedeu/main_loop.rb +1 -3
  36. data/lib/vedeu/models/cell.rb +2 -0
  37. data/lib/vedeu/models/composition.rb +1 -1
  38. data/lib/vedeu/models/group.rb +1 -1
  39. data/lib/vedeu/models/interface.rb +35 -3
  40. data/lib/vedeu/models/line.rb +6 -1
  41. data/lib/vedeu/models/menu.rb +1 -1
  42. data/lib/vedeu/models/stream.rb +6 -17
  43. data/lib/vedeu/output/all.rb +3 -2
  44. data/lib/vedeu/output/background.rb +26 -0
  45. data/lib/vedeu/output/border.rb +105 -25
  46. data/lib/vedeu/output/clear.rb +17 -10
  47. data/lib/vedeu/output/colour.rb +1 -1
  48. data/lib/vedeu/output/compositor.rb +4 -1
  49. data/lib/vedeu/output/foreground.rb +26 -0
  50. data/lib/vedeu/output/html_char.rb +2 -0
  51. data/lib/vedeu/output/null_border.rb +49 -0
  52. data/lib/vedeu/output/output.rb +8 -44
  53. data/lib/vedeu/output/renderers/all.rb +3 -0
  54. data/lib/vedeu/output/{renderer.rb → renderers/file_renderer.rb} +14 -6
  55. data/lib/vedeu/output/{html_renderer.rb → renderers/html_renderer.rb} +3 -1
  56. data/lib/vedeu/output/renderers/terminal_renderer.rb +50 -0
  57. data/lib/vedeu/output/text.rb +1 -1
  58. data/lib/vedeu/output/translator.rb +21 -2
  59. data/lib/vedeu/output/viewport.rb +17 -50
  60. data/lib/vedeu/output/virtual_terminal.rb +2 -0
  61. data/lib/vedeu/output/wordwrap.rb +2 -0
  62. data/lib/vedeu/repositories/all.rb +82 -0
  63. data/lib/vedeu/repositories/collection.rb +16 -0
  64. data/lib/vedeu/repositories/repository.rb +2 -0
  65. data/lib/vedeu/support/log.rb +3 -0
  66. data/lib/vedeu/support/sentence.rb +2 -0
  67. data/lib/vedeu/support/template.rb +2 -0
  68. data/lib/vedeu/support/terminal.rb +6 -1
  69. data/lib/vedeu/support/trace.rb +2 -0
  70. data/lib/vedeu/support/visible.rb +6 -0
  71. data/test/lib/vedeu/dsl/components/border_test.rb +0 -270
  72. data/test/lib/vedeu/dsl/shared/text_test.rb +19 -0
  73. data/test/lib/vedeu/geometry/area_test.rb +32 -0
  74. data/test/lib/vedeu/geometry/index_position_test.rb +36 -0
  75. data/test/lib/vedeu/models/interface_test.rb +42 -1
  76. data/test/lib/vedeu/models/line_test.rb +15 -1
  77. data/test/lib/vedeu/models/stream_test.rb +15 -1
  78. data/test/lib/vedeu/output/background_test.rb +4 -2
  79. data/test/lib/vedeu/output/border_test.rb +229 -127
  80. data/test/lib/vedeu/output/clear_test.rb +14 -0
  81. data/test/lib/vedeu/output/foreground_test.rb +4 -2
  82. data/test/lib/vedeu/output/null_border_test.rb +53 -0
  83. data/test/lib/vedeu/output/output_test.rb +2 -0
  84. data/test/lib/vedeu/output/{renderer_test.rb → renderers/file_renderer_test.rb} +5 -5
  85. data/test/lib/vedeu/output/renderers/html_renderer_test.rb +71 -0
  86. data/test/lib/vedeu/output/renderers/terminal_renderer_test.rb +24 -0
  87. data/test/lib/vedeu/output/viewport_test.rb +100 -74
  88. data/vedeu.gemspec +1 -1
  89. metadata +15 -11
  90. data/lib/vedeu/geometry/bounding_area.rb +0 -136
  91. data/test/lib/vedeu/geometry/bounding_area_test.rb +0 -123
  92. data/test/lib/vedeu/output/html_renderer_test.rb +0 -42
@@ -4,18 +4,23 @@ module Vedeu
4
4
  #
5
5
  class Clear
6
6
 
7
- # Clears the area defined by the interface.
8
- #
9
- # @return [Array|String]
10
- # @see #initialize
11
- def self.clear(interface)
12
- new(interface).write
7
+ class << self
8
+
9
+ # Clears the area defined by the interface.
10
+ #
11
+ # @return [Array|String]
12
+ # @see #initialize
13
+ def clear(interface)
14
+ new(interface).write
15
+ end
16
+ alias_method :render, :clear
17
+
13
18
  end
14
19
 
15
- # Return a new instance of Output.
20
+ # Return a new instance of Vedeu::Clear.
16
21
  #
17
22
  # @param interface [Interface]
18
- # @return [Output]
23
+ # @return [Vedeu::Clear]
19
24
  def initialize(interface)
20
25
  @interface = interface
21
26
  end
@@ -26,7 +31,7 @@ module Vedeu
26
31
  #
27
32
  # @return [Array<Array<Vedeu::Char>>]
28
33
  def clear
29
- Array.new(interface.height) do |iy|
34
+ @clear ||= Array.new(interface.height) do |iy|
30
35
  Array.new(interface.width) do |ix|
31
36
  Vedeu::Char.new({ value: ' ',
32
37
  colour: interface.colour,
@@ -48,7 +53,9 @@ module Vedeu
48
53
  Vedeu::HTMLRenderer.to_file(Vedeu::VirtualBuffer.retrieve)
49
54
  end
50
55
 
51
- Vedeu::Terminal.output(Vedeu::Renderer.render(clear))
56
+ # Vedeu::FileRenderer.render(clear)
57
+
58
+ Vedeu::TerminalRenderer.render(clear)
52
59
  end
53
60
 
54
61
  private
@@ -22,7 +22,7 @@ module Vedeu
22
22
  # @return [Foreground|String]
23
23
  attr_reader :foreground
24
24
 
25
- # Returns a new instance of Colour.
25
+ # Returns a new instance of Vedeu::Colour.
26
26
  #
27
27
  # @param attributes [Hash]
28
28
  # @option attributes background [String]
@@ -20,7 +20,7 @@ module Vedeu
20
20
  new(name).compose
21
21
  end
22
22
 
23
- # Initialize a new Compositor.
23
+ # Initialize a new Vedeu::Compositor.
24
24
  #
25
25
  # @param name [String] The name of the buffer.
26
26
  # @return [Compositor]
@@ -28,6 +28,9 @@ module Vedeu
28
28
  @name = name
29
29
  end
30
30
 
31
+ # Applies any overridden colours or styles in the buffered view to the
32
+ # stored interface.
33
+ #
31
34
  # @return [Array<Interface>]
32
35
  def compose
33
36
  buffer.each do |view|
@@ -11,6 +11,32 @@ module Vedeu
11
11
 
12
12
  private
13
13
 
14
+ # Registers a HTML/CSS colour code and escape sequence to reduce processing.
15
+ #
16
+ # @param colour [String] A HTML/CSS colour code.
17
+ # @param escape_sequence [String] The HTML/CSS colour code as an escape
18
+ # sequence.
19
+ # @return [String]
20
+ def register(colour, escape_sequence)
21
+ Vedeu.foreground_colours.register(colour, escape_sequence)
22
+ end
23
+
24
+ # Returns a boolean indicating the HTML/CSS colour code has been registered.
25
+ #
26
+ # @param colour [String]
27
+ # @return [Boolean]
28
+ def registered?(colour)
29
+ Vedeu.foreground_colours.registered?(colour)
30
+ end
31
+
32
+ # Retrieves the escape sequence for the HTML/CSS colour code.
33
+ #
34
+ # @param colour [String]
35
+ # @return [String]
36
+ def retrieve(colour)
37
+ Vedeu.foreground_colours.retrieve(colour)
38
+ end
39
+
14
40
  # @return [String]
15
41
  def named_codes
16
42
  Vedeu::Esc.foreground_codes[colour]
@@ -14,6 +14,8 @@ module Vedeu
14
14
  new(char).render
15
15
  end
16
16
 
17
+ # Returns a new instance of Vedeu::HTMLChar.
18
+ #
17
19
  # @param char [Vedeu::Char]
18
20
  # @return [Vedeu::HTMLChar]
19
21
  def initialize(char)
@@ -0,0 +1,49 @@
1
+ module Vedeu
2
+
3
+ # Provides a non-existent Vedeu::Border that acts like the real thing, but
4
+ # does nothing.
5
+ #
6
+ class NullBorder
7
+
8
+ # Returns a new instance of Vedeu::NullBorder.
9
+ #
10
+ # @param interface [Vedeu::Interface]
11
+ # @return [Vedeu::NullBorder]
12
+ def initialize(interface)
13
+ @interface = interface
14
+ end
15
+
16
+ # @return [Fixnum]
17
+ def bx
18
+ interface.x
19
+ end
20
+
21
+ # @return [Fixnum]
22
+ def bxn
23
+ interface.xn
24
+ end
25
+
26
+ # @return [Fixnum]
27
+ def by
28
+ interface.y
29
+ end
30
+
31
+ # @return [Fixnum]
32
+ def byn
33
+ interface.yn
34
+ end
35
+
36
+ # @return [Array]
37
+ def render
38
+ []
39
+ end
40
+
41
+ private
42
+
43
+ # @!attribute [r] interface
44
+ # @return [Vedeu::Interface]
45
+ attr_reader :interface
46
+
47
+ end # NullBorder
48
+
49
+ end # Vedeu
@@ -1,7 +1,4 @@
1
- require 'vedeu/output/clear'
2
- require 'vedeu/output/html_renderer'
3
- require 'vedeu/output/renderer'
4
- require 'vedeu/output/viewport'
1
+ require 'vedeu/output/renderers/all'
5
2
  require 'vedeu/output/virtual_buffer'
6
3
  require 'vedeu/support/terminal'
7
4
 
@@ -20,7 +17,7 @@ module Vedeu
20
17
  new(interface).render
21
18
  end
22
19
 
23
- # Return a new instance of Output.
20
+ # Return a new instance of Vedeu::Output.
24
21
  #
25
22
  # @param interface [Interface]
26
23
  # @return [Output]
@@ -33,12 +30,14 @@ module Vedeu
33
30
  # @return [Array]
34
31
  def render
35
32
  if Vedeu::Configuration.drb?
36
- Vedeu.trigger(:_drb_store_output_, virtual_view)
33
+ Vedeu.trigger(:_drb_store_output_, rendered)
37
34
 
38
35
  Vedeu::HTMLRenderer.to_file(Vedeu::VirtualBuffer.retrieve)
39
36
  end
40
37
 
41
- Vedeu::Terminal.output(Vedeu::Renderer.render(virtual_view))
38
+ # Vedeu::FileRenderer.render(rendered)
39
+
40
+ Vedeu::TerminalRenderer.render(rendered)
42
41
  end
43
42
 
44
43
  private
@@ -47,43 +46,8 @@ module Vedeu
47
46
  # @return [Interface]
48
47
  attr_reader :interface
49
48
 
50
- # Builds up a virtual view; a grid of Vedeu::Char objects- each one holding
51
- # one character along with its colour, style and position attributes.
52
- #
53
- # @note
54
- # omg!
55
- #
56
- # @return [Array<Array<Vedeu::Char>>]
57
- def virtual_view
58
- out = [ clear_area_first! ]
59
-
60
- Vedeu.log(type: :output, message: "Rendering: '#{interface.name}'")
61
-
62
- viewport.each_with_index do |line, iy|
63
- row = []
64
- line.each_with_index do |char, ix|
65
- row << if char.x != ix || char.y != iy
66
- char.position = Vedeu::IndexPosition[iy, ix, interface.top, interface.left]
67
- char
68
-
69
- else
70
- char
71
-
72
- end
73
- end
74
- out << row
75
- end
76
- out
77
- end
78
-
79
- # @return [Array<Array<Vedeu::Char>>]
80
- def clear_area_first!
81
- Vedeu::Clear.new(interface).clear
82
- end
83
-
84
- # @return [void]
85
- def viewport
86
- @viewport ||= Vedeu::Viewport.new(interface).render
49
+ def rendered
50
+ @rendered ||= interface.render
87
51
  end
88
52
 
89
53
  end # Output
@@ -0,0 +1,3 @@
1
+ require 'vedeu/output/renderers/file_renderer'
2
+ require 'vedeu/output/renderers/html_renderer'
3
+ require 'vedeu/output/renderers/terminal_renderer'
@@ -1,9 +1,10 @@
1
1
  module Vedeu
2
2
 
3
3
  # Converts a grid of {Vedeu::Char} objects into a stream of escape sequences
4
- # and content suitable for a terminal.
4
+ # and content suitable for a terminal, and writes them to a file in the /tmp
5
+ # directory.
5
6
  #
6
- class Renderer
7
+ class FileRenderer
7
8
 
8
9
  # @param output [Array<Array<Vedeu::Char>>]
9
10
  # @return [String]
@@ -11,15 +12,17 @@ module Vedeu
11
12
  new(*output).render
12
13
  end
13
14
 
15
+ # Returns a new instance of Vedeu::FileRenderer.
16
+ #
14
17
  # @param output [Array<Array<Vedeu::Char>>]
15
- # @return [Vedeu::Renderer]
18
+ # @return [Vedeu::FileRenderer]
16
19
  def initialize(*output)
17
- @output = output
20
+ @output = output
18
21
  end
19
22
 
20
23
  # @return [String]
21
24
  def render
22
- Array(output).flatten.map(&:to_s).join
25
+ File.open("/tmp/out_#{Time.now.to_f}", 'w') { |f| f.write(parsed) }
23
26
  end
24
27
 
25
28
  private
@@ -28,6 +31,11 @@ module Vedeu
28
31
  # @return [Array<Array<Vedeu::Char>>]
29
32
  attr_reader :output
30
33
 
31
- end # Renderer
34
+ # @return [String]
35
+ def parsed
36
+ Array(output).flatten.map(&:to_s).join
37
+ end
38
+
39
+ end # FileRenderer
32
40
 
33
41
  end # Vedeu
@@ -17,6 +17,8 @@ module Vedeu
17
17
  new(output).to_file(path)
18
18
  end
19
19
 
20
+ # Returns a new instance of Vedeu::HTMLRenderer.
21
+ #
20
22
  # @param output [Array<Array<Vedeu::Char>>]
21
23
  # @return [Vedeu::HTMLRenderer]
22
24
  def initialize(output)
@@ -63,7 +65,7 @@ module Vedeu
63
65
 
64
66
  # @return [String]
65
67
  def template
66
- File.dirname(__FILE__) + '/templates/html_renderer.vedeu'
68
+ File.dirname(__FILE__) + '/../templates/html_renderer.vedeu'
67
69
  end
68
70
 
69
71
  # @return [String]
@@ -0,0 +1,50 @@
1
+ module Vedeu
2
+
3
+ # Converts a grid of {Vedeu::Char} objects into a stream of escape sequences
4
+ # and content suitable for a terminal.
5
+ #
6
+ class TerminalRenderer
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::TerminalRenderer.
15
+ #
16
+ # @param output [Array<Array<Vedeu::Char>>]
17
+ # @return [Vedeu::TerminalRenderer]
18
+ def initialize(*output)
19
+ @output = output
20
+ end
21
+
22
+ # @return [Array<String>]
23
+ def render
24
+ Vedeu::Terminal.output(hide_cursor, parsed, show_cursor)
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 show_cursor
35
+ Vedeu::Esc.string(:show_cursor)
36
+ end
37
+
38
+ # @return [String]
39
+ def parsed
40
+ Array(output).flatten.map(&:to_s).join
41
+ end
42
+
43
+ # @return [String]
44
+ def hide_cursor
45
+ Vedeu::Esc.string(:hide_cursor)
46
+ end
47
+
48
+ end # TerminalRenderer
49
+
50
+ end # Vedeu
@@ -9,7 +9,7 @@ module Vedeu
9
9
  new(value, options).aligned
10
10
  end
11
11
 
12
- # Returns a new instance of Text.
12
+ # Returns a new instance of Vedeu::Text.
13
13
  #
14
14
  # @param value [String]
15
15
  # @param options [Hash]
@@ -38,7 +38,7 @@ module Vedeu
38
38
  new(colour).escape_sequence
39
39
  end
40
40
 
41
- # Return a new instance of Translator.
41
+ # Return a new instance of Vedeu::Translator.
42
42
  #
43
43
  # @param colour [Fixnum|String|Symbol]
44
44
  # @return [Translator]
@@ -52,6 +52,9 @@ module Vedeu
52
52
  if no_colour?
53
53
  ''
54
54
 
55
+ elsif registered?(colour)
56
+ retrieve(colour)
57
+
55
58
  elsif rgb?
56
59
  rgb
57
60
 
@@ -81,6 +84,22 @@ module Vedeu
81
84
 
82
85
  private
83
86
 
87
+ # Subclasses implement this method.
88
+ #
89
+ # @param colour [String]
90
+ # @return [String]
91
+ def retrieve(colour)
92
+ ''
93
+ end
94
+
95
+ # Subclasses implement this method.
96
+ #
97
+ # @param colour [String]
98
+ # @return [FalseClass]
99
+ def registered?(colour)
100
+ false
101
+ end
102
+
84
103
  # @return [Boolean]
85
104
  def no_colour?
86
105
  colour.nil? || colour.to_s.empty?
@@ -136,7 +155,7 @@ module Vedeu
136
155
  # @return [String]
137
156
  def rgb
138
157
  if Vedeu::Configuration.colour_mode == 16777216
139
- sprintf(rgb_prefix, *css_to_rgb)
158
+ register(colour, sprintf(rgb_prefix, *css_to_rgb))
140
159
 
141
160
  else
142
161
  numbered
@@ -24,7 +24,13 @@ module Vedeu
24
24
  :height,
25
25
  :width
26
26
 
27
- # Returns an instance of Viewport.
27
+ # @param interface [Vedeu::Interface]
28
+ # @return [Array<Array<Vedeu::Char>>]
29
+ def self.render(interface)
30
+ new(interface).render
31
+ end
32
+
33
+ # Returns an instance of Vedeu::Viewport.
28
34
  #
29
35
  # @param interface [Interface] An instance of interface.
30
36
  # @return [Viewport]
@@ -37,30 +43,25 @@ module Vedeu
37
43
  #
38
44
  # @return [Array<Array<String>>]
39
45
  def render
40
- if border?
41
- out = []
46
+ Vedeu.log(type: :output, message: "Rendering: '#{interface.name}'")
42
47
 
43
- out << border.top if border.top?
48
+ out = []
44
49
 
45
- show[0...bordered_height].each do |line|
46
- out << [border.left, line[0...bordered_width], border.right].flatten
50
+ show[0...bordered_height].each_with_index do |line, iy|
51
+ line[0...bordered_width].each_with_index do |column, ix|
52
+ column.position = IndexPosition[iy, ix, interface.border.by, interface.border.bx]
53
+ out << column
47
54
  end
48
-
49
- out << border.bottom if border.bottom?
50
-
51
- out
52
-
53
- else
54
- show
55
-
56
55
  end
56
+
57
+ out
57
58
  end
58
59
 
59
60
  # Returns a string representation of the viewport.
60
61
  #
61
62
  # @return [String]
62
63
  def to_s
63
- render.map(&:join).join("\n")
64
+ render.map(&:to_s).join("\n")
64
65
  end
65
66
 
66
67
  private
@@ -80,41 +81,7 @@ module Vedeu
80
81
  def show
81
82
  return [] unless lines?
82
83
 
83
- padded_lines.map { |line| padded_columns(line) }
84
- end
85
-
86
- # Returns the lines, padded where necessary for the viewport.
87
- #
88
- # @return [Array<Array<String>>]
89
- def padded_lines
90
- visible = lines[rows] || []
91
-
92
- pad(visible, :height)
93
- end
94
-
95
- # Returns the columns, padded where necessary for the given line.
96
- #
97
- # @param line [Array<String>]
98
- # @return [Array<String>]
99
- def padded_columns(line)
100
- visible = line.chars[columns] || []
101
-
102
- pad(visible, :width)
103
- end
104
-
105
- # Pads the number of rows or columns to always return an Array of the same
106
- # length for each viewport or line respectively.
107
- #
108
- # @param visible [Array<Array<String>>|Array<String>]
109
- # @param dimension [Symbol] The dimension to pad (:height or :width).
110
- # @return [Array<Array<String>>|Array<String>]
111
- def pad(visible, dimension)
112
- dim = send(dimension)
113
- size = visible.size
114
-
115
- return visible unless size < dim
116
-
117
- visible + [Vedeu::Char.new({ value: ' ' })] * (dim - size)
84
+ (lines[rows] || []).map { |line| (line.chars[columns] || []) }
118
85
  end
119
86
 
120
87
  # Using the current cursor's y position, return a range of visible lines.