Module:Infobox One-Shot

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 One-Shot/doc

-- <nowiki>
--------------------------
-- Module for [[Template:Infobox One-Shot]]
--------------------------
local p = {}

-- "imports"
local onmain = require('Module:Mainonly').on_main
local infobox = require('Module:Infobox')
local cleanimg = require('Module:Clean image').clean

local hexmonthconv = {
	January = '1',
	February = '2',
	March = '3',
	April = '4',
	May = '5',
	June = '6',
	July = '7',
	August = '8',
	September = '9',
	October = 'A',
	November = 'B',
	December = 'C',
}

local lang = mw.getContentLanguage()

function p.main(frame)
	local args = frame:getParent().args
	local ret = infobox.new(args)

	p.defineParams(ret)
	p.setup(ret)
	p.useSMWOne(ret)

	ret:defineName('Infobox One-Shot')
	p.display(ret)

	ret:finish()
	if onmain() then
		local allargs = ret:param('all')
		local catargs = ret:categoryData()
		ret:wikitext(p.addcategories(allargs, catargs))
	end
	return ret:tostring()
end

function p.defineParams(ret)
	ret:defineParams {
		{ name = 'name', func = 'name' },
		{ name = 'nameDisp', func = { name = nameDisp, params = { 'name', 'number' } } },
		{ name = 'image', func = imgarg },
		{ name = 'release', func = 'release' },
		{ name = 'number', func = 'has_content' },
		{ name = 'runtime', func = 'has_content' },
		{ name = 'phase', func = phaseParam },
		{ name = 'phasedisp', func = { name = phaseDisp, params = { 'phase' } } },
	}
end

function p.setup(ret)
	ret:setMaxButtons(4)
	ret:create()
	ret:cleanParams()
	ret:customButtonPlacement(true)
end

function p.useSMWOne(ret)
	ret:useSMWOne({
		name = 'Name',
		release = 'Release date',
		phase = 'Phase',
	})
end

function p.display(ret)
	ret:addClass('tsw-infobox plainlinks')
	ret:attr { cellpadding = '0', cellspacing = '0' }
	ret:defineLinks({ links = { { 'Template:%s', 'Infobox' },
		{ 'Template_talk:%s', 'Talk page' } }, colspan = '2' })

	-- PARAMETER: image
	ret:addRow {
		{ tag = 'argd', content = 'image', class = 'infobox-image', colspan = '2' }
	}

	-- PARAMETER: name
	ret:addRow {
		{ tag = 'argh', content = 'nameDisp', class = 'infobox-header', colspan = '2' }
	}

	-- PARAMETER: release date
	ret:addRow {
		{ tag = 'th', content = 'Release date' },
		{ tag = 'argd', content = 'release' }
	}
	
	-- PARAMETER: runtime
	if ret:paramDefined('runtime') then
		ret:addRow {
			{ tag = 'th', content = 'Runtime' },
			{ tag = 'argd', content = 'runtime' }
		}
	end

	-- PARAMTER: One-Shot phase
	ret:addRow {
		{ tag = 'th', content = 'Phase' },
		{ tag = 'argd', content = 'phasedisp' }
	}
end

function nameDisp(name, number)
	if infobox.isDefined(name) or infobox.isDefined(number) then
		local ret = {}
		if infobox.isDefined(name) then
			table.insert(ret, name)
		end
		if infobox.isDefined(number) then
			table.insert(ret, '<small>(#' .. number .. ')</small>')
		end
		return table.concat(ret, ' ')
	end
	return nil
end

function imgarg(arg)
	if infobox.isDefined(arg) then
		return cleanimg { file = arg, width = 300, height = 444 }
	end
	return nil
end

function phaseParam(d)
	if infobox.isDefined(d) then
		d = d:lower()
		if d == '1' or d == 'one' then
			return '1'
		elseif d == '2' or d == 'two' then
			return '2'
		elseif d == '3' or d == 'three' then
			return '3'
		elseif d == '4' or d == 'four' then
			return '4'
		elseif d == '5' or d == 'five' then
			return '5'
		elseif d == '6' or d == 'six' then
			return '6'
		else
			return nil
		end
	end
	return nil
end

function phaseDisp(d)
	if infobox.isDefined(d) then
		if d == '1' then
			return '[[Phase One]]'
		elseif d == '2' then
			return '[[Phase Two]]'
		elseif d == '3' then
			return '[[Phase Three]]'
		else
			return nil
		end
	end
	return nil
end

function p.addcategories(args, catargs)
	-- Added if the parameter has no content
	local cat_map_notdefined = {
		image = '[[Category:Needs image]]',
		release = '[[Category:Needs One-Shot release date added]]',
		phase = '[[Category:Needs phase added]]',
	}

	local ret = { '[[Category:One-Shots]]' }

	local phase = args.phase.d
	if infobox.isDefined(phase) then
		local a = tostring(phase):lower()
		if a == '1' then
			table.insert(ret, '[[Category:Phase One One-Shots]]')
		elseif a == '2' then
			table.insert(ret, '[[Category:Phase Two One-Shots]]')
		elseif a == '3' then
			table.insert(ret, '[[Category:Phase Three One-Shotsf]]')
		end
	end

	local release_date = args.release.d
	if infobox.isDefined(release_date) then
		day = lang:formatDate('j', release_date)
		month = lang:formatDate('F', release_date)
		year = lang:formatDate('Y', release_date)
		table.insert(ret, get_time_categories(day, month, year))
	end
	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

	for i, v in ipairs(ret) do
		if (v ~= '') then
			ret[i] = v
		end
	end
	return table.concat(ret, '')
end

function get_time_categories(day, month, year)
	local ret = {}
	local hexmonth, dayzero
		
	if not day or not month or not hexmonthconv[month] or not year then
		table.insert(ret, '[[Category:Missing release date]]')
	else
		dayzero = ((tonumber(day) < 10 and '0'..day) or day)
		hexmonth = hexmonthconv[month]
		-- [[Category:May 4 media]], sorted by year (eg 2012)
		table.insert(ret, string.format('[[Category:%s %s media|%s%s%s]]', month, day, year, hexmonth, dayzero))
		
		-- [[Category:2012 media]], sorted by monthday, months converted to hex, eg 54 (May 4)
		table.insert(ret, string.format('[[Category:%s media|%s%s]]', year, hexmonth, dayzero))
	
		-- [[Category:Media by date]], sorted year month day
		table.insert(ret, string.format('[[Category:Media by date|%s%s%s]]', year, hexmonth, dayzero))
	
	end
	return table.concat(ret)
end

return p
-- </nowiki>