To edit the documentation or categories for this module, click here.
Automated creation of tournament tabs templates without the user needing to use if statements or anything. See {{TournamentTabs}}
for usage.
Dependencies: {{Util}}m
, {{GetEventPageInfo}}m
, {{SubpageSettings}}m
, {{TabsHeader}}m
, {{AutomatedTabs}}m
Eventually {{GetEventPageInfo}}m
should be merged into this but not until it's no longer needed standalone.
local util_args = require('Module:ArgsUtil')
local util_title = require('Module:TitleUtil')
local util_vars = require("Module:VarsUtil")
local settings = require('Module:SubpageSettings').tournaments
local pageinfo = require('Module:GetEventPageInfo')
local tabs = require('Module:AutomatedTabs')
local p = {}
function p.makeArgsIntoTables(args)
local args2 = mw.clone(args) -- since we might have to modify some keys if they are numbers
for key, value in pairs(args2) do
key_str = tostring(key) or key
if not p.doWeSkip(key) then
args[key_str] = mw.text.split(value,'%s*%f[,%%],%s*')
for k, v in ipairs(args[key_str]) do
args[key_str][k] = args[key_str][k]:gsub('%%,',','):gsub('_',' ')
end
end
end
end
function p.doWeSkip(key)
if settings.dontconvert[key] then
return true
end
for k, v in pairs(settings.dontconvert_patterns) do
if string.find(key, v, 1, true) then
return true
end
end
return false
end
-- making json
function p.jsonFromArgs(args)
if util_args.castAsBool(args.oldMD) then
p.oldMD(args)
end
local tbl = {}
p.jsonRecursion(tbl, args, nil)
return tbl
end
function p.oldMD(args)
-- oldMD is an arg to make a shortcut for every Match Details artificially becoming named
-- Match Details & VODs
for _, event in ipairs(args.events) do
args[event .. '_names_Match Details'] = 'Match Details'
end
args['names_Match Details'] = 'Match Details'
args['events_names_Match Details'] = 'Match Details'
return
end
function p.jsonRecursion(tbl, args, path)
-- names are made ready for output now but links are kept in canonical form until output
local thispath = path or 'events'
local links = mw.clone(args[thispath])
p.processLinks(links)
local names = mw.clone(args[thispath .. '_names'] or links)
p.processNames(args, thispath, names, links)
tbl.links = links
tbl.names = names
if not util_args.castAsBool(args[thispath .. '_nooverview']) then
tbl.links[1] = 'Overview'
end
for k, v in ipairs(links) do
local newpath = tabs.newIndex(path, v)
if args[newpath] and not tbl[v] then
tbl[v] = {}
p.jsonRecursion(tbl[v],args,newpath)
end
end
-- if we don't specify if it's specificaly not an overview page
-- then we probably don't want any subpage for the first tab
if not util_args.castAsBool(args[thispath .. '_nooverview']) then
tbl.links[1] = ''
end
tbl.path = thispath -- for maintenance cargo table to be used when automating things
return tbl
end
function p.processLinks(links)
for k, link in ipairs(links) do
links[k] = settings.lookup[mw.ustring.lower(link)] or link
end
return
end
function p.processNames(args, path, names, links)
for key, name in ipairs(names) do
names[key] = args[path .. '_names_' .. links[key]] or settings.names[name] or name
end
return
end
-- make navbox args
function p.getNavboxData(args)
local navboxdata = {}
for i, navbox in ipairs(args.navboxes) do
local tm = args['navbox' .. i .. '_titlematch'] and args['navbox' .. i .. '_titlematch'][1]
navboxdata[i] = {
title = navbox,
args = {},
events = args['navbox' .. i .. '_events'] or ((not tm) and { showAll = true } or {}),
titlematch = tm
}
for k,v in pairs(args['navbox' .. i .. '_keys'] or {}) do
navboxdata[i].args[v] = args['navbox' .. i .. '_values'][k]
end
end
return navboxdata
end
-- link manipulation
function p.linkAdjustments(args)
local tbl = {}
tbl.fr = p.makeFindReplace(args.titlefind, args.titlereplace)
tbl.cd = p.makeCurrentdata(args.currentdata_pages, args.currentdata_values, args.currentdata_force)
return tbl
end
function p.makeFindReplace(find, replace)
-- in case the tournament has different base urls for different sections
if find and replace then
return { find = find, replace = replace }
else
return { find = {}, replace = {} }
end
end
function p.makeCurrentdata(pages, values, force)
-- current data makes a different subpage from the overview focused
-- typically find-replace is ignored when it's trying to replace the first
-- link in a list. but on rare occasions we won't want this, when we're actually
-- tricking it into focusing a different thing in the very first line
-- specifically this may be the case when there's no overview and it start with qualifiers.
-- in this case we can use the currentdata_force argument, which is a list of booleans.
local data = { force = {} }
if not pages or not values then return data end
force = force or {}
for i, page in ipairs(pages) do
data[page] = util_title.concatSubpage(page,values[i])
data.force[page] = util_args.castAsBool(force[i])
end
return data
end
-- main
function p.fromArgs(frame)
local args = util_args.merge()
if not args.basepage then
error('Missing basepage parameter')
end
util_vars.setVar('eventBasePage', args.basepage)
-- process data
if not args.events then args.events = args.Overview end
p.makeArgsIntoTables(args)
local datadiv = pageinfo.getEventPageInfo(frame) -- for vardefines
local data = {
linkadjustments = p.linkAdjustments(args),
navboxdata = args.navboxes and p.getNavboxData(args),
corrdata = args.showCorr and args,
after = nil,
basepage = args.basepage,
tabstype = args.tabstype or 'header'
}
local json = args.events and p.jsonFromArgs(args)
return tabs.main(json, data), datadiv
end
return p