Module:Navbox: Difference between revisions

From Xenharmonic Wiki
Jump to navigation Jump to search
Ganaram inukshuk (talk | contribs)
m fixed reversed logic for navbox title
ArrowHead294 (talk | contribs)
mNo edit summary
 
(140 intermediate revisions by 2 users not shown)
Line 1: Line 1:
-- Page is following provisonal style guide: User:Ganaram_inukshuk/Provisional_style_guide_for_Lua
-- 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
-- Loosely modelled off of Runescape Wiki's navbox, not Wikipedia's
local getArgs = require('Module:Arguments').getArgs
local p = {}
local p = {}
local getArgs = require("Module:Arguments").getArgs
local navbar = require("Module:Navbar")._navbar
local yesno = require("Module:Yesno")
-- Header/footer row
function p.navbox_header_footer(row_content)
local row = "|-\n"
.. '| colspan="2" style="font-size: 0.8em; text-align: center; background-color: #eaecf0; padding: 0em; border: 1px solid white;" | '
.. row_content .. "\n"
return row
end


-- Navbox row
-- Navbox row
function p.navbox_row(row_content, is_row_child_navbox)
function p.navbox_row(row_content, is_navbox)
local row_content = row_content or { "Header", "Content" }
local is_navbox = (is_navbox ~= nil and is_navbox or false)
local is_row_child_navbox = is_row_child_navbox or false -- Not implemented


local row = '<tr>\n'
local row = "|-\n"
if #row_content == 1 then
if #row_content == 1 then
-- Headerless row
-- Headerless row; takes up two cells
row = row
if is_navbox then
.. '<td style="width:5%; text-align:center; background-color:#eaecf0; white-space:nowrap; padding:0em; border:1px solid white" colspan="2">\n'
-- Row data is a child navbox; data cell has no padding
        .. '<div style="padding:0.25em 0.5em">' .. row_content[1] .. '</div>\n'
row = row
    .. '</td>\n'
.. '| style="padding: 0;" colspan="2" | \n'
elseif #row_content == 2 then
.. row_content[1] .. "\n"
-- Simple row with header and data
else
row = row
-- Row data is normal data
.. '<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'
row = row .. '| style="font-size: 0.9em; padding: 0.25em 0.5em;" colspan="2" | ' .. row_content[1] .. "\n"
.. '<td style="padding:0em">\n'
    end
.. '<div style="padding:0.25em 0.5em">' .. row_content[2] .. '</div>\n'
else
.. '</td>\n'
-- Row with header and data
if is_navbox then
-- Row data is a child navbox; data cell has no padding
row = row
.. '! style="white-space: nowrap; font-size: 0.9em; width: 5%; text-align: right; background-color: #eaecf0; padding: 0.25em 0.5em; border: 1px solid white;" |'
.. row_content[1] .. "\n"
.. '| style="padding: 0;" |\n'  
.. row_content[2] .. "\n"
else
-- Row data is normal data
row = row
.. '! style="white-space: nowrap; font-size: 0.9em; width: 5%; text-align: right; background-color: #eaecf0; padding: 0.25em 0.5em; border: 1px solid white;" |'
.. row_content[1] .. "\n"
.. '| style="font-size: 0.9em; padding: 0.25em 0.5em;" | ' .. row_content[2] .. "\n"
end
end
end
local row = row .. '</tr>\n'
return row
return row
Line 30: Line 54:


