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
function p.navbox_row(row_content, is_row_child_navbox)
	local row_content = row_content or { "Header", "Content" }
	local is_row_child_navbox = is_row_child_navbox or false	-- Not implemented

	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_content[1] .. '</div>\n'
    		.. '</td>\n'
	elseif #row_content == 2 then
		-- 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
	local row = row .. '</tr>\n'
	
	return row
end

-- Navbox title
function p.navbox_title(title, is_collapsible, is_collapsed, is_child_navbox)
	local title = title or "Example Navbox"
	local is_collapsible = is_collapsible or true		-- Not implemented
	local is_collapsed = is_collapsed or true			-- Not working?
	local is_child_navbox = is_child_navbox or false
	
	local navbox_title = ''
	if is_child_navbox then
		navbox_title = navbox_title
			.. '<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'
	else
		navbox_title = '<table style="width:100%; border-spacing:0px">\n'
	end
	
	return navbox_title
end

-- Navbox to be called by other modules; also called by wrapper function
function p._navbox(args)
	local title           = args["Title"]
	local is_child_navbox = args["Is Child Navbox"]
	local rows            = args["Rows"]
	local row_is_subtable = args["Is Row Child Navbox"]		-- Not implemented
	local is_collapsible  = args["Is Collapsible"]			-- Not implemented
	local is_collapsed    = args["Is Collapsible"]			-- Not working?
	
	-- Start of table
	local navbox = p.navbox_title(title, is_collapsible, is_collapsed, is_subtable)
	
	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)
	
	-- Check if navbox is a child navbox
	-- Default is navbox is the root navbox
	args["Is Child Navbox"] = (args["Is Child Navbox"] == nil and true or args["Is Child Navbox"])
	
	-- Preprocess individual entries for, headers, data, and is-row-child into
	-- two separate tables.
	-- Both the Wikipedia and RsWiki navboxes go up to 20 rows so follow that
	local rows = {}
	local is_row_child_navbox = {}
	for i = 1, 20 do
		local row = {}
		local header = args["Header " .. i]
		local data   = args["Data "   .. i]
		local is_child_navbox = args["Is Row Child Navbox" .. 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
		
		if is_child_navbox ~= nil then
			table.insert(is_row_child_navbox, is_child_navbox)
		end
		
		args["Header " .. i] = nil
		args["Data "   .. i] = nil
		args["Is Row Child Navbox" .. i] = nil
	end
	
	args["Rows"] = rows
	args["Is Row Child Navbox"] = is_row_child_navbox
	
	return p._navbox(args)
	
end

return p