-- Table Builder Library
local dependencies = {}
local function prepare(mainData, extraLists, headers)
local prepared = {}
local maxKeyLen = 0
local MAX_KEY_LEN = 20
local maxValLen = 0
local extraCols = {}
local totalExtraCols = #extraLists
-- Collect extras from all tables
for colIndex, extraTable in ipairs(extraLists or {}) do
for k, v in pairs(extraTable) do
extraCols[k] = extraCols[k] or {}
extraCols[k][colIndex] = v
end
end
-- Determine key and main value widths
for k, v in pairs(mainData) do
local keyStr = k:gsub("Essence", "")
if #keyStr > maxKeyLen then maxKeyLen = #keyStr end
local valStr = tostring(v or "-")
if #valStr > maxValLen then maxValLen = #valStr end
end
-- Determine extra column widths
local colWidths = {}
for i = 1, totalExtraCols do colWidths[i] = 1 end
for _, extras in pairs(extraCols) do
for i = 1, totalExtraCols do
local val = extras[i] or "-"
colWidths[i] = math.max(colWidths[i], #tostring(val))
end
end
-- Adjust widths based on headers
if headers then
local keyHeader = headers[1] or ""
maxKeyLen = math.max(maxKeyLen, #keyHeader)
local mainHeader = headers[2] or ""
maxValLen = math.max(maxValLen, #mainHeader)
for i = 1, totalExtraCols do
local h = headers[i + 2] or ""
colWidths[i] = math.max(colWidths[i], #h)
end
end
maxKeyLen = math.min(maxKeyLen, MAX_KEY_LEN)
-- HEADER row
if headers then
local headerLine = "| "
local keyHeader = headers[1] or ""
if #keyHeader > MAX_KEY_LEN then keyHeader = keyHeader:sub(1, MAX_KEY_LEN - 3) .. "..." end
keyHeader = keyHeader .. string.rep(" ", maxKeyLen - #keyHeader)
headerLine = headerLine .. keyHeader
local mainHeader = headers[2] or ""
mainHeader = string.rep(" ", maxValLen - #mainHeader) .. mainHeader
headerLine = headerLine .. " | " .. mainHeader
for i = 1, totalExtraCols do
local h = headers[i + 2] or ""
h = string.rep(" ", colWidths[i] - #h) .. h
headerLine = headerLine .. " | " .. h
end
headerLine = headerLine .. " |"
prepared["HEADER"] = headerLine
end
-- SPACER row
local spacerLine = "| " .. string.rep(" ", maxKeyLen) .. " | " .. string.rep(" ", maxValLen)
for i = 1, totalExtraCols do
spacerLine = spacerLine .. " | " .. string.rep(" ", colWidths[i])
end
spacerLine = spacerLine .. " |"
prepared["SPACER"] = spacerLine
-- Content rows
for k, v in pairs(mainData) do
local keyStr = k:gsub("Essence", "")
if #keyStr > MAX_KEY_LEN then keyStr = keyStr:sub(1, MAX_KEY_LEN - 3) .. "..." end
keyStr = keyStr .. string.rep(" ", maxKeyLen - #keyStr)
local valStr = tostring(v or "-")
valStr = string.rep(" ", maxValLen - #valStr) .. valStr
local extras = extraCols[k] or {}
local extraParts = {}
for i = 1, totalExtraCols do
local val = extras[i] or "-"
val = string.rep(" ", colWidths[i] - #tostring(val)) .. tostring(val)
table.insert(extraParts, val)
end
local line = "| " .. keyStr .. " | " .. valStr
if totalExtraCols > 0 then
line = line .. " | " .. table.concat(extraParts, " | ")
end
line = line .. " |"
prepared[k] = line
end
prepared.__maxKeyLen = maxKeyLen
prepared.__maxValLen = maxValLen
prepared.__extraColWidths = colWidths
return prepared
end
local function getRow(prepared, key)
return prepared[key] or nil
end
-- Optional: extract all rows as list (for iteration)
local function getRows(prepared)
local rows = {}
for k, v in pairs(prepared) do
if type(k) == "string" and not k:match("^__") and k ~= "HEADER" and k ~= "SPACER" then
table.insert(rows, v)
end
end
table.sort(rows)
return rows
end
return {
id = "tablebuilder",
name = "Table Builder Library",
alias = "tablebuilder",
dependencies = {},
init = function(deps)
dependencies = deps or {}
end,
prepare = prepare,
getRow = getRow,
getRows = getRows
}