한국   대만   중국   일본 
Module:Navbox - Vikipedia B? m?tni d?varde

Module : Navbox

Сe Vikipedia

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

require
(
'strict'
)

local
 p
 =
 {}

local
 navbar
 =
 require
(
'Module:Navbar'
).
_navbar

local
 cfg
 =
 mw
.
loadData
(
'Module:Navbox/configuration'
)

local
 getArgs
 -- lazily initialized

local
 args

local
 format
 =
 string.format


local
 function
 striped
(
wikitext
,
 border
)

	-- Return wikitext with markers replaced for odd/even striping.

	-- Child (subgroup) navboxes are flagged with a category that is removed

	-- by parent navboxes. The result is that the category shows all pages

	-- where a child navbox is not contained in a parent navbox.

	local
 orphanCat
 =
 cfg
.
category
.
orphan

	if
 border
 ==
 cfg
.
keyword
.
border_subgroup
 and
 args
[
cfg
.
arg
.
orphan
]
 ~=
 cfg
.
keyword
.
orphan_yes
 then

		-- No change; striping occurs in outermost navbox.

		return
 wikitext
 ..
 orphanCat

	end

	local
 first
,
 second
 =
 cfg
.
class
.
navbox_odd_part
,
 cfg
.
class
.
navbox_even_part

	if
 args
[
cfg
.
arg
.
evenodd
]
 then

		if
 args
[
cfg
.
arg
.
evenodd
]
 ==
 cfg
.
keyword
.
evenodd_swap
 then

			first
,
 second
 =
 second
,
 first

		else

			first
 =
 args
[
cfg
.
arg
.
evenodd
]

			second
 =
 first

		end

	end

	local
 changer

	if
 first
 ==
 second
 then

		changer
 =
 first

	else

		local
 index
 =
 0

		changer
 =
 function
 (
code
)

			if
 code
 ==
 '0'
 then

				-- Current occurrence is for a group before a nested table.

				-- Set it to first as a valid although pointless class.

				-- The next occurrence will be the first row after a title

				-- in a subgroup and will also be first.

				index
 =
 0

				return
 first

			end

			index
 =
 index
 +
 1

			return
 index
 %
 2
 ==
 1
 and
 first
 or
 second

		end

	end

	local
 regex
 =
 orphanCat
:
gsub
(
'([%[%]])'
,
 '%%%1'
)

	return
 (
wikitext
:
gsub
(
regex
,
 ''
):
gsub
(
cfg
.
marker
.
regex
,
 changer
))
 -- () omits gsub count

end


local
 function
 processItem
(
item
,
 nowrapitems
)

	if
 item
:
sub
(
1
,
 2
)
 ==
 '{|'
 then

		-- Applying nowrap to lines in a table does not make sense.

		-- Add newlines to compensate for trim of x in |parm=x in a template.

		return
 '
\n
'
 ..
 item
 ..
'
\n
'

	end

	if
 nowrapitems
 ==
 cfg
.
keyword
.
nowrapitems_yes
 then

		local
 lines
 =
 {}

		for
 line
 in
 (
item
 ..
 '
\n
'
):
gmatch
(
'([^
\n
]*)
\n
'
)
 do

			local
 prefix
,
 content
 =
 line
:
match
(
'^([*:;#]+)%s*(.*)'
)

			if
 prefix
 and
 not
 content
:
match
(
cfg
.
pattern
.
nowrap
)
 then

				line
 =
 format
(
cfg
.
nowrap_item
,
 prefix
,
 content
)

			end

			table.insert
(
lines
,
 line
)

		end

		item
 =
 table.concat
(
lines
,
 '
\n
'
)

	end

	if
 item
:
match
(
'^[*:;#]'
)
 then

		return
 '
\n
'
 ..
 item
 ..
'
\n
'

	end

	return
 item

end


local
 function
 has_navbar
()

	return
 args
[
cfg
.
arg
.
navbar
]
 ~=
 cfg
.
keyword
.
navbar_off

		and
 args
[
cfg
.
arg
.
navbar
]
 ~=
 cfg
.
keyword
.
navbar_plain

		and
 (

			args
[
cfg
.
arg
.
name
]

			or
 mw
.
getCurrentFrame
():
getParent
():
getTitle
():
gsub
(
cfg
.
pattern
.
sandbox
,
 ''
)

				~=
 cfg
.
pattern
.
navbox

		)

