Module:Navbox

-- -- This module will implement --

local p = {}

local gutterRow = '  ' local border local listnums = {} local ret = {}

function add(...) local args = {...} for i = 1, #args do       if args[i] then table.insert(ret, args[i]) end end end

function trim(s) return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) end

function renderTitleRow(args) if not args.title then return end add(' ') if args.titlegroup then add('', args.titlegroup, ' ')

local stateLinkPlaceholder = ' ' if args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then if args.navbar == 'off' then if args.state == 'plain' then add(stateLinkPlaceholder) end else if args.state ~= 'plain' then add(stateLinkPlaceholder) end end else if args.name then add(mw.getCurrentFrame:expandTemplate{ title = 'navbar', args = {                args.name,                 mini = 1,                 fontstyle = (args.basestyle or ) .. ';' .. (args.titlestyle or ) ..  ';background:none transparent;border:none;'            }}) else add(' Error: No name provided ') if args.state == 'plain' then add(stateLinkPlaceholder) end end end

add('') add(args.title) add('  ') end

function renderAboveRow(args) if not args.above then return end if args.title then add(gutterRow) end add(' ') add(' \n', args.above, '  ') end function renderBelowRow(args) if args.below then if args.title or args.above or #listnums > 0 then add(gutterRow) end add(' ') add(' \n', args.below, '  ') end end function getAboveBelowColspan(args) local ret = 2 if args.imageleft then ret = ret + 1 end if args.image then ret = ret + 1 end return ret end

function renderFirstListRow(args) if not args.list1 then return end if args.title or args.above then add(gutterRow) end add(' ') if args.imageleft then add(' \n', args.imageleft, ' ') end

if args.group1 then add('') add(args.group1, ' ') add('')   add('\n')    add(args.list1)    add('  ')

if args.image then add('') add(' \n', args.image, ' ') end add(' ') end

function renderNthListRow(args, listnum) if args.title or args.above or args.list1 then add(gutterRow) end add(' ') if args['group' .. listnum] then add('') add(args['group' .. listnum]) add(' <td style="text-align:left;border-left-width:2px;border-left-style:solid;')   else        add('<td colspan=2 style="') end if not args.groupwidth then add('width:100%;') end local isOdd = (listnum % 2) == 1 local rowstyle = args.evenstyle if isOdd then rowstyle = args.oddstyle end add('padding:0px;', args.liststyle, ';', rowstyle, ';', args['list' .. listnum .. 'style'], '" ')   add('class="navbox-list navbox-') if args.evenodd == 'swap' then if isOdd then add('even') else add('odd') end else if isOdd then add(args.evenodd or 'odd') else add(args.evenodd or 'even') end end add(' ', args.listclass, '">')   add('\n', args['list' .. listnum], '   ') end

function p._navbox(args) for k, v in pairs(args) do       local listnum = ('' .. k):match('^list(%d+)$') if listnum then table.insert(listnums, tonumber(listnum)) end end table.sort(listnums) border = trim(args.border or args[1] or '') if border == 'subgroup' or border == 'child' then add(' ') elseif border ~= 'none' then add(' ') if border == 'subgroup' or border == 'child' then add(' ') elseif border ~= 'none' then add('  ') end

-- TODO: add tracking categories return table.concat(ret, '') end

function p.navbox(frame) return p._navbox(frame:getParent.args) end

return p