Module: Infobox character

From A Wiki of Ice and Fire
Revision as of 09:26, 28 August 2018 by Abjiklam (talk | contribs)
Jump to: navigation, search

This module is a work in progress for a customized Infobox for characters.


local p = {}

local infobox = require('Module:Infobox').infobox
local infobox_image = require('Module:InfoboxImage').InfoboxImage
local br = require('Module:Separated entries').br

-- Add a book or category in the order it should appear in the infobox.
-- The first element of each section is the section name.
local books = {
    asoiaf = {
        "A Song of Ice and Fire",
        agot = "A Game of Thrones",
        acok = "A Clash of Kings",
        asos = "A Storm of Swords",
        affc = "A Feast for Crows",
        adwd = "A Dance with Dragon",
        twow = "The Winds of Winter",
        ados = "A Dream of Spring",
    },
    todae = {
        "Tales of Dunk and Egg",
        thk = "The Hedge Knight",
        tss = "The Sworn Sword",
        tmk = "The Mystery Knight",
    },
    other = {
        "Other Books",
        twoiaf = "The World of Ice and Fire",
        fab    = "Fire and Blood",
        tpatq  = "The Princess and the Queen",
        trp    = "The Rogue Prince",
        tsotd  = "The Sons of the Dragon",
    },
}

local function generate_arms(arms)
    --This function generates small coat of arms icons
    return infobox_image({
        args = {
            image  = arms,
            size   = '50x70px',
            border = 'no',
            suppressplaceholder = 'yes',
        }
    })
end

local function is_empty(s)
    -- This function checks whether a string is empty
    return s == nil or s == ''
end

function p.main(frame)
    -- The main function cleans up and formats all the arguments before
    -- passing them to the Infobox module.
    
    local args = frame.args -- arguments passed to this module
    local ib = {} -- arguments given to the Infobox module
    
    ------
    -- "above" contains everything appearing above the picture
    -- that is, the name, titles and coats of arms
    ------
    local above
    
    -- Name with optional honorific prefix and suffix
    local honorific_prefix = ""
    local honorific_suffix = ""
    if not is_empty(args.honorific_prefix) then
        honorific_prefix = mw.html.create('span')
        honorific_prefix:css('font-size', '80%')
                        :css('font-weight', 'normal')
                        :wikitext(args.honorific_prefix)
    end
    if not is_empty(args.honorific_suffix) then
        honorific_suffix = mw.html.create('span')
        honorific_suffix:css('font-size', '80%')
                        :css('font-weight', 'normal')
                        :wikitext(args.honorific_suffix)
    end
    local name = br({
        tostring(honorific_prefix),
        args.name,
        tostring(honorific_suffix),
    })

    -- The module looks different based on the number of arms to display
    -- 1) Between 3 and 5 arms
    if (args.arms or args.arms1) and args.arms2 and args.arms3 then
        above = mw.html.create('div')
        above
            :css('text-align', 'justify')
            :css('text-justify', 'distribute-all-lines')
        for i=1,5 do
            local arms
            if i ~= 1 then
                arms = args['arms' .. tostring(i)]
            else
                arms = args.arms1 or args.arms
            end
            if arms then
                above:wikitext(generate_arms(arms))
                     :wikitext(" ")
            end
        end
        above
            :tag('span')
                :css('display', 'inline-block')
                :css('width', '100%')
                :css('text-align', 'center')
                :wikitext(name)
    -- 2) One or 2 arms
    elseif args.arms or args.arms1 then
        local arms1 = args.arms1 or args.arms
        local arms2 = args.arms2 or arms1
        above = mw.html.create('table')
        above
            :css('width', '100%')
            :tag('tr')
                :tag('td')
                    :css('vertical-align', 'top')
                    :css('text-align', 'left')
                    :css('width', '50px')
                    :wikitext(generate_arms(arms1))
                    :done()
                :tag('td')
                    :css('vertical-align', 'middle')
                    :css('text-align', 'center')
                    :css('padding-bottom', '5px')
                    :wikitext(name)
                    :done()
                :tag('td')
                    :css('vertical-align', 'top')
                    :css('text-align', 'right')
                    :css('width', '50px')
                    :wikitext(generate_arms(arms2))
    -- 3) No arms
    else
        above = name
    end
    ib.above = tostring(above)
    
    ------
    -- image, caption and copyright
    ------
    ib.image = infobox_image({
        args = {
            image   = args.image,
            size    = args.image_size,
            maxsize = '300px',
            sizedefault = 'frameless',
            alt     = args.alt,
            border  = 'yes',
            suppressplaceholder = 'yes',
        }
    })
    -- copyright
    if args.copyright then
        local copyright = mw.html.create('span')
        copyright:css('font-size', '80%')
    end
    -- caption
    ib.caption = br({
        args.caption,
        copyright,
    })
    
    ib.headerstyle = "background-color:#f8e9d0;border:none;"
    return infobox(ib)
end

return p