end


local
 function
 renderNavBar
(
titleCell
)

	if
 has_navbar
()
 then

		titleCell
:
wikitext
(
navbar
{

			[
cfg
.
navbar
.
name
]
 =
 args
[
cfg
.
arg
.
name
],

			[
cfg
.
navbar
.
mini
]
 =
 1
,

			[
cfg
.
navbar
.
fontstyle
]
 =
 (
args
[
cfg
.
arg
.
basestyle
]
 or
 ''
)
 ..
 ';'
 ..

				(
args
[
cfg
.
arg
.
titlestyle
]
 or
 ''
)
 ..

				';background:none transparent;border:none;box-shadow:none;padding:0;'

		})

	end


end


local
 function
 renderTitleRow
(
tbl
)

	if
 not
 args
[
cfg
.
arg
.
title
]
 then
 return
 end


	local
 titleRow
 =
 tbl
:
tag
(
'tr'
)


	local
 titleCell
 =
 titleRow
:
tag
(
'th'
):
attr
(
'scope'
,
 'col'
)


	local
 titleColspan
 =
 2

	if
 args
[
cfg
.
arg
.
imageleft
]
 then
 titleColspan
 =
 titleColspan
 +
 1
 end

	if
 args
[
cfg
.
arg
.
image
]
 then
 titleColspan
 =
 titleColspan
 +
 1
 end


	titleCell

		:
cssText
(
args
[
cfg
.
arg
.
basestyle
])

		:
cssText
(
args
[
cfg
.
arg
.
titlestyle
])

		:
addClass
(
cfg
.
class
.
navbox_title
)

		:
attr
(
'colspan'
,
 titleColspan
)


	renderNavBar
(
titleCell
)


	titleCell

		:
tag
(
'div'
)

			-- id for aria-labelledby attribute

			:
attr
(
'id'
,
 mw
.
uri
.
anchorEncode
(
args
[
cfg
.
arg
.
title
]))

			:
addClass
(
args
[
cfg
.
arg
.
titleclass
])

			:
css
(
'font-size'
,
 '114%'
)

			:
css
(
'margin'
,
 '0 4em'
)

			:
wikitext
(
processItem
(
args
[
cfg
.
arg
.
title
]))

end


local
 function
 getAboveBelowColspan
()

	local
 ret
 =
 2

	if
 args
[
cfg
.
arg
.
imageleft
]
 then
 ret
 =
 ret
 +
 1
 end

	if
 args
[
cfg
.
arg
.
image
]
 then
 ret
 =
 ret
 +
 1
 end

	return
 ret

end


local
 function
 renderAboveRow
(
tbl
)

	if
 not
 args
[
cfg
.
arg
.
above
]
 then
 return
 end


	tbl
:
tag
(
'tr'
)

		:
tag
(
'td'
)

			:
addClass
(
cfg
.
class
.
navbox_abovebelow
)

			:
addClass
(
args
[
cfg
.
arg
.
aboveclass
])

			:
cssText
(
args
[
cfg
.
arg
.
basestyle
])

			:
cssText
(
args
[
cfg
.
arg
.
abovestyle
])

			:
attr
(
'colspan'
,
 getAboveBelowColspan
())

			:
tag
(
'div'
)

				-- id for aria-labelledby attribute, if no title

				:
attr
(
'id'
,
 (
not
 args
[
cfg
.
arg
.
title
])
 and
 mw
.
uri
.
anchorEncode
(
args
[
cfg
.
arg
.
above
])
 or
 nil
)

				:
wikitext
(
processItem
(
args
[
cfg
.
arg
.
above
],
 args
[
cfg
.
arg
.
nowrapitems
]))

end


local
 function
 renderBelowRow
(
tbl
)

	if
 not
 args
[
cfg
.
arg
.
below
]
 then
 return
 end


	tbl
:
tag
(
'tr'
)

		:
tag
(
'td'
)

			:
addClass
(
cfg
.
class
.
navbox_abovebelow
)

			:
addClass
(
args
[
cfg
.
arg
.
belowclass
])

			:
cssText
(
args
[
cfg
.
arg
.
basestyle
])

			:
cssText
(
args
[
cfg
.
arg
.
belowstyle
])

			:
attr
(
'colspan'
,
 getAboveBelowColspan
())

			:
