Module:Data tables: Difference between revisions

From Kerbal Space Program 2 Wiki
Jump to navigation Jump to search
change pod table to use subpage for construction
Tag: Reverted
revert to string append
Tag: Manual revert
 
(22 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
_commonCells = require("Module:Data tables/common cells").commonCells
_commonHeaders = require("Module:Data tables/common cells").commonHeaders
local podTable = require('Module:Data tables/pods').podTable
local podTable = require('Module:Data tables/pods').podTable
 
local engineTable = require('Module:Data tables/engines').engineTable
-- commonHeaders are used by all parts tables so they're called from here for
local tankTable = require('Module:Data tables/tanks').tankTable
-- cleaner code per category/family table
local parachuteTable = require('Module:Data tables/parachutes').parachuteTable
function p._commonHeaders()
return "{| class=\"wikitable sortable\"\n" ..
"!Image\n" ..
"!Name\n" ..
"!Size\n" ..
"!Mass (t)\n" ..
"!Max Temperature (K)\n" ..
"!Impact Tolerance (m/s)\n"
end
 
-- commonCells pair to commonHeaders, so they are independent from the
-- individual tables for the same reason (cleaner code)
function p._commonCells(partJson)
local commonCells = "|-\n" ..
"|".."[[File:"..partJson["file"].."|80px|center]]\n" ..
"|".."[["..partJson["name"].."]]\n" ..
"|".."{{Size|Size="..partJson["size"].."}}\n" ..
"|"..partJson["mass"].."\n" ..
"|"..partJson["max_temp"].."\n" ..
"|"..partJson["imp_tol"].."\n"
return commonCells
end


-- Accepts <category> and <family> parameters to build the relevant part table
-- Accepts <category> and <family> parameters to build the relevant part table
Line 39: Line 19:
newTable = podTable(args)
newTable = podTable(args)
elseif category == "engines" then
elseif category == "engines" then
newTable = p._engineTable(args)
newTable = engineTable(args)
elseif category == "fueltank" then
newTable = tankTable(args)
elseif family == "parachutes" then
newTable = parachuteTable(args)
else
else
newTable = p._commonTable(args)
newTable = p._commonTable(args)
Line 53: Line 37:
local category = args[1]
local category = args[1]
local family = args[2]
local family = args[2]
-- adds thrust and isp values
local header = p._commonHeaders()
local cells = ""
local cells = ""
-- load the full parts list to iterate per given category and family
-- load the full parts list
json = mw.loadJsonData("Data:Collections/parts")
json = mw.loadJsonData("GameData:Collections/parts")
-- each applicable part's data is appended to the table cells
-- each applicable part's data is appended to the table cells
for k, v in pairs(json[category][family]) do
for k, v in pairs(json[category][family]) do
local partJson = mw.loadJsonData("Data:"..k)
local partJson = mw.loadJsonData("GameData:"..k)
local tempCell = p._commonCells(partJson)
local tempCell = _commonCells(partJson)
cells = tempCell..cells
cells = tempCell..cells
end
end
-- append the cells to the headers and cap off the table wiki text
-- append the cells to the headers and cap off the table wiki text
local tempTable = header..cells.."|}"
local tempTable = _commonHeaders()..cells.."|}"
return tempTable
return tempTable
end
-- Builds table formatted for engines
function p._engineTable(args)
local category = args[1]
local family = args[2]
-- adds thrust and isp values
local header = p._commonHeaders() ..
"!Max Thrust: 1 atm (kN)\n" ..
"!Max Thrust: Vac. (kN)\n" ..
"!ISP: 1 atm (s)\n" ..
"!ISP: Vac. (s)\n"
local cells = ""
-- load the full parts list to iterate per given category and family
json = mw.loadJsonData("Data:Collections/parts")
-- each applicable part's data is appended to the table cells
for k, v in pairs(json[category][family]) do
local partJson = mw.loadJsonData("Data:"..k)
local tempCell = p._commonCells(partJson) ..
"|"..partJson["modules"]["engine"]["max_thrust"]["atm"].."\n" ..
"|"..partJson["modules"]["engine"]["max_thrust"]["vac"].."\n" ..
"|"..partJson["modules"]["engine"]["isp"]["atm"].."\n" ..
"|"..partJson["modules"]["engine"]["isp"]["vac"].."\n"
cells = tempCell..cells
end
-- append the cells to the headers and cap off the table wiki text
local tempTable = header..cells.."|}"
return tempTable
end
-- Builds table formatted for command pods [NOT FUNCTIONAL YET]
function p._podTable(args)
local category = args[1]
local family = args[2]
-- adds command module values
local header = p._commonHeaders() ..
"!Crew\n" ..
"!Electric Charge (U)\n" ..
"!Monopropellant (t)\n" ..
"!Torque (kN)\n"
local cells = ""
-- load the full parts list to iterate per given category and family
json = mw.loadJsonData("Data:Collections/parts")
-- each applicable part's data is appended to the table cells
for k, v in pairs(json[category][family]) do
local partJson = mw.loadJsonData("Data:"..k)
local tempCell = p._commonCells(partJson) ..
"|"..partJson["modules"]["command_module"]["crew_capacity"].."\n" ..
"|"..partJson["resources"]["electric_charge"].."\n" ..
"|"..partJson["resources"]["monopropellant"].."\n" ..
"|"..partJson["modules"]["reaction_wheel"]["torque"]["pitch"].."\n"
cells = tempCell..cells
end
-- append the cells to the headers and cap off the table wiki text
local tempTable = header..cells.."|}"
return tempTable
end
end



Latest revision as of 04:50, 7 March 2025

Documentation for this module may be created at Module:Data tables/doc

local p = {}
local getArgs = require('Module:Arguments').getArgs
_commonCells = require("Module:Data tables/common cells").commonCells
_commonHeaders = require("Module:Data tables/common cells").commonHeaders
local podTable = require('Module:Data tables/pods').podTable
local engineTable = require('Module:Data tables/engines').engineTable
local tankTable = require('Module:Data tables/tanks').tankTable
local parachuteTable = require('Module:Data tables/parachutes').parachuteTable

-- Accepts <category> and <family> parameters to build the relevant part table
function p.buildPartsTable(frame)
	local args = getArgs(frame)
	local category = args[1]
	local family = args[2]
	local newTable = ""
	
	-- iterate to decide which table format needs to be used for the table build
	if category == "pods" and family == "pod" then
		newTable = podTable(args)
	elseif category == "engines" then
		newTable = engineTable(args)
	elseif category == "fueltank" then
		newTable = tankTable(args)
	elseif family == "parachutes" then
		newTable = parachuteTable(args)
	else
		newTable = p._commonTable(args)
	end
	
	-- preprocessing applies the wikitext
	return frame:preprocess(newTable)
end

-- Builds a table that only uses the "common" data fields
-- Generally for structural/utility parts with no extra modules
function p._commonTable(args)
	local category = args[1]
	local family = args[2]
	local cells = ""
	
	-- load the full parts list
	json = mw.loadJsonData("GameData:Collections/parts")
	
	-- each applicable part's data is appended to the table cells
	for k, v in pairs(json[category][family]) do
		local partJson = mw.loadJsonData("GameData:"..k)
		local tempCell = _commonCells(partJson)
		cells = tempCell..cells
	end
	
	-- append the cells to the headers and cap off the table wiki text
	local tempTable = _commonHeaders()..cells.."|}"
	return tempTable	
end

--------------------------------------------------------------------------------
---- ALL CODE BELOW TO BE REPLACED BY ALL CODE ABOVE, ONCE FULLY FUNCTIONAL ----
--------------------------------------------------------------------------------

-- args: 
-- tablePage: Name of the tables subpage "Template:Data tables/<tablePage>". Ex: "parts", "tech tree"
-- tableName: Name of the table after the "#". Ex: "command-pods", "ground-landing-legs", "tier1"
function p.getTable(frame)
	local args = getArgs(frame)
	local tablePage = args[1]
	local tableName = escapeTableName(args[2])

	local tableContent = p._getTable(tablePage, tableName)
	
	return frame:preprocess(tableContent)
	-- return table.concat{frame:preprocess(partTable), "[[Category:Parts]]"}
end

function p._getTable(tablePage, TableName)
	local tablePageContent = mw.title.new("Template:Data tables/"..tablePage):getContent()
	local regex = '#'..TableName..'.-{|.-|}'
	local tableWithTag = tablePageContent:match(regex)
	local tableContent = tableWithTag:match('{|.-|}')

	return tableContent
end

function escapeTableName(name)
	return name:gsub("-","--")
end

function p.tableToObjects(inputTable)
    local result = {}
    local columns = {}
    local header = inputTable:match("\n!(.-)\n|")
    local body = inputTable:match("\n|%-(.-)\n|}")

    columns = split(header, "\n!")
    rows = split(body, "\n|-")

    for i, row in ipairs(rows) do
        local object = {}
        local cells = split(row, "\n|")
        cells = {unpack(cells, 2, #cells)}
        for i, cell in ipairs(cells) do
        	local column = columns[i]
        	column = column:gsub("^%s*(.-)%s*$", "%1")
        	if (column == null) then
        		column = "missing"
        	end
            object[column] = cell
        end
        table.insert(result, object)
    end

	return result
end

return p