Jump to content

Module:Football manager history

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Johnuniq (talk | contribs) at 00:49, 8 February 2016 (implement Template:Football manager history to fix Category:Pages where template include size is exceeded problems). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

-- Implement [[Template:Football manager history]] to avoid articles being
-- added to [[:Category:Pages where template include size is exceeded]]
-- when the template is used many times.

local function collection()
	-- Return a table to hold items.
	return {
		n = 0,
		add = function (self, item)
			self.n = self.n + 1
			self[self.n] = item
		end,
		addif = function (self, item, fmt)
			if item then
				self.n = self.n + 1
				self[self.n] = fmt and string.format(fmt, item) or item
			end
		end,
		join = function (self, sep)
			return table.concat(self, sep)
		end,
	}
end

local function make_entry(name, from, to, islast)
	local result =
		'*<span class="vevent">' ..
		'<span class="agent attendee vcard">' ..
		'<span class="fn org summary">' ..
		name ..
		'</span></span>&nbsp;(<span class="dtstart">' ..
		from ..
		'</span>'
	if to then
		result = result .. '–' .. to
	elseif islast then
		result = result .. '–'
	end
	result = result .. ')</span>'
	return result
end

local function make_list(text)
	-- Return a list of formatted items.
	-- Input is a string of multiple lines, one item per line.
	-- Each item is 'NAME FROM' TO or 'NAME FROM', where
	--   NAME = manager name (any text)
	--   FROM = four digits (from year)
	--     TO = 1, 2, 3 or 4 digits (to year), or empty
	text = text or ''
	if text:find('<span class=', 1, true) then
		-- To allow a transition period where some navboxes use the old syntax, the
		-- given text is used if it appears to have come from the old subtemplates.
		return text
	end
	local lines = collection()
	for line in string.gmatch(text .. '\n', '[\t ]*(.-)[\t\r ]*\n') do
		if line ~= '' then
			lines:add(line)
		end
	end
	if lines.n <= 0 then
		return ''
	end
	local entries = collection()
	for i, line in ipairs(lines) do
		local name, from, to = line:match('^(..-)%s+(%d%d%d%d)%s+to%s+(%d%d?%d?%d?)$')
		if not name then
			name, from = line:match('^(..-)%s+(%d%d%d%d)$')
			if not name then
				error('Invalid line: "' .. line .. '"')
			end
		end
		entries:add(make_entry(name, from, to, i == lines.n))
	end
	return '<div>\n' .. entries:join('\n') .. '\n</div>'
end

local function clean(text, default)
	-- Return text if it is not empty; otherwise return default.
	if text and not text:match('^%s*$') then
		return text
	end
	return default  -- may be nil
end

local function arg_style(bgcolor, textcolor, bordercolor)
	local result = collection()
	result:addif(clean(bgcolor), 'background:%s;')
	result:addif(clean(textcolor), 'color:%s;')
	result:addif(clean(bordercolor), 'border:1px solid %s;')
	result:add('width: 87%;')
	return result:join(' ')
end

local function arg_title(title, teamname, managerlist, textcolor, american_english)
	title = clean(title)
	teamname = clean(teamname, 'MISSING "teamname"')
	managerlist = clean(managerlist)
	textcolor = clean(textcolor)
	american_english = clean(american_english)
	local spancolor = textcolor and ('<span style="color:' .. textcolor .. ';">') or '<span>'
	local mgr = spancolor .. (american_english and 'Head coaches' or 'managers') .. '</span>'
	return
		'<span class="fn org">[[' .. teamname .. '|' ..
		spancolor ..
		(title or teamname) .. '</span>]]</span> – ' ..
		(managerlist and ('[[' .. managerlist .. '|' .. mgr .. ']]') or mgr)
end

local function main(frame)
	-- Return wikitext for a navbox.
	-- Code does not do much checking of inputs but will throw an error
	-- if input is found to be invalid.
	local args = frame:getParent().args
	-- Read arguments in order of output (Module:Navbox says this puts
	-- reference numbers in the right order).
	local _
	_ = args.title
	_ = args.list
	_ = args.below
	local style = arg_style(args.bgcolor, args.textcolor, args.bordercolor)
	local navargs = {
		bodyclass = 'vcard',
		name = clean(args.name),
		state = clean(args.state, 'autocollapse'),
		titlestyle = style,
		title = arg_title(args.title, args.teamname, args.managerlist, args.textcolor, args.american_english),
		listclass = 'hlist',
		list1 = make_list(args.list),
		belowstyle = style,
		below = clean(args.below),
	}
	local navbox = require('Module:Navbox')._navbox
	return navbox(navargs)
end

return { main = main }