Module:Tabber

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

local p = {}

function p.makeTabber(args)
	local shown = args.shown
	if shown == nil or shown ~= math.floor(shown)
		or shown < 1 or shown > #args
	then shown = 1 end
	local tabber = mw.html.create("div")
		:addClass("rhwiki-tabberneue")
	local menu = tabber:tag("div")
		:addClass("rhwiki-tabberneue-menu")
		:addClass(args["tab-centered"] and "center" or nil)
	local content = tabber:tag("div")
		:addClass("rhwiki-tabberneue-content")
		:addClass(args["content-centered"] and "center" or nil)
	
	for i, tab in ipairs(args) do
		if tab.label == nil or tab.panel == nil then break end
		menu:tag("div")
			:addClass("rhwiki-tabberneue-label")
			:addClass(i == shown and "selected" or nil)
			:wikitext(tab.label)
		content:tag("div")
			:addClass("rhwiki-tabberneue-panel")
			:addClass(i ~= shown and "hidden" or nil)
			:wikitext(tab.panel)
	end

	tabber:wikitext(mw.getCurrentFrame():extensionTag{
		name = "templatestyles",
		args = {src = "Tabber/styles.css"}
	})
	return tostring(tabber)
end

local function nonempty(s)
	return s ~= nil and mw.text.trim(s) ~= ""
end

function p.main(frame)
	local args = {}
	local parentArgs = frame:getParent().args
	local i = 1
	while true do
		local label = parentArgs["tab-" .. i]
		local panel = parentArgs["content-" .. i]
		if label == nil or panel == nil then break end
		args[i] = {label = label, panel = panel}
		i = i + 1
	end
	args.shown = tonumber(parentArgs.shown) or 1
	args["tab-centered"] = nonempty(parentArgs["tab-centered"])
	args["content-centered"] = nonempty(parentArgs["content-centered"])
	return p.makeTabber(args)
end

return p