Module:Infobox Character
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Infobox Character/doc
--------------------------
-- Module for [[Template:Infobox Character]]
------------------------
local p = {}
-- "imports"
local onmain = require('Module:Mainonly').on_main
local yesno = require('Module:Yesno')
local paramtest = require('Module:Paramtest')
local infobox = require('Module:Infobox')
local cleanimg = require('Module:Clean image').clean
local characterrace = mw.loadData('Module:Character races')
function p.main(frame)
local args = frame:getParent().args
local ret = infobox.new(args)
ret:defineParams{
{ name = 'name', func = 'name' },
{ name = 'aka', func = 'has_content' },
{ name = 'image', func = imgarg },
{ name = 'imagebackground', func = { name = imgback, params = { 'imagebackground' }, flag = { 'd' } }, dupes = true },
{ name = 'vanchor', func = { name = 'has_content', params = { 'version' }, flag = 'p' } },
{ name = 'date_of_birth', func = 'has_content' },
{ name = 'place_of_birth', func = 'has_content' },
{ name = 'date_of_death', func = 'has_content' },
{ name = 'place_of_death', func = 'has_content' },
{ name = 'race', func = racearg },
{ name = 'gender', func = 'has_content' },
}
ret:setMaxButtons(4)
ret:create()
ret:cleanParams()
ret:customButtonPlacement(true)
ret:linkParams{
image = 'imagebackground'
}
ret:defineLinks({ links = {{ 'Template:%s', 'Infobox' },
{ 'Template_talk:%s', 'Talk page' }}, colspan = '2' })
ret:defineName('Infobox Character')
ret:addClass('tsw-infobox plainlinks')
ret:addButtonsCaption()
-- PARAMETER: image
ret:addRow{
{ tag = 'argd', content = 'image', class = 'infobox-image bordered-image', colspan = '2' },
meta = { addClass = ret:param('imagebackground', 'r') }
}
-- PARAMETER: name
ret:addRow{
{ tag = 'argh', content = 'name', class='infobox-header', colspan = '2' }
}
-- PARAMETER: aka
if ret:paramDefined('aka') then
ret:addRow{
{ tag = 'th', content = 'Also known as' },
{ tag = 'argd', content = 'aka' }
}
end
-- PARAMETER: date_of_birth
if ret:paramDefined('date_of_birth') then
ret:addRow{
{ tag = 'th', content = 'Born' },
{ tag = 'argd', content = 'date_of_birth' }
}
end
-- PARAMETER: place_of_birth
if ret:paramDefined('place_of_birth') then
ret:addRow{
{ tag = 'th', content = 'Place of birth' },
{ tag = 'argd', content = 'place_of_birth' }
}
end
-- PARAMETER: date_of_death
if ret:paramDefined('date_of_death') then
ret:addRow{
{ tag = 'th', content = 'Death' },
{ tag = 'argd', content = 'date_of_death' }
}
end
-- PARAMETER: place_of_death
if ret:paramDefined('place_of_death') then
ret:addRow{
{ tag = 'th', content = 'Place of death' },
{ tag = 'argd', content = 'place_of_death' }
}
end
-- PARAMETER: race
ret:addRow{
{ tag = 'th', content = '[[Races|Race]]' },
{ tag = 'argd', content = 'race' }
}
-- PARAMETER: gender
ret:addRow{
{ tag = 'th', content = 'Gender' },
{ tag = 'argd', content = 'gender' }
}
ret:finish()
if onmain() then
local a1 = ret:param('all')
local a2 = ret:categoryData()
ret:wikitext(addcategories(a1, a2))
end
return ret:tostring()
end
function imgarg(arg)
if infobox.isDefined(arg) then
return cleanimg{ file = arg, width = 300, height = 300 }
end
return nil
end
function imgback(arg)
if infobox.isDefined(arg) then
if yesno(arg) then
return 'infobox-imgbg'
end
end
return ''
end
function txtarg(txt)
if infobox.isDefined(txt) then
txt = mw.text.trim(txt)
if string.sub(txt, 1,1) == '*' then
local ret = mw.html.create('ul')
for x in mw.text.gsplit(txt, '\n%*%s*') do
local _x = string.gsub(x, '^%*%s*', '')
ret:tag('li'):wikitext(_x)
end
return tostring(ret)
-- txt = '\n'..txt..'\n'
end
return txt
end
return nil
end
function racearg(arg)
local ret = { '' }
if infobox.isDefined(arg) then
for _, v in ipairs(characterrace) do
if v.race == string.lower(arg) then
table.insert(ret, v.racelink)
end
end
for i, v in ipairs(ret) do
if (v ~= '') then
ret[i] = string.format('[[%s]]', v)
end
end
r = table.concat(ret, '')
if r ~= '' then
return r
else
--Do not return invalid categories
--return arg
end
end
return nil
end
function addcategories(args, catargs)
function is_def(x, y)
y = y or 'd'
if infobox.isDefined(x) then
return infobox.isDefined(x[y])
end
return false
end
local ret = { 'Characters' }
local cat_map = {
-- Added if the parameter has no content
notdefined = {
image = 'Needs character image',
race = 'Needs race',
},
}
for n, v in pairs(cat_map.notdefined) do
if catargs[n] and catargs[n].all_defined == false then
table.insert(ret,v)
end
end
-- Add the associated race category if matched
local norace = true
if args['race'] and args['race'].d then
local racestr = string.gsub(string.gsub(args['race'].d, '%]%]', ''), '%[%[', '')
for _, v in ipairs(characterrace) do
if (v.racelink == racestr) then
table.insert(ret, v.racecat)
if v.addcat then
for _,k in ipairs(v.addcat) do
table.insert(ret, k)
end
end
norace = false
end
end
end
if norace then
table.insert(ret, 'Needs race')
end
-- combine table and format category wikicode
for i, v in ipairs(ret) do
if (v ~= '') then
ret[i] = string.format('[[Category:%s]]', v)
end
end
return table.concat(ret, '')
end
return p