Module:Infobox/tabber: Difference between revisions

From Nguhcraft Wiki
Jump to navigation Jump to search
(tabber test)
 
(I realised MediaWiki typically uses kebab-case)
 
(14 intermediate revisions by the same user not shown)
Line 1: Line 1:
local makeEmptyPartEmptyNoFrame = require("Module:Infobox").makeEmptyPartEmptyNoFrame
local p = {}
local p = {}


p.generateTabber = function(frame)
p.generateTabber = function(frame)
-- Get access to the arguments of the template that called this function
local parentFrame = frame:getParent()
local parentFrame = frame:getParent()
local highestTab = 0
-- Find which number arguments are present
local tabNums = {}
for k, _ in pairs(parentFrame.args) do
for k, _ in pairs(parentFrame.args) do
if type(k) == "number" and k > highestTab then
if type(k) == "number" then
highestTab = k
table.insert(tabNums, k)
end
end
end
end
-- Sort them because order is not guaranteed
-- see https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#frame.args
-- "However, due to how Lua implements table iterators, iterating over
--  arguments will return them in an unspecified order, and there's no way
--  to know the original order as they appear in wikitext."
table.sort(tabNums)
-- Create a string with the text that goes in the <tabber> tag
local tabberStr = ""
local tabberStr = ""
for i = 1, highestTab do
local nonEmptyTabs = {}
if parentFrame.args[i] then
for _, i in ipairs(tabNums) do
tabberStr = tabberStr .. "|-|" .. (parentFrame.args["name" .. i] or i) .. "=<table style=\"width:100%;border-collapse:collapse\">" .. parentFrame.args[i] .. "</table>"
if string.find(makeEmptyPartEmptyNoFrame(parentFrame.args[i]), "%S") then
table.insert(nonEmptyTabs, i)
local tabLabel = parentFrame.args["label" .. i]
-- If no label it just uses the number as a label
if tabLabel then
if not string.find(tabLabel, "%S") then
tabLabel = i
end
else
tabLabel = i
end
tabberStr = tabberStr ..
"|-|" ..
tabLabel ..
"=<table style=\"width:100%;border-collapse:collapse\">" ..
parentFrame.args[i] ..
"</table>"
end
end
end
end
-- If there is only one tab, don't generate tabber unless allow-one-tab=yes
if (not (parentFrame.args["allow-one-tab"] == "yes")) and #nonEmptyTabs == 1 then
if string.find(makeEmptyPartEmptyNoFrame(parentFrame.args[nonEmptyTabs[1]]), "%S") then
return parentFrame.args[nonEmptyTabs[1]]
else
return frame:preprocess("<nowiki />")
end
end
-- Return
if tabberStr == "" then
if tabberStr == "" then
return ""
return frame:preprocess("<nowiki />")
else
else
return "<tr><td colspan=\"2\" style=\"padding:0\">" .. frame:extensionTag("tabber", tabberStr) .. "</td></tr>"
return "<tr><td colspan=\"2\" style=\"padding:0;width:min-content\"><div style=\"width:21.6em\">" .. frame:extensionTag("tabber", tabberStr) .. "</div></td></tr>"
end
end
end
end


return p
return p

Latest revision as of 16:35, 19 December 2024

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

local makeEmptyPartEmptyNoFrame = require("Module:Infobox").makeEmptyPartEmptyNoFrame
local p = {}

p.generateTabber = function(frame)
	-- Get access to the arguments of the template that called this function
	local parentFrame = frame:getParent()
	-- Find which number arguments are present
	local tabNums = {}
	for k, _ in pairs(parentFrame.args) do
		if type(k) == "number" then
			table.insert(tabNums, k)
		end
	end
	-- Sort them because order is not guaranteed
	-- see https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#frame.args
	-- "However, due to how Lua implements table iterators, iterating over
	--  arguments will return them in an unspecified order, and there's no way
	--  to know the original order as they appear in wikitext."
	table.sort(tabNums)
	-- Create a string with the text that goes in the <tabber> tag
	local tabberStr = ""
	local nonEmptyTabs = {}
	for _, i in ipairs(tabNums) do
		if string.find(makeEmptyPartEmptyNoFrame(parentFrame.args[i]), "%S") then
			table.insert(nonEmptyTabs, i)
			local tabLabel = parentFrame.args["label" .. i]
			-- If no label it just uses the number as a label
			if tabLabel then
				if not string.find(tabLabel, "%S") then
					tabLabel = i
				end
			else
				tabLabel = i
			end
			tabberStr = tabberStr ..
				"|-|" ..
				tabLabel ..
				"=<table style=\"width:100%;border-collapse:collapse\">" ..
				parentFrame.args[i] ..
				"</table>"
		end
	end
	-- If there is only one tab, don't generate tabber unless allow-one-tab=yes
	if (not (parentFrame.args["allow-one-tab"] == "yes")) and #nonEmptyTabs == 1 then
		if string.find(makeEmptyPartEmptyNoFrame(parentFrame.args[nonEmptyTabs[1]]), "%S") then
			return parentFrame.args[nonEmptyTabs[1]]
		else
			return frame:preprocess("<nowiki />")
		end
	end
	-- Return
	if tabberStr == "" then
		return frame:preprocess("<nowiki />")
	else
		return "<tr><td colspan=\"2\" style=\"padding:0;width:min-content\"><div style=\"width:21.6em\">" .. frame:extensionTag("tabber", tabberStr) .. "</div></td></tr>"
	end
end

return p