tag
(
'div'
)

				:
wikitext
(
processItem
(
args
[
cfg
.
arg
.
below
],
 args
[
cfg
.
arg
.
nowrapitems
]))

end


local
 function
 renderListRow
(
tbl
,
 index
,
 listnum
,
 listnums_size
)

	local
 row
 =
 tbl
:
tag
(
'tr'
)


	if
 index
 ==
 1
 and
 args
[
cfg
.
arg
.
imageleft
]
 then

		row

			:
tag
(
'td'
)

				:
addClass
(
cfg
.
class
.
noviewer
)

				:
addClass
(
cfg
.
class
.
navbox_image
)

				:
addClass
(
args
[
cfg
.
arg
.
imageclass
])

				:
css
(
'width'
,
 '1px'
)
               -- Minimize width

				:
css
(
'padding'
,
 '0 2px 0 0'
)

				:
cssText
(
args
[
cfg
.
arg
.
imageleftstyle
])

				:
attr
(
'rowspan'
,
 listnums_size
)

				:
tag
(
'div'
)

					:
wikitext
(
processItem
(
args
[
cfg
.
arg
.
imageleft
]))

	end


	local
 group_and_num
 =
 format
(
cfg
.
arg
.
group_and_num
,
 listnum
)

	local
 groupstyle_and_num
 =
 format
(
cfg
.
arg
.
groupstyle_and_num
,
 listnum
)

	if
 args
[
group_and_num
]
 then

		local
 groupCell
 =
 row
:
tag
(
'th'
)


		-- id for aria-labelledby attribute, if lone group with no title or above

		if
 listnum
 ==
 1
 and
 not
 (
args
[
cfg
.
arg
.
title
]
 or
 args
[
cfg
.
arg
.
above
]
 or
 args
[
cfg
.
arg
.
group2
])
 then

			groupCell

				:
attr
(
'id'
,
 mw
.
uri
.
anchorEncode
(
args
[
cfg
.
arg
.
group1
]))

		end


		groupCell

			:
attr
(
'scope'
,
 'row'
)

			:
addClass
(
cfg
.
class
.
navbox_group
)

			:
addClass
(
args
[
cfg
.
arg
.
groupclass
])

			:
cssText
(
args
[
cfg
.
arg
.
basestyle
])

			-- If groupwidth not specified, minimize width

			:
css
(
'width'
,
 args
[
cfg
.
arg
.
groupwidth
]
 or
 '1%'
)


		groupCell

			:
cssText
(
args
[
cfg
.
arg
.
groupstyle
])

			:
cssText
(
args
[
groupstyle_and_num
])

			:
wikitext
(
args
[
group_and_num
])

	end


	local
 listCell
 =
 row
:
tag
(
'td'
)


	if
 args
[
group_and_num
]
 then

		listCell

			:
addClass
(
cfg
.
class
.
navbox_list_with_group
)

	else

		listCell
:
attr
(
'colspan'
,
 2
)

	end


	if
 not
 args
[
cfg
.
arg
.
groupwidth
]
 then

		listCell
:
css
(
'width'
,
 '100%'
)

	end


	local
 rowstyle
  -- usually nil so cssText(rowstyle) usually adds nothing

	if
 index
 %
 2
 ==
 1
 then

		rowstyle
 =
 args
[
cfg
.
arg
.
oddstyle
]

	else

		rowstyle
 =
 args
[
cfg
.
arg
.
evenstyle
]

	end


	local
 list_and_num
 =
 format
(
cfg
.
arg
.
list_and_num
,
 listnum
)

	local
 listText
 =
 args
[
list_and_num
]

	local
 oddEven
 =
 cfg
.
marker
.
oddeven

	if
 listText
:
sub
(
1
,
 12
)
 ==
 '</div><table'
 then

		-- Assume list text is for a subgroup navbox so no automatic striping for this row.

		oddEven
 =
 listText
:
find
(
cfg
.
pattern
.
navbox_title
)
 and
 cfg
.
marker
.
restart
 or
 cfg
.
class
.
navbox_odd_part

	end


	local
 liststyle_and_num
 =
 format
(
cfg
.
arg
.
liststyle_and_num
,
 listnum
)

	local
 listclass_and_num
 =
 format
(
cfg
.
arg
.
listclass_and_num
,
 listnum
)

	listCell

		:
