Module:Infobox Character

From the Tesseract Wiki, the wiki for all things Marvel Cinematic Universe
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