Difference between pages "Module:Buildings" and "Module:Infobox"
(Difference between pages)
Jump to navigation
Jump to search
| Line 1: | Line 1: | ||
return | 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')) | |||
for k,v in pairs(buildingData.influence) do | |||
table.insert(prereq, infoboxData(v, k .. 'Influence')) | |||
end | |||
for k, v in pairs(buildingData.splendor) do | |||
table.insert(prereq, infoboxData(v, k .. 'Splendor')) | |||
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 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 workers or products then | |||
local productionSet = {} | |||
table.insert(productionSet, infoboxData(workers, 'Workers')) | |||
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 | |||
return result | |||
end | |||
return p | |||
Revision as of 20:13, 11 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'))
for k,v in pairs(buildingData.influence) do
table.insert(prereq, infoboxData(v, k .. 'Influence'))
end
for k, v in pairs(buildingData.splendor) do
table.insert(prereq, infoboxData(v, k .. 'Splendor'))
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 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 workers or products then
local productionSet = {}
table.insert(productionSet, infoboxData(workers, 'Workers'))
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
return result
end
return p