Module:Navbox: Difference between revisions

    m>Edokter
    (Revert border-spacing; collapses cells in hand-build navboxes.)
    imported>Dinoguy1000
    (minor whitespace: trim trailing spaces; tabs --> spaces)
    Line 2: Line 2:
    -- This module implements {{Navbox}}
    -- This module implements {{Navbox}}
    --
    --
     
    local p = {}
    local p = {}


    Line 32: Line 32:
                     :css('height', '2px')
                     :css('height', '2px')
                     :tag('td')
                     :tag('td')
                    :attr('colspan',2)
                        :attr('colspan',2)
         end
         end
       
     
         tableRowAdded = true
         tableRowAdded = true
       
     
         return tbl:tag('tr')
         return tbl:tag('tr')
    end
    end
    Line 43: Line 43:
         -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left
         -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left
         -- or right to keep the title centered.
         -- or right to keep the title centered.
    local spacerSide = nil
        local spacerSide = nil


    if args.navbar == 'off' then
        if args.navbar == 'off' then
             -- No navbar, and client wants no spacer, i.e. wants the title to be shifted to the left. If there's
             -- No navbar, and client wants no spacer, i.e. wants the title to be shifted to the left. If there's
             -- also no show/hide link, then we need a spacer on the right to achieve the left shift.
             -- also no show/hide link, then we need a spacer on the right to achieve the left shift.
    Line 57: Line 57:
             if args.state == 'plain' then spacerSide = 'right' end
             if args.state == 'plain' then spacerSide = 'right' end


             titleCell:wikitext(navbar{  
             titleCell:wikitext(navbar{
                 args.name,  
                 args.name,
                 mini = 1,  
                 mini = 1,
                 fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') ..  ';background:none transparent;border:none;'
                 fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') ..  ';background:none transparent;border:none;'
             })
             })
         end
         end
       
     
         -- Render the spacer div.
         -- Render the spacer div.
         if spacerSide then
         if spacerSide then
    Line 79: Line 79:
    local function renderTitleRow(tbl)
    local function renderTitleRow(tbl)
         if not args.title then return end
         if not args.title then return end
     
         local titleRow = addTableRow(tbl)
         local titleRow = addTableRow(tbl)


    Line 93: Line 93:
                     :wikitext(args.titlegroup)
                     :wikitext(args.titlegroup)
         end
         end
       
     
         local titleCell = titleRow:tag('th'):attr('scope', 'col')
         local titleCell = titleRow:tag('th'):attr('scope', 'col')
               
     
         if args.titlegroup then
         if args.titlegroup then
             titleCell
             titleCell
    Line 101: Line 101:
                 :css('width', '100%')
                 :css('width', '100%')
         end
         end
       
     
         local titleColspan = 2
         local titleColspan = 2
         if args.imageleft then titleColspan = titleColspan + 1 end
         if args.imageleft then titleColspan = titleColspan + 1 end
         if args.image then titleColspan = titleColspan + 1 end
         if args.image then titleColspan = titleColspan + 1 end
         if args.titlegroup then titleColspan = titleColspan - 1 end
         if args.titlegroup then titleColspan = titleColspan - 1 end
       
     
         titleCell
         titleCell
             :cssText(args.basestyle)
             :cssText(args.basestyle)
    Line 112: Line 112:
             :addClass('navbox-title')
             :addClass('navbox-title')
             :attr('colspan', titleColspan)
             :attr('colspan', titleColspan)
     
         renderNavBar(titleCell)
         renderNavBar(titleCell)


    Line 160: Line 160:
                     :wikitext(addNewline(args.below))
                     :wikitext(addNewline(args.below))
    end
    end
     
    --
    --
    --  List rows
    --  List rows
    Line 166: Line 166:
    local function renderListRow(tbl, listnum)
    local function renderListRow(tbl, listnum)
         local row = addTableRow(tbl)
         local row = addTableRow(tbl)
       
     
         if listnum == 1 and args.imageleft then
         if listnum == 1 and args.imageleft then
             row
             row
    Line 179: Line 179:
                         :wikitext(addNewline(args.imageleft))
                         :wikitext(addNewline(args.imageleft))
         end
         end
     
    if args['group' .. listnum] then
        if args['group' .. listnum] then
             local groupCell = row:tag('th')
             local groupCell = row:tag('th')


    groupCell
            groupCell
    :attr('scope', 'row')
                :attr('scope', 'row')
    :addClass('navbox-group')
                :addClass('navbox-group')
    :addClass(args.groupclass)
                :addClass(args.groupclass)
    :cssText(args.basestyle)
                :cssText(args.basestyle)
     
             if args.groupwidth then
             if args.groupwidth then
                 groupCell:css('width', args.groupwidth)
                 groupCell:css('width', args.groupwidth)
             end
             end


    groupCell
            groupCell
                 :cssText(args.groupstyle)
                 :cssText(args.groupstyle)
                 :cssText(args['group' .. listnum .. 'style'])
                 :cssText(args['group' .. listnum .. 'style'])
                 :wikitext(args['group' .. listnum])
                 :wikitext(args['group' .. listnum])
         end
         end
       
     
         local listCell = row:tag('td')
         local listCell = row:tag('td')


    if args['group' .. listnum] then
        if args['group' .. listnum] then
             listCell
             listCell
                 :css('text-align', 'left')
                 :css('text-align', 'left')
    Line 209: Line 209:
             listCell:attr('colspan', 2)
             listCell:attr('colspan', 2)
         end
         end
       
     
         if not args.groupwidth then  
         if not args.groupwidth then
             listCell:css('width', '100%')
             listCell:css('width', '100%')
         end
         end
       
     
         local isOdd = (listnum % 2) == 1
         local isOdd = (listnum % 2) == 1
         local rowstyle = args.evenstyle
         local rowstyle = args.evenstyle
         if isOdd then rowstyle = args.oddstyle end
         if isOdd then rowstyle = args.oddstyle end
     
         local evenOdd
         local evenOdd
         if args.evenodd == 'swap' then
         if args.evenodd == 'swap' then
    Line 257: Line 257:


    local function needsHorizontalLists()
    local function needsHorizontalLists()
    if border == 'child' or border == 'subgroup'  or args.tracking == 'no' then return false end
        if border == 'child' or border == 'subgroup'  or args.tracking == 'no' then return false end
       
     
         local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'}
         local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'}
         for i, cls in ipairs(listClasses) do
         for i, cls in ipairs(listClasses) do
    Line 285: Line 285:
         local subpage = title.subpageText
         local subpage = title.subpageText
         if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
         if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
       
     
         for i, cat in ipairs(getTrackingCategories()) do
         for i, cat in ipairs(getTrackingCategories()) do
             builder:wikitext('[[Category:' .. cat .. ']]')  
             builder:wikitext('[[Category:' .. cat .. ']]')
         end
         end
    end
    end
    Line 304: Line 304:
                 :addClass(args.state or 'autocollapse')
                 :addClass(args.state or 'autocollapse')
         end
         end
     
         tbl:css('border-spacing', 0)
         tbl:css('border-spacing', 0)
         if border == 'subgroup' or border == 'child' or border == 'none' then
         if border == 'subgroup' or border == 'child' or border == 'none' then
    Line 318: Line 318:
         end
         end
         tbl:cssText(args.innerstyle)
         tbl:cssText(args.innerstyle)
     
         renderTitleRow(tbl)
         renderTitleRow(tbl)
         renderAboveRow(tbl)
         renderAboveRow(tbl)
         for i, listnum in ipairs(listnums) do
         for i, listnum in ipairs(listnums) do
             renderListRow(tbl, listnum)  
             renderListRow(tbl, listnum)
         end
         end
         renderBelowRow(tbl)
         renderBelowRow(tbl)
       
     
         return tbl
         return tbl
    end
    end
    Line 331: Line 331:
    function p._navbox(navboxArgs)
    function p._navbox(navboxArgs)
         args = navboxArgs
         args = navboxArgs
       
     
         for k, v in pairs(args) do
         for k, v in pairs(args) do
             local listnum = ('' .. k):match('^list(%d+)$')
             local listnum = ('' .. k):match('^list(%d+)$')
    Line 337: Line 337:
         end
         end
         table.sort(listnums)
         table.sort(listnums)
     
         border = trim(args.border or args[1] or '')
         border = trim(args.border or args[1] or '')


    Line 367: Line 367:
                             :node(tbl)
                             :node(tbl)
         end
         end
     
         renderTrackingCategories(res)
         renderTrackingCategories(res)
     
         return tostring(res)
         return tostring(res)
    end
    end
     
    function p.navbox(frame)
    function p.navbox(frame)
         if not getArgs then
         if not getArgs then
        getArgs = require('Module:Arguments').getArgs
            getArgs = require('Module:Arguments').getArgs
         end
         end
         args = getArgs(frame, {wrappers = 'Template:Navbox'})
         args = getArgs(frame, {wrappers = 'Template:Navbox'})
    Line 386: Line 386:
             _ = args["group" .. tostring(i)]
             _ = args["group" .. tostring(i)]
             _ = args["list" .. tostring(i)]
             _ = args["list" .. tostring(i)]
         end  
         end
         _ = args.below
         _ = args.below


         return p._navbox(args)
         return p._navbox(args)
    end
    end
     
    return p
    return p