def self.ascii(header,
rows,
header_orient=:left,
rows_orient=:left,
indent=2,
cellspace=1,
pagebreak_after=nil,
output=STDOUT)
if rows.size == 0 or rows[0].size == 0
output.puts "No rows selected"
return
end
header_orient ||= :left
rows_orient ||= :left
indent ||= 2
cellspace ||= 1
col_lengths = (0...(header.size)).collect do |colnr|
[
(0...rows.size).collect { |rownr|
value = rows[rownr][colnr]
coerce(value).size
}.max,
header[colnr].size
].max
end
indent = " " * indent
split_line = indent + "+"
col_lengths.each {|col| split_line << "-" * (col+cellspace*2) + "+" }
cellspace = " " * cellspace
output_row = proc {|row, orient|
output << indent + "|"
row.each_with_index {|c,i|
output << cellspace
str = coerce(c)
output << case orient
when :left then str.ljust(col_lengths[i])
when :right then str.rjust(col_lengths[i])
when :center then str.center(col_lengths[i])
end
output << cellspace
output << "|"
}
output << "\n"
}
rownr = 0
loop do
output << split_line + "\n"
output_row.call(header, header_orient)
output << split_line + "\n"
if pagebreak_after.nil?
rows.each {|ar| output_row.call(ar, rows_orient)}
output << split_line + "\n"
break
end
rows[rownr,pagebreak_after].each {|ar| output_row.call(ar, rows_orient)}
output << split_line + "\n"
rownr += pagebreak_after
break if rownr >= rows.size
yield output if block_given?
end
end