Halo Esports Wiki
Advertisement

Documentation for this module may be created at Module:DisambigPage/doc

local util_args = require('Module:ArgsUtil')
local util_cargo = require('Module:CargoUtil')
local util_esports = require("Module:EsportsUtil")
local util_map = require('Module:MapUtil')
local util_sentence = require("Module:SentenceUtil")
local util_table = require('Module:TableUtil')
local util_text = require("Module:TextUtil")
local i18n = require('Module:i18nUtil')

local m_team = require('Module:Team')
local Country = require('Module:Country')
local Region = require('Module:Region')
local Role = require('Module:Role')
local util_vars = require('Module:VarsUtil')

local lang = mw.getLanguage('en')

local ORDER = {
	'players',
	'teams',
	'other'
}

local TITLE
local CARGO_INDEX = 0

local h = {}

local p = {}
function p.main(frame)
	local args = util_args.merge()
	i18n.init('DisambigPage')
	h.setTitle(args)
	
	local sections = {
		intro = i18n.print('DisambigPage', mw.site.siteName),
		players = h.getAndStorePlayerData(args),
		teams = h.getAndStoreTeamData(args),
		other = util_args.numberedArgsToTable(args, 'other'),
	}
	return h.makeOutput(sections)
end

function h.setTitle(args)
	-- strip out (Disambiguation) text if needed
	if args.title then
		TITLE = args.title
		return
	end
	TITLE = mw.title.getCurrentTitle().text:gsub(' %(Disambiguation%)', '')
end

-- players
function h.getAndStorePlayerData(args)
	local tbl = util_args.numberedArgsToTable(args, 'player')
	if not tbl then return nil end
	util_map.arrayInPlaceWithIndex(tbl, h.getPlayerData, args)
	h.storeCargo(tbl, 'Player')
	return util_map.inPlace(tbl, h.makePlayerLine)
end

function h.getPlayerData(player, i, args)
	if mw.title.makeTitle('', player).exists then
		return h.getPlayerDataFromCargo(player)
	end
	return h.getPlayerDataFromArgs(args, i)
end

function h.getPlayerDataFromCargo(player)
	local row = util_cargo.getOneRow(h.makePlayerQuery(player)) or {}
	if not row._pageName then
		row.isNil = true
	end
	row.IsFormer = not row.Team
	row.Team = row.Team or row.TeamLast
	row.CurrentName = row._pageName ~= lang:ucfirst(player) and row._pageName
	row.Name = player
	return row
end

function h.makePlayerQuery(player)
	return {
		tables = 'Players, PlayerRedirects=PR',
		join = 'Players._pageName=PR._pageName',
		fields = {
			"Players.Residency [region]",
		    "Players.Team",
		    "Players.TeamLast",
		    "Players.RoleLast",
		    "Players.Country [country]",
		    "Players.IsSubstitute [boolean]",
		    "Players.IsLowercase [boolean]",
		    "Players._pageName",
		},
		groupBy = 'Players._pageName',
		where = ('PR.AllName = "%s"'):format(player),
	}
end

function h.getPlayerDataFromArgs(args, i)
	local index = 'player' .. i
	local row = {
		Name = args[index],
		Residency = Region(args[index .. 'res']),
		Country = Country(args[index .. 'country']),
		Team = args[index .. 'team'],
		RoleLast = args[index .. 'role'],
		IsSubstitute = util_cargo.strToBool(args[index .. 'isSubstitute']),
		IsFormer = util_cargo.strToBool(args[index .. 'isFormer']),
		CurrentName = args[index .. 'currentName'],
		_pageName = args[index],
	}
	return row
end

function h.makePlayerLine(row)
	if row.isNil then
		return util_sentence.makeReplacements(
			i18n.default('selfPagePlayer'),
			{ LINK = util_text.intLinkOrText(row.Name) }
		)
	end
	local replacements = {
		RESIDENCY = row.Residency:image() or '',
		LINK = util_text.intLinkOrText(row.Name),
		NATIONALITY = row.Country:get('adjective') or '',
		FORMER = row.IsFormer and i18n.default('former') or '',
		ROLE = Role(row.RoleLast, { sub = row.IsSubstitute }):sentence(),
		TEAM = m_team.rightmediumlinked(row.Team),
		NOW_KNOWN_AS = row.CurrentName and i18n.default('nowKnownAs', row.CurrentName) or '',
	}
	return util_sentence.makeReplacements(i18n.default('sentencePlayer'), replacements)
