July 25, 2020

👭 Knight Challenge #11 👬

Want to try your hand at these challenges? There's a couple of things you can do!
From writing, to research, to images, find your preferred way to contribute with our eleventh theme: Couples!

Latest Announcements

Module:Tab2

From Zelda Wiki, the Zelda encyclopedia
Jump to: navigation, search
LA Grandpa Ulrira Sprite.png
This module has been deprecated.

Please use Module:UtilsLayout#tabs instead.


-- This modules serves as the code for Template:Tab2
local p = {}

local utilsCode = require("Module:UtilsCode")
local utilsTable = require("Module:UtilsTable")

-- Main function
function p.Main(tabs, defaultTab, tabFormat, tabsPerRow, tabsWidth, contentWidth, contentHeight, align)
	
	if utilsCode.IsEmpty(tabsWidth) then
		tabsWidth = "100%"
	end
	
	local result = mw.html.create("div")
	
	-- Create contents and containers depending on the format.
	if (tabFormat == "bottom") then
		result:node(p.GenerateContent(tabs, defaultTab, contentWidth, contentHeight))
		result:node(p.GenerateContainer(tabs, defaultTab, tabFormat, tabsPerRow, tabsWidth, align))
	else
		result:node(p.GenerateContainer(tabs, defaultTab, tabFormat, tabsPerRow, tabsWidth, align))
		result:node(p.GenerateContent(tabs, defaultTab, contentWidth, contentHeight))
	end
	
	return result
end

-- Main function wrapper for template calls
function p._Main(frame)
	local args = frame:getParent().args
	
	-- Defaults
	local defaultTab = 1
	local tabFormat = "top"
	local align = "left"
	
	-- Overriding defaults if providen
	if not (utilsCode.IsEmpty(args["default"])) then
		defaultTab = args["default"]
	end
	if not (utilsCode.IsEmpty(args["format"])) then
		tabFormat = args["format"]
	end
	if not (utilsCode.IsEmpty(args["align"])) then
		align = args["align"]
	end
	
	-- Generates a table of tab-content combinations if both have been provided
	-- values for the same index. (ex: tabs[1] = {"tabName1", {"tabContent1"})
	local tabs = {}
	for key, value in pairs(args) do
		if ((string.match(key, "tab[0-9]+") ~= nil) and (value ~= "")) then
			if not (utilsCode.IsEmpty(args["content" .. string.match(key, "[0-9]+")])) then
				local index = tonumber(string.sub(key, 4))
				tabs[index] = {tabName = value, tabContent = args["content" .. string.match(key, "[0-9]+")]}
			end
		end
	end
	tabs = utilsTable.compact(tabs) -- just in case. e.g. template call specifies tab1= and tab3= but not tab=2
	
	return p.Main(tabs, defaultTab, tabFormat, args["tabsPerRow"], args["tabsWidth"], contentWidth, contentHeight, align)
end

-- Generate containers (tabs).
function p.GenerateContainer(tabs, defaultTab, tabFormat, tabsPerRow, tabsWidth, align)
	local result = mw.html.create("div")
		:addClass("tabcontainer tabcontainer-" .. tabFormat)
	
	if align then
		result:addClass("tabcontainer--"..align)
	end
	
		-- Ordering tabs by keys.
		local orderedKeys = {}
		for key in pairs(tabs) do
			table.insert(orderedKeys, key)
		end
		table.sort(orderedKeys)
		
		for i = 1, #orderedKeys do
			local span = mw.html.create("span")
				:addClass("tab explain")
				:attr("title", tabs[orderedKeys[i]]["tabCaption"])
				:wikitext(tabs[orderedKeys[i]]["tabName"]):done()
			if not utilsCode.IsEmpty(tabsPerRow) then
				span:css{
					["width"] = "calc((" .. tabsWidth .. " / " .. tabsPerRow .. ") - (1px * 2) - (2px * 2) - (3px * 2))",
					["white-space"] = "normal",
				}:done()
			end
				
			if (tostring(defaultTab) == tostring(orderedKeys[i])) then
				span:addClass("active"):done()
			end
			result:node(span)
		end
	return result
end

-- Generate contents.
function p.GenerateContent(tabs, defaultTab, contentWidth, contentHeight)
	local result = mw.html.create("div")
		:addClass("tabcontents")
		:done()
		if not (utilsCode.IsEmpty(contentHeight)) then
			result:addClass("vertical-centered-content")
			:css{
				["min-height"] = contentHeight,
				["height"] = contentHeight
			}:done()
		end
		
		if not (utilsCode.IsEmpty(contentWidth)) then
			result
			:css{
				["min-width"] = contentWidth,
				["width"] = contentWidth
			}:done()
		end
		
		-- Ordering tabs by keys.
		local orderedKeys = {}
		for key in pairs(tabs) do
			table.insert(orderedKeys, key)
		end
		table.sort(orderedKeys)
		
		for i = 1, #orderedKeys do
			local container = mw.html.create("div")
				:addClass("content")
				:wikitext("\n",tabs[orderedKeys[i]]["tabContent"])
				:done()
			if not (utilsCode.IsEmpty(contentHeight)) then
				container:css{
					["height"] = contentHeight
				}:done()
			end
			if not (utilsCode.IsEmpty(contentWidth)) then
				container:css{
					["width"] = contentWidth
				}:done()
			end
			if (tostring(defaultTab) == tostring(orderedKeys[i])) then
				container:addClass("content--active")
			end
			result:node(container):done()
		end
	return result
end

return p