-- 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 }