Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
The main server is currently down. We are running on a backup server, so editing and search functionality are temporarily disabled. Please check back in a few hours.
Revision as of 02:21, 18 April 2025 by Hyatt (talk | contribs)

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

-- Simple infobox module with enhanced flexibility and cleaner structure
local p = {}

--- Main function: generates an infobox table
function p.infobox(frame)
    -- Retrieve arguments (from template or direct call)
    local args = (frame.args and frame.args) or (frame:getParent() and frame:getParent().args) or {}

    -- Create the container table
    local infobox = mw.html.create('table'):addClass('infobox')

    -- Top ad slot
    infobox:node(
        mw.html.create('div')
            :attr('id', 'Ads-InfoboxTop')
    )

    -- Title row (defaults to page title)
    local title = args.title or mw.title.getCurrentTitle().text
    infobox:tag('tr')
        :tag('th')
            :addClass('infobox-title')
            :attr{scope = 'col', colspan = '2'}
            :wikitext(title)

    -- Optional description row
    if args.description and args.description ~= '' then
        infobox:tag('tr')
            :tag('td')
                :addClass('infobox-description')
                :attr('colspan', 2)
                :wikitext(args.description)
    end

    -- Image block (with optional width and caption)
    if args.image and args.image ~= '' then
        local img = args.image
        -- Wrap in File: namespace if needed
        if not img:match('%[%[') then
            if not img:find(':') then img = 'File:' .. img end
            local width = args.imagewidth or '300px'
            img = string.format('[[%s|%s]]', img, width)
        end
        local imgCell = infobox:tag('tr')
            :tag('td')
                :addClass('infobox-image')
                :attr('colspan', 2)
                :wikitext(img)
        if args.imagecaption and args.imagecaption ~= '' then
            imgCell:tag('div')
                :addClass('infobox-caption')
                :wikitext(args.imagecaption)
        end
    end

    -- Data rows: uses args.rows to limit iterations or defaults to 30
    local maxRows = tonumber(args.rows or 30)
    for i = 1, maxRows do
        local header = args['header' .. i]
        if header and header ~= '' then
            infobox:tag('tr')
                :tag('th')
                    :addClass('infobox-header')
                    :attr{scope = 'col', colspan = '2'}
                    :wikitext(header)
        end

        local label = args['label' .. i]
        local data  = args['data'  .. i]
        if data and data ~= '' then
            if label and label ~= '' then
                local row = infobox:tag('tr')
                row:tag('th')
                    :addClass('infobox-label')
                    :attr('scope', 'row')
                    :wikitext(label)
                row:tag('td')
                    :addClass('infobox-data')
                    :wikitext(data)
            else
                infobox:tag('tr')
                    :tag('td')
                        :addClass('infobox-data')
                        :attr{colspan = '2', style = 'text-align:center;'}
                        :wikitext(data)
            end
        end
    end

    -- Optional footer row
    if args.below and args.below ~= '' then
        infobox:tag('tr')
            :tag('td')
                :addClass('infobox-below')
                :attr('colspan', 2)
                :wikitext(args.below)
    end

    -- Return HTML string
    return tostring(infobox)
end

return p

Advertising: