tabularize 0.2.5 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +11 -0
- data/Gemfile.lock +1 -1
- data/README.md +17 -10
- data/lib/tabularize.rb +73 -41
- data/lib/tabularize/version.rb +1 -1
- data/test/readme.rb +3 -2
- data/test/test_tabularize.rb +29 -2
- metadata +2 -2
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -46,9 +46,11 @@ puts table
|
|
46
46
|
* `:pad_left` Size of left padding
|
47
47
|
* `:pad_right` Size of right padding
|
48
48
|
* Border
|
49
|
+
* `:border_style` Predefined border styles. `:ascii` (default) and `:unicode`
|
50
|
+
* `:border_color` ANSI color code for borders
|
49
51
|
* `:hborder` Character for horizontal border
|
50
52
|
* `:vborder` Character for vertical border
|
51
|
-
* `:iborder`
|
53
|
+
* `:iborder` Array of 9 characters for intersection points. e.g. `%w[┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘]`
|
52
54
|
* Alignment
|
53
55
|
* `:align` Horizontal alignment. `:left`, `:center`, `:right`, or Array of the three options
|
54
56
|
* `:valign` Vertical alignment. `:top`, `:middle`, `:bottom`, or Array of the three options
|
@@ -57,7 +59,11 @@ puts table
|
|
57
59
|
* `:ellipsis` Ellipsis string when cells are cut off. Default: `>`
|
58
60
|
|
59
61
|
```ruby
|
62
|
+
require 'ansi'
|
63
|
+
|
60
64
|
table = Tabularize.new :pad => '.', :pad_left => 2, :pad_right => 0,
|
65
|
+
:border_style => :unicode,
|
66
|
+
:border_color => ANSI::Code.red,
|
61
67
|
:hborder => '~', :vborder => 'I', :iborder => '#',
|
62
68
|
:align => [:left, :center, :right],
|
63
69
|
:valign => [:top, :bottom, :middle, :middle],
|
@@ -71,15 +77,15 @@ puts table
|
|
71
77
|
```
|
72
78
|
|
73
79
|
```
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
┌─────────────┬─────────────┬─────────────────────────────┬──────────~
|
81
|
+
│..Name.......│.....Dept....│.....................Location│.....Phone~
|
82
|
+
├─────────────┼─────────────┼─────────────────────────────┼──────────~
|
83
|
+
│..John Doe...│....Finance..│.........Los Angeles CA 90089│..555-1555~
|
84
|
+
│..Average Joe│..Engineering│...Somewhere over the rainbow│.......N/A~
|
85
|
+
│..홍길동.....│.............│..서울역 3번 출구 김씨 옆자리│..........~
|
86
|
+
│.............│.............│.............................│.......N/A~
|
87
|
+
│.............│...탁상 3부..│.....................맞습니다│..........~
|
88
|
+
└─────────────┴─────────────┴─────────────────────────────┴──────────~
|
83
89
|
```
|
84
90
|
|
85
91
|
Tabularize.it
|
@@ -206,6 +212,7 @@ There are a few things, however, [tabularize](https://github.com/junegunn/tabula
|
|
206
212
|
- It correctly formats cells containing CJK wide characters.
|
207
213
|
- Vertical alignment for multi-line cells
|
208
214
|
- Cutting off trailing cells when the width of the output string exceeds specified screen width
|
215
|
+
- Customizable border style
|
209
216
|
|
210
217
|
Copyright
|
211
218
|
---------
|
data/lib/tabularize.rb
CHANGED
@@ -1,21 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require "tabularize/version"
|
2
4
|
require 'stringio'
|
3
5
|
require 'unicode/display_width'
|
4
6
|
|
5
7
|
class Tabularize
|
6
8
|
DEFAULT_OPTIONS = {
|
7
|
-
:align
|
8
|
-
:valign
|
9
|
-
:pad
|
10
|
-
:pad_left
|
11
|
-
:pad_right
|
9
|
+
:align => :left,
|
10
|
+
:valign => :top,
|
11
|
+
:pad => ' ',
|
12
|
+
:pad_left => 0,
|
13
|
+
:pad_right => 0,
|
12
14
|
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:iborder => '+',
|
15
|
+
:border_style => :ascii,
|
16
|
+
:border_color => nil,
|
16
17
|
|
17
|
-
:unicode
|
18
|
-
:ansi
|
18
|
+
:unicode => true,
|
19
|
+
:ansi => true,
|
19
20
|
|
20
21
|
:ellipsis => '>',
|
21
22
|
:screen_width => nil,
|
@@ -26,6 +27,19 @@ class Tabularize
|
|
26
27
|
:pad_right => 1,
|
27
28
|
}
|
28
29
|
|
30
|
+
BORDER_STYLE = {
|
31
|
+
:ascii => {
|
32
|
+
:hborder => '-',
|
33
|
+
:vborder => '|',
|
34
|
+
:iborder => %w[+ + + + + + + + +],
|
35
|
+
},
|
36
|
+
:unicode => {
|
37
|
+
:hborder => '─',
|
38
|
+
:vborder => '│',
|
39
|
+
:iborder => %w[┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘],
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
29
43
|
# @since 0.2.0
|
30
44
|
def initialize options = {}
|
31
45
|
@rows = []
|
@@ -33,6 +47,14 @@ class Tabularize
|
|
33
47
|
@options = DEFAULT_OPTIONS.
|
34
48
|
merge(DEFAULT_OPTIONS_GENERATOR).
|
35
49
|
merge(options)
|
50
|
+
if @options[:border_style]
|
51
|
+
@options = BORDER_STYLE[@options[:border_style]].merge(@options)
|
52
|
+
|
53
|
+
# Backward-compatibility
|
54
|
+
unless @options[:iborder].is_a?(Array)
|
55
|
+
@options[:iborder] = [@options[:iborder]] * 9
|
56
|
+
end
|
57
|
+
end
|
36
58
|
@cache = {}
|
37
59
|
end
|
38
60
|
|
@@ -66,12 +88,12 @@ class Tabularize
|
|
66
88
|
num_cached_rows = 0
|
67
89
|
else
|
68
90
|
[@seps[@rows.length] - @cache[:last_seps], 0].max.times do
|
69
|
-
@cache[:string_io].puts @cache[:
|
91
|
+
@cache[:string_io].puts @cache[:separators][1]
|
70
92
|
end
|
71
93
|
@cache[:last_seps] = @seps[@rows.length]
|
72
94
|
|
73
95
|
if num_cached_rows == @rows.length
|
74
|
-
return @cache[:string_io].string + @cache[:
|
96
|
+
return @cache[:string_io].string + @cache[:separators].last
|
75
97
|
end
|
76
98
|
end
|
77
99
|
end
|
@@ -80,63 +102,73 @@ class Tabularize
|
|
80
102
|
|
81
103
|
h = @options[:hborder]
|
82
104
|
v = @options[:vborder]
|
83
|
-
i = @options[:iborder]
|
84
105
|
vl = @options[:vborder]
|
85
|
-
|
106
|
+
i9 = @options[:iborder]
|
107
|
+
e = @options[:ellipsis]
|
108
|
+
c = @options[:border_color] || ''
|
109
|
+
r = c.empty? ? '' : "\e[0m"
|
86
110
|
u = @options[:unicode]
|
87
111
|
a = @options[:ansi]
|
88
112
|
sw = @options[:screen_width]
|
89
|
-
el = Tabularize.cell_width(
|
113
|
+
el = Tabularize.cell_width(e, u, a)
|
90
114
|
|
91
|
-
|
115
|
+
separators = @cache[:separators]
|
92
116
|
col_count = @cache[:col_count]
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
117
|
+
separators ||=
|
118
|
+
Array.new(3) {''}.zip(i9.each_slice(3).to_a).map { |separator, i3|
|
119
|
+
rows[0].each_with_index do |ch, idx|
|
120
|
+
new_sep = separator + i3[idx == 0 ? 0 : 1] + h * Tabularize.cell_width(ch, u, a)
|
121
|
+
|
122
|
+
if sw && Tabularize.cell_width(new_sep, u, a) > sw - el
|
123
|
+
col_count = idx
|
124
|
+
break
|
125
|
+
else
|
126
|
+
separator = new_sep
|
127
|
+
end
|
128
|
+
end
|
129
|
+
separator += col_count ? e : i3.last
|
130
|
+
if c
|
131
|
+
c + separator + r
|
101
132
|
else
|
102
|
-
separator
|
133
|
+
separator
|
103
134
|
end
|
104
|
-
|
105
|
-
separator += il
|
106
|
-
end
|
135
|
+
}
|
107
136
|
|
108
|
-
output = @cache[:string_io] || StringIO.new.tap { |io|
|
137
|
+
output = @cache[:string_io] || StringIO.new.tap { |io|
|
138
|
+
io.set_encoding 'UTF-8' if io.respond_to? :set_encoding
|
139
|
+
io.puts separators.first
|
140
|
+
}
|
109
141
|
if col_count
|
110
142
|
rows = rows.map { |line| line[0, col_count] }
|
111
|
-
vl =
|
143
|
+
vl = e
|
112
144
|
end
|
113
145
|
rows.each_with_index do |row, idx|
|
114
146
|
row = row.map { |val| val.lines.to_a.map(&:chomp) }
|
115
147
|
height = row[0] ? row[0].count : 1
|
116
148
|
@seps[idx + num_cached_rows].times do
|
117
|
-
output.puts
|
149
|
+
output.puts separators[1]
|
118
150
|
end
|
119
151
|
(0...height).each do |line|
|
120
|
-
output.print v unless row.empty?
|
152
|
+
output.print c + v + r unless row.empty?
|
121
153
|
output.puts row.map { |lines|
|
122
154
|
lines[line] || @options[:pad] * Tabularize.cell_width(lines[0], u, a)
|
123
|
-
}.join(v) + vl
|
155
|
+
}.join(c + v + r) + c + vl + r
|
124
156
|
end
|
125
157
|
end
|
126
158
|
|
127
159
|
@seps[rows.length + num_cached_rows].times do
|
128
|
-
output.puts
|
160
|
+
output.puts separators[1]
|
129
161
|
end
|
130
162
|
|
131
163
|
@cache = {
|
132
|
-
:analysis
|
133
|
-
:
|
134
|
-
:col_count
|
135
|
-
:num_rows
|
136
|
-
:string_io
|
137
|
-
:last_seps
|
164
|
+
:analysis => analysis,
|
165
|
+
:separators => separators,
|
166
|
+
:col_count => col_count,
|
167
|
+
:num_rows => @rows.length,
|
168
|
+
:string_io => output,
|
169
|
+
:last_seps => @seps[rows.length]
|
138
170
|
}
|
139
|
-
output.string +
|
171
|
+
output.string + separators.last
|
140
172
|
rescue Exception
|
141
173
|
@cache = {}
|
142
174
|
raise
|
data/lib/tabularize/version.rb
CHANGED
data/test/readme.rb
CHANGED
@@ -9,10 +9,11 @@ require 'tabularize'
|
|
9
9
|
|
10
10
|
table = Tabularize.new
|
11
11
|
table = Tabularize.new :pad => '.', :pad_left => 2, :pad_right => 0,
|
12
|
-
:
|
12
|
+
:border_style => :unicode,
|
13
|
+
:border_color => ANSI::Code.red,
|
13
14
|
:align => [:left, :center, :right],
|
14
15
|
:valign => [:top, :bottom, :middle, :middle],
|
15
|
-
:screen_width => 75, :ellipsis => '
|
16
|
+
:screen_width => 75, :ellipsis => '~'
|
16
17
|
table << %w[Name Dept Location Phone Description]
|
17
18
|
table.separator!
|
18
19
|
table << ['John Doe', 'Finance', 'Los Angeles CA 90089', '555-1555', 'Just a guy']
|
data/test/test_tabularize.rb
CHANGED
@@ -118,6 +118,8 @@ class TestTabularize < Test::Unit::TestCase
|
|
118
118
|
|
119
119
|
# TODO: Need assertion
|
120
120
|
def test_tabularize_csv
|
121
|
+
return if RUBY_VERSION =~ /^1\.8\./
|
122
|
+
|
121
123
|
sio = StringIO.new
|
122
124
|
|
123
125
|
{
|
@@ -141,7 +143,7 @@ class TestTabularize < Test::Unit::TestCase
|
|
141
143
|
|
142
144
|
def test_invalid_arguments
|
143
145
|
assert_raise(ArgumentError) { Tabularize.it(5) }
|
144
|
-
assert_raise(ArgumentError) { Tabularize.it("hello") }
|
146
|
+
assert_raise(ArgumentError) { Tabularize.it("hello") } unless RUBY_VERSION =~ /^1\.8\./
|
145
147
|
assert_raise(ArgumentError) { Tabularize.it([1, 2, 3], :align => :noidea) }
|
146
148
|
assert_raise(ArgumentError) { Tabularize.it([1, 2, 3], :valign => :noidea) }
|
147
149
|
assert_raise(ArgumentError) { Tabularize.it([1, 2, 3], :align => [:center, :top]) }
|
@@ -263,7 +265,32 @@ I..This should change everything doh!I.............I............................
|
|
263
265
|
t << %w[12345]
|
264
266
|
puts t.to_s
|
265
267
|
assert t.to_s.lines.all? { |line| line.chomp.length <= w }
|
266
|
-
assert t.to_s.lines.all? { |line|
|
268
|
+
assert t.to_s.lines.all? { |line| line.chomp.reverse[0, 1] == '>' }
|
267
269
|
end
|
268
270
|
end
|
271
|
+
|
272
|
+
def test_readme
|
273
|
+
table = Tabularize.new
|
274
|
+
table = Tabularize.new :pad => '.', :pad_left => 2, :pad_right => 0,
|
275
|
+
:border_style => :unicode,
|
276
|
+
:align => [:left, :center, :right],
|
277
|
+
:valign => [:top, :bottom, :middle, :middle],
|
278
|
+
:screen_width => 75, :ellipsis => '~'
|
279
|
+
table << %w[Name Dept Location Phone Description]
|
280
|
+
table.separator!
|
281
|
+
table << ['John Doe', 'Finance', 'Los Angeles CA 90089', '555-1555', 'Just a guy']
|
282
|
+
table << ['Average Joe', 'Engineering', 'Somewhere over the rainbow', 'N/A', 'Unknown']
|
283
|
+
table << ['홍길동', '탁상 3부', "서울역 3번 출구 김씨 옆자리\n\n맞습니다", 'N/A', 'No description']
|
284
|
+
assert_equal "
|
285
|
+
┌─────────────┬─────────────┬─────────────────────────────┬──────────~
|
286
|
+
│..Name.......│.....Dept....│.....................Location│.....Phone~
|
287
|
+
├─────────────┼─────────────┼─────────────────────────────┼──────────~
|
288
|
+
│..John Doe...│....Finance..│.........Los Angeles CA 90089│..555-1555~
|
289
|
+
│..Average Joe│..Engineering│...Somewhere over the rainbow│.......N/A~
|
290
|
+
│..홍길동.....│.............│..서울역 3번 출구 김씨 옆자리│..........~
|
291
|
+
│.............│.............│.............................│.......N/A~
|
292
|
+
│.............│...탁상 3부..│.....................맞습니다│..........~
|
293
|
+
└─────────────┴─────────────┴─────────────────────────────┴──────────~
|
294
|
+
".strip, table.to_s
|
295
|
+
end
|
269
296
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tabularize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: awesome_print
|