Module:Navbox: Difference between revisions

From Xenharmonic Wiki
Jump to navigation Jump to search
ArrowHead294 (talk | contribs)
m Okay, I understand now why the functions should be separate. Also note that you don't need the "dummy" «span» element if the nested navbox isn't collapsible as the «div» should centre itself.
Ganaram inukshuk (talk | contribs)
m minor renaming
 
(45 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
-- This module follows [[User:Ganaram inukshuk/Provisional style guide for Lua]]
-- Loosely modelled off of Runescape Wiki's navbox, not Wikipedia's
local getArgs = require("Module:Arguments").getArgs
local getArgs = require("Module:Arguments").getArgs
local navbar = require("Module:Navbar")._navbar
local tiu = require("Module:Template input utils")
local yesno = require("Module:Yesno")
local yesno = require("Module:Yesno")
local navbar = require("Module:Navbar")._navbar
 
local p = {}
local p = {}


-- Header/footer row
-- TODO (medium priority): add/use navbox/styles.css
 
-- TODO (medium priority): nest and refactor helper functions
 
-- Navbox row helper function
-- Function was refactored to use table.concat(), like with the "main" function,
-- since it's being called multiple times. The other helper functions don't need
-- to be refactored (currently) because they only need to be called a fixed
-- number of times.
function p.navbox_row(row_content, is_content_navbox)
local is_navbox = is_navbox or false
local header = row_content["Header"]
local data = row_content["Data"]
local row = {}
if header and data then
-- Row is a header+data row
local header_style = '! 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;" |'
local data_style = is_content_navbox
and '| style="padding: 0;" |\n' -- For nested navboxes; endline required for nested navboxes to work properly
or  '| style="font-size: 0.9em; padding: 0.25em 0.5em;" |' -- For normal content; endline not needed as adding it makes rows too thick
 
table.insert(row, "|-")
table.insert(row, header_style .. header)
table.insert(row, data_style .. data)
elseif data and not header then
-- Row is a headerless data row
local data_style = is_content_navbox
and '| style="padding: 0; colspan="2" |\n' -- For nested navboxes
or  '| style="font-size: 0.9em; padding: 0.25em 0.5em;" colspan="2" |' -- For normal content
table.insert(row, "|-")
table.insert(row, data_style .. data)
elseif header and not data then
-- Row is a dataless header row
local data_style = is_content_navbox
and '! style="padding: 0;" colspan="2" |\n' -- For nested navboxes; in case nav elements are ever added here, such as numlinks
or  '! style="white-space: nowrap; font-size: 0.9em; width: 5%; background-color: #eaecf0; padding: 0.25em 0.5em; border: 1px solid white;" colspan="2" |'
table.insert(row, "|-")
table.insert(row, data_style .. header)
end
 
return table.concat(row, "\n")
end
 
-- Header/footer row helper function
-- Called up to twice on a table.
function p.navbox_header_footer(row_content)
function p.navbox_header_footer(row_content)
local row = "|-\n"
local row = "|-\n"
.. '| colspan="2" style="font-size: 0.8em; text-align: center; background-color: #eaecf0; padding: 0em; border: 1px solid white;" | '
.. '| colspan="2" style="font-size: 0.8em; text-align: center; background-color: #eaecf0; padding: 0em; border: 1px solid white;" | '
.. row_content .. "\n"
.. 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
return row
end
end


-- Navbox title
-- Navbox title helper function
-- Up to one title helper is called per table; this is expected to be called in
-- most cases, however.
function p.navbox_title(title, is_collapsible, name)
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 is_root_navbox = (is_root_navbox == nil and is_root_navbox or true) -- If not specified, default to TRUE
Line 64: Line 77:
.. (has_navbar and navbar(name, "mini", "") or "") .. '</span>'
.. (has_navbar and navbar(name, "mini", "") or "") .. '</span>'
.. '<span style="font-size: 1.05em;">' .. title .. "</span>"
.. '<span style="font-size: 1.05em;">' .. title .. "</span>"
.. ((not is_collapsible) and '<span style="display: inline-block; float: right; text-align: right; font-size: 0.8em; width: 5em;">&nbsp;</span>' or "")
.. (is_collapsible and '' or '<span style="display: inline-block; float: right; font-size: 0.8em; width: 5em;">&nbsp;</span>')
.. '\n'
--.. '\n'
end
end
return navbox_title
return navbox_title
end
end


-- Navbox title for nested navboxes
-- Navbox title for nested navboxes or subheader (subcategory) navboxes
-- Up to one title helper is called per table; not always necessray if the table
-- is used for subcategories.
function p.nested_navbox_title(title, is_collapsible)
function p.nested_navbox_title(title, is_collapsible)
local navbox_title = ''
local navbox_title = ''
Line 77: Line 92:
.. '! style="text-align: center; background-color: #eaecf0; white-space: nowrap; margin: 0em 4em 0em 4em;'
.. '! 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" | '  
.. 'padding: 0.25em 0.5em; border: 1px solid white;" colspan="2" | '  
.. (is_collapsible and '<span style="display: inline-block; float: left; text-align: left; font-weight: normal; font-style: normal; min-width: 4em; padding: 0px; margin: 0px;">&nbsp;</span>' or '')
.. (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>"
.. '<span style="font-size: 0.9em;">' .. title .. "</span>"
.. '\n'
--.. '\n'
end
end
return navbox_title
return navbox_title
end
end


-- "Main" function
-- 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)
Line 93: Line 109:
local is_collapsed    = yesno(args["Is Collapsed"  ], false)
local is_collapsed    = yesno(args["Is Collapsed"  ], false)
local navbox_type    = ((args["Navbox Type"] == nil) and "Normal" or args["Navbox Type"])
local navbox_type    = ((args["Navbox Type"] == nil) and "Normal" or args["Navbox Type"])
local header_row = args["Header Row"]
local header_row     = args["Header Row"]
local footer_row = args["Footer Row"]
local footer_row     = args["Footer Row"]
 
-- Start of table
-- Table that holds individual lines
local navbox = ''
local navbox = {}
 
if navbox_type == "Nested" then
if navbox_type == "Nested" then
-- Navbox has a title, wikitable border, collapse options, and extra
-- Build a navbox that lies within another navbox
-- margin.
table.insert(navbox, '<div class="wikitable" style="overflow-x: auto; padding: 0; margin: 2px;">')
-- This navbox is meant to be a sub-navbox, placed on a headerless row.
table.insert(navbox,
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%;"'
.. '{| width="100%" style="mw-border-collapse: collapse; border-spacing: 0; margin: 0;"'
.. (is_collapsible and (' class="mw-collapsible' .. (is_collapsed and ' mw-collapsed"' or '"')) or '')
.. (is_collapsible and ('class="mw-collapsible' .. (is_collapsed and ' mw-collapsed"' or '"')) or '') .. '\n'
)
.. p.nested_navbox_title(title, is_collapsible)
 
-- Title row
-- Add header
table.insert(navbox, p.nested_navbox_title(title, is_collapsible))
if header_row ~= nil then
navbox = navbox .. p.navbox_header_footer(header_row)
-- Header row
if header_row then
table.insert(navbox, p.navbox_header_footer(header_row))
end
end
 
-- Add rows
-- Data rows
for i = 1, #rows do
for i = 1, #rows do
navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
table.insert(navbox, p.navbox_row(rows[i], is_data_navbox[i]))
end
end
 
-- Add footer
-- Footer rows
if footer_row ~= nil then
if footer_row then
navbox = navbox .. p.navbox_header_footer(footer_row)
table.insert(navbox, p.navbox_header_footer(footer_row))
end
end
 
-- End of table
-- End of table
navbox = navbox
table.insert(navbox, '|}')
.. '|}\n'
table.insert(navbox, '</div>')
.. '</div>'
 
elseif navbox_type == "Subheader" then
elseif navbox_type == "Subheader" then
-- Navbox has no title, border, or collapse options.
-- Build a navbox that lies within another navbox
-- This navbox is meant to display subheaders.
-- This one serves as subcategories for one row
navbox = '{| width="100%" style="mw-border-collapse: collapse; border-spacing: 0; margin: 0;"\n'
table.insert(navbox, '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;"')
-- Add rows
-- Title (optional)
table.insert(navbox, p.nested_navbox_title(title, false))
 
-- Rows
for i = 1, #rows do
for i = 1, #rows do
navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
table.insert(navbox, p.navbox_row(rows[i], is_data_navbox[i]))
end
end
 
-- End of table
-- End of table
navbox = navbox .. '|}\n'
table.insert(navbox, '|}')
else
 
-- Navbox has a title, wikitable border, and collapse options.
else -- Normal
-- This navbox is a normal navbox or a nested navbox.
table.insert(navbox, '<div class="wikitable" style="overflow-x: auto; padding: 0">')
navbox = '<div class="wikitable" style="overflow-x: auto; padding: 0">\n'
table.insert(navbox,
.. '{| width="100%" style="mw-border-collapse: collapse; border-spacing: 0; margin: 0"'
'{| 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'
.. (is_collapsible and (' class="mw-collapsible' .. (is_collapsed and ' mw-collapsed"' or '"')) or '')
.. p.navbox_title(title, is_collapsible, name)
)
 
-- Add header
-- Title
if header_row ~= nil then
table.insert(navbox, p.navbox_title(title, is_collapsible, name))
navbox = navbox .. p.navbox_header_footer(header_row)
 
-- Header
if header_row then
table.insert(navbox, p.navbox_header_footer(header_row))
end
end
 
-- Add rows
-- Rows
for i = 1, #rows do
for i = 1, #rows do
navbox = navbox .. p.navbox_row(rows[i], is_data_navbox[i])
table.insert(navbox, p.navbox_row(rows[i], is_data_navbox[i]))
end
end
-- Add header
-- Footer
if footer_row ~= nil then
if footer_row then
navbox = navbox .. p.navbox_header_footer(footer_row)
table.insert(navbox, p.navbox_header_footer(footer_row))
end
end
 
-- End of table
-- End of table
navbox = navbox
table.insert(navbox, '|}')
.. '|}\n'
table.insert(navbox, '</div>')
.. '</div>'
end
end
 
return table.concat(navbox, '\n')
return navbox
end
end


-- Navbox to be invoked
-- Wrapper function for template-based navboxes
-- Wrapper function for template-based navboxes
function p.navbox(frame)
function p.navbox(frame)
local args = getArgs(frame)
local args = getArgs(frame)
-- Preprocess individual entries for, headers, data, and is-row-child into
-- Preprocess bools for rows that indicate whether that row is a nested
-- one single table.
-- navbox. A row is considered valid if it has either a header or data. If
-- Both the Wikipedia and RsWiki navboxes go up to 20 rows so follow that.
-- a bool exists but not its header or data, it's skipped. If a valid row
local rows = {}
-- exists but not its bool, it defaults to false.
local is_data_navbox = {}
local is_data_navbox = {}
for i = 1, 30 do
for i = 1, 30 do
local header = args["Header " .. i]
local header = args["Header " .. i]
local data  = args["Data "  .. i]
local data  = args["Data "  .. i]
local is_navbox = args["Is Data " .. i .. " Navbox"] ~= nil and args["Is Data " .. i .. " Navbox"] or false
local key = string.format("Is Data %d Navbox", i)
local row = nil
if header or data then
if (header == nil and data ~= nil) then
table.insert(is_data_navbox, args[key] or false)
-- 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
end
if row ~= nil then
 
table.insert(rows, row)
args[key] = nil
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
end
args["Is Data Navbox"] = is_data_navbox
-- Preprocess individual entries for headers and data
local rows = tiu.numbered_header_data_args_to_table(args, 30)
args["Rows"] = rows
args["Rows"] = rows
args["Is Data Navbox"] = is_data_navbox
return p._navbox(args)
local result = p._navbox(args)
-- Debugger option
local debugg = yesno(args["debug"])
if debugg == true then
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
end
return frame:preprocess(result)
end
function p.tester()
local row_content = {  ["Header"] = "AAA" }
return p.navbox_row(row_content, false)
end
end


return p
return p

Latest revision as of 05:58, 15 October 2025

Module documentation[view] [edit] [history] [purge]
This module implements a metatemplate, and may be invoked by templates using its corresponding template Template:Navbox, or used directly from other modules.

Module:Navbox is a module that implements the {{Navbox}} template. Navbox templates can be made by using the template or by calling the _navbox function from another module.

On templates, you can create a navbox by using {{Navbox}}, which calls this module's wrapper function.

On modules, you can include local navbox = require("Module:Navbox")._navbox to create a navbox.


Introspection summary for Module:Navbox 
Functions provided (7)
Line Function Params
18 navbox_row (row_content, is_content_navbox)
57 navbox_header_footer (row_content)
68 navbox_title (title, is_collapsible, name)
88 nested_navbox_title (title, is_collapsible)
103 _navbox (main) (args)
197 navbox (invokable) (frame)
233 tester none
Lua modules required (4)
Variable Module Functions used
getArgs Module:Arguments getArgs
navbar Module:Navbar _navbar
tiu Module:Template input utils numbered_header_data_args_to_table
yesno Module:Yesno yesno

No function descriptions were provided. The Lua code may have further information.


-- This module follows [[User:Ganaram inukshuk/Provisional style guide for Lua]]
local getArgs = require("Module:Arguments").getArgs
local navbar = require("Module:Navbar")._navbar
local tiu = require("Module:Template input utils")
local yesno = require("Module:Yesno")

local p = {}

-- TODO (medium priority): add/use navbox/styles.css

-- TODO (medium priority): nest and refactor helper functions

-- Navbox row helper function
-- Function was refactored to use table.concat(), like with the "main" function,
-- since it's being called multiple times. The other helper functions don't need
-- to be refactored (currently) because they only need to be called a fixed
-- number of times.
function p.navbox_row(row_content, is_content_navbox)
	local is_navbox = is_navbox or false
	local header = row_content["Header"]
	local data = row_content["Data"]
	
	local row = {}
	if header and data then
		-- Row is a header+data row
		local header_style = '! 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;" |'
		local data_style = is_content_navbox
			and '| style="padding: 0;" |\n'									-- For nested navboxes; endline required for nested navboxes to work properly
			or  '| style="font-size: 0.9em; padding: 0.25em 0.5em;" |'		-- For normal content; endline not needed as adding it makes rows too thick

		table.insert(row, "|-")
		table.insert(row, header_style .. header)
		table.insert(row, data_style .. data)
	elseif data and not header then
		-- Row is a headerless data row
		local data_style = is_content_navbox
			and '| style="padding: 0; colspan="2" |\n'									-- For nested navboxes
			or  '| style="font-size: 0.9em; padding: 0.25em 0.5em;" colspan="2" |'		-- For normal content
		
		table.insert(row, "|-")
		table.insert(row, data_style .. data)
	elseif header and not data then
		-- Row is a dataless header row
		local data_style = is_content_navbox
			and '! style="padding: 0;" colspan="2" |\n'							-- For nested navboxes; in case nav elements are ever added here, such as numlinks
			or  '! style="white-space: nowrap; font-size: 0.9em; width: 5%; background-color: #eaecf0; padding: 0.25em 0.5em; border: 1px solid white;" colspan="2" |'
		
		table.insert(row, "|-")
		table.insert(row, data_style .. header)
	end

	return table.concat(row, "\n")
end

-- Header/footer row helper function
-- Called up to twice on a table.
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 title helper function
-- Up to one title helper is called per table; this is expected to be called in
-- most cases, however.
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 or subheader (subcategory) navboxes
-- Up to one title helper is called per table; not always necessray if the table
-- is used for subcategories.
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

-- "Main" function
-- 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"]

	-- Table that holds individual lines
	local navbox = {}

	if navbox_type == "Nested" then
		-- Build a navbox that lies within another navbox
		table.insert(navbox, '<div class="wikitable" style="overflow-x: auto; padding: 0; margin: 2px;">')
		table.insert(navbox,
			'{| 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 '')
		)

		-- Title row
		table.insert(navbox, p.nested_navbox_title(title, is_collapsible))
		
		-- Header row
		if header_row then
			table.insert(navbox, p.navbox_header_footer(header_row))
		end

		-- Data rows
		for i = 1, #rows do
			table.insert(navbox, p.navbox_row(rows[i], is_data_navbox[i]))
		end

		-- Footer rows
		if footer_row then
			table.insert(navbox, p.navbox_header_footer(footer_row))
		end

		-- End of table
		table.insert(navbox, '|}')
		table.insert(navbox, '</div>')

	elseif navbox_type == "Subheader" then
		-- Build a navbox that lies within another navbox
		-- This one serves as subcategories for one row
		table.insert(navbox, '{| style="mw-border-collapse: collapse; border-spacing: 0; margin: 0; width: 100%;"')
		
		-- Title (optional)
		table.insert(navbox, p.nested_navbox_title(title, false))

		-- Rows
		for i = 1, #rows do
			table.insert(navbox, p.navbox_row(rows[i], is_data_navbox[i]))
		end

		-- End of table
		table.insert(navbox, '|}')

	else -- Normal
		table.insert(navbox, '<div class="wikitable" style="overflow-x: auto; padding: 0">')
		table.insert(navbox,
			'{| 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 '')
		)

		-- Title
		table.insert(navbox, p.navbox_title(title, is_collapsible, name))

		-- Header
		if header_row then
			table.insert(navbox, p.navbox_header_footer(header_row))
		end

		-- Rows
		for i = 1, #rows do
			table.insert(navbox, p.navbox_row(rows[i], is_data_navbox[i]))
		end
		
		-- Footer
		if footer_row then
			table.insert(navbox, p.navbox_header_footer(footer_row))
		end

		-- End of table
		table.insert(navbox, '|}')
		table.insert(navbox, '</div>')
	end

	return table.concat(navbox, '\n')
end

-- Wrapper function for template-based navboxes
function p.navbox(frame)
	local args = getArgs(frame)
	
	-- Preprocess bools for rows that indicate whether that row is a nested
	-- navbox. A row is considered valid if it has either a header or data. If
	-- a bool exists but not its header or data, it's skipped. If a valid row
	-- exists but not its bool, it defaults to false.
	local is_data_navbox = {}
	for i = 1, 30 do
		local header = args["Header " .. i]
		local data   = args["Data "   .. i]
		local key = string.format("Is Data %d Navbox", i)
		
		if header or data then
			table.insert(is_data_navbox, args[key] or false)
		end

		args[key] = nil
	end
	args["Is Data Navbox"] = is_data_navbox
	
	-- Preprocess individual entries for headers and data
	local rows = tiu.numbered_header_data_args_to_table(args, 30)
	args["Rows"] = rows
	
	local result = p._navbox(args)
	
	-- Debugger option
	local debugg = yesno(args["debug"])
	if debugg == true then
		result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
	end
	
	return frame:preprocess(result)
end

function p.tester()
	local row_content = {  ["Header"] = "AAA" }
	return p.navbox_row(row_content, false)
end

return p