Jump to content

Module:PHL sports team

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by McVahl (talk | contribs) at 09:50, 9 March 2020 (+mw to wrap autolink). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

require('Module:No globals')

local p = {}
local constants = {	CODE_LEN = 3, SPACE = ' ', SHORT = 'short', INST = 'inst' }

local function makeInvokeFunc(funcName)
	return function (frame)
		local args = (frame.args[1] ~= nil) and frame.args or frame:getParent().args
		return p[funcName](args)
	end
end

local function stripwhitespace(text) return text:match("^%s*(.-)%s*$") end

local function load_data(args)
	local data_module = 'Module:PHL sports team/' .. (args['level'] or 'collegiate')
	return mw.loadData(data_module)
end

local function get_key_by_code(code, data)
	if (string.len(code) == constants.CODE_LEN) then
		for k,v in pairs(data) do
			if v[1]==code then return k end
		end
	end
	return nil
end

local function get_icon(team, size, alt_team)
	local icon = '[[File:%s colors.svg|%s|border|%s school colors|link=]]'
	return string.format(icon, team, size or '11px', alt_team or team)
end

local function show_empty_param(param)
	return mw.html.create('span'):css('color', 'red'):cssText('style'):wikitext(string.format('Value for parameter \'%s\' not provided.', param))
end

local function get_link_by_evt(args, div, text)
	local evt = { bk = 'basketball', vb = 'volleyball', ft = 'football' }
	evt = evt[args[2]] or evt[args[3]] or evt[args['evt']]
	if (evt == nil) then return nil end
	local divLt = { "men\'s", "women's", "boys'", "girls'" }
	if (type(div) == 'string') then div = 3 end
	local evt_link = string.format('%s %s %s', text, divLt[div-2], evt)
	if (args['yr'] ~= nil) then return args['yr'] .. ' ' .. evt_link .. ' team' end
	return evt_link
end

local function add_link(args, team, name, div, text)
	local evt_link = get_link_by_evt(args, div, team[div] or team[3])
	if (type(div) == 'number' and div >= 3 and div <= 6) then
		if ((args['inst'] or name) ~= nil or ((args[3] or div) == constants.INST)) then return string.format('[[%s|%s]]', evt_link or team[div], team[args['inst']]  or text)
			elseif (evt_link ~= nil) then return string.format('[[%s|%s]]', evt_link, text)
			else return string.format('[[%s]]', text) end
	end
	return string.format('[[%s|%s]]', evt_link or team[3], text)
end

function p._main(args)
	local data = load_data(args)
	local in_team = stripwhitespace(args[1] or '')
	if (in_team:match('^{{{.*}}}$') ~= nil) then return show_empty_param(in_team) elseif (in_team == '' or nil) then return '—' end
	
	local in_div = stripwhitespace(args[2] or '')
	local in_name = args['name']
	local key = get_key_by_code(in_team, data)
	local team = data[in_team] or data[key]
	if (team == nil) then return error(string.format('Invalid team: %s', in_team)) end
	
	local out
	if (in_div ~= constants.SHORT) then
		local div = { inst = 2, men = 3, women = 4, junior = 5, boys = 5, girls = 6 }
		in_div = div[in_div] or tonumber(in_div:match('[2-6]') or '3')
		if ((args[3] or in_div) == constants.INST) then out = team[div['inst']] else out = in_name or team[in_div] end
		if (out == nil) then return error('No team') end
	else
		out = team[7] or key or in_team
	end
	
	out = add_link(args, team, in_name, in_div, out)

	local yesno = require('Module:Yesno')
	if yesno(args['icon'] or 'y') then
		local icon = get_icon(key or in_team, args['iconsize'])
		out = yesno(args['rt'] or 'n') and out .. constants.SPACE .. icon or icon .. constants.SPACE .. out
	end
	
	return out
end

function p._rt(args)
	args['rt'] = 'y'
	return p._main(args)
end

function p._name(args)
	args['icon'] = 'n'
	return p._main(args)
end

function p._color(args)
	local data = load_data(args)
	local in_team = args[1] or ''
	if (in_team:match('^{{{.*}}}$') ~= nil) then return show_empty_param(in_team) elseif (in_team == '' or nil) then return '—' end
		
	local key = get_key_by_code(in_team, data)
	if ((data[in_team] or data[key]) == nil) then return '—' end
	return get_icon(key or in_team, args['size'], args[2])
end

function p._athlete(args)
	local root = mw.html.create('')
	local out = string.format('{{auto link|%s|%s}}&nbsp;<span style="font-size:90%%;">(%s)</span>', args['link'] or args['athl'], args['athl'], p._name(args))
	root:wikitext(out)
	return tostring(root)
end

p.main = makeInvokeFunc('_main')
p.rt = makeInvokeFunc('_rt')
p.name = makeInvokeFunc('_name')
p.color = makeInvokeFunc('_color')
p.athlete = makeInvokeFunc('_athlete')

return p