css
(
'padding'
,
 '0'
)

		:
cssText
(
args
[
cfg
.
arg
.
liststyle
])

		:
cssText
(
rowstyle
)

		:
cssText
(
args
[
liststyle_and_num
])

		:
addClass
(
cfg
.
class
.
navbox_list
)

		:
addClass
(
cfg
.
class
.
navbox_part
 ..
 oddEven
)

		:
addClass
(
args
[
cfg
.
arg
.
listclass
])

		:
addClass
(
args
[
listclass_and_num
])

		:
tag
(
'div'
)

			:
css
(
'padding'
,

				(
index
 ==
 1
 and
 args
[
cfg
.
arg
.
list1padding
])
 or
 args
[
cfg
.
arg
.
listpadding
]
 or
 '0 0.25em'

			)

			:
wikitext
(
processItem
(
listText
,
 args
[
cfg
.
arg
.
nowrapitems
]))


	if
 index
 ==
 1
 and
 args
[
cfg
.
arg
.
image
]
 then

		row

			:
tag
(
'td'
)

				:
addClass
(
cfg
.
class
.
noviewer
)

				:
addClass
(
cfg
.
class
.
navbox_image
)

				:
addClass
(
args
[
cfg
.
arg
.
imageclass
])

				:
css
(
'width'
,
 '1px'
)
               -- Minimize width

				:
css
(
'padding'
,
 '0 0 0 2px'
)

				:
cssText
(
args
[
cfg
.
arg
.
imagestyle
])

				:
attr
(
'rowspan'
,
 listnums_size
)

				:
tag
(
'div'
)

					:
wikitext
(
processItem
(
args
[
cfg
.
arg
.
image
]))

	end

end


local
 function
 has_list_class
(
htmlclass
)

	local
 patterns
 =
 {

		'^'
 ..
 htmlclass
 ..
 '$'
,

		'%s'
 ..
 htmlclass
 ..
 '$'
,

		'^'
 ..
 htmlclass
 ..
 '%s'
,

		'%s'
 ..
 htmlclass
 ..
 '%s'

	}

	
	for
 arg
,
 _
 in
 pairs
(
args
)
 do

		if
 type
(
arg
)
 ==
 'string'
 and
 mw
.
ustring
.
find
(
arg
,
 cfg
.
pattern
.
class
)
 then

			for
 _
,
 pattern
 in
 ipairs
(
patterns
)
 do

				if
 mw
.
ustring
.
find
(
args
[
arg
]
 or
 ''
,
 pattern
)
 then

					return
 true

				end

			end

		end

	end

	return
 false

end


-- there are a lot of list classes in the wild, so we add their TemplateStyles

local
 function
 add_list_styles
()

	local
 frame
 =
 mw
.
getCurrentFrame
()

	local
 function
 add_list_templatestyles
(
htmlclass
,
 templatestyles
)

		if
 has_list_class
(
htmlclass
)
 then

			return
 frame
:
extensionTag
{

				name
 =
 'templatestyles'
,
 args
 =
 {
 src
 =
 templatestyles
 }

			}

		else

			return
 ''

		end

	end

	
	local
 hlist_styles
 =
 add_list_templatestyles
(
'hlist'
,
 cfg
.
hlist_templatestyles
)

	local
 plainlist_styles
 =
 add_list_templatestyles
(
'plainlist'
,
 cfg
.
plainlist_templatestyles
)

	
	-- a second workaround for [[phab:T303378]]

	-- when that issue is fixed, we can actually use has_navbar not to emit the

	-- tag here if we want

	if
 has_navbar
()
 and
 hlist_styles
 ==
 ''
 then

		hlist_styles
 =
 frame
:
extensionTag
{

			name
 =
 'templatestyles'
,
 args
 =
 {
 src
 =
 cfg
.
hlist_templatestyles
 }

		}

	end

	
	-- hlist -> plainlist is best-effort to preserve old Common.css ordering.

	-- this ordering is not a guarantee because most navboxes will emit only

	-- one of these classes [hlist_note]

	return
 hlist_styles
 ..
 plainlist_styles

end


local
 function
 needsHorizontalLists
(
border
)

	if
 border
 ==
 cfg
.
keyword
.
border_subgroup
 or
 args
[
cfg
.
arg
.
tracking
]
 ==
 cfg
