Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- 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
- }
Advertisement
Add Comment
Please, Sign In to add comment