To edit the documentation or categories for this module, click here.
local util_args = require('Module:ArgsUtil')
local util_infobox = require('Module:InfoboxUtil')
local util_html = require('Module:HtmlUtil')
local util_cargo = require('Module:CargoUtil')
local util_table = require('Module:TableUtil')
local util_title = require('Module:TitleUtil')
local util_vars = require('Module:VarsUtil')
local Country = require('Module:Country')
local Region = require('Module:Region')
local m_team = require('Module:Team')
local IntroSentence = require('Module:IntroSentence/Team').main
local NOIMAGE = 'Unknown Infobox Image - Team.png'
local Infobox = require('Module:Infobox'):extends()
Infobox.LAYOUT = {
tabs = 'TeamTabsHeader',
sections = { 'Team Information', 'History', 'Social Media & Links', 'Current Roster' },
contents = {
{ 'Org Location', 'Team Location', 'FoundedIn', 'Region', 'Owner', 'HeadCoach', 'Sponsor', 'Partner', 'Affiliated' },
{ 'history', history = 'wide' },
{ 'social', social = 'wide' },
{ 'rosterimage', rosterimage = 'wide' }
},
}
Infobox.type = 'Team'
local SPECIAL = {
allstar = { cat = 'All-Star Regional Teams', nonav = true, nocargo = true },
aprilfools = { nonav = true, nocargo = true },
city = { nonav = true, nocargo = true },
clubmasters = { nonav = true, nocargo = true },
collegiate = { cat = 'Collegiate Teams', nocargo = false },
iesf = { cat = 'IESF Teams', nonav = true, nocargo = true },
nasg = { nonav = true },
national = { cat = 'National Teams', nonav = true, nocargo = true },
}
local h = {}
local p = {}
function p.main(frame)
local args = util_args.merge()
return Infobox(args):run()
end
function Infobox:castArgs(args)
args.region = Region(args.region)
args.special = args.special and args.special:lower()
args._title = args.name
args.isdisbanded = util_args.castAsBool(args.isdisbanded)
args.neworg = util_args.norm(args.neworg)
args.isrenamed = util_args.norm(args.isrenamed)
args.isinactive = util_args.castAsBool(args.isinactive)
args._isDisbanded = args.isdisbanded or args.neworg or args.isrenamed or args.isinactive
args._special = args.special and SPECIAL[args.special] or {}
args.orgcountry = Country(args.orgcountry)
args.country = Country(args.country)
args.foundedcountry = Country(args.foundedcountry)
args.effective_country = args.country:_or(args.orgcountry)
args.suppress_roster_photo = util_args.castAsBool(args.suppress_roster_photo)
end
function Infobox:validateArgs(args)
if args.special and not SPECIAL[args.special] then
error('Invalid special specification - perhaps you need to add new preload at Module:Infobox/Team?')
end
end
function Infobox:getProcessed(args)
local processed = self:super('getProcessed', args)
processed.image = h.getImage(args.image, processed.pagename)
return processed
end
function Infobox:getDisplay(args, processed)
local display = self:super('getDisplay', args, processed)
local rosterPhoto = h.queryForRosterPhoto(args)
local rosterImage = rosterPhoto and ('[[File:%s|center|320px]]'):format(rosterPhoto)
local tbl = {
title = args.name or processed.pagename,
image = not processed.isLowContent and processed.image,
notice = h.makeNotice(args),
['Org Location'] = args.orgcountry:flair(),
['Team Location'] = args.country:flair(),
FoundedIn = args.foundedcountry:flair(),
Region = args.region:flair(),
Owner = args.owner,
HeadCoach = args.headcoach,
Sponsor = args.sponsor,
Partner = args.partner,
Affiliated = h.getAffiliated(args),
history = h.makeHistory(args),
rosterimage = args.rosterphoto and ('[[File:%s|center|320px]]'):format(args.rosterphoto) or rosterImage,
class = h.getClass(args, processed)
}
return Infobox.mergeDisplay(display, tbl)
end
function h.getAffiliated(args)
if not args.affiliated and not args.academy then
elseif not args.academy then
return m_team.plainlinked(args.affiliated)
elseif not args.affiliated then
return m_team.plainlinked(args.academy)
else
local links = {
m_team.plainlinked(args.affiliated),
m_team.plainlinked(args.academy),
}
return util_table.concat(links, '<br>')
end
end
-- might need to rewrite this to depend on the teamLink variable instead of the actual pagename
function h.getImage(image, pagename)
if image and mw.title.makeTitle('Media', image).exists then
return image
end
local profile = ('%slogo profile.png'):format(pagename)
if mw.title.makeTitle('Media', profile).exists then
return profile
end
local square = ('%slogo square.png'):format(pagename)
if mw.title.makeTitle('Media', square).exists then
return square
end
return NOIMAGE
end
function h.queryForRosterPhoto(args)
if args._isDisbanded then return nil end
if args.suppress_roster_photo then return nil end
local query = {
tables = {
'TeamRedirects=TR',
'TeamRosterPhotos=TP',
'Tournaments=T',
},
join = {
'TR.AllName=TP.Team',
'TP.Tournament=T.OverviewPage',
},
where = h.getRosterPhotoWhere(args),
fields = { 'TP.FileName', 'TP.Hide[boolean]' },
orderBy = 'COALESCE(TP.SortDate, T.DateStartFuzzy, T.Date) DESC',
}
return h.getRosterPhotoIfVisible(util_cargo.getOneRow(query) or {})
end
function h.getRosterPhotoIfVisible(row)
if row.Hide then return nil end
return row.FileName
end
function h.getRosterPhotoWhere(args)
local where = {
('TR._pageName="%s"'):format(mw.title.getCurrentTitle().text),
('TP._pageName IS NOT NULL'),
}
return where
end
function h.makeNotice(args)
if args.isdisbanded then
return 'Team has disbanded.'
elseif args.neworg then
return ('[[%s|Roster has joined a new organization.]]'):format(args.neworg)
elseif args.isrenamed then
return ('[[%s|Team has renamed.]]'):format(args.isrenamed)
elseif args.isinactive then
return 'Team is inactive.'
else
return false
end
end
function h.makeHistory(args)
if not args.created then return false end
local tbl = mw.html.create('table')
:addClass('infobox-subtable')
h.makeHistoryLine(tbl, 'Created', args.created, args.created2 and 1)
h.makeHistoryLine(tbl, 'Disbanded', args.disbanded, args.created2 and 1)
local i = 2
while args['created' .. i] do
h.makeHistoryLine(tbl, 'Created', args['created' .. i], i)
h.makeHistoryLine(tbl, 'Disbanded', args['disbanded' .. i], i)
i = i + 1
end
return tostring(tbl)
end
function h.makeHistoryLine(tbl, label, content, i)
if not content then return end
tbl:tag('tr')
:tag('th')
:addClass('teamdate')
:wikitext(label .. (i and (' (%s)'):format(i) or ''))
:done()
:tag('td')
:wikitext(content)
:done()
:done()
return
end
function h.getClass(args, processed)
local listOfClasses = {
processed.isLowContent and 'infobox-low-content',
}
return util_table.concat(listOfClasses, ' ')
end
function Infobox:getCargo(args, processed)
local cargo = self:super('getCargo', args, processed)
if args._special.nocargo then
return cargo
end
cargo[#cargo+1] = {
'',
_table = 'Teams',
Name = args.name,
OverviewPage = mw.title.getCurrentTitle().text,
Short = m_team.short(mw.title.getCurrentTitle().text),
OrganizationPage = args.organization,
Location = args.orgcountry,
TeamLocation = args.country,
Region = args.region,
Image = args.image,
Twitter = args.twitter,
Website = args.website,
Youtube = args.youtube,
Facebook = args.facebook,
Instagram = args.instagram,
Discord = args.discord,
Snapchat = args.snapchat,
Vk = args.vk,
Subreddit = args.subreddit,
RosterPhoto = args.rosterphoto,
IsDisbanded = args._isDisbanded,
IsLowercase = processed.lc,
RenamedTo = h.renamedTo(args.isrenamed),
}
return cargo
end
function h.renamedTo(isrenamed)
if not isrenamed then return nil end
return m_team.teamlinkname(isrenamed)
end
function Infobox:getVariables(args, processed)
local variables = self:super('getVariables', args, processed)
local tbl = {
suppressorgnavbox = args._special.nonav,
introSentence = h.getIntroSentence(args, processed),
isdisbanded = args.isdisbanded or args.neworg or args.isrenamed or args.isinactive
}
return util_table.merge(variables, tbl)
end
function h.getIntroSentence(args, processed)
local data = mw.clone(args)
data.name = args.name or processed.pagename
return IntroSentence(data)
end
function Infobox:getCategories(args, processed)
local categories = self:super('getCategories', args, processed)
local tbl = {
args.region:exists() and (args.region:get('adjective') .. ' Teams') or 'Teams Without Region In Infobox',
'Teams',
args._isDisbanded and 'Inactive Teams' or 'Active Teams',
args.effective_country:exists() and ('%s Teams'):format(args.effective_country:get('adjective')),
args._special.cat,
}
return util_table.mergeArrays(categories, tbl)
end
return p