<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASports_roster</id>
	<title>Module:Sports roster - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASports_roster"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Sports_roster&amp;action=history"/>
	<updated>2026-06-14T09:15:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Sports_roster&amp;diff=479568&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Sports_roster&amp;diff=479568&amp;oldid=prev"/>
		<updated>2021-07-16T07:19:34Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require('Module:No globals')&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
&lt;br /&gt;
local tracking = ''&lt;br /&gt;
&lt;br /&gt;
local function addflags(frame, names)&lt;br /&gt;
	for k,v in ipairs(names) do&lt;br /&gt;
		if v['nat'] then&lt;br /&gt;
			names[k]['nat'] = '&amp;lt;span data-sort-value=&amp;quot;' .. v['nat'] .. '&amp;quot;&amp;gt;'&lt;br /&gt;
				.. frame:expandTemplate{title = 'flagicon', args = {v['nat']}} .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return names&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function linkschools(frame, names)&lt;br /&gt;
	for k,v in ipairs(names) do&lt;br /&gt;
		if v['college'] or v['school'] then&lt;br /&gt;
			names[k]['college'] = frame:expandTemplate{title = 'college', args = {v['college'] or v['school']}}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return names&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function stylelinks(txt, css)&lt;br /&gt;
	if css and txt then&lt;br /&gt;
		local bg,fg = '',''&lt;br /&gt;
		css = string.lower(css)&lt;br /&gt;
		for k,v in ipairs(mw.text.split(css .. ';', ';')) do&lt;br /&gt;
			if v:match('^%s*background%s*:') then&lt;br /&gt;
				bg = v .. ';'&lt;br /&gt;
			elseif v:match('^s*background%-color%s*:') then&lt;br /&gt;
				bg = v .. ';'&lt;br /&gt;
			elseif v:match('^s*color%s*:') then&lt;br /&gt;
				fg = v .. ';'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		txt = mw.ustring.gsub(txt, '(%[%[)([^%[%]%|]*)(%]%])', '%1%2|%2%3')&lt;br /&gt;
		txt = mw.ustring.gsub(txt, '(%[%[[^%[%]%|]*%|)([^%[%]%|]*)(%]%])', &lt;br /&gt;
			'%1&amp;lt;span style=&amp;quot;' .. bg .. fg .. '&amp;quot;&amp;gt;%2&amp;lt;/span&amp;gt;%3')&lt;br /&gt;
	end&lt;br /&gt;
	return txt&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getlastduplicates(names)&lt;br /&gt;
	local found = {}&lt;br /&gt;
	local res = {}&lt;br /&gt;
	local count = 0&lt;br /&gt;
	for k,v in ipairs(names) do&lt;br /&gt;
		if v['last'] then&lt;br /&gt;
			if found[v['last']] then&lt;br /&gt;
				res[v['last']] = 1&lt;br /&gt;
				count = count + 1&lt;br /&gt;
			else&lt;br /&gt;
				found[v['last']] = 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if count &amp;lt; 1 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function linknames(names, fmt, reqinitials)&lt;br /&gt;
	for k,v in ipairs(names) do&lt;br /&gt;
		local link = v['link'] or v['name'] or ((v['first'] or '') .. ' ' .. (v['last']  or '') .. (v['dab'] and ' (' .. v['dab'] .. ')' or '')) or ''&lt;br /&gt;
		if v['nolink'] then&lt;br /&gt;
			link = ''&lt;br /&gt;
		end&lt;br /&gt;
		local text = v['last'] or v['alt'] or v['name'] or ((v['first'] or '') .. ' ' .. (v['last']  or '')) or link&lt;br /&gt;
		if fmt == 'lf' then&lt;br /&gt;
			text = v['alt'] or v['name'] or ((v['last']  or '') .. ', ' .. (v['first'] or '')) or ''&lt;br /&gt;
		elseif fmt == 'fl' or fmt == 'fil' or (reqinitials and reqinitials[v['last']]) then&lt;br /&gt;
			if (fmt == 'fil' or (reqinitials and reqinitials[v['last']])) and v['first'] then&lt;br /&gt;
				v['first'] = string.upper(string.sub(v['first'] .. ' ', 1, 1)) .. '.'&lt;br /&gt;
			end&lt;br /&gt;
			text = v['alt'] or v['name'] or ((v['first'] or '') .. ' ' .. (v['last']  or '')) or ''&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if link:match('^[,%s]*$') then&lt;br /&gt;
			if text:match('^[,%s]*$') then&lt;br /&gt;
				text = ''&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if text:match('^[,%s]*$') then&lt;br /&gt;
				text = '[[' .. link .. ']]'&lt;br /&gt;
			elseif link == text then&lt;br /&gt;
				text = '[[' .. link .. ']]'&lt;br /&gt;
			else&lt;br /&gt;
				text = '[[' .. link .. '|' .. text .. ']]'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		names[k]['name'] = text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return names&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseEntry(s, keys)&lt;br /&gt;
	local res = {}&lt;br /&gt;
	for k,v in pairs(mw.text.split(s, '%s*&amp;lt;[Tt][Dd]%s*')) do&lt;br /&gt;
		v = mw.ustring.gsub(v, '%s*&amp;lt;/[Tt][RrDd]&amp;gt;%s*', '')&lt;br /&gt;
		if v:find('^.-class%s*=%s*[\'&amp;quot;][^\'&amp;quot;]*sports%-roster%-([A-Za-z]+)%s*[\'&amp;quot;][^&amp;gt;]*&amp;gt;%s*([^%s].-)%s*$') then&lt;br /&gt;
			local kk =  mw.ustring.gsub(v, '^.-class%s*=%s*[\'&amp;quot;][^\'&amp;quot;]*sports%-roster%-([A-Za-z]+)%s*[\'&amp;quot;][^&amp;gt;]*&amp;gt;%s*([^%s].-)%s*$', '%1')&lt;br /&gt;
			res[kk] = mw.ustring.gsub(v, '^.-class%s*=%s*[\'&amp;quot;][^\'&amp;quot;]*sports%-roster%-([A-Za-z]+)%s*[\'&amp;quot;][^&amp;gt;]*&amp;gt;%s*([^%s].-)%s*$', '%2')&lt;br /&gt;
			keys[kk] = 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return keys, res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getEntries(args, role, res, keys)&lt;br /&gt;
	local i = 2&lt;br /&gt;
	local v&lt;br /&gt;
	res = res or {}&lt;br /&gt;
	keys = keys or {}&lt;br /&gt;
	while args[i] ~= nil do&lt;br /&gt;
		keys, v = parseEntry(args[i], keys)&lt;br /&gt;
		if role then&lt;br /&gt;
			v['role'] = role&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(res, v)&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return res, keys&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.entry(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local res = ''&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		if type(k) == 'string' then&lt;br /&gt;
			res = res .. '&amp;lt;td class=&amp;quot;sports-roster-' .. k .. '&amp;quot;&amp;gt;' .. v .. '&amp;lt;/td&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if res ~= '' then&lt;br /&gt;
		return '&amp;lt;tr&amp;gt;' .. res .. '&amp;lt;/tr&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.roster(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local players, keys = getEntries(mw.text.split(args['players'] or '', '%s*&amp;lt;[Tt][Rr]&amp;gt;%s*'))&lt;br /&gt;
&lt;br /&gt;
	local coaches, ckeys = {}, {}&lt;br /&gt;
	for k,v in ipairs({&lt;br /&gt;
		{'head_coach', 'Head coach'},&lt;br /&gt;
		{'asst_coach', 'Assistant coaches'}&lt;br /&gt;
		}) do&lt;br /&gt;
		coaches, ckeys = getEntries(mw.text.split(args[v[1]] or '', '%s*&amp;lt;[Tt][Rr]&amp;gt;%s*'), v[2], coaches, ckeys)&lt;br /&gt;
	end&lt;br /&gt;
	local staff, skeys = {}, {}&lt;br /&gt;
	for k,v in ipairs({&lt;br /&gt;
			{'player_development', 'Player development'}, &lt;br /&gt;
			{'ath_train', 'Athletic trainer'},&lt;br /&gt;
			{'assistant_trainer', 'Assistant trainer'},&lt;br /&gt;
			{'str_cond', 'Strength and conditioning coach'},&lt;br /&gt;
		}) do&lt;br /&gt;
		staff, skeys = getEntries(mw.text.split(args[v[1]] or '', '%s*&amp;lt;[Tt][Rr]&amp;gt;%s*'), v[2], staff, skeys)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local p_style&lt;br /&gt;
	if args['style'] and mw.title.new('Module:Sports roster/' .. args['style']) then&lt;br /&gt;
		p_style = require('Module:Sports roster/' .. args['style'])&lt;br /&gt;
	else&lt;br /&gt;
		p_style = require('Module:Sports roster/default')&lt;br /&gt;
	end&lt;br /&gt;
	-- flags&lt;br /&gt;
	if keys['nat'] then&lt;br /&gt;
		players = addflags(frame, players)&lt;br /&gt;
	end&lt;br /&gt;
	if ckeys['nat'] then&lt;br /&gt;
		coaches = addflags(frame, coaches)&lt;br /&gt;
	end&lt;br /&gt;
	if skeys['nat'] then&lt;br /&gt;
		staff = addflags(frame, staff)&lt;br /&gt;
	end&lt;br /&gt;
	-- college links&lt;br /&gt;
	if keys['college'] or keys['school'] then&lt;br /&gt;
		players = linkschools(frame, players)&lt;br /&gt;
	end&lt;br /&gt;
	if ckeys['college'] or ckeys['school'] then&lt;br /&gt;
		coaches = linkschools(frame, coaches)&lt;br /&gt;
	end&lt;br /&gt;
	if skeys['college'] or ckeys['school'] then&lt;br /&gt;
		staff = linkschools(frame, staff)&lt;br /&gt;
	end&lt;br /&gt;
	-- link names&lt;br /&gt;
	players = linknames(players, 'lf')&lt;br /&gt;
	coaches = linknames(coaches, 'fl')&lt;br /&gt;
	staff = linknames(staff, 'fl')&lt;br /&gt;
	&lt;br /&gt;
	local res = mw.html.create('table')&lt;br /&gt;
	res:addClass('toccolours')&lt;br /&gt;
		:css('font-size', '85%')&lt;br /&gt;
		:css('margin', '1em auto')&lt;br /&gt;
		:css('width', '90%')&lt;br /&gt;
	local row = res:tag('tr')&lt;br /&gt;
	local above = p_style.above(args)&lt;br /&gt;
	local abovestyle = p_style.abovestyle(frame, args)&lt;br /&gt;
	local color = mw.ustring.match(';' .. string.lower(abovestyle or ''), ';%s*color%s*:([^;]*)')&lt;br /&gt;
	row:tag('th')&lt;br /&gt;
		:attr('colspan', 2)&lt;br /&gt;
		:cssText(abovestyle)&lt;br /&gt;
		:css('text-align', 'center')&lt;br /&gt;
		:wikitext(above and frame:expandTemplate{title='navbar-header', args={&lt;br /&gt;
			stylelinks(above,abovestyle),&lt;br /&gt;
			args['name'], fontcolor = color or ''}} or nil)&lt;br /&gt;
	row = res:tag('tr')&lt;br /&gt;
		:css('text-align', 'center')&lt;br /&gt;
	local headingstyle = p_style.headingstyle(frame, args)&lt;br /&gt;
	row:tag('th'):cssText(headingstyle):wikitext('Players')&lt;br /&gt;
	row:tag('th'):cssText(headingstyle):wikitext('Coaches')&lt;br /&gt;
	row = res:tag('tr')&lt;br /&gt;
&lt;br /&gt;
	local innertable = row:tag('td'):css('vertical-align', 'top'):tag('table')&lt;br /&gt;
	innertable:addClass('sortable')&lt;br /&gt;
		:css('background', 'transparent')&lt;br /&gt;
		:css('margin', 0)&lt;br /&gt;
		:css('width', '100%')&lt;br /&gt;
	innertable:wikitext(p_style.headings(args, keys))&lt;br /&gt;
	innertable:wikitext(p_style.players_roster(args, players, keys))&lt;br /&gt;
	local cell = row:tag('td'):css('vertical-align', 'top')&lt;br /&gt;
	cell:wikitext(p_style.coaches_roster(coaches))&lt;br /&gt;
	cell:wikitext(p_style.staff_roster(staff))&lt;br /&gt;
	cell:wikitext(p_style.legend(args))&lt;br /&gt;
	local footer = p_style.footer(args, keys)&lt;br /&gt;
	if footer ~= '' then&lt;br /&gt;
		cell:attr('rowspan', 2)&lt;br /&gt;
		local footerstyle = p_style.footerstyle(frame, args)&lt;br /&gt;
		row = res:tag('tr')&lt;br /&gt;
		row:tag('td')&lt;br /&gt;
			:addClass('hlist')&lt;br /&gt;
			:css('text-align', 'center')&lt;br /&gt;
			:cssText(footerstyle)&lt;br /&gt;
			:wikitext(footer)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(res)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local players, keys = getEntries(mw.text.split(args['players'] or '', '%s*&amp;lt;[Tt][Rr]&amp;gt;%s*'))&lt;br /&gt;
	local coaches, ckeys = {}, {}&lt;br /&gt;
	for k,v in ipairs({&lt;br /&gt;
		{'head_coach', 'Head coach'},&lt;br /&gt;
		{'asst_coach', 'Assistant coaches'}&lt;br /&gt;
		}) do&lt;br /&gt;
		coaches, ckeys = getEntries(mw.text.split(args[v[1]] or '', '%s*&amp;lt;[Tt][Rr]&amp;gt;%s*'), v[2], coaches, ckeys)&lt;br /&gt;
	end&lt;br /&gt;
	local p_style&lt;br /&gt;
	if args['style'] and mw.title.new('Module:Sports roster/' .. args['style']) then&lt;br /&gt;
		p_style = require('Module:Sports roster/' .. args['style'])&lt;br /&gt;
	else&lt;br /&gt;
		p_style = require('Module:Sports roster/default')&lt;br /&gt;
	end&lt;br /&gt;
	local needinitials = getlastduplicates(players)&lt;br /&gt;
	players = linknames(players, 'l', needinitials)&lt;br /&gt;
	coaches = linknames(coaches, 'fil')&lt;br /&gt;
	for k=1,2 do&lt;br /&gt;
	table.sort(players, function (a, b) &lt;br /&gt;
			return (tonumber(a['num']) or 9999) &amp;lt; (tonumber(b['num']) or 9999)&lt;br /&gt;
				or ((tonumber(a['num']) or 9999) == (tonumber(b['num']) or 9999)&lt;br /&gt;
					and ((a['last'] or 'ZZZZ') &amp;lt; (b['last'] or 'ZZZZ')))&lt;br /&gt;
				end&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local Navbox = require('Module:Navbox')&lt;br /&gt;
&lt;br /&gt;
	local targs = {}&lt;br /&gt;
	&lt;br /&gt;
	targs['name'] = args['name'] or mw.title.getCurrentTitle().text&lt;br /&gt;
	targs['titlestyle'] = p_style.titlestyle(frame, args)&lt;br /&gt;
	targs['title'] = stylelinks(p_style.title(args), targs['titlestyle'])&lt;br /&gt;
	targs['listclass'] = 'hlist'&lt;br /&gt;
	targs['state'] = args['state'] or 'autocollapse'&lt;br /&gt;
	targs['list1'] = p_style.players_list(args, players, keys) .. '\n' .. p_style.coaches_list(coaches)&lt;br /&gt;
	targs['belowclass'] = 'hlist'&lt;br /&gt;
	targs['belowstyle'] = p_style.belowstyle(frame, args)&lt;br /&gt;
	targs['below'] =  stylelinks(p_style.below(args, keys), targs['belowstyle'])&lt;br /&gt;
&lt;br /&gt;
	return Navbox._navbox(targs) .. tracking&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>