Module:Sports roster/sandbox

require('strict')
local p = {}

local getArgs = require('Module:Arguments').getArgs

local tracking = ''

local function addflags(frame, names)
	for k, v in ipairs(names) do
		if v['nat'] then
			names[k]['nat'] = '<span data-sort-value="' .. v['nat'] .. '">'
				.. frame:expandTemplate{title = 'flagicon', args = {v['nat']}} .. '</span>'
		end
	end
	return names
end

local function linkschools(frame, names)
	for k, v in ipairs(names) do
		if v['college'] or v['school'] then
			names[k]['college'] = frame:expandTemplate{title = 'college', args = {v['college'] or v['school']}}
		end
	end
	return names
end

local function stylelinks(txt, css)
	if css and txt then
		local bg,fg = '',''
		css = string.lower(css)
		for k, v in ipairs(mw.text.split(css .. ';', ';')) do
			if v:match('^%s*background%s*:') then
				bg = v .. ';'
			elseif v:match('^%s*background%-color%s*:') then
				bg = v .. ';'
			elseif v:match('^%s*color%s*:') then
				fg = v .. ';'
			end
		end
		txt = mw.ustring.gsub(txt, '(%[%[)([^%[%]%|]*)(%]%])', '%1%2|%2%3')
		txt = mw.ustring.gsub(txt, '(%[%[[^%[%]%|]*%|)([^%[%]%|]*)(%]%])', 
			'%1<span style="' .. bg .. fg .. '">%2</span>%3')
	end
	return txt
end

local function getlastduplicates(names)
	local found = {}
	local res = {}
	local count = 0
	for k, v in ipairs(names) do
		if v['last'] then
			if found[v['last']] then
				res[v['last']] = 1
				count = count + 1
			else
				found[v['last']] = 1
			end
		end
	end
	if count < 1 then
		return nil
	end
	return res
end

local function linknames(names, fmt, reqinitials)
	for k, v in ipairs(names) do
		local link = v['link'] or v['name'] or ((v['first'] or '') .. ' ' .. (v['last']  or '') .. (v['dab'] and ' (' .. v['dab'] .. ')' or '')) or ''
		if v['nolink'] then
			link = ''
		end
		local text = v['last'] or v['alt'] or v['name'] or ((v['first'] or '') .. ' ' .. (v['last']  or '')) or link
		if fmt == 'lf' then
			text = v['alt'] or v['name'] or ((v['last']  or '') .. ', ' .. (v['first'] or '')) or ''
		elseif fmt == 'fl' or fmt == 'fil' or (reqinitials and reqinitials[v['last']]) then
			if (fmt == 'fil' or (reqinitials and reqinitials[v['last']])) and v['first'] then
				v['first'] = string.upper(string.sub(v['first'] .. ' ', 1, 1)) .. '.'
			end
			text = v['alt'] or v['name'] or ((v['first'] or '') .. ' ' .. (v['last']  or '')) or ''
		end
		
		if link:match('^[,%s]*$') then
			if text:match('^[,%s]*$') then
				text = ''
			end
		elseif text:match('^[,%s]*$') then
			text = '[[' .. link .. ']]'
		elseif link == text then
			text = '[[' .. link .. ']]'
		else
			text = '[[' .. link .. '|' .. text .. ']]'
		end
		names[k]['name'] = text
	end
	
	return names
end

local function parseEntry(s, keys)
	local res = {}
	for k, v in pairs(mw.text.split(s, '%s*<[Tt][Dd]%s*')) do
		v = mw.ustring.gsub(v, '%s*</[Tt][RrDd]>%s*', '')
		if v:find('^.-class%s*=%s*[\'"][^\'"]*sports%-roster%-([A-Za-z]+)%s*[\'"][^>]*>%s*([^%s].-)%s*$') then
			local kk =  mw.ustring.gsub(v, '^.-class%s*=%s*[\'"][^\'"]*sports%-roster%-([A-Za-z]+)%s*[\'"][^>]*>%s*([^%s].-)%s*$', '%1')
			res[kk] = mw.ustring.gsub(v, '^.-class%s*=%s*[\'"][^\'"]*sports%-roster%-([A-Za-z]+)%s*[\'"][^>]*>%s*([^%s].-)%s*$', '%2')
			keys[kk] = 1
		end
	end
	return keys, res
end

local function getEntries(args, role, res, keys)
	local i = 2
	local v
	res = res or {}
	keys = keys or {}
	while args[i] ~= nil do
		keys, v = parseEntry(args[i], keys)
		if role then
			v['role'] = role
		end
		table.insert(res, v)
		i = i + 1
	end
	return res, keys
end

function p.entry(frame)
	local args = getArgs(frame)
	local res = ''
	for k, v in pairs(args) do
		if type(k) == 'string' then
			res = res .. '<td class="sports-roster-' .. k .. '">' .. v .. '</td>'
		end
	end

	if res ~= '' then
		return '<tr>' .. res .. '</tr>'
	end

	return res
end

