def columnize(list, displaywidth=80)
if not list.is_a?(Array)
return "Expecting an Array, got #{list.class}\n"
end
if list.size == 0
return "<empty>\n"
end
nonstrings = []
for str in list do
nonstrings << str unless str.is_a?(String)
end
if nonstrings.size > 0
return "Nonstrings: %s\n" % nonstrings.map {|non| non.to_s}.join(', ')
end
if 1 == list.size
return "#{list[0]}\n"
end
nrows = ncols = 0
colwidths = []
1.upto(list.size) do
colwidths = []
nrows += 1
ncols = (list.size + nrows-1) / nrows
totwidth = -2
0.upto(ncols-1) do |col|
colwidth = 0
0.upto(nrows-1) do |row|
i = row + nrows*col
if i >= list.size
break
end
colwidth = [colwidth, list[i].size].max
end
colwidths << colwidth
totwidth += colwidth + 2
if totwidth > displaywidth
break
end
end
if totwidth <= displaywidth
break
end
end
s = ''
0.upto(nrows-1) do |row|
texts = []
0.upto(ncols-1) do |col|
i = row + nrows*col
if i >= list.size
x = ""
else
x = list[i]
end
texts << x
end
while texts and texts[-1] == ''
texts = texts[0..-2]
end
0.upto(texts.size-1) do |col|
texts[col] = texts[col].ljust(colwidths[col])
end
s += "%s\n" % texts.join(" ")
end
return s
end