This wiki is still in active development, many areas of the site are unstable or broken.

In the meantime, consider adding content to pages you like!

Module:Tab

From NBITTRPG Wiki

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

local p = {}
local getArgs = require('Module:Arguments').getArgs;

local function escape_group(group)
	if not group then
		return group;
	end
	return group:gsub("[ -\"\\]", "_");
end

local function make_style_class(class)
	return class and (" tab-" .. class) or " tab-default-style";
end

function p.tab_list(button_labels, group, options)
	options = options or {};
	group = escape_group(group);
	local class = make_style_class(options['class']);
	local container = mw.html.create('div')
		:addClass('tab-button-container')
		:addClass(class)
		:attr('data-group', group);
	for i, button_label in pairs(button_labels) do
		local classes = {"tab-button"};
		if i == 1 then
			table.insert(classes, "tab-button-selected");
		end
		local class = options[string.format("button-class%d", i)] or "";
		if class ~= "" then
			table.insert(classes, class);
		end
		container:tag('div')
			:addClass(table.concat(classes, " "))
			:wikitext(button_label)
	end
	return container;
end

function p.panel_list(panels, group, options)
	options = options or {};
	group = escape_group(group);
	local class = make_style_class(options['class']);
	local container = mw.html.create('div')
		:addClass('tab-panel-container')
		:addClass(class)
		:attr('data-group', group);
	for i, panel in ipairs(panels) do
		local panelClass = "tab-panel" .. (i ~= 1 and " tab-panel-hidden" or "");
		panelClass = panelClass .. " " .. (options[string.format("panel-class%d", i)] or "")
		container:tag('div')
			:addClass(panelClass)
			:wikitext("\n" .. tostring(panel));
	end
	return container;
end

-- backward compatibility on Strinova Wiki
p.tabs = p.tab_list;
p.content = p.panel_list;

function p.style(frame)
	return frame:extensionTag( 'templatestyles', '', { src = 'Module:Tab/styles.css' } );
end

function get_positional_args(args)
	local p_args = {}
	for _, value in ipairs(args) do
		table.insert(p_args, value);
	end
	return p_args;
end

function p.__tab_list(frame)
	local args = getArgs(frame, {parentFirst = true});
	local group = args['group'] or "defaultgroup";
	local p_args = get_positional_args(args);
	return tostring(p.tab_list(p_args, group, args)) .. p.style(frame);
end

function p.__panel_list(frame)
	local args = getArgs(frame, {parentFirst = true});
	local group = args['group'] or "defaultgroup";
	local p_args = get_positional_args(args);
	return tostring(p.panel_list(p_args, group, args)) .. p.style(frame);
end

function p.main(frame)
	local args = getArgs(frame, {parentFirst = true});
	local tab_type = args['type'] or "";
	if tab_type == "tabs" or tab_type == "labels" or tab_type == "buttons" then
		return p.__tab_list(frame);
	elseif tab_type == "content" or tab_type == "panels" then
		return p.__panel_list(frame);
	end
	local tabs = {};
	local panels = {};
	for i, v in ipairs(args) do
		if i % 2 == 1 then
			table.insert(tabs, v);
		else
			table.insert(panels, v);
		end
	end
	if #tabs ~= #panels then
		table.insert(panels, "")
	end
	local group = args['group'] or nil;
	tabsObj = p.tab_list(tabs, group, args);
	panelsObj = p.panel_list(panels, group, args);
	local class = make_style_class(args['class']);
	local container = mw.html.create('div')
		:addClass("tab-group-container" .. class)
		:attr('data-group', group)
		
	container:node(tabsObj)
	container:node(panelsObj)
	
	container:wikitext(p.style(frame))

	return tostring(container)
end

return p