whirled_peas 0.5.0 → 0.6.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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +6 -0
  4. data/README.md +62 -29
  5. data/Rakefile +3 -2
  6. data/examples/intro.rb +52 -0
  7. data/examples/scrolling.rb +53 -0
  8. data/lib/whirled_peas.rb +2 -8
  9. data/lib/whirled_peas/command_line.rb +25 -33
  10. data/lib/whirled_peas/graphics/box_painter.rb +9 -1
  11. data/lib/whirled_peas/graphics/composer.rb +80 -0
  12. data/lib/whirled_peas/graphics/container_coords.rb +18 -8
  13. data/lib/whirled_peas/graphics/container_dimensions.rb +17 -7
  14. data/lib/whirled_peas/graphics/container_painter.rb +151 -33
  15. data/lib/whirled_peas/graphics/debugger.rb +10 -1
  16. data/lib/whirled_peas/graphics/grid_painter.rb +14 -2
  17. data/lib/whirled_peas/graphics/mock_screen.rb +1 -1
  18. data/lib/whirled_peas/graphics/painter.rb +1 -6
  19. data/lib/whirled_peas/graphics/renderer.rb +1 -29
  20. data/lib/whirled_peas/graphics/screen.rb +8 -3
  21. data/lib/whirled_peas/graphics/text_painter.rb +6 -4
  22. data/lib/whirled_peas/settings/container_settings.rb +11 -0
  23. data/lib/whirled_peas/settings/debugger.rb +9 -0
  24. data/lib/whirled_peas/settings/grid_settings.rb +4 -0
  25. data/lib/whirled_peas/settings/scrollbar.rb +15 -0
  26. data/lib/whirled_peas/version.rb +1 -1
  27. data/screen_test/rendered/elements/box.frame +1 -1
  28. data/screen_test/rendered/elements/grid.frame +1 -1
  29. data/screen_test/rendered/elements/screen_overflow.frame +1 -0
  30. data/screen_test/rendered/elements/text.frame +1 -1
  31. data/screen_test/rendered/elements/text_multiline.frame +1 -1
  32. data/screen_test/rendered/settings/align/box.frame +1 -1
  33. data/screen_test/rendered/settings/align/box.rb +14 -10
  34. data/screen_test/rendered/settings/align/children_center.frame +1 -1
  35. data/screen_test/rendered/settings/align/children_left.frame +1 -1
  36. data/screen_test/rendered/settings/align/children_right.frame +1 -1
  37. data/screen_test/rendered/settings/align/grid.frame +1 -1
  38. data/screen_test/rendered/settings/ansi/bold.frame +1 -1
  39. data/screen_test/rendered/settings/ansi/color.frame +1 -1
  40. data/screen_test/rendered/settings/ansi/underline.frame +1 -1
  41. data/screen_test/rendered/settings/border.frame +1 -1
  42. data/screen_test/rendered/settings/flow/box_b2t.frame +1 -0
  43. data/screen_test/rendered/settings/flow/box_b2t.rb +24 -0
  44. data/screen_test/rendered/settings/flow/{l2r.frame → box_l2r.frame} +1 -1
  45. data/screen_test/rendered/settings/flow/{l2r.rb → box_l2r.rb} +0 -0
  46. data/screen_test/rendered/settings/flow/box_r2l.frame +1 -0
  47. data/screen_test/rendered/settings/flow/box_r2l.rb +24 -0
  48. data/screen_test/rendered/settings/flow/{t2b.frame → box_t2b.frame} +1 -1
  49. data/screen_test/rendered/settings/flow/{t2b.rb → box_t2b.rb} +0 -0
  50. data/screen_test/rendered/settings/flow/grid_b2t.frame +1 -0
  51. data/screen_test/rendered/settings/flow/grid_b2t.rb +14 -0
  52. data/screen_test/rendered/settings/flow/grid_l2r.frame +1 -0
  53. data/screen_test/rendered/settings/flow/grid_l2r.rb +14 -0
  54. data/screen_test/rendered/settings/flow/grid_r2l.frame +1 -0
  55. data/screen_test/rendered/settings/flow/grid_r2l.rb +14 -0
  56. data/screen_test/rendered/settings/flow/grid_t2b.frame +1 -0
  57. data/screen_test/rendered/settings/flow/grid_t2b.rb +14 -0
  58. data/screen_test/rendered/settings/height/box.frame +1 -1
  59. data/screen_test/rendered/settings/height/grid.frame +1 -1
  60. data/screen_test/rendered/settings/height/overflow_box.frame +1 -1
  61. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +1 -1
  62. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +1 -1
  63. data/screen_test/rendered/settings/height/overflow_grid.frame +1 -1
  64. data/screen_test/rendered/settings/margin.frame +1 -1
  65. data/screen_test/rendered/settings/padding.frame +1 -1
  66. data/screen_test/rendered/settings/position/box_left.frame +1 -1
  67. data/screen_test/rendered/settings/position/box_left_negative.frame +1 -1
  68. data/screen_test/rendered/settings/position/box_top.frame +1 -1
  69. data/screen_test/rendered/settings/position/box_top_negative.frame +1 -1
  70. data/screen_test/rendered/settings/position/grid_left.frame +1 -1
  71. data/screen_test/rendered/settings/position/grid_left_negative.frame +1 -1
  72. data/screen_test/rendered/settings/position/grid_top.frame +1 -1
  73. data/screen_test/rendered/settings/position/grid_top_negative.frame +1 -1
  74. data/screen_test/rendered/settings/scroll/horiz_box.frame +1 -0
  75. data/screen_test/rendered/settings/scroll/horiz_box.rb +15 -0
  76. data/screen_test/rendered/settings/scroll/vert_box.frame +1 -0
  77. data/screen_test/rendered/settings/scroll/vert_box.rb +18 -0
  78. data/screen_test/rendered/settings/title_font.frame +1 -1
  79. data/screen_test/rendered/settings/width/box.frame +1 -1
  80. data/screen_test/rendered/settings/width/grid.frame +1 -1
  81. data/screen_test/rendered/settings/width/overflow_box.frame +1 -1
  82. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +1 -1
  83. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +1 -1
  84. data/screen_test/rendered/settings/width/overflow_grid.frame +1 -1
  85. data/screen_test/screen_tester.rb +13 -3
  86. metadata +27 -16
  87. data/bin/debug +0 -35
  88. data/lib/whirled_peas/debugger.rb +0 -80
  89. data/lib/whirled_peas/template.rb +0 -5
  90. data/lib/whirled_peas/template/box_element.rb +0 -8
  91. data/lib/whirled_peas/template/composer.rb +0 -68
  92. data/lib/whirled_peas/template/container.rb +0 -28
  93. data/lib/whirled_peas/template/debugger.rb +0 -34
  94. data/lib/whirled_peas/template/element.rb +0 -13
  95. data/lib/whirled_peas/template/grid_element.rb +0 -8
  96. data/lib/whirled_peas/template/text_element.rb +0 -24
