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.
- 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
|