Module: Infobox character
From A Wiki of Ice and Fire
This module is a work in progress for a customized Infobox for characters.
local getArgs = require('Module:Arguments').getArgs
local ib = require('Module:Infobox maker')
local infobox_image = require('Module:InfoboxImage').InfoboxImage
local br = require('Module:Separated entries').br
local date = require('Module:Date')._format
-- 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
local p = {}
function p.main(frame)
-- The main function cleans up and formats all the arguments before
-- passing them to the Infobox module.
local args = getArgs(frame) -- arguments passed to this module
ib.initialize(args)
--- General styling
ib.add_classes{
bodyclass = "plainlist",
titleclass = "",
aboveclass = "",
imageclass = "",
belowclass = "",
}
ib.add_styles{
bodystyle = "",
titlestyle = "",
abovestyle = "",
imagestyle = "",
captionstyle = "",
headerstyle = "background-color:#f8e9d0;border:none;",
labelstyle = "",
datastyle = "",
belowstyle = "",
}
------
-- "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.add_above{above=tostring(above)}
------
-- image, caption and copyright
------
-- copyright
if args.copyright then
local copyright = mw.html.create('span')
copyright:css('font-size', '80%')
end
-- image and caption
ib.add_image{
image = args.image,
size = args.image_size,
maxsize = '300px',
sizedefault = 'frameless',
alt = args.alt,
border = 'yes',
suppressplaceholder = 'yes',
caption = br{args.caption, copyright},
}
ib.add_repeated_section{
header_prefix = 'office',
rows = {
-- {
-- rowtype = 'rows',
-- prefix = 'suffix',
-- rowstyle = "background-color:#f8e9d0;font-weight:bold;",
-- },
{
rowtype = 'row',
prefix = 'status',
rowstyle = "font-weight:bold;",
},
{
rowtype = 'list',
prefix = 'consort',
singular = "Consort",
plural = "Consorts",
},
},
}
-- important events
local born = br({
date(args.birth_date),
birth_date,
not is_empty(args.birth_place) and ("in " .. args.birth_place),
})
local knighted = br({
date(args.knighted_date),
not is_empty(args.knighted_by) and ("by " .. args.knighted_by),
})
local legitimized = br({
date(args.legitimized_date),
not is_empty(args.legitimized_by) and ("by " .. args.legitimized_by),
})
local died = br({
date(args.death_date),
not is_empty(args.death_place) and ("in " .. args.death_place),
})
ib.add_section{
header = "Biographical information",
rows = {
{
label = "Born",
data = born,
},
{
label = "Knighted",
data = knighted,
},
{
label = "Legitimized",
data = legitimized,
},
{
label = "Died",
data = died,
},
{
rowtype = 'list',
singular = "Occupation",
plural = "Occupations",
prefix = 'occupation',
},
{
rowtype = 'list',
singular = "Title",
plural = "Titles",
prefix = 'title',
},
{
rowtype = 'list',
singular = "Culture",
plural = "Cultures",
prefix = 'culture',
},
{
rowtype = 'list',
singular = "Allegiance",
plural = "Allegiances",
prefix = 'allegiance',
},
},
}
return ib.make_infobox()
end
return p