-- Navbox title
-- Navbox title
function p.navbox_title(title, is_collapsible, is_collapsed, is_child_navbox)
function p.navbox_title(title, is_collapsible, name)
local title = title or "Example Navbox"
local is_root_navbox = (is_root_navbox == nil and is_root_navbox or true) -- If not specified, default to TRUE
local is_collapsible = is_collapsible or true -- Not implemented
local has_navbar = name ~= nil
local is_collapsed = is_collapsed or true -- Not working?
local navbox_title = ''
local is_child_navbox = is_child_navbox or false
if title ~= nil then
navbox_title = "|-\n"
.. '! style="text-align: center; background-color: #eaecf0; white-space: nowrap; margin: 0em 4em 0em 4em;'
.. 'padding: 0.25em 0.5em; border: 1px solid white;" colspan="2" | '
.. '<span style="display: inline-block; float: left; text-align: left; font-weight: normal; font-style: normal; min-width: 4em; padding: 0px; margin: 0px;">'
.. (has_navbar and navbar(name, "mini", "") or "") .. '</span>'
.. '<span style="font-size: 1.05em;">' .. title .. "</span>"
.. (is_collapsible and '' or '<span style="display: inline-block; float: right; font-size: 0.8em; width: 5em;">&nbsp;</span>')
.. '\n'
end
return navbox_title
end
 
-- Navbox title for nested navboxes
function p.nested_navbox_title(title, is_collapsible)
local navbox_title = ''
local navbox_title = ''
if is_child_navbox then
if title ~= nil then
navbox_title = '<table style="width:100%; border-spacing:0px">\n'
navbox_title = "|-\n"
else
.. '! style="text-align: center; background-color: #eaecf0; white-space: nowrap; margin: 0em 4em 0em 4em;'
navbox_title = navbox_title
.. 'padding: 0.25em 0.5em; border: 1px solid white;" colspan="2" | '  
.. '<div class="wikitable">'
.. (is_collapsible and '<span style="display: inline-block; float: left; min-width: 4em; padding: 0px; margin: 0px;">&nbsp;</span>' or '')
.. '<table class="mw-collapsible' .. (is_collapsed and ' mw-collapsed ' or '') .. 'nowraplinks" style="width: 100%; border-spacing:0px">\n'
.. '<span style="font-size: 0.9em;">' .. title .. "</span>"
.. '<tr>\n'
.. '\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'
end
end
return navbox_title
return navbox_title
end
end
Line 53: Line 87:
-- Navbox to be called by other modules; also called by wrapper function
-- Navbox to be called by other modules; also called by wrapper function
function p._navbox(args)
function p._navbox(args)
local title          = args["Title"]
local title          = args["Title"] or "Navbox Title"
local is_child_navbox = args["Is Child Navbox"]
local name            = args["name"]
local rows            = args["Rows"]
local rows            = args["Rows"]
local row_is_subtable = args["Is Row Child Navbox"] -- Not implemented
local is_data_navbox  = args["Is Data Navbox"]
local is_collapsible  = args["Is Collapsible"] -- Not implemented
local is_collapsible  = yesno(args["Is Collapsible"], true )
local is_collapsed    = args["Is Collapsible"] -- Not working?
local is_collapsed    = yesno(args["Is Collapsed"  ], false)
local navbox_type    = ((args["Navbox Type"] == nil) and "Normal" or args["Navbox Type"])
local header_row = args["Header Row"]
local footer_row = args["Footer Row"]
-- Start of table
-- Start of table
local navbox = p.navbox_title(title, is_collapsible, is_collapsed, is_subtable)
local navbox = ''
if navbox_type == "Nested" then
for i = 1, #rows do
-- Navbox has a title, wikitable border, collapse options, and extra
navbox = navbox .. p.navbox_row(rows[i])
-- margin.
end
-- This navbox is meant to be a sub-navbox, placed on a headerless row.
navbox = '<div class="wikitable" style="overflow-x: auto; padding: 0; margin: 2px;">\n'
navbox = navbox
.. '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;"'
.. '</table>\n'
.. (is_collapsible and ('class="mw-collapsible' .. (is_collapsed and ' mw-collapsed"' or '"')) or '') .. '\n'
.. '</div>'
.. p.nested_navbox_title(title, is_collapsible)
-- Add header
if header_row ~= nil then
navbox = navbox .. p.navbox_header_footer(header_row)
end
-- Add rows
for i = 1, #rows do
navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
end
-- Add footer
if footer_row ~= nil then
navbox = navbox .. p.navbox_header_footer(footer_row)
end
-- End of table
navbox = navbox
.. '|}\n'
.. '</div>'
elseif navbox_type == "Subheader" then
-- Navbox has no title, border, or collapse options.
-- This navbox is meant to display subheaders.
navbox = '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;\n'
-- Add rows
for i = 1, #rows do
navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
end
-- End of table
navbox = navbox .. '|}\n'
else
-- Navbox has a title, wikitable border, and collapse options.
-- This navbox is a normal navbox or a nested navbox.
navbox = '<div class="wikitable" style="overflow-x: auto; padding: 0">\n'
.. '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;"'
.. (is_collapsible and ('class="mw-collapsible' .. (is_collapsed and 'mw-collapsed"' or '"')) or '') .. '\n'
.. p.navbox_title(title, is_collapsible, name)
-- Add header
if header_row ~= nil then
navbox = navbox .. p.navbox_header_footer(header_row)
end
-- Add rows
for i = 1, #rows do
navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
end
-- Add header
if footer_row ~= nil then
navbox = navbox .. p.navbox_header_footer(footer_row)
end
-- End of table
navbox = navbox
.. '|}\n'
.. '</div>'
end
return navbox
return navbox
end
end