@@ -17,7 +17,16 @@ module WhirledPeas
17
17
  info << "#{indent + ' '}- Dimensions(#{dimensions})"
18
18
  info << "#{indent + ' '}- Settings"
19
19
  info << Settings::Debugger.new(painter.settings).debug(indent + ' ')
20
- if painter.is_a?(ContainerPainter)
20
+ if painter.is_a?(TextPainter)
21
+ content = if painter.content.length > 1
22
+ '<multiline>'
23
+ elsif painter.content.first.length > 12
24
+ "#{painter.content.first[0..9]}...".inspect
25
+ else
26
+ painter.content.first.inspect
27
+ end
28
+ info << "#{indent + ' '}- Content(value=#{content})"
29
+ elsif painter.is_a?(ContainerPainter)
21
30
  info << "#{indent + ' '}- Children"
22
31
  info += painter.each_child.map { |c| Debugger.new(c).debug(indent + ' ') }
23
32
  end
@@ -8,8 +8,7 @@ module WhirledPeas
8
8
  super
9
9
  return unless canvas.writable?
10
10
  each_child.with_index do |child, index|
11
- col_index = index % dimensions.num_cols
12
- row_index = index / dimensions.num_cols
11
+ col_index, row_index = grid_cell(index)
13
12
  content_left = coords(canvas).content_left(col_index)
