Module:Navbox

From Xenharmonic Wiki
Revision as of 07:11, 23 November 2024 by Ganaram inukshuk (talk | contribs)
Jump to navigation Jump to search
Module documentation[view] [edit] [history] [purge]
Note: While this module should not be invoked directly, the use of its corresponding template (Template:Navbox) is not absolutely necessary.

On other templates that use or generate navigation boxes, you can call _navbox (note the underscore in front). The navbox function (without the underscore) is used by Template:Navbox as a wrapper.

On other modules, you can include local navbox = require("Module:Navbox")._navbox at or near the top.

This template allows a navigation box to be set up relatively quickly by supplying it with one or more lists of links. It comes equipped with default styles that should work for most navigational templates. Changing the default styles is possible, but not recommended. The default styling for our navigation boxes is modelled off of RuneScape Wiki's navigation box, instead of Wikipedia's.

See also


-- Page is following provisonal style guide: User:Ganaram_inukshuk/Provisional_style_guide_for_Lua
-- Loosely modeled off of Runescape Wiki's navbox, not Wikipedia's
local getArgs = require('Module:Arguments').getArgs
local p = {}

-- Navbox row
-- A single table representing the row is entered, where:
-- - If it has one entry, then it's for a headerless row
-- - If it has two entry, then it's a header-data pair; if the second entry
--   is another jagged array, then the data is a subtable
function p.navbox_row(row_content)
	local row_content = row_content or { "Header", {{"Subheadher 1", "Content 1"}, {"Subheader 2", "Content 2"}}}
	
	local row = '<tr>\n'
	if #row_content == 1 then
		-- Headerless row
		row = row
			.. '<td style="width:5%; text-align:center; background-color:#eaecf0; white-space:nowrap; padding:0em; border:1px solid white" colspan="2">\n'
        	.. '<div style="padding:0.25em 0.5em">' .. row[1] .. '</div>\n'
    		.. '</td>\n'
	elseif #row_content == 2 then
		if type(row_content[2]) == "table" then
			-- Row with subcategories
			row = row
				.. '<th style="width:5%; text-align:right; background-color:#eaecf0; white-space:nowrap; padding:0.25em 0.5em; border:1px solid white">' .. row_content[1] .. '</th>\n'
				.. '<td style="padding:0em">\n'
				.. p.navbox_subtable(row_content[2])
				.. '</td>\n'
		else
			-- Simple row with header and data
			row = row
				.. '<th style="width:5%; text-align:right; background-color:#eaecf0; white-space:nowrap; padding:0.25em 0.5em; border:1px solid white">' .. row_content[1] .. '</th>\n'
				.. '<td style="padding:0em">\n'
				.. '<div style="padding:0.25em 0.5em">' .. row_content[2] .. '</div>\n'
				.. '</td>\n'
		end
	end
	local row = row .. '</tr>\n'
	
	return row
end

-- Navbox subtable
function p.navbox_subtable(subtable_content)
	local subtable_content = subtable_content or {{"Subheadher 1", "Content 1"}, {"Subheader 2", "Content 2"}}
	
	local subtable = '<table style="width:100%; border-spacing:0px"\n'
	for i = 1, #subtable_content do
		subtable = subtable
			.. p.navbox_row(subtable_content[i])
	end
	subtable = subtable .. '</table>\n'

	return subtable
end

-- Navbox to be called by other modules
-- Rows are entered as a jagged array; one subtable per row
function p._navbox(title, rows, is_collapsed)
	local title = title or "Navbox Title"
	local rows = rows or {{"Header", {{"Subheadher 1", "Content 1"}, {"Subheader 2", "Content 2"}}}}
	local is_collapsed = is_collapsed or true
	
	-- Start of table
	local navbox = '<div class="wikitable">'
		.. '<table class="mw-collapsible' .. (is_collapsed and ' mw-collapsed ' or ' ') .. 'nowraplinks" style="width: 100%; border-spacing:0px">\n'
		.. '<tr>\n'
		.. '<th style="width:5%; text-align:center; background-color:#eaecf0; white-space:nowrap; padding:0.25em 0.5em; border:1px solid white" colspan="2"><b>' .. title .. '</b></th>\n'
		.. '</tr>\n'
	
	for i = 1, #rows do
		navbox = navbox .. p.navbox_row(rows[i])
	end
	
	navbox = navbox
		.. '</table>\n'
		.. '</div>'
	
	return navbox
end

-- Navbox to be #invoke'd
function p.navbox(frame)
	local args = getArgs(frame)
	
	local is_collapsed = args["Is Collapsed"]
	local is_subtable = args["Is Subtable"]		-- "subgroup" already means something else here
	local title = args["Title"]
	
	-- Both the Wikipedia and RsWiki navboxes go up to 20 rows so follow that
	local rows = {}
	for i = 1, 20 do
		local row = {}
		local header = args["Header " .. i]
		local data   = args["Data "   .. i]
		
		if header ~= nil and data ~= nil then
			-- If there's both a header data, add both
			table.insert(row, header)
			table.insert(row, data)
		elseif header == nil and data ~= nil then
			-- Headerless row
			table.insert(row, data)
		elseif header ~= nil and data == nil then
			-- Dataless row with header; this is allowed
			table.insert(row, header)
			table.insert(row, "")
		end
		
		if #row >= 1 then
			table.insert(rows, row)
		end
	end
	
	return p._navbox(title, rows, is_collapsed)
	
end

return p