Halo Esports Wiki
Register
Advertisement
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

To edit the documentation or categories for this module, click here.


local util_map = require("Module:MapUtil")
local util_table = require('Module:TableUtil')
local util_text = require('Module:TextUtil')
local util_title = require('Module:TitleUtil')
local TabsHeader = require('Module:TabsHeader')
local TabsTitle = require('Module:TabsTitle')
local corr = require('Module:CorrespondingPageBox').makeBox
local sep = '%s*;%s*'

local p = {}
function p.main(json, data)
	local frame = mw.getCurrentFrame()
	p.getReverseFR(data.linkadjustments)
	local title = p.getCanonicalTitle(data.linkadjustments, data.basepage)
	local thisevent, thispath, tabstable = p.whereAreWe(json, title, data.basepage)
	
	local text = {}
	if data.navboxdata then p.makeNavboxes(frame, text, data.navboxdata, thisevent, title) end
	n = #text + 2
	if json then
		p.makeTabs(text, tabstable, data.linkadjustments, data.tabstype)
	end
	if data.corrdata then table.insert(text, n, p.makeCorrBox(data.corrdata, title)) end
	if data.after then text[#text+1] = data.after end
	local output = table.concat(text,'')
	return output
end

function p.getReverseFR(linkadjustments)
	-- this function lets us have two consecutive lookups in the find-replace
	-- that apply to the same title. otherwise one of the lookups would not get done properly
	-- we'll use the reversed args when we get canonical title, original order when we do
	-- the replacements back to live title
	if not linkadjustments then return end
	linkadjustments.fr_reverse = {
		replace = util_table.reverse(linkadjustments.fr.find),
		find = util_table.reverse(linkadjustments.fr.replace)
	}
	return
end

-- making parts of the page
function p.getCanonicalTitle(linkadjustments, basepage)
	local title = mw.title.getCurrentTitle()
	titlestr = title.nsText == 'Template' and basepage or title.prefixedText
	if not linkadjustments then
		return titlestr
	end
	return p.findReplace(titlestr, linkadjustments.fr_reverse)
end

function p.makeNavboxes(frame, text, data, thisevent, title)
	for i, navboxdata in ipairs(data) do
		if navboxdata.events.showAll or util_table.keyOf(navboxdata.events or {}, thisevent) or (navboxdata.titlematch and title:find(navboxdata.titlematch, 1, true)) then
			text[#text+1] = frame:expandTemplate({
				title = navboxdata.title,
				args = navboxdata.args
			})
		end
	end
	return
end

function p.makeCorrBox(args, title)
	local i = tonumber(args.showCorr) or p.getPageMatch(args.corr_titlematch,title,1)
	if not i or p.getPageMatch(args.corr_notitlematch and mw.text.split(args.corr_notitlematch[i] or '',sep), title) then
		return ''
	end
	return corr({
		find = mw.text.split(args.corr_find[i] or '',sep),
		replace = mw.text.split(args.corr_replace[i] or '',sep),
		display = args.corr_display and mw.text.split(args.corr_display[i] or '',sep),
		tournament = args.corr_tournament and mw.text.split(args.corr_tournament[i] or '',sep),
		targetpage = args.targetpage,
	})
end

function p.getPageMatch(matches, title, default)
	if not matches then return default end
	for k, v in ipairs(matches) do
		if v ~= '' and string.find(title,v,1,true) then
			return k
		end
	end
	return nil -- this is actually supposed to be nil, not default. default only applies when matches is nil.
end

function p.makeTabs(text, tabstable, linkadjustments, tabstype)
	local Tabs = tabstype == 'title' and TabsTitle or TabsHeader
	for k, v in ipairs(tabstable) do
		p.linksToOutput(v.links, linkadjustments)
		text[#text+1] = Tabs.fromTables(v.names, v.links, v.this)
	end
	return
end

function p.linksToOutput(links, linkadjustments)
	if not linkadjustments then return end
	for k, link in ipairs(links or {}) do
		links[k] = p.linkToOutput(link, linkadjustments.fr, linkadjustments.cd, k)
	end
	return
end

function p.linkToOutput(link, fr, cd, k)
	-- allow editors to give currentdata using either actual title or canonical title
	-- in the unlikely case that there's a cd entry for both canonical & actual
	-- we wouldn't want to change it twice. so make sure we didn't already change it when
	-- we do the second replacement. first replacement will be canonical, second is actual.
	-- the "proper" way to do this would be only replace canonical but this might be confusing.
	local used_cd
	if k ~= 1 and cd[link] then
		link = cd[link]
		used_cd = true
	end
	link = p.findReplace(link, fr)
	link = ((cd.force and cd.force[link]) or k~= 1) and not used_cd and cd[link] or link
	return link
end

-- where are we
function p.whereAreWe(json, titlestr, basepagestr)
	local title = mw.text.split(titlestr,'/')
	local basepage = mw.text.split(basepagestr,'/')
	local tbl = {}
	local i = #basepage + 1
	local thisevent = title[i] or 'Overview'
	local t = json
	local j = 1
	local thispath = ''
	while t do
		tbl[j] = {
			links = p.constructLinks(t.links,basepagestr),
			names = t.names,
			this = util_table.keyOf(t.links, title[i]) or 1
		}
		basepagestr = util_title.concatSubpage(basepagestr,t.links[tbl[j].this])
		thispath = t.path
		if t[title[i]] then
			t = t[title[i]]
			i = i + 1
		elseif tbl[j].this == 1 then
			t = t['Overview']
		else
			t = nil
		end
		j = j + 1
	end
	return thisevent, thispath, tbl
end

function p.constructLinks(links,path)
	local tbl = {}
	for i, link in ipairs(links) do
		tbl[i] = util_title.concatSubpage(path, link)
	end
	return tbl
end

-- Processing utils
function p.newIndex(base, extension)
	-- concatenate the two but don't add a / if the 2nd argument is empty
	if not base and extension == 'Overview' then
		return 'events/Overview'
	elseif not base or base == '' or base == 'events' then
		return extension
	elseif extension == '' or not extension then
		return base
	else
		return base .. '/' .. extension
	end
end

function p.findReplace(link, fr)
	local find = fr.find
	local replace = fr.replace
	for k, v in ipairs(find) do
		link = string.gsub(link, util_text.escape(v), util_text.escape(replace[k]))
	end
	return link
end

return p
Advertisement