14
13
  if settings.align_center?
15
14
  content_left += (dimensions.content_width - child.dimensions.outer_width) / 2
@@ -50,6 +49,19 @@ module WhirledPeas
50
49
  )
51
50
  end
52
51
  end
52
+
53
+ private
54
+
55
+ def grid_cell(index)
56
+ if settings.horizontal_flow?
57
+ col_index, row_index = [index % dimensions.num_cols, index / dimensions.num_cols]
58
+ col_index = dimensions.num_cols - col_index - 1 if settings.reverse_flow?
59
+ else
60
+ col_index, row_index = [index / dimensions.num_cols, index % dimensions.num_cols]
61
+ row_index = dimensions.num_rows - row_index - 1 if settings.reverse_flow?
62
+ end
63
+ [col_index, row_index]
64
+ end
53
65
  end
54
66
  private_constant :BoxPainter
55
67
  end
@@ -3,7 +3,7 @@ require_relative 'renderer'
3
3
  module WhirledPeas
4
4
  module Graphics
5
5
  class MockScreen
6
- def initialize(width, height)
6
+ def initialize(width:, height:)
7
7
  @width = width
8
8
  @height = height
9
9
  end
@@ -3,8 +3,7 @@ module WhirledPeas
3
3
  class Painter
4
4
  attr_reader :name, :settings
5
5
 
6
- def initialize(element, settings, name)
7
- @element = element
6
+ def initialize(name, settings)
8
7
  @settings = settings
9
8
  @name = name
10
9
  end
@@ -14,10 +13,6 @@ module WhirledPeas
14
13
 
15
14
  def dimensions
16
15
  end
17
-
18
- private
19
-
20
- attr_reader :element
21
16
  end
22
17
  private_constant :Painter
23
18
  end
@@ -1,21 +1,8 @@
1
- require 'whirled_peas/template/box_element'
2
- require 'whirled_peas/template/container'
3
- require 'whirled_peas/template/grid_element'
4
- require 'whirled_peas/template/text_element'
5
-
6
- require_relative 'box_painter'
7
1
  require_relative 'canvas'
8
- require_relative 'grid_painter'
9
- require_relative 'text_painter'
10
2
 
11
3
  module WhirledPeas
12
4
  module Graphics
13
5
  class Renderer
14
- PAINTERS = {
15
- Template::BoxElement => BoxPainter,
16
- Template::GridElement => GridPainter,
17
- Template::TextElement => TextPainter
18
- }
19
6
  def initialize(template, width, height)
20
7
  @template = template
21
8
  @width = width
@@ -23,27 +10,12 @@ module WhirledPeas
23
10
  end
24
11
 
25
12
  def paint(&block)
26
- painter.paint(Canvas.new(0, 0, width, height, 0, 0), &block)
27
- end
28
-
29
- def painter
30
- build(template)
13
+ template.paint(Canvas.new(0, 0, width, height, 0, 0), &block)
31
14
  end
32
15
 
33
16
  private
34
17
 
35
18
  attr_reader :template, :width, :height
36
-
37
- def build(element)
38
- unless PAINTERS.key?(element.class)
39
- raise ArgumentError, "Unable to render #{element.class}"
40
- end
41
- painter = PAINTERS[element.class].new(element, element.settings, element.name)
42
- if element.is_a?(Template::Container)
43
- element.each_child { |child| painter.add_child(build(child)) }
44
- end
45
- painter
46
- end
47
19
  end
