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
|
module Terminal
class Table
class Row
##
# Row cells
attr_reader :cells
attr_reader :table
##
# Initialize with _width_ and _options_.
def initialize table, array = [], **_kwargs
@cell_index = 0
@table = table
@cells = []
array.each { |item| self << item }
end
def add_cell item
options = item.is_a?(Hash) ? item : {:value => item}
cell = Cell.new(options.merge(:index => @cell_index, :table => @table))
@cell_index += cell.colspan
@cells << cell
end
alias << add_cell
def [] index
cells[index]
end
def height
cells.map { |c| c.lines.count }.max || 0
end
def render
vleft, vcenter, vright = @table.style.vertical
(0...height).to_a.map do |line|
vleft + cells.map do |cell|
cell.render(line)
end.join(vcenter) + vright
end.join("\n")
end
def number_of_columns
@cells.collect(&:colspan).inject(0, &:+)
end
# used to find indices where we have table '+' crossings.
# in cases where the colspan > 1, then we will skip over some numbers
# if colspan is always 1, then the list should be incrementing by 1.
#
# skip 0 entry, because it's the left side.
# skip last entry, because it's the right side.
# we only care about "+/T" style crossings.
def crossings
idx = 0
@cells[0...-1].map { |c| idx += c.colspan }
end
end
end
end
|