Leaguepedia | League of Legends Esports Wiki
Advertisement

Edit the documentation or categories for this module.


local tabs = require('Module:AutomatedTabs').main
local util = require('Module:Util')
local util_cargo = require('Module:CargoUtil')
local util_form = require('Module:FormUtil')
local p = {}

function p.getPageList(frame, title, fulltitle)
	local pages = frame:callParserFunction{name = '#dpl', args = {
		'',
		titleregexp = '^' .. util.dplEscape(title) .. '/.*',
		format = ',%PAGE%,;,',
		namespace = '',
		debug = 0,
	}}
	if pages == '' and title == fulltitle then return nil end
	pages = pages .. fulltitle
	local pgtbl = mw.text.split(pages,';')
	p.processPageTable(pgtbl)
	return pgtbl
end

function p.processPageTable(pgtbl)
	for k, v in ipairs(pgtbl) do
		if not k or k == '' then
			table.remove(pgtbl,k)
		else
			pgtbl[k] = mw.text.split(v,'/')
			table.remove(pgtbl[k],1) -- get rid of the base page
		end
	end
	return
end

function p.jsonFromPages(pages, tabstype)
	local data = mw.loadData('Module:SubpageSettings')[tabstype]
	local json = { links = { 'Overview' } }
	p.jsonLoop(json, pages)
	p.processJsonRecursion(json, data.lookup, data.order, '')
	return json
end

function p.jsonLoop(json, pages)
	while #pages > 0 do
		local page = table.remove(pages,1)
		p.pageRecursion(json, page)
	end
	return
end

function p.pageRecursion(json, page)
	if not page or #page == 0 then
		return
	end
	titlepart = table.remove(page, 1)
	if #page > 0 then
		if not json[titlepart] then
			json[titlepart] = { links = { 'Overview' } }
		end
		p.pageRecursion(json[titlepart],page)
	elseif #page == 0 then
		json.links[#json.links+1] = titlepart
	end
	return
end

function p.processJsonRecursion(json, lookup, order, index)
	table.sort(json.links, function (a,b)
			return (util.keyOf(order,a) or 0) < (util.keyOf(order,b) or 0)
		end
	)
	json.names = {}
	for k, link in ipairs(json.links) do
		json.names[k] = lookup[index .. link] or link
	end
	for k, v in pairs(json) do
		if v.links then
			p.processJsonRecursion(v, lookup, order[k] or {}, k)
		end
	end
	return
end

function p.linkAdjustments(json, title)
	local tbl = { fr = { find = {}, replace = {} }, cd = {} }
	if json.Statistics and json.Statistics.links then
		tbl.cd[title .. '/Statistics'] = title .. '/Statistics/' .. json.Statistics.links[#json.Statistics.links]
	end
	return tbl
end

-- navbox stuff
function p.navboxArgs(tabstype, title)
	if tabstype == 'Champion' or tabstype == 'Item' then
		return nil
	end
	local team = (tabstype == 'Team') and title or p.getTeamFromPlayer(title)
	local orgnavbox = p.orgNavboxArgs(team)
	local navboxes = { orgnavbox }
	if tabstype == 'Team' then
		table.insert(navboxes,1,p.cplnArgs(team))
	end
	return p.doWeMakeNavbox(orgnavbox.args) and navboxes
end

function p.orgNavboxArgs(team)
	return {
		title = 'OrgNavbox',
		events = { showAll = true },
		args = { team, suffix = 'Yes' },
	}
end

function p.cplnArgs(team)
	return {
		title = 'CurrentLeagueParticipantNavbox',
		events = { showAll = true },
		args = { team, suffix = 'Yes' },
	}
end

function p.doWeMakeNavbox(n_args)
	local team = n_args[1]
	if not team then return nil end
	local teamtitle = mw.title.makeTitle('', team)
	if not teamtitle.exists then return nil end
	local result = mw.ext.cargo.query(
		'InfoboxTeam',
		'IsDisbanded',
		{ where = string.format('_pageName="%s"',team) }
	)
	return util_cargo.getOnlyResult(result,'IsDisbanded') == 'No'
end

function p.getTeamFromPlayer(title)
	local result = mw.ext.cargo.query('InfoboxPlayer','Team', {
		where = '_pageName="' .. title .. '"'
	})
	return util_cargo.getOnlyResult(result, 'Team')
end

function p.after(frame, fulltitle, tabstype)
	local titletbl = mw.text.split(fulltitle, '/')
	local text = {}
	if tabstype == 'Player' then
		p.after_player(text, frame, titletbl)
	elseif tabstype == 'Team' then
		p.after_team(text, frame, titletbl)
	end
	if not mw.title.makeTitle('',titletbl[1]).exists then
		text[#text+1] = '[[Category:Player Secondary Pages Without Primary Pages]]'
	end
	local output = table.concat(text)
	return output
end

function p.after_player(text, frame, titletbl)
	if titletbl[2] == 'Statistics' and titletbl[3] then
		text[#text+1] = p.playerConcept(titletbl) or ''
	end
	if titletbl[2] then
		if p.doWeLowercase('InfoboxPlayer', titletbl[1]) == 'Yes' then
			text[#text+1] = frame:expandTemplate({ title = 'lowercase' })
		end
	end
	return
end

function p.playerConcept(titletbl)
	local player = titletbl[1]
	local year = titletbl[3]
	local concept = mw.title.makeTitle('Concept', player .. '/Games')
	if not concept.exists then
		return nil
	end
	local formlink = util_form.makeBaseQueryURL('CareerPlayerStats', 'CPS', { 'player', 'year'}, { player, year })
	return string.format("\n:''To see all stats for %s not separated by tournament, <span class=\"plainlinks\">[%s Click Here]</span>.",
		year,
		formlink.full
		)
end

function p.after_team(text, frame, titletbl)
	if titletbl[2] then
		if p.doWeLowercase('InfoboxTeam', titletbl[1]) == 'Yes' then
			text[#text+1] = frame:expandTemplate({ title = 'lowercase' })
		end
	end
	return
end

function p.doWeLowercase(tbl, title)
	local result = mw.ext.cargo.query(tbl, 'IsLowercase', {
		where = string.format('_pageName="%s"',title),
		groupBy = '_pageName',
	})
	return util_cargo.getOnlyResult(result,'IsLowercase')
end

function p.main(frame)
	if frame == mw.getCurrentFrame() then
		args = require('Module:ProcessArgs').merge(true)
	else
		frame = mw.getCurrentFrame()
	end
	local tabstype = args[1] or 'Player'
	local title_obj = mw.title.getCurrentTitle()
	local fulltitle = title_obj.prefixedText
	local title = tostring(title_obj.rootPageTitle)
	local pages = p.getPageList(frame, title, fulltitle)
	frame:callParserFunction{name='#vardefine:page1',args=pages and pages[1]}
	local json = pages and p.jsonFromPages(pages, tabstype)
	local linkadjustments = json and p.linkAdjustments(json, title)
	local navbox = (args.nonavbox ~= 'Yes') and p.navboxArgs(tabstype, title)
	local after = p.after(frame, fulltitle,tabstype)
	return tabs(json, linkadjustments, navbox, nil, title, after)
end
return p
Advertisement