-- Navbox to be #invoke'd
-- Navbox to be invoked
-- Wrapper function for template-based navboxes
function p.navbox(frame)
function p.navbox(frame)
local args = getArgs(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
-- Preprocess individual entries for, headers, data, and is-row-child into
-- two separate tables.
-- one single table.
-- Both the Wikipedia and RsWiki navboxes go up to 20 rows so follow that
-- Both the Wikipedia and RsWiki navboxes go up to 20 rows so follow that.
local rows = {}
local rows = {}
local is_row_child_navbox = {}
local is_data_navbox = {}
for i = 1, 20 do
for i = 1, 30 do
local row = {}
local header = args["Header " .. i]
local header = args["Header " .. i]
local data  = args["Data "  .. i]
local data  = args["Data "  .. i]
local is_child_navbox = args["Is Row Child Navbox" .. i]
local is_navbox = args["Is Data " .. i .. " Navbox"] ~= nil and args["Is Data " .. i .. " Navbox"] or false
if header ~= nil and data ~= nil then
local row = nil
-- If there's both a header data, add both
if (header == nil and data ~= nil) then
table.insert(row, header)
table.insert(row, data)
elseif header == nil and data ~= nil then
-- Headerless row
-- Headerless row
row = {}
table.insert(row, data)
table.insert(row, data)
elseif header ~= nil and data == nil then
elseif (header ~= nil and data == nil) then
-- Dataless row with header; this is allowed
-- Dataless row; permitted for placeholder purposes
row = {}
table.insert(row, header)
table.insert(row, header)
table.insert(row, "")
table.insert(row, "")
elseif (header ~= nil and data ~= nil) then
-- Row with header and data
row = {}
table.insert(row, header)
table.insert(row, data)
end
end
if row ~= nil then
if #row >= 1 then
table.insert(rows, row)
table.insert(rows, row)
table.insert(is_data_navbox, is_navbox)
end
end
if is_child_navbox ~= nil then
-- Remove original entries as cleanup
table.insert(is_row_child_navbox, is_child_navbox)
end
args["Header " .. i] = nil
args["Header " .. i] = nil
args["Data "  .. i] = nil
args["Data "  .. i] = nil
args["Is Row Child Navbox" .. i] = nil
args["Is Data " .. i .. " Navbox"] = nil
end
end
args["Rows"] = rows
args["Is Data Navbox"] = is_data_navbox
args["Rows"] = rows
local result = p._navbox(args)
args["Is Row Child Navbox"] = is_row_child_navbox
return p._navbox(args)
-- Debugger option
local debugg = yesno(args["debug"])
if debugg == true then
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
end
return result
end
end


return p
return p

Latest revision as of 12:57, 1 June 2025

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 modelled off of Runescape Wiki's navbox, not Wikipedia's
local p = {}

local getArgs = require("Module:Arguments").getArgs
local navbar = require("Module:Navbar")._navbar
local yesno = require("Module:Yesno")

-- Header/footer row
function p.navbox_header_footer(row_content)
	local row = "|-\n"
		.. '| colspan="2" style="font-size: 0.8em; text-align: center; background-color: #eaecf0; padding: 0em; border: 1px solid white;" | '
		.. row_content .. "\n"

	return row
end

-- Navbox row
function p.navbox_row(row_content, is_navbox)
	local is_navbox = (is_navbox ~= nil and is_navbox or false)

	local row = "|-\n"
	if #row_content == 1 then
		-- Headerless row; takes up two cells
		if is_navbox then
			-- Row data is a child navbox; data cell has no padding
			row = row
				.. '| style="padding: 0;" colspan="2" | \n'
				.. row_content[1] .. "\n"
		else
			-- Row data is normal data
			row = row .. '| style="font-size: 0.9em; padding: 0.25em 0.5em;" colspan="2" | ' .. row_content[1] .. "\n"
    	end
	else
		-- Row with header and data
		if is_navbox then
			-- Row data is a child navbox; data cell has no padding
			row = row
				.. '! style="white-space: nowrap; font-size: 0.9em; width: 5%; text-align: right; background-color: #eaecf0; padding: 0.25em 0.5em; border: 1px solid white;" |'
				..  row_content[1] .. "\n"
				.. '| style="padding: 0;" |\n' 
				.. row_content[2] .. "\n"
		else
			-- Row data is normal data
			row = row
				.. '! style="white-space: nowrap; font-size: 0.9em; width: 5%; text-align: right; background-color: #eaecf0; padding: 0.25em 0.5em; border: 1px solid white;" |'
				..  row_content[1] .. "\n"
				.. '| style="font-size: 0.9em; padding: 0.25em 0.5em;" | ' .. row_content[2] .. "\n"
		end
	end
	
	return row
end

-- Navbox title
function p.navbox_title(title, is_collapsible, name)
	local is_root_navbox = (is_root_navbox == nil and is_root_navbox or true)		-- If not specified, default to TRUE
	local has_navbar = name ~= nil
	local navbox_title = ''
	if title ~= nil then
		navbox_title = "|-\n"
			.. '! style="text-align: center; background-color: #eaecf0; white-space: nowrap; margin: 0em 4em 0em 4em;'
			.. 'padding: 0.25em 0.5em; border: 1px solid white;" colspan="2" | ' 
			.. '<span style="display: inline-block; float: left; text-align: left; font-weight: normal; font-style: normal; min-width: 4em; padding: 0px; margin: 0px;">'
			.. (has_navbar and navbar(name, "mini", "") or "") .. '</span>'
			.. '<span style="font-size: 1.05em;">' .. title .. "</span>"
			.. (is_collapsible and '' or '<span style="display: inline-block; float: right; font-size: 0.8em; width: 5em;">&nbsp;</span>')
			.. '\n'
	end
	return navbox_title
end

-- Navbox title for nested navboxes
function p.nested_navbox_title(title, is_collapsible)
	local navbox_title = ''
	if title ~= nil then
		navbox_title = "|-\n"
			.. '! style="text-align: center; background-color: #eaecf0; white-space: nowrap; margin: 0em 4em 0em 4em;'
			.. 'padding: 0.25em 0.5em; border: 1px solid white;" colspan="2" | ' 
			.. (is_collapsible and '<span style="display: inline-block; float: left; min-width: 4em; padding: 0px; margin: 0px;">&nbsp;</span>' or '')
			.. '<span style="font-size: 0.9em;">' .. title .. "</span>"
			.. '\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"] or "Navbox Title"
	local name            = args["name"]
	local rows            = args["Rows"]
	local is_data_navbox  = args["Is Data Navbox"]
	local is_collapsible  = yesno(args["Is Collapsible"], true )
	local is_collapsed    = yesno(args["Is Collapsed"  ], false)
	local navbox_type     = ((args["Navbox Type"] == nil) and "Normal" or args["Navbox Type"])
	local header_row = args["Header Row"]
	local footer_row = args["Footer Row"]
	
	-- Start of table
	local navbox = ''
	if navbox_type == "Nested" then
		-- Navbox has a title, wikitable border, collapse options, and extra
		-- margin.
		-- This navbox is meant to be a sub-navbox, placed on a headerless row.
		navbox = '<div class="wikitable" style="overflow-x: auto; padding: 0; margin: 2px;">\n'
			.. '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;"'
			.. (is_collapsible and ('class="mw-collapsible' .. (is_collapsed and ' mw-collapsed"' or '"')) or '') .. '\n'
			.. p.nested_navbox_title(title, is_collapsible)
			
		-- Add header
		if header_row ~= nil then
			navbox = navbox .. p.navbox_header_footer(header_row)
		end
		
		-- Add rows
		for i = 1, #rows do
			navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
		end
		
		-- Add footer
		if footer_row ~= nil then
			navbox = navbox .. p.navbox_header_footer(footer_row)
		end
		
		-- End of table
		navbox = navbox
			.. '|}\n'
			.. '</div>'
			
	elseif navbox_type == "Subheader" then
		-- Navbox has no title, border, or collapse options.
		-- This navbox is meant to display subheaders.
		navbox = '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;\n'
		
		-- Add rows
		for i = 1, #rows do
			navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
		end
		
		-- End of table
		navbox = navbox .. '|}\n'
	else
		-- Navbox has a title, wikitable border, and collapse options.
		-- This navbox is a normal navbox or a nested navbox.
		navbox = '<div class="wikitable" style="overflow-x: auto; padding: 0">\n'
			.. '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;"'
			.. (is_collapsible and ('class="mw-collapsible' .. (is_collapsed and 'mw-collapsed"' or '"')) or '') .. '\n'
			.. p.navbox_title(title, is_collapsible, name)
			
		-- Add header
		if header_row ~= nil then
			navbox = navbox .. p.navbox_header_footer(header_row)
		end
		
		-- Add rows
		for i = 1, #rows do
			navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
		end
		
		-- Add header
		if footer_row ~= nil then
			navbox = navbox .. p.navbox_header_footer(footer_row)
		end
		
		-- End of table
		navbox = navbox
			.. '|}\n'
			.. '</div>'
	end	
	
	return navbox
end

-- Navbox to be invoked
-- Wrapper function for template-based navboxes
function p.navbox(frame)
	local args = getArgs(frame)
	
	-- Preprocess individual entries for, headers, data, and is-row-child into
	-- one single table.
	-- Both the Wikipedia and RsWiki navboxes go up to 20 rows so follow that.
	local rows = {}
	local is_data_navbox = {}
	for i = 1, 30 do
		local header = args["Header " .. i]
		local data   = args["Data "   .. i]
		local is_navbox = args["Is Data " .. i .. " Navbox"] ~= nil and args["Is Data " .. i .. " Navbox"] or false
		
		local row = nil
		if (header == nil and data ~= nil) then
			-- Headerless row
			row = {}
			table.insert(row, data)
		elseif (header ~= nil and data == nil) then
			-- Dataless row; permitted for placeholder purposes
			row = {}
			table.insert(row, header)
			table.insert(row, "")
		elseif (header ~= nil and data ~= nil) then
			-- Row with header and data
			row = {}
			table.insert(row, header)
			table.insert(row, data)
		end
		if row ~= nil then
			table.insert(rows, row)
			table.insert(is_data_navbox, is_navbox)
		end
		
		-- Remove original entries as cleanup
		args["Header " .. i] = nil
		args["Data "   .. i] = nil
		args["Is Data " .. i .. " Navbox"] = nil
	end
	args["Rows"] = rows
	args["Is Data Navbox"] = is_data_navbox
	
	local result = p._navbox(args)
	
	-- Debugger option
	local debugg = yesno(args["debug"])
	if debugg == true then
		result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
	end
	
	return result
end

return p