Module:Navbox with collapsible groups explained

-- This module implements

require('strict')local p = local parentCfg = mw.loadData('Module:Navbox/configuration')local thisCfg = mw.loadData('Module:Navbox with collapsible groups/configuration')local cfg = for k, v in pairs(thisCfg) do if type(v)

'table' then cfg[k] = if type(parentCfg[k])

'table' then for kk, vv in pairs(parentCfg[k]) do cfg[k][kk] = vv end end for kk, vv in pairs(v) do cfg[k][kk] = vv end endendlocal inArray = require("Module:TableTools").inArraylocal getArgs -- lazily initialized

-- helper functionslocal andnum = function(s, n) return string.format(cfg.arg[s..'_and_num'], n) end local isblank = function(v) return (v or )

end

local function concatstrings(s) local r = table.concat(s, ) if r:match('^%s*$') then return nil end return rend local function concatstyles(s) local r = for _, v in ipairs(s) do v = mw.text.trim(v, "%s;") if not isblank(v) then r = r .. v .. ';' end end if isblank(r) then return nil end return rend local function getSubgroup(args, listnum, listText) local subArgs = local hasSubArgs = false for k, v in pairs(args) do k = tostring(k) for _, w in ipairs(cfg.keyword.subgroups) do w = w .. listnum .. "_" if (#k > #w) and (k:sub(1, #w)

w) then subArgs[k:sub(#w + 1)] = v hasSubArgs = true end end end return hasSubArgs and p._navbox(subArgs) or listTextend

-- Main functionsp._navbox = require('Module:Navbox')._navbox

function p._withCollapsibleGroups(pargs) -- table for args passed to navbox local targs =

-- process args local passthrough = for k,v in pairs(pargs) do if k and type(k)

'string' then if passthrough[k] then targs[k] = v elseif (k:match(cfg.pattern.num)) then local n = k:match(cfg.pattern.num) local list_and_num = andnum('list', n) if ((k:match(cfg.pattern.listnum) or k:match(cfg.pattern.contentnum)) and targs[list_and_num]

nil and pargs[andnum('group', n)]

nil and pargs[andnum('sect', n)]

nil and pargs[andnum('section', n)]

nil) then targs[list_and_num] = concatstrings if (targs[list_and_num] and inArray(cfg.keyword.subgroups, targs[list_and_num])) then targs[list_and_num] = getSubgroup(pargs, n, targs[list_and_num]) end elseif ((k:match(cfg.pattern.groupnum) or k:match(cfg.pattern.sectnum) or k:match(cfg.pattern.sectionnum)) and targs[list_and_num]

nil) then local titlestyle = concatstyles local liststyle = concatstyles local title = concatstrings local list = concatstrings if list and inArray(cfg.keyword.subgroups, list) then list = getSubgroup(pargs, n, list) end local abbr_and_num = andnum('abbr', n) local state = (pargs[abbr_and_num] and pargs[abbr_and_num]

pargs[cfg.arg.selected]) and cfg.keyword.state_uncollapsed or (pargs[andnum('state', n)] or cfg.keyword.state_collapsed) targs[list_and_num] =p._navbox end end end end -- ordering of style and bodystyle targs[cfg.arg.style] = concatstyles targs[cfg.arg.bodystyle] = nil -- child or subgroup if targs[cfg.arg.border]

nil then targs[cfg.arg.border] = pargs[1] end

return p._navbox(targs)end

-- Template entry pointsfunction p.navbox (frame, boxtype) local function readArgs(args, prefix) -- Read the arguments in the order they'll be output in, to make references -- number in the right order. local _ _ = args[prefix .. cfg.arg.title] _ = args[prefix .. 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[prefix .. andnum('group', i)] if inArray(cfg.keyword.subgroups, args[prefix .. andnum('list', i)]) then for _, v in ipairs(cfg.keyword.subgroups) do readArgs(args, prefix .. v .. i .. "_") end end end _ = args[prefix .. cfg.arg.below] end

if not getArgs then getArgs = require('Module:Arguments').getArgs end local args = getArgs(frame,) readArgs(args, "") return p['_'..(boxtype or 'navbox')](args)end

p['with collapsible groups'] = function (frame) return p.navbox(frame, 'withCollapsibleGroups')end

local q = q._navbox = p._withCollapsibleGroupsq.navbox = p['with collapsible groups']return q