function p.roster(frame)
	local args = getArgs(frame)
	local players, keys = getEntries(mw.text.split(args['players'] or '', '%s*<[Tt][Rr]>%s*'))

	local coaches, ckeys = {}, {}
	for k, v in ipairs({
		{'head_coach', 'Head coach'},
		{'asst_coach', 'Assistant coaches'}
		}) do
		coaches, ckeys = getEntries(mw.text.split(args[v[1]] or '', '%s*<[Tt][Rr]>%s*'), v[2], coaches, ckeys)
	end
	local staff, skeys = {}, {}
	for k, v in ipairs({
			{'player_development', 'Player development'}, 
			{'ath_train', 'Athletic trainer'},
			{'assistant_trainer', 'Assistant trainer'},
			{'str_cond', 'Strength and conditioning coach'},
		}) do
		staff, skeys = getEntries(mw.text.split(args[v[1]] or '', '%s*<[Tt][Rr]>%s*'), v[2], staff, skeys)
	end

	local p_style
	if args['style'] and mw.title.new('Module:Sports roster/' .. args['style']) then
		p_style = require('Module:Sports roster/' .. args['style'])
	else
		p_style = require('Module:Sports roster/default')
	end
	-- flags
	if keys['nat'] then
		players = addflags(frame, players)
	end
	if ckeys['nat'] then
		coaches = addflags(frame, coaches)
	end
	if skeys['nat'] then
		staff = addflags(frame, staff)
	end
	-- college links
	if keys['college'] or keys['school'] then
		players = linkschools(frame, players)
	end
	if ckeys['college'] or ckeys['school'] then
		coaches = linkschools(frame, coaches)
	end
	if skeys['college'] or ckeys['school'] then
		staff = linkschools(frame, staff)
	end
	-- link names
	players = linknames(players, 'lf')
	coaches = linknames(coaches, 'fl')
	staff = linknames(staff, 'fl')
	
	local res = mw.html.create('table')
	res:addClass('toccolours')
		:css('font-size', '85%')
		:css('margin', '1em auto')
		:css('width', '90%')
	local row = res:tag('tr')
	local above = p_style.above(args)
	local abovestyle = p_style.abovestyle(frame, args)
	local color = mw.ustring.match(';' .. string.lower(abovestyle or ''), ';%s*color%s*:([^;]*)')
	row:tag('th')
		:attr('colspan', 2)
		:cssText(abovestyle)
		:css('text-align', 'center')
		:wikitext((above and args['template_name'] and frame:expandTemplate{title='navbar-header', args={
			stylelinks(above,abovestyle),
			args['template_name'], fontcolor = color or ''}}) or stylelinks(above,abovestyle))
	row = res:tag('tr')
		:css('text-align', 'center')
	local headingstyle = p_style.headingstyle(frame, args)
	row:tag('th'):cssText(headingstyle):wikitext('Players')
	row:tag('th'):cssText(headingstyle):wikitext('Coaches')
	row = res:tag('tr')

	local innertable = row:tag('td'):css('vertical-align', 'top'):tag('table')
	innertable:addClass('sortable')
		:css('background', 'transparent')
		:css('margin', 0)
		:css('width', '100%')
	innertable:wikitext(p_style.headings(args, keys))
	innertable:wikitext(p_style.players_roster(args, players, keys, frame))
	local cell = row:tag('td'):css('vertical-align', 'top')
	cell:wikitext(p_style.coaches_roster(coaches))
	cell:wikitext(p_style.staff_roster(staff))
	cell:wikitext(p_style.legend(args))
	local footer = p_style.footer(args, keys)
	if footer and footer ~= '' then
		cell:attr('rowspan', 2)
		local footerstyle = p_style.footerstyle(frame, args)
		row = res:tag('tr')
		row:tag('td')
			:css('text-align', 'center')
			:cssText(footerstyle)
			:wikitext(
				frame:expandTemplate{ title = 'flatlist', args = {}} .. footer ..
				frame:expandTemplate{ title = 'endflatlist', args = {}}
			)
	end

	return tostring(res)

end

function p.navbox(frame)
	local args = getArgs(frame)
	local players, keys = getEntries(mw.text.split(args['players'] or '', '%s*<[Tt][Rr]>%s*'))
	local coaches, ckeys = {}, {}
	for k, v in ipairs({
		{'head_coach', 'Head coach'},
		{'asst_coach', 'Assistant coaches'}
		}) do
		coaches, ckeys = getEntries(mw.text.split(args[v[1]] or '', '%s*<[Tt][Rr]>%s*'), v[2], coaches, ckeys)
	end
	local p_style
	if args['style'] and mw.title.new('Module:Sports roster/' .. args['style']) then
		p_style = require('Module:Sports roster/' .. args['style'])
	else
		p_style = require('Module:Sports roster/default')
	end
	local needinitials = getlastduplicates(players)
	players = linknames(players, 'l', needinitials)
	coaches = linknames(coaches, 'fil')
	for k = 1, 2 do
	table.sort(players, function (a, b) 
			return (tonumber(a['num']) or 9999) < (tonumber(b['num']) or 9999)
				or ((tonumber(a['num']) or 9999) == (tonumber(b['num']) or 9999)
					and ((a['last'] or 'ZZZZ') < (b['last'] or 'ZZZZ')))
				end
		)
	end
	
	local Navbox = require('Module:Navbox')

	local targs = {
		['name'] = args['template_name'] or mw.title.getCurrentTitle().text,
		['titlestyle'] = p_style.titlestyle(frame, args),
		['title'] = stylelinks(p_style.title(args), p_style.titlestyle(frame, args)),
		['listclass'] = 'hlist',
		['state'] = args['state'] or 'autocollapse',
		['list1'] = p_style.players_list(args, players, keys) .. '\n' .. p_style.coaches_list(coaches),
		['belowclass'] = 'hlist',
		['belowstyle'] = p_style.belowstyle(frame, args),
		['below'] =  stylelinks(p_style.below(args, keys), p_style.belowstyle(frame, args))
	}
	return Navbox._navbox(targs) .. tracking
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.