vedeu 0.4.9 → 0.4.10

Sign up to get free protection for your applications and to get access to all the features.
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.