.
keyword
.
tracking_no
 then

		return
 false

	end

	return
 not
 has_list_class
(
cfg
.
pattern
.
hlist
)
 and
 not
 has_list_class
(
cfg
.
pattern
.
plainlist
)

end


local
 function
 hasBackgroundColors
()

	for
 _
,
 key
 in
 ipairs
({
cfg
.
arg
.
titlestyle
,
 cfg
.
arg
.
groupstyle
,

		cfg
.
arg
.
basestyle
,
 cfg
.
arg
.
abovestyle
,
 cfg
.
arg
.
belowstyle
})
 do

		if
 tostring
(
args
[
key
]):
find
(
'background'
,
 1
,
 true
)
 then

			return
 true

		end

	end

	return
 false

end


local
 function
 hasBorders
()

	for
 _
,
 key
 in
 ipairs
({
cfg
.
arg
.
groupstyle
,
 cfg
.
arg
.
basestyle
,

		cfg
.
arg
.
abovestyle
,
 cfg
.
arg
.
belowstyle
})
 do

		if
 tostring
(
args
[
key
]):
find
(
'border'
,
 1
,
 true
)
 then

			return
 true

		end

	end

	return
 false

end


local
 function
 isIllegible
()

	local
 styleratio
 =
 require
(
'Module:Color contrast'
).
_styleratio

	for
 key
,
 style
 in
 pairs
(
args
)
 do

		if
 tostring
(
key
):
match
(
cfg
.
pattern
.
style
)
 then

			if
 styleratio
{
mw
.
text
.
unstripNoWiki
(
style
)}
 <
 4.5
 then

				return
 true

			end

		end

	end

	return
 false

end


local
 function
 getTrackingCategories
(
border
)

	local
 cats
 =
 {}

	if
 needsHorizontalLists
(
border
)
 then
 table.insert
(
cats
,
 cfg
.
category
.
horizontal_lists
)
 end

	if
 hasBackgroundColors
()
 then
 table.insert
(
cats
,
 cfg
.
category
.
background_colors
)
 end

	if
 isIllegible
()
 then
 table.insert
(
cats
,
 cfg
.
category
.
illegible
)
 end

	if
 hasBorders
()
 then
 table.insert
(
cats
,
 cfg
.
category
.
borders
)
 end

	return
 cats

end


local
 function
 renderTrackingCategories
(
builder
,
 border
)

	local
 title
 =
 mw
.
title
.
getCurrentTitle
()

	if
 title
.
namespace
 ~=
 10
 then
 return
 end
 -- not in template space

	local
 subpage
 =
 title
.
subpageText

	if
 subpage
 ==
 cfg
.
keyword
.
subpage_doc
 or
 subpage
 ==
 cfg
.
keyword
.
subpage_sandbox

		or
 subpage
 ==
 cfg
.
keyword
.
subpage_testcases
 then
 return
 end


	for
 _
,
 cat
 in
 ipairs
(
getTrackingCategories
(
border
))
 do

		builder
:
wikitext
(
'[[Category:'
 ..
 cat
 ..
 ']]'
)

	end

end


local
 function
 renderMainTable
(
border
,
 listnums
)

	local
 tbl
 =
 mw
.
html
.
create
(
'table'
)

		:
addClass
(
cfg
.
class
.
nowraplinks
)

		:
addClass
(
args
[
cfg
.
arg
.
bodyclass
])


	local
 state
 =
 args
[
cfg
.
arg
.
state
]

	if
 args
[
cfg
.
arg
.
title
]
 and
 state
 ~=
 cfg
.
keyword
.
state_plain
 and
 state
 ~=
 cfg
.
keyword
.
state_off
 then

		if
 state
 ==
 cfg
.
keyword
.
state_collapsed
 then

			state
 =
 cfg
.
class
.
collapsed

		end

		tbl

			:
addClass
(
cfg
.
class
.
collapsible
)

			:
addClass
(
state
 or
 cfg
.
class
.
autocollapse
)

	end


	tbl
:
css
(
'border-spacing'
,
 0
)

	if
 border
 ==
 cfg
.
keyword
.
border_subgroup
 or
 border
 ==
 cfg
.
keyword
.
border_none
 then

		tbl

			:
addClass
(
cfg
.
class
.
navbox_subgroup
)

			:
cssText
(
args
[
cfg
.
arg
.
bodystyle
])

			:
