Fortnite Esports Wiki
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.

Edit the documentation or categories for this module.


local util = require('Module:Util')
local util_args = require('Module:ArgsUtil')
local util_dpl = require('Module:DPLUtil')
local util_table = require('Module:TableUtil')
local util_title = require('Module:TitleUtil')

local tabs = require('Module:AutomatedTabs').main
local Navbox = require('Module:SubpageNavbox').navbox
local After = require('Module:SubpageAfter').after

--[[ json structure:
	{
		links = a, b, c, d,
		names = ,
		a = { links = , names = }, b = { links = , names = }
		names table is added only after construction of links table
		construction is recursive
	}
]]
local p = {}

function p.getPageList(frame, title, fulltitle, title_obj)
	local pages = frame:callParserFunction{name = '#dpl', args = {
		'',
		titleregexp = '^' .. util_dpl.escape(title_obj.rootText) .. '/.*',
		format = ',%PAGE%,;,',
		namespace = title_obj.nsText,
		debug = 0,
		notuses = 'Template:NoDPLTabs',
		skipthispage = 'no'
	}}
	if pages == '' and title == fulltitle then return nil end
	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.processJson(json, data.lookup, data.order, '')
	return json
end

function p.jsonLoop(json, pages)
	-- go through all of the pages from our dpl list, and for each page add its data to the json
	while #pages > 0 do
		local page = table.remove(pages,1)
		p.pageRecursion(json, page)
		p.addMissingPages(json)
	end
	return
end

function p.pageRecursion(json, page)
	-- the page should always exist, but when we reach the end of our recursion for this one page, #page will be 0
	if not page or #page == 0 then
		return
	end
	-- pull out the first titlepart of the page, and the rest of the page will be dealt with later when we call this again
	titlepart = table.remove(page, 1)
	if #page > 0 then
		-- if we dont have an entry at this level yet
		if not json[titlepart] then
			-- assume the 1st thing is going to be called Overview
			json[titlepart] = { links = { 'Overview' } }
		end
		-- recursion
		-- json[titlepart] is one step later, and page has been truncated
		p.pageRecursion(json[titlepart],page)
	elseif #page == 0 then
		-- if we are on the very last part of the page then just append the current page to the list
		json.links[#json.links+1] = titlepart
	end
	return
end

function p.addMissingPages(json)
	-- if there's no overview for statistics for example, we still want to print the stats
	for k, v in pairs(json) do
		-- actually pretty sure everything in the json is a table but we'll just double check to avoid errors
		-- want to skip this for links obviously
		if type(v) == 'table' and k ~= 'links' then
			if not util_table.keyOf(json.links, k) then
				-- k is the set of sub-subpages, so if there's no subpage of this then we want to add it
				json.links[#json.links+1] = k
				-- also in this case that means there's no overview. because we made an overview by default
				-- we now need to remove it from the list of sub-subpages
				if v.links[1] then
					table.remove(v.links,1)
				end
			end
			p.addMissingPages(v)
		end
	end
end

function p.processJson(json, lookup, order, index)
	p.processJsonLinks(json, order)
	-- add the name list
	json.names = {}
	for k, link in ipairs(json.links) do
		json.names[k] = lookup[index .. link] or link
	end
	-- recursion
	for k, v in pairs(json) do
		if v.links then
			p.processJson(v, lookup, order[k] or {}, k)
		end
	end
	return
end

function p.processJsonLinks(json, order)
	-- we already added the missing links in p.addMissingPages, so no need to do that again here
	
	-- sort links
	util_table.sortByKeyOrder(json.links, order)
	
	-- remove overview if we don't have an overview, since json creation automatically adds one
	-- but actually we may have already removed the overview in the event that the page doesn't exist period
	-- but if the page exists & we don't want it to be here, then we will remove it now
	-- this code means that you may want to specify both Overview as being the first element of your
	-- page order array in SubpageTabs and also have nooverview=true in the same line
	if order.nooverview and json.links[1] == 'Overview' then
		table.remove(json.links,1)
	end
	return
end

function p.linkAdjustments(json, title, tabstype)
	local tbl = { fr = { find = {}, replace = {} }, cd = {} }
	local data = mw.loadData('Module:SubpageSettings')[tabstype].order
	p.linkAdjustmentsRecursion(json, title, data, tbl)
	return tbl
end

function p.linkAdjustmentsRecursion(json, title, data, tbl)
	for _, v in ipairs(json.links) do
		if json[v] and json[v].links and data[v] then
			local lr = data[v .. '_linkrecent']
			if lr then
				new_title = util_title.concatSubpage(title, v)
				-- optionally can define _linkrecent=true to just show the last one
				-- or can specify a specific tab to show as a string
				-- we'll pick what to focus depending
				local focused = type(lr) == 'string' and lr or json[v].links[#json[v].links]
				tbl.cd[new_title] = util_title.concatSubpage(new_title, focused)
			end
			p.linkAdjustmentsRecursion(json[v], new_title, data[v], tbl)
		end
	end
	return
end

function p.main(frame)
	local args = util_args.merge(true)
	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, title_obj)
	local json = pages and p.jsonFromPages(pages, tabstype)
	local data = {
		linkadjustments = json and json.links and p.linkAdjustments(json, title, tabstype),
		navboxdata = (args.nonavbox ~= 'Yes') and Navbox(tabstype, title),
		after = title_obj.namespace == 0 and After(frame, fulltitle,tabstype),
		basepage = title,
		tabstype = args.tabstype or 'header'
	}
	return tabs(json, data)
end
return p
Advertisement