33: def doctable(headers, data)
34: str = "\n\n"
35:
36: lengths = []
37:
38: data.each do |name, values|
39: [name, values].flatten.each_with_index do |value, i|
40: lengths[i] ||= 0
41: lengths[i] = value.to_s.length if value.to_s.length > lengths[i]
42: end
43: end
44:
45:
46: headers.each_with_index do |value, i|
47: lengths[i] = value.to_s.length if value.to_s.length > lengths[i]
48: end
49:
50:
51: str += lengths.collect { |num| "=" * num }.join(" ") + "\n"
52:
53:
54: str += headers.zip(lengths).collect { |value, num| pad(value, num) }.join(" ") + "\n"
55:
56:
57: str += lengths.collect { |num| "=" * num }.join(" ") + "\n"
58:
59:
60: data.sort { |a, b| a[0].to_s <=> b[0].to_s }.each do |name, rows|
61: str += [name, rows].flatten.zip(lengths).collect do |value, length|
62: pad(value, length)
63: end.join(" ") + "\n"
64: end
65:
66:
67: str += lengths.collect { |num| "=" * num }.join(" ") + "\n"
68:
69: str + "\n"
70: end