Difference between pages "Module:Tables" and "Module:Infobox"

From Foundation - Wiki
(Difference between pages)
Jump to navigation Jump to search
 
 
Line 4: Line 4:
local p = {}
local p = {}


function p.buildings(frame)
local function mainBox(title)
local buildingList = mw.load('Module:Buildings')
local result = mw.html.create('div')
local args = a.getArgs(frame)
result:addClass('infobox')
local buildingTable = mw.html.create('table')
:tag('div')
local dataTable = {}
:addClass('infobox-title')
for k, v in pairs(buildingList) do
:wikitext(com.modulePagename(title))
if v.group == args['group'] or not args['group'] then
:done()
table.insert(dataTable, k)
return result
end
 
local function infoboxImage(image, caption, defaultImage, defaultCaption)
local result = mw.html.create('div')
result:addClass('infobox-image')
if image or defaultImage then
local file = '[[File:'
if image then
file = file .. image
else
file = file .. defaultImage
end
file = file .. '|260px|frameless]]'
local fileCaption = mw.html.create('span')
if caption or defaultCaption then
fileCaption:addClass('infoboxCaption')
:wikitext(caption or defaultCaption)
end
result:wikitext(file)
:node(fileCaption)
else
result = '[[Category:Image Needed]]'
end
return result
end
 
local function infoboxGroup(data, rows, header)
local result = {}
if data then
if header then
local headerData = mw.html.create('div')
headerData:addClass('infobox-header')
:wikitext(header)
table.insert(result, headerData)
end
local rowClass = 'infobow-row'
if rows then
rowClass = rowClass ..  ' data-rows-' .. rows
end
local rowData = mw.html.create('div')
rowData:addClass(rowClass)
for k,v in ipairs(data) do
rowData:node(v)
end
end
table.insert(result, rowData)
end
end
table.sort(dataTable)
return result
buildingTable:addClass('wikitable sortable')
end
:tag('tr')
 
:tag('th')
local function infoboxData(data, label, default)
:wikitext('Name')
local result
if data or default then
result = mw.html.create('div')
:addClass('infobox-data-section')
if label then
result:tag('span')
:addClass('infobox-label')
:wikitext(label)
:done()
:done()
:tag('th')
:tag('span')
:wikitext('Prerequisites')
:addClass('infobox-data')
:done()
:wikitext(data or default)
:tag('th')
else
:wikitext('Production')
result:tag('span')
:done()
:addClass('infobox-data')
:tag('th')
:wikitext(data or default)
:wikitext('Construction Requirements')
end
:done()
end
:done()
return result
end
for k, v in pairs (dataTable) do
 
