vedeu 0.7.4 → 0.8.0

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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/docs/api.md +5 -1
  4. data/docs/borders.md +2 -26
  5. data/docs/dsl.md +4 -4
  6. data/docs/dsl_elements.md +100 -0
  7. data/docs/events/by_name/action.md +3 -0
  8. data/docs/events/by_name/cursor_hide.md +3 -0
  9. data/docs/events/by_name/cursor_reset.md +3 -0
  10. data/docs/events/by_name/cursor_show.md +3 -0
  11. data/docs/events/by_name/geometry_down.md +3 -0
  12. data/docs/events/by_name/geometry_left.md +3 -0
  13. data/docs/events/by_name/geometry_right.md +3 -0
  14. data/docs/events/by_name/geometry_up.md +3 -0
  15. data/docs/events/by_name/hide_view.md +3 -0
  16. data/docs/events/by_name/set_border_caption.md +13 -0
  17. data/docs/events/by_name/set_border_title.md +13 -0
  18. data/docs/events/by_name/show_view.md +3 -0
  19. data/docs/events/by_name/standalone.md +3 -0
  20. data/docs/events/by_name/toggle_view.md +3 -0
  21. data/docs/events/by_name/view_down.md +4 -0
  22. data/docs/events/by_name/view_left.md +4 -0
  23. data/docs/events/by_name/view_right.md +4 -0
  24. data/docs/events/by_name/view_up.md +4 -0
  25. data/examples/views/empty_template.rb +46 -0
  26. data/examples/views/expected/line.out +1 -0
  27. data/examples/views/expected/lines.out +1 -0
  28. data/examples/views/expected/lines_alignment.out +1 -0
  29. data/examples/views/line.rb +220 -0
  30. data/examples/views/lines.rb +281 -0
  31. data/examples/views/lines_alignment.rb +231 -0
  32. data/examples/views/lines_line_stream.rb +99 -0
  33. data/examples/views/lines_line_streams.rb +73 -0
  34. data/examples/views/lines_line_streams_stream.rb +83 -0
  35. data/examples/views/lines_line_streams_stream_stream.rb +53 -0
  36. data/examples/views/lines_streams.rb +50 -0
  37. data/examples/views/lines_streams_stream.rb +51 -0
  38. data/examples/views/runner.sh +27 -0
  39. data/lib/vedeu/all.rb +6 -2
  40. data/lib/vedeu/application/controller.rb +1 -1
  41. data/lib/vedeu/boolean.rb +35 -0
  42. data/lib/vedeu/borders/border.rb +3 -3
  43. data/lib/vedeu/borders/caption.rb +1 -1
  44. data/lib/vedeu/borders/dsl.rb +1 -20
  45. data/lib/vedeu/borders/title.rb +6 -8
  46. data/lib/vedeu/buffers/buffer.rb +2 -2
  47. data/lib/vedeu/buffers/refresh.rb +1 -1
  48. data/lib/vedeu/cells/border.rb +0 -11
  49. data/lib/vedeu/cells/empty.rb +4 -4
  50. data/lib/vedeu/{geometries/alignment → coercers}/alignment.rb +50 -53
  51. data/lib/vedeu/coercers/all.rb +16 -0
  52. data/lib/vedeu/coercers/colour.rb +78 -0
  53. data/lib/vedeu/coercers/colour_attributes.rb +122 -0
  54. data/lib/vedeu/coercers/horizontal_alignment.rb +28 -0
  55. data/lib/vedeu/coercers/vertical_alignment.rb +27 -0
  56. data/lib/vedeu/colours/all.rb +1 -0
  57. data/lib/vedeu/colours/background.rb +13 -2
  58. data/lib/vedeu/colours/colour.rb +16 -31
  59. data/lib/vedeu/colours/foreground.rb +13 -2
  60. data/lib/vedeu/colours/translator.rb +21 -59
  61. data/lib/vedeu/colours/validator.rb +84 -0
  62. data/lib/vedeu/common.rb +52 -0
  63. data/lib/vedeu/configuration/api.rb +4 -10
  64. data/lib/vedeu/configuration/configuration.rb +4 -4
  65. data/lib/vedeu/cursors/coordinate.rb +1 -1
  66. data/lib/vedeu/cursors/cursor.rb +1 -1
  67. data/lib/vedeu/cursors/dsl.rb +1 -28
  68. data/lib/vedeu/dsl/all.rb +7 -7
  69. data/lib/vedeu/dsl/attributes.rb +224 -0
  70. data/lib/vedeu/dsl/border.rb +127 -0
  71. data/lib/vedeu/dsl/cursors.rb +44 -0
  72. data/lib/vedeu/dsl/dsl.rb +9 -0
  73. data/lib/vedeu/dsl/elements.rb +335 -0
  74. data/lib/vedeu/dsl/geometry.rb +113 -0
  75. data/lib/vedeu/dsl/string/align.rb +127 -0
  76. data/lib/vedeu/dsl/string/all.rb +14 -0
  77. data/lib/vedeu/dsl/string/text.rb +107 -0
  78. data/lib/vedeu/dsl/string/truncate.rb +111 -0
  79. data/lib/vedeu/{output → dsl/string}/wordwrap.rb +10 -6
  80. data/lib/vedeu/dsl/view.rb +124 -248
  81. data/lib/vedeu/dsl/views.rb +244 -0
  82. data/lib/vedeu/editor/cursor.rb +1 -1
  83. data/lib/vedeu/editor/delete.rb +3 -1
  84. data/lib/vedeu/editor/insert.rb +22 -6
  85. data/lib/vedeu/editor/line.rb +15 -9
  86. data/lib/vedeu/editor/lines.rb +27 -18
  87. data/lib/vedeu/esc/actions.rb +73 -26
  88. data/lib/vedeu/esc/all.rb +2 -0
  89. data/lib/vedeu/esc/background.rb +219 -0
  90. data/lib/vedeu/esc/borders.rb +72 -26
  91. data/lib/vedeu/esc/colours.rb +26 -27
  92. data/lib/vedeu/esc/esc.rb +4 -4
  93. data/lib/vedeu/esc/foreground.rb +219 -0
  94. data/lib/vedeu/esc/mouse.rb +16 -13
  95. data/lib/vedeu/events/aliases.rb +2 -2
  96. data/lib/vedeu/events/event.rb +1 -1
  97. data/lib/vedeu/geometries/all.rb +0 -1
  98. data/lib/vedeu/geometries/area/dimension.rb +2 -2
  99. data/lib/vedeu/geometries/dsl/dsl.rb +3 -51
  100. data/lib/vedeu/geometries/dsl/validator.rb +4 -4
  101. data/lib/vedeu/geometries/geometry.rb +10 -10
  102. data/lib/vedeu/geometries/move.rb +4 -4
  103. data/lib/vedeu/groups/dsl.rb +1 -0
  104. data/lib/vedeu/groups/group.rb +1 -1
  105. data/lib/vedeu/input/all.rb +1 -0
  106. data/lib/vedeu/input/capture.rb +14 -10
  107. data/lib/vedeu/input/dsl.rb +20 -26
  108. data/lib/vedeu/input/key.rb +0 -6
  109. data/lib/vedeu/input/keymap.rb +4 -9
  110. data/lib/vedeu/input/keys.rb +13 -0
  111. data/lib/vedeu/input/mapper.rb +29 -14
  112. data/lib/vedeu/input/read.rb +4 -2
  113. data/lib/vedeu/interfaces/dsl.rb +23 -22
  114. data/lib/vedeu/interfaces/interface.rb +2 -2
  115. data/lib/vedeu/logging/debug.rb +33 -0
  116. data/lib/vedeu/logging/log.rb +42 -33
  117. data/lib/vedeu/menus/dsl.rb +7 -18
  118. data/lib/vedeu/menus/menu.rb +1 -1
  119. data/lib/vedeu/models/focus.rb +1 -1
  120. data/lib/vedeu/models/toggleable.rb +4 -4
  121. data/lib/vedeu/null/generic.rb +2 -2
  122. data/lib/vedeu/output/all.rb +0 -2
  123. data/lib/vedeu/output/compressor_cache.rb +1 -1
  124. data/lib/vedeu/output/output.rb +5 -20
  125. data/lib/vedeu/presentation/colour.rb +39 -7
  126. data/lib/vedeu/presentation/style.rb +25 -11
  127. data/lib/vedeu/renderers/html.rb +11 -11
  128. data/lib/vedeu/repositories/assemblage.rb +9 -0
  129. data/lib/vedeu/repositories/collection.rb +1 -0
  130. data/lib/vedeu/repositories/defaults.rb +4 -1
  131. data/lib/vedeu/repositories/model.rb +7 -37
  132. data/lib/vedeu/repositories/parent.rb +6 -6
  133. data/lib/vedeu/repositories/registerable.rb +16 -2
  134. data/lib/vedeu/repositories/repositories.rb +1 -1
  135. data/lib/vedeu/repositories/repository.rb +2 -12
  136. data/lib/vedeu/runtime/flags.rb +1 -1
  137. data/lib/vedeu/terminal/terminal.rb +7 -2
  138. data/lib/vedeu/version.rb +1 -1
  139. data/lib/vedeu/views/all.rb +4 -1
  140. data/lib/vedeu/views/char.rb +5 -4
  141. data/lib/vedeu/views/chars.rb +42 -0
  142. data/lib/vedeu/views/composition.rb +15 -30
  143. data/lib/vedeu/views/default_attributes.rb +74 -0
  144. data/lib/vedeu/views/html_char.rb +2 -2
  145. data/lib/vedeu/views/line.rb +27 -53
  146. data/lib/vedeu/views/lines.rb +31 -0
  147. data/lib/vedeu/views/stream.rb +31 -78
  148. data/lib/vedeu/views/streams.rb +42 -0
  149. data/lib/vedeu/views/value.rb +150 -0
  150. data/lib/vedeu/views/view.rb +32 -36
  151. data/lib/vedeu/views/{view_collection.rb → views.rb} +2 -2
  152. data/test/lib/vedeu/application/application_controller_test.rb +5 -0
  153. data/test/lib/vedeu/application/controller_test.rb +22 -28
  154. data/test/lib/vedeu/boolean_test.rb +57 -0
  155. data/test/lib/vedeu/borders/border_test.rb +130 -36
  156. data/test/lib/vedeu/borders/dsl_test.rb +63 -10
  157. data/test/lib/vedeu/borders/title_test.rb +16 -5
  158. data/test/lib/vedeu/buffers/buffer_test.rb +26 -10
  159. data/test/lib/vedeu/buffers/empty_test.rb +1 -1
  160. data/test/lib/vedeu/cells/border_test.rb +0 -6
  161. data/test/lib/vedeu/cells/clear_test.rb +2 -0
  162. data/test/lib/vedeu/cells/empty_test.rb +12 -2
  163. data/test/lib/vedeu/cells/escape_test.rb +7 -2
  164. data/test/lib/vedeu/{geometries/alignment → coercers}/alignment_test.rb +44 -19
  165. data/test/lib/vedeu/coercers/colour_attributes_test.rb +168 -0
  166. data/test/lib/vedeu/coercers/colour_test.rb +75 -0
  167. data/test/lib/vedeu/{geometries/alignment → coercers}/horizontal_alignment_test.rb +6 -6
  168. data/test/lib/vedeu/{geometries/alignment → coercers}/vertical_alignment_test.rb +6 -6
  169. data/test/lib/vedeu/colours/background_test.rb +17 -1
  170. data/test/lib/vedeu/colours/colour_test.rb +74 -2
  171. data/test/lib/vedeu/colours/foreground_test.rb +17 -1
  172. data/test/lib/vedeu/colours/repository_test.rb +1 -1
  173. data/test/lib/vedeu/colours/translator_test.rb +8 -1
  174. data/test/lib/vedeu/colours/validator_test.rb +60 -0
  175. data/test/lib/vedeu/common_test.rb +138 -0
  176. data/test/lib/vedeu/configuration/api_test.rb +96 -51
  177. data/test/lib/vedeu/cursors/coordinate_test.rb +58 -117
  178. data/test/lib/vedeu/cursors/cursor_test.rb +46 -17
  179. data/test/lib/vedeu/cursors/dsl_test.rb +19 -5
  180. data/test/lib/vedeu/distributed/client_test.rb +8 -3
  181. data/test/lib/vedeu/distributed/server_test.rb +8 -0
  182. data/test/lib/vedeu/distributed/test_application_test.rb +62 -19
  183. data/test/lib/vedeu/distributed/uri_test.rb +4 -2
  184. data/test/lib/vedeu/dsl/attributes_test.rb +212 -0
  185. data/test/lib/vedeu/dsl/border_test.rb +51 -0
  186. data/test/lib/vedeu/dsl/{lines_test.rb → cursors_test.rb} +2 -2
  187. data/test/lib/vedeu/dsl/dsl_test.rb +44 -0
  188. data/test/lib/vedeu/dsl/elements_test.rb +118 -0
  189. data/test/lib/vedeu/dsl/geometry_test.rb +35 -0
  190. data/test/lib/vedeu/dsl/presentation_test.rb +52 -11
  191. data/test/lib/vedeu/dsl/string/align_test.rb +147 -0
  192. data/test/lib/vedeu/dsl/string/text_test.rb +213 -0
  193. data/test/lib/vedeu/dsl/string/truncate_test.rb +97 -0
  194. data/test/lib/vedeu/{output → dsl/string}/wordwrap_test.rb +3 -3
  195. data/test/lib/vedeu/dsl/view_test.rb +30 -42
  196. data/test/lib/vedeu/dsl/views_test.rb +61 -0
  197. data/test/lib/vedeu/editor/cursor_test.rb +30 -12
  198. data/test/lib/vedeu/editor/document_test.rb +18 -10
  199. data/test/lib/vedeu/editor/line_test.rb +4 -1
  200. data/test/lib/vedeu/editor/lines_test.rb +11 -3
  201. data/test/lib/vedeu/esc/actions_test.rb +42 -4
  202. data/test/lib/vedeu/esc/background_test.rb +185 -0
  203. data/test/lib/vedeu/esc/borders_test.rb +37 -9
  204. data/test/lib/vedeu/esc/colours_test.rb +0 -59
  205. data/test/lib/vedeu/esc/foreground_test.rb +185 -0
  206. data/test/lib/vedeu/esc/mouse_test.rb +9 -4
  207. data/test/lib/vedeu/geometries/area/area_test.rb +34 -11
  208. data/test/lib/vedeu/geometries/dsl/dsl_test.rb +52 -61
  209. data/test/lib/vedeu/geometries/geometry_test.rb +62 -18
  210. data/test/lib/vedeu/geometries/position_test.rb +14 -7
  211. data/test/lib/vedeu/groups/dsl_test.rb +24 -15
  212. data/test/lib/vedeu/groups/group_test.rb +18 -8
  213. data/test/lib/vedeu/input/dsl_test.rb +33 -16
  214. data/test/lib/vedeu/input/key_test.rb +8 -1
  215. data/test/lib/vedeu/input/keymap_test.rb +4 -1
  216. data/test/lib/vedeu/input/keys_test.rb +16 -0
  217. data/test/lib/vedeu/interfaces/dsl_test.rb +24 -30
  218. data/test/lib/vedeu/interfaces/interface_test.rb +79 -24
  219. data/test/lib/vedeu/logging/ips_test.rb +10 -1
  220. data/test/lib/vedeu/menus/dsl_test.rb +24 -23
  221. data/test/lib/vedeu/menus/menu_test.rb +18 -8
  222. data/test/lib/vedeu/models/page_test.rb +5 -1
  223. data/test/lib/vedeu/models/row_test.rb +4 -0
  224. data/test/lib/vedeu/models/toggleable_test.rb +10 -6
  225. data/test/lib/vedeu/null/generic_test.rb +90 -1
  226. data/test/lib/vedeu/output/viewport_test.rb +11 -10
  227. data/test/lib/vedeu/plugins/plugin_test.rb +22 -9
  228. data/test/lib/vedeu/presentation/colour_test.rb +2 -1
  229. data/test/lib/vedeu/presentation/presentation_test.rb +13 -8
  230. data/test/lib/vedeu/presentation/style_test.rb +28 -13
  231. data/test/lib/vedeu/renderers/file_test.rb +4 -2
  232. data/test/lib/vedeu/renderers/options_test.rb +1 -1
  233. data/test/lib/vedeu/repositories/assemblage_test.rb +18 -0
  234. data/test/lib/vedeu/repositories/collection_test.rb +34 -10
  235. data/test/lib/vedeu/repositories/defaults_test.rb +6 -0
  236. data/test/lib/vedeu/repositories/model_test.rb +4 -13
  237. data/test/lib/vedeu/repositories/repository_test.rb +12 -5
  238. data/test/lib/vedeu/repositories/store_test.rb +9 -0
  239. data/test/lib/vedeu/runtime/flags_test.rb +6 -4
  240. data/test/lib/vedeu/runtime/launcher_test.rb +1 -1
  241. data/test/lib/vedeu/templating/helpers_test.rb +93 -65
  242. data/test/lib/vedeu/templating/view_template_test.rb +26 -26
  243. data/test/lib/vedeu/views/char_test.rb +36 -11
  244. data/test/lib/vedeu/views/chars_test.rb +71 -0
  245. data/test/lib/vedeu/views/composition_test.rb +17 -16
  246. data/test/lib/vedeu/views/default_attributes_test.rb +97 -0
  247. data/test/lib/vedeu/views/line_test.rb +20 -75
  248. data/test/lib/vedeu/views/lines_test.rb +47 -0
  249. data/test/lib/vedeu/views/stream_test.rb +38 -63
  250. data/test/lib/vedeu/views/streams_test.rb +9 -0
  251. data/test/lib/vedeu/views/value_test.rb +112 -0
  252. data/test/lib/vedeu/views/view_test.rb +67 -45
  253. data/test/lib/vedeu/views/views_test.rb +22 -0
  254. data/test/support/examples/material_colours_app.rb +2 -2
  255. data/test/support/helpers/model_test_class.rb +1 -0
  256. data/test/test_helper.rb +3 -1
  257. data/vedeu.gemspec +2 -2
  258. metadata +124 -58
  259. data/lib/vedeu/dsl/composition.rb +0 -150
  260. data/lib/vedeu/dsl/line.rb +0 -119
  261. data/lib/vedeu/dsl/lines.rb +0 -23
  262. data/lib/vedeu/dsl/shared.rb +0 -85
  263. data/lib/vedeu/dsl/stream.rb +0 -40
  264. data/lib/vedeu/dsl/streams.rb +0 -23
  265. data/lib/vedeu/dsl/text.rb +0 -98
  266. data/lib/vedeu/geometries/alignment/all.rb +0 -11
  267. data/lib/vedeu/geometries/alignment/horizontal_alignment.rb +0 -27
  268. data/lib/vedeu/geometries/alignment/vertical_alignment.rb +0 -27
  269. data/lib/vedeu/output/text.rb +0 -275
  270. data/test/lib/vedeu/dsl/composition_test.rb +0 -67
  271. data/test/lib/vedeu/dsl/line_test.rb +0 -85
  272. data/test/lib/vedeu/dsl/shared_test.rb +0 -66
  273. data/test/lib/vedeu/dsl/stream_test.rb +0 -30
  274. data/test/lib/vedeu/dsl/streams_test.rb +0 -13
  275. data/test/lib/vedeu/dsl/text_test.rb +0 -122
  276. data/test/lib/vedeu/output/text_test.rb +0 -156
  277. data/test/lib/vedeu/views/view_collection_test.rb +0 -13
