Difference between revisions of "Module:InfoboxBuilding"

From Foundation - Wiki
Jump to navigation Jump to search
(Testing for new building infobox template; credits for this draft to @levrin)
(No difference)

Revision as of 15:22, 26 March 2025

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

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

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

local function addImage(box, image, caption, defaultImage, defaultCaption)
    if not image and not defaultImage then
        box:wikitext('[[Category:Image Needed]]')
        return box
    end
    
    local imageDiv = mw.html.create('div')
    imageDiv:addClass('infobox-image')
    
    local fileName = image or defaultImage
    local fileWiki = '[[File:' .. fileName .. '|260px|frameless]]'
    
    imageDiv:wikitext(fileWiki)
    
    if caption or defaultCaption then
        imageDiv:tag('span')
            :addClass('infoboxCaption')
            :wikitext(caption or defaultCaption)
    end
    
    box:node(imageDiv)
    return box
end

local function addSection(box, data, header, columnCount)
    if not data or #data == 0 then
        return box
    end
    
    if header then
        box:tag('div')
            :addClass('infobox-header')
            :wikitext(header)
            :done()
    end
    
    local rowClass = 'infobox-row'
    if columnCount then
        rowClass = rowClass .. ' data-rows-' .. columnCount
    end
    
    local rowContainer = mw.html.create('div')
    rowContainer:addClass(rowClass)
    
    for _, item in ipairs(data) do
        local dataRow = createDataRow(item.label, item.value, item.defaultValue)
        if dataRow then
            rowContainer:node(dataRow)
        end
    end
    
    box:node(rowContainer)
    return box
end

local function createDataRow(label, value, defaultValue)
    if not value and not defaultValue then
        return nil
    end
    
    local dataRow = mw.html.create('div')
    dataRow:addClass('infobox-data-section')
    
    if label then
        dataRow:tag('span')
            :addClass('infobox-label')
            :wikitext(label)
            :done()
        :tag('span')
            :addClass('infobox-data')
            :wikitext(value or defaultValue)
    else
        dataRow:tag('span')
            :addClass('infobox-data')
            :wikitext(value or defaultValue)
    end
    
    return dataRow
end

--[[
I left next section, that I commented "Start" and "End," in here in case you all needed or wanted it (blame Pelendur if it's bad.....just kidding (maybe) :p)
It seemed to be in other templates, and I didn't want to remove it if it was needed or useful to you all. ]]--

-- Start
local function createIconRow(iconName, value) 
    if not value then
        return nil
    end
    
    local label = i.icon(iconName, nil, nil, com.firstUpper({iconName}), 'en')
    return createDataRow(label, value)
end
-- End

function p.building(frame)
    local args = a.getArgs(frame)
    
    local titleArg = args['title']
    local currentTitle = mw.title.getCurrentTitle().text
    local building = com.modulePagename(titleArg or currentTitle)
    
    local buildingData = require('Module:Buildings')[string.lower(building)]
    
    local infobox = createInfobox(building)
        
    addImage(infobox, args['image'], args['caption'], buildingData and buildingData.defaultImage, buildingData and buildingData.defaultCaption)
    
    if buildingData then
        local prereqData = {}
        
        if buildingData.building then
            table.insert(prereqData, {label = 'Building', value = buildingData.building})
        end
        
        if buildingData.population then
            table.insert(prereqData, {label = 'Population', value = buildingData.population})
        end
        
        if buildingData.influence then
            for type, value in pairs(buildingData.influence) do
                table.insert(prereqData, {label = type .. ' Influence', value = value})
            end
        end
        
        if buildingData.splendor then
            for type, value in pairs(buildingData.splendor) do
                table.insert(prereqData, {label = type .. ' Splendor', value = value})
            end
        end
        
        if #prereqData > 0 then
            addSection(infobox, prereqData, 'Prerequisites')
        end
        
        if buildingData.prosperity then
            local prosperityData = {}
            for type, value in pairs(buildingData.prosperity) do
                table.insert(prosperityData, {label = com.firstUpper({type}), value = value})
            end
            
            if #prosperityData > 0 then
                addSection(infobox, prosperityData, 'Prosperity', 2)
            end
        end
        
        local productionData = {}
        
        if buildingData.workers then
            local workers = buildingData.workers
            if buildingData.rank then
                workers = workers .. ' ' .. buildingData.rank
            end
            table.insert(productionData, {label = 'Workers', value = workers})
        end
        
        if buildingData.requirements then
            local requirements = ''
            for k, requirement in ipairs(buildingData.requirements) do
                requirements = requirements .. i.icon(requirement, nil, nil, com.firstUpper({requirement}), 'en')
                if k < #buildingData.requirements then
                    requirements = requirements .. '<br />'
                end
            end
            
            if com.exists(requirements) then
                table.insert(productionData, {label = 'Requires', value = requirements})
            end
        end
        
        if buildingData.products then
            local products = ''
            for k, product in ipairs(buildingData.products) do
                products = products .. i.icon(product, nil, nil, com.firstUpper({product}), 'en')
                if k < #buildingData.products then
                    products = products .. '<br />'
                end
            end
            
            if com.exists(products) then
                table.insert(productionData, {label = 'Produces', value = products})
            end
        end
        
        if #productionData > 0 then
            addSection(infobox, productionData, 'Production')
        end
        
        if buildingData.construction then
            local constructionData = {}
            for resource, amount in pairs(buildingData.construction) do
                local resourceIcon = i.icon(resource, nil, nil, com.firstUpper({resource}), 'en')
                table.insert(constructionData, {label = resourceIcon, value = amount})
            end
            
            if #constructionData > 0 then
                addSection(infobox, constructionData, 'Construction Requirements', 2)
            end
        end
        
        local costData = {}
        
        if buildingData.maintenance then
            local maintenanceLabel = i.icon('maintenance cost', nil, nil, 'Maintenance Cost', 'en')
            table.insert(costData, {label = maintenanceLabel, value = buildingData.maintenance})
        end
        
        if buildingData.tax then
            local taxLabel = i.icon('coin', nil, nil, 'Tax', 'en')
            table.insert(costData, {label = taxLabel, value = buildingData.tax})
        end
        
        if #costData > 0 then
            addSection(infobox, costData, 'Running Costs')
        end
    end
    
    return infobox
end

return p -- Wiki's are still not really my thing, but hopefully this helps :)