48
20
  end
49
21
  end
@@ -12,12 +12,17 @@ module WhirledPeas
12
12
  [width || 0, height || 0]
13
13
  end
14
14
 
15
- def initialize(output=STDOUT)
15
+ def initialize(width: nil, height: nil, output: STDOUT)
16
16
  @output = output
17
17
  @terminal = HighLine.new.terminal
18
18
  @strokes = []
19
- refresh_size!
20
- Signal.trap('SIGWINCH', proc { self.refresh_size! })
19
+ if width && height
20
+ @width = width
21
+ @height = height
22
+ else
23
+ refresh_size!
24
+ Signal.trap('SIGWINCH', proc { self.refresh_size! })
25
+ end
21
26
  end
22
27
 
23
28
  def paint(template)
@@ -7,6 +7,8 @@ require_relative 'text_dimensions'
7
7
  module WhirledPeas
8
8
  module Graphics
9
9
  class TextPainter < Painter
10
+ attr_reader :content
11
+
10
12
  def paint(canvas, &block)
11
13
  return unless canvas.writable?
12
14
  formatting = [*settings.color, *settings.bg_color]
@@ -23,13 +25,13 @@ module WhirledPeas
23
25
  TextDimensions.new(content)
24
26
  end
25
27
 
26
- def content
27
- if settings.title_font
28
+ def content=(content)
29
+ @content = if settings.title_font
28
30
  Utils::TitleFont.to_s(
29
- element.content, settings.title_font
31
+ content, settings.title_font
30
32
  ).split("\n")
31
33
  else
32
- element.content.split("\n")
34
+ content.split("\n")
33
35
  end
34
36
  end
35
37
  end
@@ -4,6 +4,7 @@ require_relative 'element_settings'
4
4
  require_relative 'margin'
5
5
  require_relative 'padding'
6
6
  require_relative 'position'
7
+ require_relative 'scrollbar'
7
8
 
8
9
  module WhirledPeas
9
10
  module Settings
@@ -112,6 +113,16 @@ module WhirledPeas
112
113
  @_position || Position.new
113
114
  end
114
115
 
116
+ def set_scrollbar(horiz: nil, vert: nil)
117
+ @_scrollbar = Scrollbar.new unless @_scrollbar
118
+ @_scrollbar.horiz = horiz unless horiz.nil?
119
+ @_scrollbar.vert = vert unless vert.nil?
120
+ end
121
+
122
+ def scrollbar
123
+ @_scrollbar || Scrollbar.new
124
+ end
125
+
115
126
  def inherit(parent)
116
127
  super
117
128
  return unless parent.is_a?(ContainerSettings)
@@ -3,6 +3,7 @@ require_relative 'container_settings'
3
3
  require_relative 'margin'
4
4
  require_relative 'padding'
5
5
  require_relative 'position'
6
+ require_relative 'scrollbar'
6
7
 
7
8
  module WhirledPeas
8
9
  module Settings
@@ -41,6 +42,8 @@ module WhirledPeas
41
42
  border_value(value)
42
43
  when Padding
43
44
  padding_value(value)
45
+ when Scrollbar
46
+ scrollbar_value(value)
44
47
  else
45
48
  value.inspect
46
49
  end
@@ -82,6 +85,12 @@ module WhirledPeas
82
85
  return if values == ''
83
86
  "Padding(#{values})"
84
87
  end
88
+
89
+ def scrollbar_value(scrollbar)
90
+ values = non_defaults(scrollbar, Scrollbar.new, %i[horiz? vert?])
91
+ return if values == ''
92
+ "Scrollbar(#{values})"
93
+ end
85
94
  end
86
95
  end
87
96
  end
@@ -6,6 +6,10 @@ module WhirledPeas
6
6
  module Settings
