Module:Infobox
Jump to navigation
Jump to search
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 prereqSet = infoboxGroup(prereq, nil, 'Prerequisites') for k, v in 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 end --Construction group if buildingData.construction then local conList = {} for k, v in pairs(buildingData.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 return result end return p