Module:Navbox

From Timelines
Revision as of 01:35, 25 February 2013 by Toohool (talk) (Created page with '-- -- This module will implement {{Navbox}} -- local p = {} local gutterRow = '<tr style="height:2px;"><td></td></tr>' local ret = {} function add(...) fo...')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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

--
-- This module will implement {{Navbox}}
--

local p = {}

local gutterRow = '<tr style="height:2px;"><td></td></tr>'

local ret = {}
function add(...)
    for i, s in ipairs({...}) do
        if s then
            table.insert(ret, s)
        end
    end
end

function renderList(args, listnum)
    if args.title or args.above or args.list1 then
        add(gutterRow)
    end
    add('<tr>')
    if args['group' .. listnum] then
        add('<th scope="row" class="navbox-group ', args.groupclass, '" style="', args.basestyle, ';')
        if args.groupwidth then add('width:', args.groupwidth, ';') end
        add(args.groupstyle, ';', args['group' .. listnum .. 'style'], '">')
        add(args['group' .. listnum])
        add('</th><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('<div style="padding:', args.listpadding or '0em 0.25em', '">', args['list' .. listnum], '</div></td></tr>')
end

function p._navbox(args)
    local listnums = {}
    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)
    
    local border = args.border or args[1]
    if border == 'subgroup' or border == 'child' then
        add('</div>')
    elseif border ~= 'none' then
        add('<table cellspacing="0" class="navbox" style="border-spacing:0;', args.bodystyle, ';', args.style, '"><tr><td style="padding:2px;">')
    end
    
    add('<table cellspacing="0" class="nowraplinks ', args.bodyclass, ' ')
    
    if args.title and (args.state ~= 'plain' and args.state ~= 'off') then
        add('collapsible ', args.state or 'autocollapse', ' ')
    end
    
    if border == 'subgroup' or border == 'child' or border == 'none' then
        add('navbox-subgroup" style="border-spacing:0;', args.bodystyle, ';', args.style)
    else
        add('navbox-inner" style="border-spacing:0;background:transparent;color:inherit')
    end
    add(';', args.innerstyle, ';">')
    
    if args.title then
        if args.titlegroup then
            add('<th scope="row" class="navbox-group ', args.titlegroupclass, '" style="', args.basestyle, ';', args.groupstyle, ';', args.titlegroupstyle, '">', args.titlegroup, '</th><th scope="col" style="border-left:2px solid #fdfdfd;width:100%;')
        else
            add('<th scope="col" style="')
        end
        local colspan = 2
        if args.imageleft then colspan = colspan + 1 end
        if args.image then colspan = colspan + 1 end
        if args.titlegroup then colspan = colspan - 1 end
        add(args.basestyle, ';', args.titlestyle, '" class="navbox-title" colspan=', colspan, '>')
    
        local stateLinkPlaceholder = '<span style="float:right;width:6em;">&nbsp;</span>'
        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('<span class="error" style="float:left;white-space:nowrap;">Error: No name provided</span>')
                if args.state == 'plain' then add(stateLinkPlaceholder) end
            end
        end
    
        add('<div class="', args.titleclass, '" style="font-size:110%;">')
        add(args.title)
        add('</div></th></tr>')
    end

    local aboveBelowColspan = 2
    if args.imageleft then aboveBelowColspan = aboveBelowColspan + 1 end
    if args.image then aboveBelowColspan = aboveBelowColspan + 1 end

    if args.above then
        if args.title then add(gutterRow) end
        add('<tr><td class="navbox-abovebelow ', args.aboveclass, '" style="', args.basestyle, ';', args.abovestyle, '" colspan="', aboveBelowColspan, '">')
        add('<div>', args.above, '</div></td></tr>')
    end

    if args.list1 then
        if args.title or args.above then add(gutterRow) end
        add('<tr>')
        if args.imageleft then
            add('<td class="navbox-image ', args.imageclass, '" style="width:0%;padding:0px 2px 0px 0px;', args.imageleftstyle, '"')
            add(' rowspan=', (2 * #listnums - 1), '><div>', args.imageleft, '</div></td>')
        end
    
        if args.group1 then
            add('<th scope="row" class="navbox-group ', args.groupclass, '" style="', args.basestyle, ';')
            if args.groupwidth then add('width:', args.groupwidth, ';') end
            add(args.groupstyle, ';', args.group1style, '">')
            add(args.group1, '</th>')
            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
        add('padding:0px;', args.liststyle, ';', args.oddstyle, ';', args.list1style, '" class="navbox-list navbox-')
        if args.evenodd == 'swap' then
            add('even')
        else
            add(args.evenodd or 'odd')
        end
        add(' ', args.listclass, '">')
        add('<div style="padding:', args.list1padding or args.listpadding or '0em 0.25em', '">')
        add(args.list1)
        add('</div></td>')

        if args.image then
            add('<td class="navbox-image ', args.imageclass, '" style="width:0%;padding:0px 0px 0px 2px;', args.imagestyle, '" ')
            add(' rowspan=', (2 * #listnums - 1), '>')
            add('<div>', args.image, '</div></td>')
        end
        
        add('</tr>')
    end

    -- render lists 2 through N
    for i, listnum in ipairs(listnums) do
        if listnum > 1 then
            renderList(args, listnum) 
        end
    end
    
    if args.below then
        if args.title or args.above or #listnums > 0 then add(gutterRow) end
        add('<tr><td class="navbox-abovebelow ', args.belowclass, '" style="', args.basestyle, ';', args.belowstyle, '"  colspan="', aboveBelowColspan, '">')
        add('<div>', args.below, '</div></td></tr>')
    end

    add('</table>')
    
    if border == 'subgroup' or border == 'child' then
        add('<div>')
    elseif border ~= 'none' then
        add('</td></tr></table>')
    end

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

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

return p