end

function h.pageExistsField(name)
	return mw.title.new(name, '').exists
end

function h.storeCargo(tbl, tableType)
	util_map.rowsInPlace(tbl, h.storeOneCargoRow, tableType)
end

function h.storeOneCargoRow(row, tableType)
	CARGO_INDEX = CARGO_INDEX + 1
	util_cargo.store(h.getGeneralCargoData(row, tableType))
end

function h.getGeneralCargoData(row, disambigType)
	local data = {
		_table = 'Disambiguations',
		FinalLocation = row._pageName,
		Term = TITLE,
		DisambigType = disambigType,
		N_LineInPage = CARGO_INDEX,
		DisambigID = h.getDisambigId(),
	}
	return data
end

function h.getDisambigId()
	return ('%s_%s'):format(mw.title.getCurrentTitle().text, CARGO_INDEX)
end

-- teams
function h.getAndStoreTeamData(args)
	local tbl = util_args.numberedArgsToTable(args, 'team')
	if not tbl then return nil end
	util_map.arrayInPlaceWithIndex(tbl, h.getTeamData, args)
	h.storeCargo(tbl, 'Team')
	return util_map.inPlace(tbl, h.makeTeamLine)
end

function h.getTeamData(team, i, args)
	if mw.title.makeTitle('', team).exists then
		return h.getTeamDataFromCargo(team, args['team' .. i .. 'freetext'])
	end
	return h.getTeamDataFromArgs(args, i)
end

function h.getTeamDataFromCargo(team, freetext)
	local row = util_cargo.getOneRow(h.makeTeamQuery(team)) or {}
	row.freetext = freetext
	return row
end

function h.makeTeamQuery(team)
	local fields = {
		'Region [region]',
		'_pageName',
		'COALESCE(TeamLocation,Location)=Location [country]',
		'IsDisbanded [boolean]',
		'IsLowercase [boolean]',
	}
	return {
		tables = 'Teams',
		fields = fields,
		where = ('_pageName="%s"'):format(team),
		groupBy = '_pageName',
	}
end

function h.getTeamDataFromArgs(args, i)
	local index = 'team' .. i
	local row = {
		Region = Region(args[index .. 'region']),
		Location = Country(args[index .. 'location']),
		IsDisbanded = util_cargo.strToBool(args[index .. 'isDisbanded']),
		_pageName = args[index],
		freetext = args[index .. 'freetext'],
	}
	return row
end

function h.makeTeamLine(row)
	local replacements = {
		REGION = row.Region:image(),
		LINK = util_text.intLinkOrText(h.getCasedLink(row._pageName, row.IsLowercase)),
		DISBANDED = row.IsDisbanded and i18n.default('disbanded') or '',
		COUNTRY = row.Location:get('adjective') or '',
		END = h.getTeamLineEnd(row),
	}
	return util_sentence.makeReplacements(i18n.default('sentenceTeam'), replacements)
end

function h.getCasedLink(link, isLowercase)
	if not isLowercase then return link end
	return util_text.lcfirst(link)
end

function h.getTeamLineEnd(row)
	if not row.IsDisbanded and not row.Location then
		return row.freetext or ''
	end
	return i18n.default('teamEndDefault')
end

-- output
function h.makeOutput(sections)
	local output = mw.html.create()
	output:wikitext(sections.intro)
	h.printLists(output, sections)
	return output
end

function h.printLists(output, sections)
	notfirst = false
	for _, v in ipairs(ORDER) do
		h.printOneList(output, sections[v], v, notfirst)
		notfirst = true
	end
end

function h.printOneList(output, sectionData, sectionName, notfirst)
	if not sectionData or not next(sectionData) then return end
	output:wikitext(h.getIntro(sectionName, notfirst))
	local ul = output:tag('ul')
	util_map.inPlace(sectionData, h.printOneListItems, ul)
end

function h.getIntro(sectionName, notfirst)
	return i18n.print(
		'intro_' .. sectionName,
		TITLE,
		i18n.print(notfirst and 'also_refer' or 'refer')
	)
end

function h.printOneListItems(line, ul)
	ul:tag('li'):wikitext(line)
end

return p
Advertisement