-
Notifications
You must be signed in to change notification settings - Fork 16
/
align-columns
executable file
路85 lines (71 loc) 路 2.16 KB
/
align-columns
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env ruby
#
# Vertically aligns columns, which are delimited by a user-defined
# regular expression, that are present in the input given on STDIN.
#
# For example, the following input:
#
# short text = foo
# really long text = bar
# wide operator <=> moz
#
# yields the following output:
#
# short text = foo
# really long text = bar
# wide operator <=> moz
#
# Written in 2007 by Suraj N. Kurapati <https://github.com/sunaku>
class Column < Struct.new(:left, :delim, :right)
def to_s
mid = delim.empty? ? ' ' : " #{delim} "
left + mid + right
end
end
def align_columns lines, delimiter, selector, rejector
# determine columns widths
left_width = 0
delim_width = 0
cols = lines.map do |line|
if line =~ selector and
line !~ rejector and
line =~ /^(.*?)(#{delimiter})(.*?)$/
then
left = $1.to_s.rstrip
delim = $2.to_s.strip
right = $3.to_s.lstrip
left_width = [left_width, left.length].max
delim_width = [delim_width, delim.length].max
Column.new(left, delim, right)
else
line.chomp
end
end
# equalize column widths
cols.each do |col|
if col.is_a? Column
col.left = col.left.ljust(left_width)
col.delim = col.delim.center(delim_width)
end
end
cols.join("\n")
end
if $0 == __FILE__
require 'optparse'
parser = OptionParser.new
parser.on '-h', '--help', 'show this help message' do
puts File.read(__FILE__).split(/^$/).first, nil, parser
exit
end
parser.on '-d', '--delimiter REGEXP', 'column delimiter',
"(default: #{(delimiter = /[[:punct:]]*=[[:punct:]]*/).inspect})\n",
String do |arg| delimiter = arg end
parser.on '-m', '--select REGEXP', 'only wrap lines that match REGEXP',
"(default: #{(selector = //).inspect})",
Regexp do |arg| selector = arg end
parser.on '-M', '--reject REGEXP', 'do not wrap lines that match REGEXP',
"(default: #{(rejector = nil).inspect})",
Regexp do |arg| rejector = arg end
parser.parse ARGV
puts align_columns(STDIN.readlines, delimiter, selector, rejector)
end