@@ -0,0 +1,113 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Provides DSL methods for Vedeu::Geometries::Geometry objects.
6
+ #
7
+ # @api public
8
+ #
9
+ module Geometry
10
+
11
+ # When {Vedeu::DSL::Geometry} is included in a class, the
12
+ # methods within this module are included as class methods on
13
+ # that class.
14
+ #
15
+ module ClassMethods
16
+
17
+ # Specify the geometry of an interface or view with a simple
18
+ # DSL.
19
+ #
20
+ # # Standalone (preferred):
21
+ # Vedeu.geometry :my_interface do
22
+ # # ... see {Vedeu::Geometries::DSL}
23
+ # end
24
+ #
25
+ # @param name [String|Symbol] The name of the interface or
26
+ # view to which this geometry belongs.
27
+ # @param block [Proc]
28
+ # @raise [Vedeu::Error::MissingRequired|
29
+ # Vedeu::Error::RequiresBlock] When a name or block
30
+ # respectively are not given.
31
+ # @return [Vedeu::Geometries::Geometry]
32
+ # @see Vedeu::Geometries::DSL
33
+ def geometry(name = nil, &block)
34
+ # Alternative implementation which treats `Vedeu.geometry`
35
+ # as `Vedeu.geometries` if no name or block is given.
36
+ #
37
+ # if name && block_given?
38
+ # Vedeu::Geometries::Geometry.build(name: name, &block).store
39
+ #
40
+ # else
41
+ # Vedeu.geometries
42
+ #
43
+ # end
44
+
45
+ fail Vedeu::Error::MissingRequired unless name
46
+ fail Vedeu::Error::RequiresBlock unless block_given?
47
+
48
+ Vedeu::Geometries::Geometry.build(name: name, &block).store
49
+ end
50
+
51
+ end # ClassMethods
52
+
53
+ # When {Vedeu::DSL::Geometry} is included in a class, the
54
+ # methods within this module are included as instance methods on
55
+ # that class.
56
+ #
57
+ module InstanceMethods
58
+
59
+ # Specify the geometry of an interface or view with a simple
60
+ # DSL.
61
+ #
62
+ # # As part of an interface:
63
+ # Vedeu.interface :my_interface do
64
+ # geometry do
65
+ # # ... see {Vedeu::Geometries::DSL}
66
+ # end
67
+ # end
68
+ #
69
+ # # As part of a view:
70
+ # Vedeu.render do
71
+ # view :my_interface do
72
+ # geometry do
73
+ # # ... see {Vedeu::Geometries::DSL}
74
+ # end
75
+ # end
76
+ # end
77
+ #
78
+ # @param name [String|Symbol] The name of the interface; this
79
+ # is already provided when we define the interface or view,
80
+ # setting it here is just mirroring functionality of
81
+ # {Vedeu::DSL::Geometry::ClassMethods.geometry}.
82
+ # @param block [Proc]
83
+ # @raise [Vedeu::Error::MissingRequired|
84
+ # Vedeu::Error::RequiresBlock] When a name or block
85
+ # respectively are not given.
86
+ # @return [Vedeu::Geometries::Geometry]
87
+ # @see Vedeu::Geometries::DSL
88
+ def geometry(name = nil, &block)
89
+ fail Vedeu::Error::RequiresBlock unless block_given?
90
+
91
+ model_name = name ? name : model.name
92
+
93
+ Vedeu::Geometries::Geometry.build(name: model_name, &block).store
94
+ end
95
+
96
+ end # InstanceMethods
97
+
98
+ # When this module is included in a class, provide ClassMethods
99
+ # as class methods and InstanceMethods as instance methods for
100
+ # the given class.
101
+ #
102
+ # @param klass [Class]
103
+ # @return [void]
104
+ def self.included(klass)
105
+ klass.extend(Vedeu::DSL::Geometry::ClassMethods)
106
+ klass.include(Vedeu::DSL::Geometry::InstanceMethods)
107
+ end
108
+
109
+ end # Geometry
110
+
111
+ end # DSL
112
+
113
+ end # Vedeu
@@ -0,0 +1,127 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Aligns a text value based on given options when building views.
6
+ #
7
+ # @api private
8
+ #
9
+ class Align
10
+
11
+ extend Forwardable
12
+ include Vedeu::Common
13
+
14
+ def_delegators :alignment,
15
+ :centre_aligned?,
16
+ :left_aligned?,
17
+ :right_aligned?,
18
+ :unaligned?
19
+
20
+ # @param value [String]
21
+ # @param options [Hash]
22
+ # @option options align [Symbol]
23
+ # @option options name [String|Symbol]
24
+ # @option options pad [String]
25
+ # @option options width [Fixnum]
26
+ # @return [Vedeu::DSL::Align]
27
+ def initialize(value = '', options = {})
28
+ @value = value || ''
29
+ @options = defaults.merge!(options)
30
+ end
31
+
32
+ # @return [String]
33
+ def text
34
+ if unaligned?
35
+ value
36
+
37
+ elsif left_aligned?
38
+ left
39
+
40
+ elsif centre_aligned?
41
+ centre
42
+
43
+ elsif right_aligned?
44
+ right
45
+
46
+ else
47
+ value
48
+
49
+ end
50
+ end
51
+
52
+ protected
53
+
54
+ # @!attribute [r] options
55
+ # @return [Hash]
56
+ attr_reader :options
57
+
58
+ # @!attribute [r] value
59
+ # @return [String]
60
+ attr_reader :value
61
+
62
+ private
63
+
64
+ # @return [Vedeu::Coercers::Alignment]
65
+ def alignment
66
+ @_alignment ||= Vedeu::Coercers::Alignment.coerce(options[:align])
67
+ end
68
+
69
+ # The value padded to width, centralized.
70
+ #
71
+ # @return [String]
72
+ def centre
73
+ value.center(width, options[:pad])
74
+ end
75
+ alias_method :center, :centre
76
+
77
+ # @return [Hash]
78
+ def defaults
79
+ {
80
+ align: :left,
81
+ name: nil,
82
+ pad: ' ',
83
+ width: nil,
84
+ }
85
+ end
86
+
87
+ # @return [NilClass|Vedeu::Geometries::Geometry]
88
+ def geometry
89
+ @_geometry ||= Vedeu.geometries.by_name(options[:name])
90
+ end
91
+
92
+ # The value padded to width, left justified.
93
+ #
94
+ # @return [String]
95
+ def left
96
+ value.ljust(width, options[:pad])
97
+ end
98
+
99
+ # The value padded to width, right justified.
100
+ #
101
+ # @return [String]
102
+ def right
103
+ value.rjust(width, options[:pad])
104
+ end
105
+
106
+ # Return the width of the interface when a name is given,
107
+ # otherwise use the given width.
108
+ #
109
+ # @return [Fixnum]
110
+ def width
111
+ if present?(options[:width])
112
+ options[:width]
113
+
114
+ elsif present?(options[:name])
115
+ geometry.bordered_width
116
+
117
+ else
118
+ value.size
119
+
120
+ end
121
+ end
122
+
123
+ end # Align
124
+
125
+ end # DSL
126
+
127
+ end # Vedeu
@@ -0,0 +1,14 @@
1
+ module Vedeu
2
+
3
+ # Provides a mechanism to help configure and use Vedeu.
4
+ #
5
+ module DSL
6
+
7
+ end # DSL
8
+
9
+ end # Vedeu
10
+
11
+ require 'vedeu/dsl/string/align'
12
+ require 'vedeu/dsl/string/truncate'
13
+ require 'vedeu/dsl/string/wordwrap'
14
+ require 'vedeu/dsl/string/text'
@@ -0,0 +1,107 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Manipulates text values based on given options when building
6
+ # views.
7
+ #
8
+ # @api private
9
+ #
10
+ class Text
11
+
12
+ include Vedeu::Common
13
+
14
+ # @param value [String]
15
+ # @param options [Vedeu::DSL::Attributes]
16
+ # @return [Vedeu::DSL::Text]
17
+ def initialize(value = '', options = {})
18
+ @value = value || ''
19
+ @options = options || {}
20
+ end
21
+
22
+ # @return [Array<Vedeu::Views::Char>]
23
+ def chars
24
+ return [] unless present?(value) && string?(value)
25
+
26
+ collection
27
+ end
28
+
29
+ protected
30
+
31
+ # @!attribute [r] options
32
+ # @return [Hash<Symbol => void>]
33
+ attr_reader :options
34
+
35
+ # @!attribute [r] value
36
+ # @return [NilClass|String]
37
+ attr_reader :value
38
+
39
+ private
40
+
41
+ # @return [String]
42
+ def align
43
+ Vedeu::DSL::Align.new(value, options).text
44
+ end
45
+
46
+ # @return [NilClass|Vedeu::Coercers::Alignment]
47
+ def align?
48
+ options[:align]
49
+ end
50
+
51
+ # @param char [String]
52
+ # @return [Hash<Symbol => void>]
53
+ def attributes(char)
54
+ {
55
+ colour: options[:colour],
56
+ name: name,
57
+ parent: parent,
58
+ position: nil,
59
+ style: options[:style],
60
+ value: char,
61
+ }
62
+ end
63
+
64
+ # @return [Array<Vedeu::Views::Char>]
65
+ def collection
66
+ text.chars.map { |char| Vedeu::Views::Char.new(attributes(char)) }
67
+ end
68
+
69
+ # @return [NilClass|String|Symbol]
70
+ def name
71
+ options[:name]
72
+ end
73
+
74
+ # @return [NilClass|void]
75
+ def parent
76
+ options[:parent]
77
+ end
78
+
79
+ # @return [String]
80
+ def text
81
+ if truncate?
82
+ truncate
83
+
84
+ elsif align?
85
+ align
86
+
87
+ else
88
+ value
89
+
90
+ end
91
+ end
92
+
93
+ # @return [String]
94
+ def truncate
95
+ Vedeu::DSL::Truncate.new(value, options).text
96
+ end
97
+
98
+ # @return [Boolean|NilClass]
99
+ def truncate?
100
+ options[:truncate]
101
+ end
102
+
103
+ end # Text
104
+
105
+ end # DSL
106
+
107
+ end # Vedeu
@@ -0,0 +1,111 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Truncates a string to an optional width, or uses the named
6
+ # geometry width.
7
+ #
8
+ # @api private
9
+ #
10
+ class Truncate
11
+
12
+ include Vedeu::Common
13
+
14
+ # Returns a new instance of Vedeu::DSL::Truncate.
15
+ #
16
+ # @param value [String]
17
+ # @param options [Hash<Symbol => Boolean|Fixnum|NilClass|String|
18
+ # Symbol]
19
+ # @option options name [String|Symbol] The name of the geometry
20
+ # to use to determine the width if the width option is not
21
+ # given.
22
+ # @option options truncate [Boolean] Whether to truncate the
23
+ # value.
24
+ # @option options width [Fixnum] The width of the new value.
25
+ # @return [Vedeu::DSL::Truncate]
26
+ def initialize(value = '', options = {})
27
+ @value = value || ''
28
+ @options = defaults.merge!(options)
29
+ end
30
+
31
+ # @return [String]
32
+ def text
33
+ if truncate?
34
+ truncate
35
+
36
+ else
37
+ value
38
+
39
+ end
40
+ end
41
+
42
+ protected
43
+
44
+ # @!attribute [r] options
45
+ # @return [Hash<Symbol => Boolean|Fixnum|NilClass|String|
46
+ # Symbol]
47
+ attr_reader :options
48
+
49
+ private
50
+
51
+ # @return [Hash<Symbol => Boolean|Fixnum|NilClass|String|
52
+ # Symbol]
53
+ def defaults
54
+ {
55
+ name: nil,
56
+ truncate: false,
57
+ width: nil,
58
+ }
59
+ end
60
+
61
+ # @return [Vedeu::Geometries::Geometry]
62
+ def geometry
63
+ @_geometry ||= Vedeu.geometries.by_name(options[:name])
64
+ end
65
+
66
+ # @return [Boolean]
67
+ def truncate?
68
+ truthy?(options[:truncate]) && value.size > width
69
+ end
70
+
71
+ # @return [String]
72
+ def truncate
73
+ value.slice(0, width)
74
+ end
75
+
76
+ # @return [String]
77
+ def value
78
+ if present?(@value) && string?(@value)
79
+ @value
80
+
81
+ elsif present?(@value)
82
+ @value.to_s
83
+
84
+ else
85
+ ''
86
+
87
+ end
88
+ end
89
+
90
+ # Return the width of the interface when a name is given,
91
+ # otherwise use the given width.
92
+ #
93
+ # @return [Fixnum]
94
+ def width
95
+ if present?(options[:width])
96
+ options[:width]
97
+
98
+ elsif present?(options[:name])
99
+ geometry.bordered_width
100
+
101
+ else
102
+ value.size
103
+
104
+ end
105
+ end
106
+
107
+ end # Truncate
108
+
109
+ end # DSL
110
+
111
+ end # Vedeu