local getPreReq = {}
function p.building(frame)
table.insert(getPreReq, v.building)
local args = a.getArgs(frame)
table.insert(getPreReq, v.population)
local building = com.modulePagename(args['title'])
if v.splendor then
local buildingData = require('Module:Buildings')[string.lower(building)]
for k, v in pairs(v.splendor) do
local result
table.insert(getPreReq, i.icon(k .. ' splendor', v, nil, nil, 'en'))
if buildingData or args['image'] then
result = mainBox(building)
if args['image'] then
result:node(infoboxImage(args['image'], args['caption']))
end
--Prerequisites group
local prereq = {}
table.insert(prereq, infoboxData(buildingData.building, 'Building'))
table.insert(prereq, infoboxData(buildingData.population, 'Population'))
if buildingData.influence then
for k,v in pairs(buildingData.influence) do
table.insert(prereq, infoboxData(v, k .. 'Influence'))
end
end
if buildingData.splendor then
for k, v in pairs(buildingData.splendor) do
table.insert(prereq, infoboxData(v, k .. 'Splendor'))
end
end
end
end
if v.influence then
if #prereq > 0 then
for k, v in pairs(v.influence) do
local prereqSet = infoboxGroup(prereq, nil, 'Prerequisites')
table.insert(getPreReq, i.icon(k .. ' influence', v, nil, nil, 'en'))
for k, v in ipairs(prereqSet) do
result:node(v)
end
end
end
end
local preReq = ''
--Production group
for k, v in ipairs(getPreReq) do
local workers = buildingData.workers
preReq = preReq .. v
local requirementData = buildingData.requirements
if k ~= #getPreReq then
local requirements = ''
preReq = preReq .. '<br />'
if requirementData then
for k, v in ipairs(requirementData) do  
requirements = requirements .. i.icon(v, nil, nil, string.gsub(v,
string.sub(v,1,1), string.upper(string.sub(v,1,1)), 1),
'en')
if k ~= #requirementData then
requirements = requirements .. '<br />'
end
end
end
end
end
local production = {}
if not com.exists(requirements) then
if v.requirements then  
requirements = nil
local reqs = ''
end
for k, v in pairs(v.requirements) do
local productData = buildingData.products
local products = ''
if productData then
for k, v in ipairs(productData) do
products = products .. i.icon(v, nil, nil, string.gsub(v,
string.sub(v,1,1), string.upper(string.sub(v,1,1)), 1),
'en')
if k ~= #productData then
products = products .. '<br />'
end
end
end
end
end
local newRow = mw.html.create('tr')
if not com.exists(products) then
newRow:tag('th')
products = nil
:wikitext(k)
end
:done()
:tag('td')
if workers or products or requirements then
:wikitext(preReq)
local productionSet = {}
:done()
table.insert(productionSet, infoboxData(workers, 'Workers'))
table.insert(productionSet, infoboxData(requirements, 'Requires'))
table.insert(productionSet, infoboxData(products, 'Produces'))
local production = infoboxGroup(productionSet, nil, 'Production')
for k, v in ipairs(production) do
result:node(v)
end
end
--Construction group
local construction = buildingData.construction
if construction then
local conList = {}
for k, v in pairs(construction) do
local conLabel = i.icon(k, nil, nil, string.gsub(k,
string.sub(k,1,1), string.upper(string.sub(k,1,1)), 1),
'en')
table.insert(conList, infoboxData(v, conLabel))
end
local conGroup = infoboxGroup(conList, '2', 'Construction Requirements')
for k, v in ipairs(conGroup) do
result:node(v)
end
end
local maintenance = buildingData.maintenance
local tax = buildingData.tax
if maintenance or tax then
local costSet = {}
local maintenanceLabel = i.icon('maintenance cost', nil , nil,
'Maintenance Cost', 'en')
local taxLabel = i.icon('coin', nil, nil, 'Tax', 'en')
table.insert(costSet, infoboxData(maintenance, maintenanceLabel))
table.insert(costSet, infoboxData(tax, taxLabel))
local costGroup = infoboxGroup(costSet, nil, 'Running Costs')
for k, v in ipairs(costGroup) do
result:node(v)
end
end
end
end
return result
end
end
 
return p
return p

Revision as of 16:34, 13 August 2022

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

local com = require('Module:Common')
local a = require('Module:Arguments')
local i = require('Module:Icon')
local p = {}

local function mainBox(title)
	local result = mw.html.create('div')
	result:addClass('infobox')
		:tag('div')
		:addClass('infobox-title')
		:wikitext(com.modulePagename(title))
		:done()
	return result
end

local function infoboxImage(image, caption, defaultImage, defaultCaption)
	local result = mw.html.create('div')
	result:addClass('infobox-image')
	
	if image or defaultImage then
		local file = '[[File:'
		if image then
			file = file .. image
		else
			file = file .. defaultImage
		end
		
		file = file .. '|260px|frameless]]'
		local fileCaption = mw.html.create('span')
		
		if caption or defaultCaption then
			fileCaption:addClass('infoboxCaption')
				:wikitext(caption or defaultCaption)
		end
		
		result:wikitext(file)
			:node(fileCaption)
	else
		result = '[[Category:Image Needed]]'
	end
	
	return result
end

local function infoboxGroup(data, rows, header)
	local result = {}
	if data then
		if header then
			local headerData = mw.html.create('div')
			headerData:addClass('infobox-header')
				:wikitext(header)
			table.insert(result, headerData)
		end
		
		local rowClass = 'infobow-row'
		if rows then
			rowClass = rowClass ..  ' data-rows-' .. rows
		end
		
		local rowData = mw.html.create('div')
		rowData:addClass(rowClass)
		for k,v in ipairs(data) do
			rowData:node(v)
		end
		
		table.insert(result, rowData)
	end
	
	return result