cssText
(
args
[
cfg
.
arg
.
style
])

	else
  -- regular navbox - bodystyle and style will be applied to the wrapper table

		tbl

			:
addClass
(
cfg
.
class
.
navbox_inner
)

			:
css
(
'background'
,
 'transparent'
)

			:
css
(
'color'
,
 'inherit'
)

	end

	tbl
:
cssText
(
args
[
cfg
.
arg
.
innerstyle
])


	renderTitleRow
(
tbl
)

	renderAboveRow
(
tbl
)

	local
 listnums_size
 =
 #
listnums

	for
 i
,
 listnum
 in
 ipairs
(
listnums
)
 do

		renderListRow
(
tbl
,
 i
,
 listnum
,
 listnums_size
)

	end

	renderBelowRow
(
tbl
)


	return
 tbl

end


local
 function
 add_navbox_styles
(
hiding_templatestyles
)

	local
 frame
 =
 mw
.
getCurrentFrame
()

	-- This is a lambda so that it doesn't need the frame as a parameter

	local
 function
 add_user_styles
(
templatestyles
)

		if
 templatestyles
 and
 templatestyles
 ~=
 ''
 then

			return
 frame
:
extensionTag
{

				name
 =
 'templatestyles'
,
 args
 =
 {
 src
 =
 templatestyles
 }

			}

		end

		return
 ''

	end


	-- get templatestyles. load base from config so that Lua only needs to do

	-- the work once of parser tag expansion

	local
 base_templatestyles
 =
 cfg
.
templatestyles

	local
 templatestyles
 =
 add_user_styles
(
args
[
cfg
.
arg
.
templatestyles
])

	local
 child_templatestyles
 =
 add_user_styles
(
args
[
cfg
.
arg
.
child_templatestyles
])


	-- The 'navbox-styles' div exists to wrap the styles to work around T200206

	-- more elegantly. Instead of combinatorial rules, this ends up being linear

	-- number of CSS rules.

	return
 mw
.
html
.
create
(
'div'
)

		:
addClass
(
cfg
.
class
.
navbox_styles
)

		:
wikitext
(

			add_list_styles
()
 ..
 -- see [hlist_note] applied to 'before base_templatestyles'

			base_templatestyles
 ..

			templatestyles
 ..

			child_templatestyles
 ..

			table.concat
(
hiding_templatestyles
)

		)

		:
done
()

end


-- work around [[phab:T303378]]

-- for each arg: find all the templatestyles strip markers, insert them into a

-- table. then remove all templatestyles markers from the arg

local
 function
 move_hiding_templatestyles
(
args
)

	local
 gfind
 =
 string
.
gfind

	local
 gsub
 =
 string.gsub

	local
 templatestyles_markers
 =
 {}

	local
 strip_marker_pattern
 =
 '(
\127
[^
\127
]*UNIQ%-%-templatestyles%-%x+%-QINU[^
\127
]*
\127
)'

	for
 k
,
 arg
 in
 pairs
(
args
)
 do

		for
 marker
 in
 gfind
(
arg
,
 strip_marker_pattern
)
 do

			table.insert
(
templatestyles_markers
,
 marker
)

		end

		args
[
k
]
 =
 gsub
(
arg
,
 strip_marker_pattern
,
 ''
)

	end

	return
 templatestyles_markers

end


function
 p
.
_navbox
(
navboxArgs
)

	args
 =
 navboxArgs

	local
 hiding_templatestyles
 =
 move_hiding_templatestyles
(
args
)

	local
 listnums
 =
 {}


	for
 k
,
 _
 in
 pairs
(
args
)
 do

		if
 type
(
k
)
 ==
 'string'
 then

			local
 listnum
 =
 k
:
match
(
cfg
.
pattern
.
listnum
)

			if
 listnum
 then
 table.insert
(
listnums
,
 tonumber
(
listnum
))
 end

		end

	end

	table.sort
(
listnums
)


	local
 border
 =
 mw
.
text
.
trim
(
args
[
cfg
.
arg
.
border
]
 or
 args
[
1
]
 or
 ''
)

	if
 border
 ==
 cfg
.
keyword
.
border_child
 then

		border
 =
 cfg
.
keyword
.
border_subgroup

	end


	-- render the main body of the navbox

	local
 tbl
 =
 renderMainTable
