Halo Esports Wiki

We are currently performing extensive maintenance to this wiki and as a result there will likely be errors. Please be patient while we work to fix all problems.

READ MORE

Halo Esports Wiki
Advertisement

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

local util_args = require('Module:ArgsUtil')
local util_table = require('Module:TableUtil')
local util_vars = require('Module:VarsUtil')
local HTML = {
	name = {
		outer_class = 'tabs',
		outer = 'ul',
		inner = 'li'
	},
	content = {
		outer_class = 'tabs-content',
		outer = 'div',
		inner = 'div'
	}
}

local h = {}

local p = {}

function p.main(frame)
	local args = util_args.merge()
	if not next(args) then return end
	return p._main(args)
end

function p.right(frame)
	local args = util_args.merge()
	if not next(args) then return end
	h.convertRightArgs(args)
	return p._main(args)
end

function p._main(args)
	if args[1] == 'tab' then
		return h.tab(args)
	elseif args[1] == 'end' then
		return h.endTable()
	end
	if not args.content1 then
		return h.start(args)
	end
	local data = h.getDataFromArgs(args)
	--if not next(data[1]) then return end
	return p.constructor(data, this)
end

function p.constructor(data, this, right)
	this = tonumber(this or 1)
	if not next(data) then return end
	local output = h.initOutput()
	if util_args.castAsBool(right) then
		util_table.reverseInPlace(data)
	end
	h.printNames(output, data, this, 'name')
	h.printContent(output, data, this, 'content')
	return output
end

function h.convertRightArgs(args)
	local names = util_args.numberedArgsToTable(args, 'name') or {}
	local contents = util_args.numberedArgsToTable(args, 'content') or {}
	h.readdArgListButBackwards(args, names, 'name')
	h.readdArgListButBackwards(args, contents, 'content')
end

function h.readdArgListButBackwards(args, tbl, key)
	util_table.reverseInPlace(tbl)
	for k, v in ipairs(tbl) do
		if v ~= '' then
			args[key .. k] = v
		end
	end
end

function h.convertThis(args, names)
	if args.This then
		args.This = #names + 1 - tonumber(args.This)
	else
		args.This = 1
	end
end

function h.getDataFromArgs(args)
	local ret = {
		name = util_args.numberedArgsToTable(args, 'name') or {},
		content = util_args.numberedArgsToTable(args, 'content') or {},
	}
	return util_table.interlace(ret)
end

function h.start(args)
	-- if the user inputs {{TD|...}} without any |content= args
	this = tonumber(args.This or 1)
	util_vars.setVar('tdthis', this)
	util_vars.resetGlobalIndex('currentTab')
	local output = mw.html.create()
	local data = h.getDataFromArgs(args)
	local ul = h.printInitSection(output, 'name')
	h.printNamesInner(ul, data, this)
	return '<div class="tabs-dynamic">', output, h.contentIntro()
end

function h.tab(frame)
	-- if the user inputs {{TD|tab}}
	return tostring(h.tabClose()) .. tostring(h.tabOpen())
end

function h.tabClose()
	if util_vars.setGlobalIndex('currentTab') > 1 then
		return '</div>'
	end
	return ''
end

function h.tabOpen()
	local current = util_vars.getGlobalIndex('currentTab')
	local this = util_vars.getVar('tdthis')
	return ('<div class="content%s %s">')
		:format(current, h.thisClass(tonumber(current) == tonumber(this)))
end

function h.thisClass(isthis)
	if isthis then
		return 'active'
	end
	return ''
end

function h.endTable()
	-- if the user inputs {{TD|end}}
	return '</div></div></div>'
end

function h.initOutput()
	local output = mw.html.create('div')
		:addClass('tabs-dynamic')
	return output
end

function h.printContent(output, data, this)
	local ul = h.printInitSection(output, 'content')
	h.printContentInner(ul, data, this)
end

function h.printNames(output, data, this)
	local ul = h.printInitSection(output, 'name')
	h.printNamesInner(ul, data, this)
end

function h.printInitSection(output, contentType)
	return output:tag(HTML[contentType].outer)
		:addClass(HTML[contentType].outer_class)
end

function h.printContentInner(ul, data, this)
	for i, row in ipairs(data) do
		local li = ul:tag('div')
			:wikitext('\n', mw.getCurrentFrame():preprocess(row.content or ''), '\n')
			:addClass('content' .. i)
		if i == this then
			li:addClass('active')
		end
	end
end

function h.printNamesInner(ul, data, this)
	for i, row in ipairs(data) do
		local li = ul:tag('li')
			:wikitext(mw.getCurrentFrame():preprocess(row.name or ''))
			:addClass('content' .. i)
		if i == this then
			li:addClass('active')
		end
	end
end

function h.contentIntro()
	return '<div class="tabs-content">'
end

return p
Advertisement