end

local function infoboxData(data, label, default)
	local result
	if data or default then
		result = mw.html.create('div')	
			:addClass('infobox-data-section')
		if label then
			result:tag('span')
				:addClass('infobox-label')
				:wikitext(label)
				:done()
			:tag('span')
				:addClass('infobox-data')
				:wikitext(data or default)
		else
			result:tag('span')
				:addClass('infobox-data')
				:wikitext(data or default)
		end
	end
	return result
end

function p.building(frame)
	local args = a.getArgs(frame)
	local building = com.modulePagename(args['title'])
	local buildingData = require('Module:Buildings')[string.lower(building)]
	local result
	if buildingData or args['image'] then
		result = mainBox(building)
		if args['image'] then
			result:node(infoboxImage(args['image'], args['caption']))
		end
		
		--Prerequisites group
		local prereq = {}
		table.insert(prereq, infoboxData(buildingData.building, 'Building'))
		table.insert(prereq, infoboxData(buildingData.population, 'Population'))
		if buildingData.influence then
			for k,v in pairs(buildingData.influence) do
				table.insert(prereq, infoboxData(v, k .. 'Influence'))
			end
		end
		
		if buildingData.splendor then
			for k, v in pairs(buildingData.splendor) do
				table.insert(prereq, infoboxData(v, k .. 'Splendor'))
			end
		end
		
		if #prereq > 0 then
			local prereqSet = infoboxGroup(prereq, nil, 'Prerequisites')
			for k, v in ipairs(prereqSet) do
				result:node(v)
			end
		end
		
		--Production group
		local workers = buildingData.workers
		local requirementData = buildingData.requirements
		local requirements = ''
		if requirementData then
			for k, v in ipairs(requirementData) do 
				requirements = requirements .. i.icon(v, nil, nil, string.gsub(v, 
					string.sub(v,1,1), string.upper(string.sub(v,1,1)), 1),
					'en')
				if k ~= #requirementData then
					requirements = requirements .. '<br />'
				end
			end
		end
		
		if not com.exists(requirements) then
			requirements = nil
		end
		
		local productData = buildingData.products
		local products = ''
		if productData then
			for k, v in ipairs(productData) do
				products = products .. i.icon(v, nil, nil, string.gsub(v, 
					string.sub(v,1,1), string.upper(string.sub(v,1,1)), 1),
					'en')
				if k ~= #productData then
					products = products .. '<br />'
				end
			end
		end
		
		if not com.exists(products) then
			products = nil
		end
		
		if workers or products or requirements then
			local productionSet = {}
			table.insert(productionSet, infoboxData(workers, 'Workers'))
			table.insert(productionSet, infoboxData(requirements, 'Requires'))
			table.insert(productionSet, infoboxData(products, 'Produces'))
			local production = infoboxGroup(productionSet, nil, 'Production')
			for k, v in ipairs(production) do
				result:node(v)
			end
		end
	
	
		--Construction group
		local construction = buildingData.construction
		if construction then
			local conList = {}
			for k, v in pairs(construction) do
				local conLabel = i.icon(k, nil, nil, string.gsub(k, 
						string.sub(k,1,1), string.upper(string.sub(k,1,1)), 1),
						'en')
				table.insert(conList, infoboxData(v, conLabel))
			end
			
			local conGroup = infoboxGroup(conList, '2', 'Construction Requirements')
			for k, v in ipairs(conGroup) do
				result:node(v)
			end
		end
	
		local maintenance = buildingData.maintenance
		local tax = buildingData.tax
	
		if maintenance or tax then
			local costSet = {}
			local maintenanceLabel = i.icon('maintenance cost', nil , nil, 
				'Maintenance Cost', 'en')
			local taxLabel = i.icon('coin', nil, nil, 'Tax', 'en')
			table.insert(costSet, infoboxData(maintenance, maintenanceLabel))
			table.insert(costSet, infoboxData(tax, taxLabel))
			local costGroup = infoboxGroup(costSet, nil, 'Running Costs')
			for k, v in ipairs(costGroup) do
				result:node(v)
			end
		end
	end
	
	return result
end
	
return p