7
7
  class GridSettings < ContainerSettings
8
8
  attr_accessor :num_cols
9
+
10
+ def set_scrollbar(*)
11
+ raise NotImplemented, 'Grids do not currently support scrollbars'
12
+ end
9
13
  end
10
14
  end
11
15
  end
@@ -0,0 +1,15 @@
1
+ module WhirledPeas
2
+ module Settings
3
+ class Scrollbar
4
+ attr_writer :horiz, :vert
5
+
6
+ def horiz?
7
+ @horiz == true
8
+ end
9
+
10
+ def vert?
11
+ @vert == true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module WhirledPeas
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -1 +1 @@
1
- [?25lTOP LEFTBOTTOM LEFT TOP RIGHT  BOTTOM RIGHT[?25h
1
+ [?25lTOP LEFTBOTTOM LEFT TOP RIGHT  BOTTOM RIGHT[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━┳━━━━━━┳━━━━━━┓┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┗━━━━━━┻━━━━━━┻━━━━━━┛Item 0Item 1Item 2Item 3Item 4Item 5Item 6[?25h
1
+ [?25l┏━━━━━━┳━━━━━━┳━━━━━━┓┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┗━━━━━━┻━━━━━━┻━━━━━━┛Item 0Item 1Item 2Item 3Item 4Item 5Item 6[?25h
@@ -0,0 +1 @@
1
+ [?25l--------------------------------------------------------------------------------[?25h
@@ -1 +1 @@
1
- [?25lHello, World![?25h
1
+ [?25lHello, World![?25h
@@ -1 +1 @@
1
- [?25lLine 1Line 2Line 3[?25h
1
+ [?25lLine 1Line 2Line 3[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxdefault┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxleft┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxcenter┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxright[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxdefault┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxleft┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxcenter┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxright[?25h
@@ -3,16 +3,20 @@ require 'whirled_peas'
3
3
  class TemplateFactory
4
4
  def build(*)
5
5
  WhirledPeas.template do |composer|
6
- [nil, :left, :center, :right].each do |align|
7
- composer.add_box("Alignment-#{align || :default}") do |composer, settings|
8
- settings.flow = :t2b
9
- settings.full_border
10
- settings.align = align
11
- # Keep the title long so grids below will be wide enough to use the
12
- # alignment attribute. Don't rely on the `width` attribute to keep
13
- # `align` isolated in this test.
14
- composer.add_text('Title') { 'This is an aligned box' }
15
- composer.add_text('Content') { align || :default }
6
+ composer.add_grid do |composer, settings|
7
+ settings.num_cols = 2
8
+
9
+ [nil, :left, :center, :right].each do |align|
10
+ composer.add_box("Alignment-#{align || :default}") do |composer, settings|
11
+ settings.flow = :t2b
12
+ settings.full_border
13
+ settings.align = align
14
+ # Keep the title long so grids below will be wide enough to use the
15
+ # alignment attribute. Don't rely on the `width` attribute to keep
16
+ # `align` isolated in this test.
17
+ composer.add_text('Title') { 'This is an aligned box' }
18
+ composer.add_text('Content') { align || :default }
19
+ end
16
20
  end
17
21
  end
18
22
  end
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned griddefault┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridleft┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridcenter┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridright[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned griddefault┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridleft┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridcenter┏━━━━┃ ┣━━━━┃ ┗━━━━This[?25h
@@ -1 +1 @@
1
- [?25lThis is boldThis is not bold[?25h
1
+ [?25lThis is boldThis is not bold[?25h
@@ -1 +1 @@
1
- [?25lBLACK on WHITEGRAY on BRIGHT_REDRED on BRIGHT_GREENGREEN on BRIGHT_YELLOWYELLOW on BRIGHT_BLUEBLUE on BRIGHT_MAGENTAMAGENTA on BRIGHT_CYANCYAN on BRIGHT_WHITEWHITE on BLACKBRIGHT_RED on GRAYBRIGHT_GREEN on REDBRIGHT_YELLOW on GREENBRIGHT_BLUE on YELLOWBRIGHT_MAGENTA on BLUEBRIGHT_CYAN on MAGENTABRIGHT_WHITE on CYAN[?25h
1
+ [?25lBLACK on WHITEGRAY on BRIGHT_REDRED on BRIGHT_GREENGREEN on BRIGHT_YELLOWYELLOW on BRIGHT_BLUEBLUE on BRIGHT_MAGENTAMAGENTA on BRIGHT_CYANCYAN on BRIGHT_WHITEWHITE on BLACKBRIGHT_RED on GRAYBRIGHT_GREEN on REDBRIGHT_YELLOW on GREENBRIGHT_BLUE on YELLOWBRIGHT_MAGENTA on BLUEBRIGHT_CYAN on MAGENTABRIGHT_WHITE on CYAN[?25h
@@ -1 +1 @@
1
- [?25lThis is underlinedThis is not underlined[?25h
1
+ [?25lThis is underlinedThis is not underlined[?25h
@@ -1 +1 @@
1
- [?25l╔══╦══╦══╗║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╚══╩══╩══╝01234567891011[?25h
1
+ [?25l╔══╦══╦══╗║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╚══╩══╩══╝01234567891011[?25h
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛3. NARROW┏━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━┛2. WIDE┏━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━┛1. MEDIUM[?25h
@@ -0,0 +1,24 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer, settings|
6
+ settings.flow = :b2t
7
+ settings.full_border
8
+ composer.add_box('Medium') do |composer, settings|
9
+ settings.full_border
10
+ settings.set_padding(left: 3, right: 3)
11
+ '1. MEDIUM'
12
+ end
13
+ composer.add_box('Wide') do |composer, settings|
14
+ settings.full_border
15
+ settings.set_padding(left: 7, right: 7)
16
+ '2. WIDE'
17
+ end
18
+ composer.add_box('Narrow') do |composer, settings|
19
+ settings.full_border
20
+ '3. NARROW'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━┛1. MEDIUM┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛2. TALL┏━━━━━━━━┓┃ ┃┗━━━━━━━━┛3. SHORT[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━┛1. MEDIUM┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛2. TALL┏━━━━━━━━┓┃ ┃┗━━━━━━━━┛3. SHORT[?25h
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━┓┃ ┃┗━━━━━━━━┛3. SHORT┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛2. TALL┏━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━┛1. MEDIUM[?25h
@@ -0,0 +1,24 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer, settings|
6
+ settings.flow = :r2l
7
+ settings.full_border
8
+ composer.add_box('Medium') do |composer, settings|
9
+ settings.set_padding(top: 2, bottom: 2)
10
+ settings.full_border
11
+ '1. MEDIUM'
12
+ end
13
+ composer.add_box('Tall') do |composer, settings|
14
+ settings.set_padding(top: 4, bottom: 4)
15
+ settings.full_border
16
+ '2. TALL'
17
+ end
18
+ composer.add_box('Short') do |composer, settings|
19
+ settings.full_border
20
+ '3. SHORT'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━┛1. MEDIUM┏━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━┛2. WIDE┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛3. NARROW[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━┛1. MEDIUM┏━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━┛2. WIDE┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛3. NARROW[?25h
@@ -0,0 +1 @@
1
+ [?25l┏━━┳━━┳━━┳━━┓┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┗━━┻━━┻━━┻━━┛1234567891011121314[?25h
@@ -0,0 +1,14 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_grid do |_, settings|
7
+ settings.flow = :b2t
8
+ settings.full_border
9
+ settings.num_cols = 4
10
+ 14.times.map { |i| i + 1 }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━┳━━┳━━┳━━┓┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┗━━┻━━┻━━┻━━┛1234567891011121314[?25h