Module:Navbox with collapsible groups
Appearance
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This Lua module is used on approximately 16,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
![]() | This module depends on the following other modules: |
Implements {{Navbox with collapsible groups}}
Usage
{{#invoke:Navbox with collapsible groups|navbox}}
See Template:Navbox with collapsible groups for more detailed usage.
See also
-- This module implements {{Navbox with collapsible groups}}
local p = {}
local Navbox = require('Module:Navbox')
local getArgs -- lazily initialized
-- helper functions
local function concatstrings(t)
local res = table.concat(t, '')
if res:match('^%s*$') then res = nil end
return res
end
local function concatstyles(t)
local res = table.concat(t, ';')
while res:match(';%s*;') do
res = mw.ustring.gsub(res, ';%s*;', ';')
end
if res:match('^%s*;%s*$') then res = nil end
return res
end
function p._navbox(args)
-- table for args passed to navbox
local targs = {}
-- process args
local passthrough = {
['name']=1,['navbar']=1,['state']=1,['border']=1,
['bodyclass']=1,['groupclass']=1,['listclass']=1,
['style']=1,['bodystyle']=1,['basestyle']=1,
['title']=1,['titleclass']=1,['titlestyle']=1,
['above']=1,['aboveclass']=1,['abovestyle']=1,
['below']=1,['belowclass']=1,['belowstyle']=1,
['image']=1,['imageclass']=1,['imagestyle']=1,
['imageleft']=1,['imageleftstyle']=1
}
for k,v in pairs(frame:getParent().args) do
if k and type(k) == 'string' then
if passthrough[k] then
targs[k] = v
elseif (k:match('^list[0-9][0-9]*$')
or k:match('^content[0-9][0-9]*$') ) then
local n = mw.ustring.gsub(k, '^[a-z]*([0-9]*)$', '%1')
if (targs['list' .. n] == nil and args['group' .. n] == nil
and args['sect' .. n] == nil and args['section' .. n] == nil) then
targs['list' .. n] = (args['list' .. n] or '') .. (args['content' .. n] or '')
end
elseif (k:match('^group[0-9][0-9]*$')
or k:match('^sect[0-9][0-9]*$')
or k:match('^section[0-9][0-9]*$') ) then
local n = mw.ustring.gsub(k, '^[a-z]*([0-9]*)$', '%1')
if targs['list' .. n] == nil then
local titlestyle = concatstyles(
{args['groupstyle'] or '',args['secttitlestyle'] or '',
args['group' .. n .. 'style'] or '',
args['section' .. n ..'titlestyle'] or ''})
local liststyle = concatstyles(
{args['liststyle'] or '', args['contentstyle'] or '',
args['list' .. n .. 'style'] or '',
args['content' .. n .. 'style'] or ''})
local title = concatstrings(
{args['group' .. n] or '',
args['sect' .. n] or '',
args['section' .. n] or ''})
local list = concatstrings(
{args['list' .. n] or '',
args['content' .. n] or ''})
local state = (args['abbr' .. n] and args['abbr' .. n] == args['selected'])
and 'uncollapsed' or args['state' .. n] or 'collapsed'
targs['list' .. n] = Navbox._navbox(
{navbar = 'plain', state = state,
basestyle = args['basestyle'],
title = title, titlestyle = titlestyle,
list = list, liststyle = liststyle,
listclass = args['list' .. n .. 'class'],
image = args['image' .. n],
imageleft = args['imageleft' .. n],
listpadding = args['listpadding']})
end
end
end
end
-- child or subgroup
if targs['border'] == nil then targs['border'] = args[1] end
return Navbox._navbox(targs)
end
function p.navbox(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
args = getArgs(frame, {wrappers = {'Template:Navbox with collapsible groups'}})
-- Read the arguments in the order they'll be output in, to make references number in the right order.
local _
_ = args.title
_ = args.above
for i = 1, 20 do
_ = args["group" .. tostring(i)]
_ = args["list" .. tostring(i)]
end
_ = args.below
return p._navbox(args)
end
return p