whirled_peas 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +6 -0
- data/README.md +62 -29
- data/Rakefile +3 -2
- data/examples/intro.rb +52 -0
- data/examples/scrolling.rb +53 -0
- data/lib/whirled_peas.rb +2 -8
- data/lib/whirled_peas/command_line.rb +25 -33
- data/lib/whirled_peas/graphics/box_painter.rb +9 -1
- data/lib/whirled_peas/graphics/composer.rb +80 -0
- data/lib/whirled_peas/graphics/container_coords.rb +18 -8
- data/lib/whirled_peas/graphics/container_dimensions.rb +17 -7
- data/lib/whirled_peas/graphics/container_painter.rb +151 -33
- data/lib/whirled_peas/graphics/debugger.rb +10 -1
- data/lib/whirled_peas/graphics/grid_painter.rb +14 -2
- data/lib/whirled_peas/graphics/mock_screen.rb +1 -1
- data/lib/whirled_peas/graphics/painter.rb +1 -6
- data/lib/whirled_peas/graphics/renderer.rb +1 -29
- data/lib/whirled_peas/graphics/screen.rb +8 -3
- data/lib/whirled_peas/graphics/text_painter.rb +6 -4
- data/lib/whirled_peas/settings/container_settings.rb +11 -0
- data/lib/whirled_peas/settings/debugger.rb +9 -0
- data/lib/whirled_peas/settings/grid_settings.rb +4 -0
- data/lib/whirled_peas/settings/scrollbar.rb +15 -0
- data/lib/whirled_peas/version.rb +1 -1
- data/screen_test/rendered/elements/box.frame +1 -1
- data/screen_test/rendered/elements/grid.frame +1 -1
- data/screen_test/rendered/elements/screen_overflow.frame +1 -0
- data/screen_test/rendered/elements/text.frame +1 -1
- data/screen_test/rendered/elements/text_multiline.frame +1 -1
- data/screen_test/rendered/settings/align/box.frame +1 -1
- data/screen_test/rendered/settings/align/box.rb +14 -10
- data/screen_test/rendered/settings/align/children_center.frame +1 -1
- data/screen_test/rendered/settings/align/children_left.frame +1 -1
- data/screen_test/rendered/settings/align/children_right.frame +1 -1
- data/screen_test/rendered/settings/align/grid.frame +1 -1
- data/screen_test/rendered/settings/ansi/bold.frame +1 -1
- data/screen_test/rendered/settings/ansi/color.frame +1 -1
- data/screen_test/rendered/settings/ansi/underline.frame +1 -1
- data/screen_test/rendered/settings/border.frame +1 -1
- data/screen_test/rendered/settings/flow/box_b2t.frame +1 -0
- data/screen_test/rendered/settings/flow/box_b2t.rb +24 -0
- data/screen_test/rendered/settings/flow/{l2r.frame → box_l2r.frame} +1 -1
- data/screen_test/rendered/settings/flow/{l2r.rb → box_l2r.rb} +0 -0
- data/screen_test/rendered/settings/flow/box_r2l.frame +1 -0
- data/screen_test/rendered/settings/flow/box_r2l.rb +24 -0
- data/screen_test/rendered/settings/flow/{t2b.frame → box_t2b.frame} +1 -1
- data/screen_test/rendered/settings/flow/{t2b.rb → box_t2b.rb} +0 -0
- data/screen_test/rendered/settings/flow/grid_b2t.frame +1 -0
- data/screen_test/rendered/settings/flow/grid_b2t.rb +14 -0
- data/screen_test/rendered/settings/flow/grid_l2r.frame +1 -0
- data/screen_test/rendered/settings/flow/grid_l2r.rb +14 -0
- data/screen_test/rendered/settings/flow/grid_r2l.frame +1 -0
- data/screen_test/rendered/settings/flow/grid_r2l.rb +14 -0
- data/screen_test/rendered/settings/flow/grid_t2b.frame +1 -0
- data/screen_test/rendered/settings/flow/grid_t2b.rb +14 -0
- data/screen_test/rendered/settings/height/box.frame +1 -1
- data/screen_test/rendered/settings/height/grid.frame +1 -1
- data/screen_test/rendered/settings/height/overflow_box.frame +1 -1
- data/screen_test/rendered/settings/height/overflow_box_l2r.frame +1 -1
- data/screen_test/rendered/settings/height/overflow_box_t2b.frame +1 -1
- data/screen_test/rendered/settings/height/overflow_grid.frame +1 -1
- data/screen_test/rendered/settings/margin.frame +1 -1
- data/screen_test/rendered/settings/padding.frame +1 -1
- data/screen_test/rendered/settings/position/box_left.frame +1 -1
- data/screen_test/rendered/settings/position/box_left_negative.frame +1 -1
- data/screen_test/rendered/settings/position/box_top.frame +1 -1
- data/screen_test/rendered/settings/position/box_top_negative.frame +1 -1
- data/screen_test/rendered/settings/position/grid_left.frame +1 -1
- data/screen_test/rendered/settings/position/grid_left_negative.frame +1 -1
- data/screen_test/rendered/settings/position/grid_top.frame +1 -1
- data/screen_test/rendered/settings/position/grid_top_negative.frame +1 -1
- data/screen_test/rendered/settings/scroll/horiz_box.frame +1 -0
- data/screen_test/rendered/settings/scroll/horiz_box.rb +15 -0
- data/screen_test/rendered/settings/scroll/vert_box.frame +1 -0
- data/screen_test/rendered/settings/scroll/vert_box.rb +18 -0
- data/screen_test/rendered/settings/title_font.frame +1 -1
- data/screen_test/rendered/settings/width/box.frame +1 -1
- data/screen_test/rendered/settings/width/grid.frame +1 -1
- data/screen_test/rendered/settings/width/overflow_box.frame +1 -1
- data/screen_test/rendered/settings/width/overflow_box_l2r.frame +1 -1
- data/screen_test/rendered/settings/width/overflow_box_t2b.frame +1 -1
- data/screen_test/rendered/settings/width/overflow_grid.frame +1 -1
- data/screen_test/screen_tester.rb +13 -3
- metadata +27 -16
- data/bin/debug +0 -35
- data/lib/whirled_peas/debugger.rb +0 -80
- data/lib/whirled_peas/template.rb +0 -5
- data/lib/whirled_peas/template/box_element.rb +0 -8
- data/lib/whirled_peas/template/composer.rb +0 -68
- data/lib/whirled_peas/template/container.rb +0 -28
- data/lib/whirled_peas/template/debugger.rb +0 -34
- data/lib/whirled_peas/template/element.rb +0 -13
- data/lib/whirled_peas/template/grid_element.rb +0 -8
- 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?(
|
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
|
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,8 +3,7 @@ module WhirledPeas
|
|
3
3
|
class Painter
|
4
4
|
attr_reader :name, :settings
|
5
5
|
|
6
|
-
def initialize(
|
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
|
-
|
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
|
15
|
+
def initialize(width: nil, height: nil, output: STDOUT)
|
16
16
|
@output = output
|
17
17
|
@terminal = HighLine.new.terminal
|
18
18
|
@strokes = []
|
19
|
-
|
20
|
-
|
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
|
-
|
31
|
+
content, settings.title_font
|
30
32
|
).split("\n")
|
31
33
|
else
|
32
|
-
|
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
|
data/lib/whirled_peas/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1HTOP LEFT[2;1HBOTTOM LEFT[1;12H TOP RIGHT [2;12H BOTTOM RIGHT[0m[
|
1
|
+
[?25l[1;1H[J[1;1HTOP LEFT[2;1HBOTTOM LEFT[1;12H TOP RIGHT [2;12H BOTTOM RIGHT[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[37m┏━━━━━━┳━━━━━━┳━━━━━━┓[0m[2;1H[37m┃ ┃ ┃ ┃[0m[3;1H[37m┣━━━━━━╋━━━━━━╋━━━━━━┫[0m[4;1H[37m┃ ┃ ┃ ┃[0m[5;1H[37m┣━━━━━━╋━━━━━━╋━━━━━━┫[0m[6;1H[37m┃ ┃ ┃ ┃[0m[7;1H[37m┗━━━━━━┻━━━━━━┻━━━━━━┛[0m[2;2HItem 0[2;9HItem 1[2;16HItem 2[4;2HItem 3[4;9HItem 4[4;16HItem 5[6;2HItem 6[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━┳━━━━━━┳━━━━━━┓[0m[2;1H[37m┃ ┃ ┃ ┃[0m[3;1H[37m┣━━━━━━╋━━━━━━╋━━━━━━┫[0m[4;1H[37m┃ ┃ ┃ ┃[0m[5;1H[37m┣━━━━━━╋━━━━━━╋━━━━━━┫[0m[6;1H[37m┃ ┃ ┃ ┃[0m[7;1H[37m┗━━━━━━┻━━━━━━┻━━━━━━┛[0m[2;2HItem 0[2;9HItem 1[2;16HItem 2[4;2HItem 3[4;9HItem 4[4;16HItem 5[6;2HItem 6[0m[32;1H[?25h
|
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H--------------------------------------------------------------------------------[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1HHello, World![0m[
|
1
|
+
[?25l[1;1H[J[1;1HHello, World![0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1HLine 1[2;1HLine 2[3;1HLine 3[0m[
|
1
|
+
[?25l[1;1H[J[1;1HLine 1[2;1HLine 2[3;1HLine 3[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2HThis is an aligned box[3;2Hdefault[1;25H[37m┏━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;25H[37m┃ ┃[0m[3;25H[37m┃ ┃[0m[4;25H[37m┗━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;26HThis is an aligned box[3;26Hleft[
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2HThis is an aligned box[3;2Hdefault[1;25H[37m┏━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;25H[37m┃ ┃[0m[3;25H[37m┃ ┃[0m[4;25H[37m┗━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;26HThis is an aligned box[3;26Hleft[5;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━┓[0m[6;1H[37m┃ ┃[0m[7;1H[37m┃ ┃[0m[8;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━┛[0m[6;2HThis is an aligned box[7;10Hcenter[5;25H[37m┏━━━━━━━━━━━━━━━━━━━━━━┓[0m[6;25H[37m┃ ┃[0m[7;25H[37m┃ ┃[0m[8;25H[37m┗━━━━━━━━━━━━━━━━━━━━━━┛[0m[6;26HThis is an aligned box[7;43Hright[0m[32;1H[?25h
|
@@ -3,16 +3,20 @@ require 'whirled_peas'
|
|
3
3
|
class TemplateFactory
|
4
4
|
def build(*)
|
5
5
|
WhirledPeas.template do |composer|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;20HThing 1[2;27HThing 2[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;20HThing 1[2;27HThing 2[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2HThing 1[2;9HThing 2[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2HThing 1[2;9HThing 2[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;38HThing 1[2;45HThing 2[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;38HThing 1[2;45HThing 2[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┣━━━━━━━━━━━━━━━━━━━━━━━┫[0m[4;1H[37m┃ ┃[0m[5;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2HThis is an aligned grid[4;2Hdefault[1;26H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;26H[37m┃ ┃[0m[3;26H[37m┣━━━━━━━━━━━━━━━━━━━━━━━┫[0m[4;26H[37m┃ ┃[0m[5;26H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;27HThis is an aligned grid[4;27Hleft[1;51H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;51H[37m┃ ┃[0m[3;51H[37m┣━━━━━━━━━━━━━━━━━━━━━━━┫[0m[4;51H[37m┃ ┃[0m[5;51H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;52HThis is an aligned grid[4;60Hcenter[1;76H[37m
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┣━━━━━━━━━━━━━━━━━━━━━━━┫[0m[4;1H[37m┃ ┃[0m[5;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2HThis is an aligned grid[4;2Hdefault[1;26H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;26H[37m┃ ┃[0m[3;26H[37m┣━━━━━━━━━━━━━━━━━━━━━━━┫[0m[4;26H[37m┃ ┃[0m[5;26H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;27HThis is an aligned grid[4;27Hleft[1;51H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;51H[37m┃ ┃[0m[3;51H[37m┣━━━━━━━━━━━━━━━━━━━━━━━┫[0m[4;51H[37m┃ ┃[0m[5;51H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;52HThis is an aligned grid[4;60Hcenter[1;76H[37m┏━━━━[0m[2;76H[37m┃ [0m[3;76H[37m┣━━━━[0m[4;76H[37m┃ [0m[5;76H[37m┗━━━━[0m[2;77HThis[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[1mThis is bold[0m[1;13HThis is not bold[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[1mThis is bold[0m[1;13HThis is not bold[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[30m[47mBLACK on WHITE[0m[2;1H[90m[101mGRAY on BRIGHT_RED[0m[3;1H[31m[102mRED on BRIGHT_GREEN[0m[4;1H[32m[103mGREEN on BRIGHT_YELLOW[0m[5;1H[33m[104mYELLOW on BRIGHT_BLUE[0m[6;1H[34m[105mBLUE on BRIGHT_MAGENTA[0m[7;1H[35m[106mMAGENTA on BRIGHT_CYAN[0m[8;1H[36m[107mCYAN on BRIGHT_WHITE[0m[9;1H[37m[40mWHITE on BLACK[0m[10;1H[91m[100mBRIGHT_RED on GRAY[0m[11;1H[92m[41mBRIGHT_GREEN on RED[0m[12;1H[93m[42mBRIGHT_YELLOW on GREEN[0m[13;1H[94m[43mBRIGHT_BLUE on YELLOW[0m[14;1H[95m[44mBRIGHT_MAGENTA on BLUE[0m[15;1H[96m[45mBRIGHT_CYAN on MAGENTA[0m[16;1H[97m[46mBRIGHT_WHITE on CYAN[0m[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[30m[47mBLACK on WHITE[0m[2;1H[90m[101mGRAY on BRIGHT_RED[0m[3;1H[31m[102mRED on BRIGHT_GREEN[0m[4;1H[32m[103mGREEN on BRIGHT_YELLOW[0m[5;1H[33m[104mYELLOW on BRIGHT_BLUE[0m[6;1H[34m[105mBLUE on BRIGHT_MAGENTA[0m[7;1H[35m[106mMAGENTA on BRIGHT_CYAN[0m[8;1H[36m[107mCYAN on BRIGHT_WHITE[0m[9;1H[37m[40mWHITE on BLACK[0m[10;1H[91m[100mBRIGHT_RED on GRAY[0m[11;1H[92m[41mBRIGHT_GREEN on RED[0m[12;1H[93m[42mBRIGHT_YELLOW on GREEN[0m[13;1H[94m[43mBRIGHT_BLUE on YELLOW[0m[14;1H[95m[44mBRIGHT_MAGENTA on BLUE[0m[15;1H[96m[45mBRIGHT_CYAN on MAGENTA[0m[16;1H[97m[46mBRIGHT_WHITE on CYAN[0m[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[4mThis is underlined[0m[1;19HThis is not underlined[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[4mThis is underlined[0m[1;19HThis is not underlined[0m[32;1H[?25h
|
@@ -1 +1 @@
|
|
1
|
-
[?25l[1;1H[J[1;1H[32m╔══╦══╦══╗[0m[2;1H[32m║ ║ ║ ║[0m[3;1H[32m╠══╬══╬══╣[0m[4;1H[32m║ ║ ║ ║[0m[5;1H[32m╠══╬══╬══╣[0m[6;1H[32m║ ║ ║ ║[0m[7;1H[32m╠══╬══╬══╣[0m[8;1H[32m║ ║ ║ ║[0m[9;1H[32m╚══╩══╩══╝[0m[2;2H0[2;5H1[2;8H2[4;2H3[4;5H4[4;8H5[6;2H6[6;5H7[6;8H8[8;2H9[8;5H10[8;8H11[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[32m╔══╦══╦══╗[0m[2;1H[32m║ ║ ║ ║[0m[3;1H[32m╠══╬══╬══╣[0m[4;1H[32m║ ║ ║ ║[0m[5;1H[32m╠══╬══╬══╣[0m[6;1H[32m║ ║ ║ ║[0m[7;1H[32m╠══╬══╬══╣[0m[8;1H[32m║ ║ ║ ║[0m[9;1H[32m╚══╩══╩══╝[0m[2;2H0[2;5H1[2;8H2[4;2H3[4;5H4[4;8H5[6;2H6[6;5H7[6;8H8[8;2H9[8;5H10[8;8H11[0m[32;1H[?25h
|
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┃ ┃[0m[5;1H[37m┃ ┃[0m[6;1H[37m┃ ┃[0m[7;1H[37m┃ ┃[0m[8;1H[37m┃ ┃[0m[9;1H[37m┃ ┃[0m[10;1H[37m┃ ┃[0m[11;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2H[37m┏━━━━━━━━━┓[0m[3;2H[37m┃ ┃[0m[4;2H[37m┗━━━━━━━━━┛[0m[3;3H3. NARROW[5;2H[37m┏━━━━━━━━━━━━━━━━━━━━━┓[0m[6;2H[37m┃ ┃[0m[7;2H[37m┗━━━━━━━━━━━━━━━━━━━━━┛[0m[6;10H2. WIDE[8;2H[37m┏━━━━━━━━━━━━━━━┓[0m[9;2H[37m┃ ┃[0m[10;2H[37m┗━━━━━━━━━━━━━━━┛[0m[9;6H1. MEDIUM[0m[32;1H[?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;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┃ ┃[0m[5;1H[37m┃ ┃[0m[6;1H[37m┃ ┃[0m[7;1H[37m┃ ┃[0m[8;1H[37m┃ ┃[0m[9;1H[37m┃ ┃[0m[10;1H[37m┃ ┃[0m[11;1H[37m┃ ┃[0m[12;1H[37m┃ ┃[0m[13;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2H[37m┏━━━━━━━━━┓[0m[3;2H[37m┃ ┃[0m[4;2H[37m┃ ┃[0m[5;2H[37m┃ ┃[0m[6;2H[37m┃ ┃[0m[7;2H[37m┃ ┃[0m[8;2H[37m┗━━━━━━━━━┛[0m[5;3H1. MEDIUM[2;13H[37m┏━━━━━━━┓[0m[3;13H[37m┃ ┃[0m[4;13H[37m┃ ┃[0m[5;13H[37m┃ ┃[0m[6;13H[37m┃ ┃[0m[7;13H[37m┃ ┃[0m[8;13H[37m┃ ┃[0m[9;13H[37m┃ ┃[0m[10;13H[37m┃ ┃[0m[11;13H[37m┃ ┃[0m[12;13H[37m┗━━━━━━━┛[0m[7;14H2. TALL[2;22H[37m┏━━━━━━━━┓[0m[3;22H[37m┃ ┃[0m[4;22H[37m┗━━━━━━━━┛[0m[3;23H3. SHORT[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┃ ┃[0m[5;1H[37m┃ ┃[0m[6;1H[37m┃ ┃[0m[7;1H[37m┃ ┃[0m[8;1H[37m┃ ┃[0m[9;1H[37m┃ ┃[0m[10;1H[37m┃ ┃[0m[11;1H[37m┃ ┃[0m[12;1H[37m┃ ┃[0m[13;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2H[37m┏━━━━━━━━━┓[0m[3;2H[37m┃ ┃[0m[4;2H[37m┃ ┃[0m[5;2H[37m┃ ┃[0m[6;2H[37m┃ ┃[0m[7;2H[37m┃ ┃[0m[8;2H[37m┗━━━━━━━━━┛[0m[5;3H1. MEDIUM[2;13H[37m┏━━━━━━━┓[0m[3;13H[37m┃ ┃[0m[4;13H[37m┃ ┃[0m[5;13H[37m┃ ┃[0m[6;13H[37m┃ ┃[0m[7;13H[37m┃ ┃[0m[8;13H[37m┃ ┃[0m[9;13H[37m┃ ┃[0m[10;13H[37m┃ ┃[0m[11;13H[37m┃ ┃[0m[12;13H[37m┗━━━━━━━┛[0m[7;14H2. TALL[2;22H[37m┏━━━━━━━━┓[0m[3;22H[37m┃ ┃[0m[4;22H[37m┗━━━━━━━━┛[0m[3;23H3. SHORT[0m[32;1H[?25h
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┃ ┃[0m[5;1H[37m┃ ┃[0m[6;1H[37m┃ ┃[0m[7;1H[37m┃ ┃[0m[8;1H[37m┃ ┃[0m[9;1H[37m┃ ┃[0m[10;1H[37m┃ ┃[0m[11;1H[37m┃ ┃[0m[12;1H[37m┃ ┃[0m[13;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2H[37m┏━━━━━━━━┓[0m[3;2H[37m┃ ┃[0m[4;2H[37m┗━━━━━━━━┛[0m[3;3H3. SHORT[2;12H[37m┏━━━━━━━┓[0m[3;12H[37m┃ ┃[0m[4;12H[37m┃ ┃[0m[5;12H[37m┃ ┃[0m[6;12H[37m┃ ┃[0m[7;12H[37m┃ ┃[0m[8;12H[37m┃ ┃[0m[9;12H[37m┃ ┃[0m[10;12H[37m┃ ┃[0m[11;12H[37m┃ ┃[0m[12;12H[37m┗━━━━━━━┛[0m[7;13H2. TALL[2;21H[37m┏━━━━━━━━━┓[0m[3;21H[37m┃ ┃[0m[4;21H[37m┃ ┃[0m[5;21H[37m┃ ┃[0m[6;21H[37m┃ ┃[0m[7;21H[37m┃ ┃[0m[8;21H[37m┗━━━━━━━━━┛[0m[5;22H1. MEDIUM[0m[32;1H[?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;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┃ ┃[0m[5;1H[37m┃ ┃[0m[6;1H[37m┃ ┃[0m[7;1H[37m┃ ┃[0m[8;1H[37m┃ ┃[0m[9;1H[37m┃ ┃[0m[10;1H[37m┃ ┃[0m[11;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2H[37m┏━━━━━━━━━━━━━━━┓[0m[3;2H[37m┃ ┃[0m[4;2H[37m┗━━━━━━━━━━━━━━━┛[0m[3;6H1. MEDIUM[5;2H[37m┏━━━━━━━━━━━━━━━━━━━━━┓[0m[6;2H[37m┃ ┃[0m[7;2H[37m┗━━━━━━━━━━━━━━━━━━━━━┛[0m[6;10H2. WIDE[8;2H[37m┏━━━━━━━━━┓[0m[9;2H[37m┃ ┃[0m[10;2H[37m┗━━━━━━━━━┛[0m[9;3H3. NARROW[0m[
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━━━━━━━━━━━━━━━━━━━━━━┓[0m[2;1H[37m┃ ┃[0m[3;1H[37m┃ ┃[0m[4;1H[37m┃ ┃[0m[5;1H[37m┃ ┃[0m[6;1H[37m┃ ┃[0m[7;1H[37m┃ ┃[0m[8;1H[37m┃ ┃[0m[9;1H[37m┃ ┃[0m[10;1H[37m┃ ┃[0m[11;1H[37m┗━━━━━━━━━━━━━━━━━━━━━━━┛[0m[2;2H[37m┏━━━━━━━━━━━━━━━┓[0m[3;2H[37m┃ ┃[0m[4;2H[37m┗━━━━━━━━━━━━━━━┛[0m[3;6H1. MEDIUM[5;2H[37m┏━━━━━━━━━━━━━━━━━━━━━┓[0m[6;2H[37m┃ ┃[0m[7;2H[37m┗━━━━━━━━━━━━━━━━━━━━━┛[0m[6;10H2. WIDE[8;2H[37m┏━━━━━━━━━┓[0m[9;2H[37m┃ ┃[0m[10;2H[37m┗━━━━━━━━━┛[0m[9;3H3. NARROW[0m[32;1H[?25h
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H[37m┏━━┳━━┳━━┳━━┓[0m[2;1H[37m┃ ┃ ┃ ┃ ┃[0m[3;1H[37m┣━━╋━━╋━━╋━━┫[0m[4;1H[37m┃ ┃ ┃ ┃ ┃[0m[5;1H[37m┣━━╋━━╋━━╋━━┫[0m[6;1H[37m┃ ┃ ┃ ┃ ┃[0m[7;1H[37m┣━━╋━━╋━━╋━━┫[0m[8;1H[37m┃ ┃ ┃ ┃ ┃[0m[9;1H[37m┗━━┻━━┻━━┻━━┛[0m[8;2H1[6;2H2[4;2H3[2;2H4[8;5H5[6;5H6[4;5H7[2;5H8[8;8H9[6;8H10[4;8H11[2;8H12[8;11H13[6;11H14[0m[32;1H[?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[1;1H[J[1;1H[37m┏━━┳━━┳━━┳━━┓[0m[2;1H[37m┃ ┃ ┃ ┃ ┃[0m[3;1H[37m┣━━╋━━╋━━╋━━┫[0m[4;1H[37m┃ ┃ ┃ ┃ ┃[0m[5;1H[37m┣━━╋━━╋━━╋━━┫[0m[6;1H[37m┃ ┃ ┃ ┃ ┃[0m[7;1H[37m┣━━╋━━╋━━╋━━┫[0m[8;1H[37m┃ ┃ ┃ ┃ ┃[0m[9;1H[37m┗━━┻━━┻━━┻━━┛[0m[2;2H1[2;5H2[2;8H3[2;11H4[4;2H5[4;5H6[4;8H7[4;11H8[6;2H9[6;5H10[6;8H11[6;11H12[8;2H13[8;5H14[0m[32;1H[?25h
|