(
border
,
 listnums
)


	local
 res
 =
 mw
.
html
.
create
()

	-- render the appropriate wrapper for the navbox, based on the border param


	if
 border
 ==
 cfg
.
keyword
.
border_none
 then

		res
:
node
(
add_navbox_styles
(
hiding_templatestyles
))

		local
 nav
 =
 res
:
tag
(
'div'
)

			:
attr
(
'role'
,
 'navigation'
)

			:
node
(
tbl
)

		-- aria-labelledby title, otherwise above, otherwise lone group

		if
 args
[
cfg
.
arg
.
title
]
 or
 args
[
cfg
.
arg
.
above
]
 or
 (
args
[
cfg
.
arg
.
group1
]

			and
 not
 args
[
cfg
.
arg
.
group2
])
 then

			nav
:
attr
(

				'aria-labelledby'
,

				mw
.
uri
.
anchorEncode
(

					args
[
cfg
.
arg
.
title
]
 or
 args
[
cfg
.
arg
.
above
]
 or
 args
[
cfg
.
arg
.
group1
]

				)

			)

		else

			nav
:
attr
(
'aria-label'
,
 cfg
.
aria_label
)

		end

	elseif
 border
 ==
 cfg
.
keyword
.
border_subgroup
 then

		-- We assume that this navbox is being rendered in a list cell of a

		-- parent navbox, and is therefore inside a div with padding:0em 0.25em.

		-- We start with a </div> to avoid the padding being applied, and at the

		-- end add a <div> to balance out the parent's </div>

		res

			:
wikitext
(
'</div>'
)

			:
node
(
tbl
)

			:
wikitext
(
'<div>'
)

	else

		res
:
node
(
add_navbox_styles
(
hiding_templatestyles
))

		local
 nav
 =
 res
:
tag
(
'div'
)

			:
attr
(
'role'
,
 'navigation'
)

			:
addClass
(
cfg
.
class
.
navbox
)

			:
addClass
(
args
[
cfg
.
arg
.
navboxclass
])

			:
cssText
(
args
[
cfg
.
arg
.
bodystyle
])

			:
cssText
(
args
[
cfg
.
arg
.
style
])

			:
css
(
'padding'
,
 '3px'
)

			:
node
(
tbl
)

		-- aria-labelledby title, otherwise above, otherwise lone group

		if
 args
[
cfg
.
arg
.
title
]
 or
 args
[
cfg
.
arg
.
above
]

			or
 (
args
[
cfg
.
arg
.
group1
]
 and
 not
 args
[
cfg
.
arg
.
group2
])
 then

			nav
:
attr
(

				'aria-labelledby'
,

				mw
.
uri
.
anchorEncode
(
args
[
cfg
.
arg
.
title
]
 or
 args
[
cfg
.
arg
.
above
]
 or
 args
[
cfg
.
arg
.
group1
])

			)

		else

			nav
:
attr
(
'aria-label'
,
 cfg
.
aria_label
)

		end

	end


	if
 (
args
[
cfg
.
arg
.
nocat
]
 or
 cfg
.
keyword
.
nocat_false
):
lower
()
 ==
 cfg
.
keyword
.
nocat_false
 then

		renderTrackingCategories
(
res
,
 border
)

	end

	return
 striped
(
tostring
(
res
),
 border
)

end


function
 p
.
navbox
(
frame
)

	if
 not
 getArgs
 then

		getArgs
 =
 require
(
'Module:Arguments'
).
getArgs

	end

	args
 =
 getArgs
(
frame
,
 {
wrappers
 =
 {
cfg
.
pattern
.
navbox
}})


	-- Read the arguments in the order they'll be output in, to make references

	-- number in the right order.

	local
 _

	_
 =
 args
[
cfg
.
arg
.
title
]

	_
 =
 args
[
cfg
.
arg
.
above
]

	-- Limit this to 20 as covering 'most' cases (that's a SWAG) and because

	-- iterator approach won't work here

	for
 i
 =
 1
,
 20
 do

		_
 =
 args
[
format
(
cfg
.
arg
.
group_and_num
,
 i
)]

		_
 =
 args
[
format
(
cfg
.
arg
.
list_and_num
,
 i
)]

	end

	_
 =
 args
[
cfg
.
arg
.
below
]


	return
 p
.
_navbox
(
args
)

end


return
 p