fix: Only change cell size per column/row

This commit is contained in:
Myzel394 2023-10-05 17:42:30 +02:00
parent 8273e5020b
commit 158f120c57
2 changed files with 62 additions and 20 deletions

View File

@ -22,6 +22,32 @@ function M:value_at(row, col)
return self.table[row][col] return self.table[row][col]
end end
function M:get_largest_length_for_column(
col --[[ int ]]
) -- int
local largest = #self.table[1][col]
for _, row in ipairs(self.table) do
if #row[col] > largest then
largest = #row[col]
end
end
return largest
end
function M:get_largest_length_for_row(
row --[[ int ]]
) -- int
local largest = #self.table[row][1]
for _, col in ipairs(self.table[row]) do
if #col > largest then
largest = #col
end
end
return largest
end
function M:get_largest_length() function M:get_largest_length()
local largest = #self.table[1][1] local largest = #self.table[1][1]
for _, row in ipairs(self.table) do for _, row in ipairs(self.table) do
@ -35,6 +61,18 @@ function M:get_largest_length()
return largest return largest
end end
function M:get_widths_for_columns(
min_width --[[ int ]]
) -- table
local widths = {}
for i = 1, #self.table[1] do
widths[i] = math.max(min_width, self:get_largest_length_for_column(i))
end
return widths
end
function M:rows_amount() function M:rows_amount()
return #self.table return #self.table
end end

View File

@ -16,21 +16,21 @@ DEFAULT_DRAW_REPRESENTATION_OPTIONS = {
cross = "" cross = ""
} }
function create_horizontal_line(width, cell_width, left, middle, right, middle_t) function create_horizontal_line(cell_widths, left, middle, right, middle_t)
local string = "" local string = ""
for i = 1, width do
if i == 1 then
string = string .. left string = string .. left
elseif i == width then
string = string .. right for i, width in ipairs(cell_widths) do
elseif (i - 1) % (cell_width + 1) == 0 then string = string .. string.rep(middle, width)
if i ~= #cell_widths then
string = string .. middle_t string = string .. middle_t
else
string = string .. middle
end end
end end
string = string .. right
return string return string
end end
@ -41,7 +41,10 @@ end
-- ├─────┼─────┼─────┼─────┼─────┤ -- ├─────┼─────┼─────┼─────┼─────┤
-- `create_horizontal_divider(5, 5, {variant = "bottom"})`: -- `create_horizontal_divider(5, 5, {variant = "bottom"})`:
-- └─────┴─────┴─────┴─────┴─────┘ -- └─────┴─────┴─────┴─────┴─────┘
function create_horizontal_divider(table_width, cell_width, options) function create_horizontal_divider(
table,
options -- [[ table ]] -- optional
)
local options = options or {} local options = options or {}
local top_left = options.top_left or DEFAULT_DRAW_REPRESENTATION_OPTIONS.top_left local top_left = options.top_left or DEFAULT_DRAW_REPRESENTATION_OPTIONS.top_left
local top_right = options.top_right or DEFAULT_DRAW_REPRESENTATION_OPTIONS.top_right local top_right = options.top_right or DEFAULT_DRAW_REPRESENTATION_OPTIONS.top_right
@ -53,16 +56,17 @@ function create_horizontal_divider(table_width, cell_width, options)
local top_t = options.top_t or DEFAULT_DRAW_REPRESENTATION_OPTIONS.top_t local top_t = options.top_t or DEFAULT_DRAW_REPRESENTATION_OPTIONS.top_t
local bottom_t = options.bottom_t or DEFAULT_DRAW_REPRESENTATION_OPTIONS.bottom_t local bottom_t = options.bottom_t or DEFAULT_DRAW_REPRESENTATION_OPTIONS.bottom_t
local cross = options.cross or DEFAULT_DRAW_REPRESENTATION_OPTIONS.cross local cross = options.cross or DEFAULT_DRAW_REPRESENTATION_OPTIONS.cross
local min_width = options.min_width or DEFAULT_DRAW_REPRESENTATION_OPTIONS.min_width
local variant = options.variant or "between" local variant = options.variant or "between"
local full_width = table_width * cell_width + table_width + 1 local widths = table:get_widths_for_columns(min_width)
if variant == "top" then if variant == "top" then
return create_horizontal_line(full_width, cell_width, top_left, horizontal, top_right, top_t) return create_horizontal_line(widths, top_left, horizontal, top_right, top_t)
elseif variant == "between" then elseif variant == "between" then
return create_horizontal_line(full_width, cell_width, left_t, horizontal, right_t, cross) return create_horizontal_line(widths, left_t, horizontal, right_t, cross)
elseif variant == "bottom" then elseif variant == "bottom" then
return create_horizontal_line(full_width, cell_width, bottom_left, horizontal, bottom_right, bottom_t) return create_horizontal_line(widths, bottom_left, horizontal, bottom_right, bottom_t)
end end
end end
@ -73,17 +77,17 @@ function table.draw_representation(table, options)
local vertical = options.vertical or DEFAULT_DRAW_REPRESENTATION_OPTIONS.vertical local vertical = options.vertical or DEFAULT_DRAW_REPRESENTATION_OPTIONS.vertical
local representation = {} local representation = {}
local largest_length = table:get_largest_length()
-- If length is shorter than min_width, then add filler to the end of the string
local length = largest_length < min_width and min_width or largest_length
local horizontal_divider = create_horizontal_divider(table:cols_amount(), length, options) local horizontal_divider = create_horizontal_divider(table, options)
representation[#representation + 1] = create_horizontal_divider(table:cols_amount(), length, { variant = "top" }) representation[#representation + 1] = create_horizontal_divider(table, { variant = "top" })
local column_widths = table:get_widths_for_columns(min_width)
for i = 1, table:rows_amount() do for i = 1, table:rows_amount() do
local line = "" local line = ""
for j = 1, table:cols_amount() do for j = 1, table:cols_amount() do
local length = column_widths[j]
local cell = table:value_at(i, j) local cell = table:value_at(i, j)
local cell_width = #cell local cell_width = #cell
@ -107,7 +111,7 @@ function table.draw_representation(table, options)
end end
end end
representation[#representation + 1] = create_horizontal_divider(table:cols_amount(), length, { variant = "bottom" }) representation[#representation + 1] = create_horizontal_divider(table, { variant = "bottom" })
return representation return representation
end end