Module:NavboxMobile: Difference between revisions

No edit summary
No edit summary
 
(16 intermediate revisions by the same user not shown)
Line 150: Line 150:
         -- Applying nowrap to lines in a table does not make sense.
         -- Applying nowrap to lines in a table does not make sense.
         -- Add newlines to compensate for trim of x in |parm=x in a template.
         -- Add newlines to compensate for trim of x in |parm=x in a template.
        item = item:gsub('|%s*width%s*=%s*"[%d%w]+"', '| width="100%"')
         return '\n' .. item .. '\n'
         return '\n' .. item .. '\n'
     end
     end
     if nowrapitems == cfg.keyword.nowrapitems_yes then
     if nowrapitems == cfg.keyword.nowrapitems_yes or true then
         local lines = {}
         local lines = {}
         for line in (item .. '\n'):gmatch('([^\n]*)\n') do
         for line in (item .. '\n'):gmatch('([^\n]*)\n') do
Line 166: Line 167:
         return '\n' .. item .. '\n'
         return '\n' .. item .. '\n'
     end
     end
    -- Ensure no excessive whitespace
    item = mw.ustring.gsub(item, "%s+", " ")
     return item
     return item
end
end


-- Function to add a new table row with optional gutter
-- Function to add a new table row with optional gutter
Line 219: Line 223:
         :addClass(cfg.class.navbox_list)
         :addClass(cfg.class.navbox_list)
         :addClass(args[cfg.arg.titleclass])
         :addClass(args[cfg.arg.titleclass])
         :attr('data-level', 1) -- Level 1 for the main title
         :attr('data-level', 1)
         :attr('colspan', 2)
         :attr('colspan', 2)
         :cssText(args.basestyle)
         :cssText(args.basestyle)
         :cssText(args.titlestyle)
         :cssText(args.titlestyle)
        :css('position', 'relative')  -- Ensure relative positioning for absolute children


     -- Add the title content
     -- Add the title content, centered across the full width
     titleCell
     titleCell
         :tag('div')
         :tag('div')
             :css('font-size', '114%')
             :css('margin', '0 auto')
             :css('margin', '0')
             :css('text-align', 'center')
             :wikitext(addNewline(args.title))
             :wikitext(addNewline(args.title))
    -- Add the navbar, positioned absolutely in the top-right corner
    if has_navbar() then
        titleCell
            :tag('div')
                :addClass('navboxMobile-navbar')
                :css('position', 'absolute')
                :css('top', '0')
                :css('right', '0')
                :css('padding', '0.2em')  -- Optional: Adjust padding for alignment
                :wikitext(navbar{
                    args.name,
                    mini = 1,
                    fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;'
                })
    end
end
end


--
--
Line 257: Line 276:
                 :wikitext(addNewline(args.above))
                 :wikitext(addNewline(args.above))
end
end




Line 280: Line 298:


local function renderListRow(tbl, path, parentLevel)
local function renderListRow(tbl, path, parentLevel)
    -- Initialize path and parentLevel
     path = path or ""
     path = path or ""
     parentLevel = parentLevel or 2 -- Start at level 2 for child groups
     parentLevel = parentLevel or 2 -- Start at level 2 for child groups
    -- Keep track of rendered children to avoid duplicates
    local renderedChildren = {}


     for i = 1, 10 do
     for i = 1, 10 do
Line 287: Line 309:
         local listKey = (path ~= "" and "child" .. path .. "_" or "") .. "list" .. i
         local listKey = (path ~= "" and "child" .. path .. "_" or "") .. "list" .. i


         if args[groupKey] then
         -- Skip if this group has already been rendered
        if not renderedChildren[listKey] and args[listKey] then
            renderedChildren[listKey] = true -- Track rendered lists
 
             -- Render the group (heading)
             -- Render the group (heading)
             local groupRow = addTableRow(tbl)
             local groupRow = addTableRow(tbl)
Line 324: Line 349:
                         :addClass('navboxMobile-list-level' .. parentLevel) -- Correct level
                         :addClass('navboxMobile-list-level' .. parentLevel) -- Correct level
                         :addClass((i % 2 == 1) and 'navboxMobile-odd' or 'navboxMobile-even') -- Odd/even class
                         :addClass((i % 2 == 1) and 'navboxMobile-odd' or 'navboxMobile-even') -- Odd/even class
                         :addClass('hlist') -- Ensure `hlist` is applied for horizontal lists
                         :addClass(args.listclass or '') -- Apply `listclass` if defined in the template
                         :wikitext(processItem(args[listKey], args.nowrapitems))
                         :wikitext(processItem(args[listKey], args.nowrapitems))
                 end
                 end
Line 331: Line 356:
     end
     end
end
end




Line 402: Line 424:
     local tbl = mw.html.create('table')
     local tbl = mw.html.create('table')
         :addClass('nowraplinks')
         :addClass('nowraplinks')
         :addClass(cfg.class.navbox_list)
         :addClass(cfg.class.navbox)
         :addClass(args.bodyclass)
         :addClass(args.bodyclass)
        :addClass(args.listclass or '') -- Apply the `listclass` argument globally if applicable
         :cssText(args.bodystyle)
         :cssText(args.bodystyle)
         :cssText(args.style)
         :cssText(args.style)
Line 409: Line 432:
         :css('margin-bottom', '0')
         :css('margin-bottom', '0')


     -- Add title, above, and list rows
     -- Add the title row
     renderTitleRow(tbl)
     renderTitleRow(tbl)
    -- Add the above row
     renderAboveRow(tbl)
     renderAboveRow(tbl)


     -- Render list rows (group and list content)
     -- Render all group and list rows
     for _, listnum in ipairs(listnums) do
     for _, listnum in ipairs(listnums) do
         local listKey = "list" .. listnum
         local listKey = "list" .. listnum
Line 419: Line 444:


         if args[listKey] then
         if args[listKey] then
             -- Render group and list rows
             -- Render group row
             local groupRow = addTableRow(tbl)
             local groupRow = addTableRow(tbl)
             local groupCell = groupRow:tag('th')
             local groupCell = groupRow:tag('th')
Line 425: Line 450:
                 :addClass('navboxMobile-group-content')
                 :addClass('navboxMobile-group-content')
                 :addClass('navboxMobile-group-level1')
                 :addClass('navboxMobile-group-level1')
                :addClass(args.listclass or '') -- Apply `listclass` for group rows
                 :wikitext(processItem(args[groupKey]))
                 :wikitext(processItem(args[groupKey]))


            -- Render list row
             if args[listKey] == 'child' then
             if args[listKey] == 'child' then
                 renderListRow(tbl, tostring(listnum), 2)
                 renderListRow(tbl, tostring(listnum), 2)
Line 434: Line 461:
                     :attr('colspan', 2)
                     :attr('colspan', 2)
                     :addClass('navboxMobile-list-content')
                     :addClass('navboxMobile-list-content')
                    :addClass((listnum % 2 == 1) and 'navboxMobile-odd' or 'navboxMobile-even')
                    :addClass(args.listclass or '') -- Apply `listclass` to flat rows
                     :wikitext(processItem(args[listKey]))
                     :wikitext(processItem(args[listKey]))
             end
             end
Line 439: Line 468:
     end
     end


     -- Add below row (if applicable)
     -- Add the below row
     renderBelowRow(tbl)
     renderBelowRow(tbl)
    -- Add the Navbar row last
    if has_navbar() then
        local navbarRow = tbl:tag('tr')
        local navbarCell = navbarRow:tag('td')
            :attr('colspan', 2)
            :css('text-align', 'right')
            :addClass('navboxMobile-navbar') -- Add custom Navbar class
            :wikitext(navbar{
                args.name,
                mini = 1,
                fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;'
            })
    end


     return tbl
     return tbl
Line 491: Line 506:
     -- Render the main body of the navboxMobile
     -- Render the main body of the navboxMobile
     local tbl = renderMainTable()
     local tbl = renderMainTable()
    -- Iterate through list numbers and handle child and flat lists separately
    for _, listnum in ipairs(listnums) do
        local listKey = "list" .. listnum
        local groupKey = "group" .. listnum
        if args[listKey] then
            -- Always render the parent group
            local groupRow = addTableRow(tbl)
            local groupCell = groupRow:tag('th')
                :attr('scope', 'row')
                :addClass('navboxMobile-group-content')
                :addClass('navboxMobile-group-level1') -- Top-level groups use level1
                :wikitext(processItem(args[groupKey]))
            if args[listKey] == 'child' then
                -- Render child lists recursively
                renderListRow(tbl, tostring(listnum), 2) -- Start at level 2 for children
            else
                -- Render flat lists directly
                local listRow = addTableRow(tbl)
                local listCell = listRow:tag('td')
                    :attr('colspan', 2)
                    :addClass('navboxMobile-list-content')
                    :addClass((listnum % 2 == 1) and 'navboxMobile-odd' or 'navboxMobile-even')
                    :cssText(args.liststyle)
                    :cssText(args[listKey .. 'style'])
                    :addClass('hlist') -- Ensure hlist class is added for proper shading
                    :wikitext(processItem(args[listKey], args.nowrapitems))
                -- Ensure consistent background shading across rows
                if args.groupstyle or args.liststyle then
                        local bgColor = mw.ustring.match(args.groupstyle or args.liststyle, "background%-color%s*:%s*([^;]+)")
                    if bgColor then
                        listCell:css('background-color', bgColor) -- Apply consistent background color
                    end
                end
            end
        end
    end


     -- Create the final HTML with styles
     -- Create the final HTML with styles
     local res = mw.html.create()
     local res = mw.html.create()
    -- Inject styles analogous to Module:Navbox
     res:node(add_navbox_mobile_styles(hiding_templatestyles))
     res:node(add_navbox_mobile_styles(hiding_templatestyles))
 
     res:node(tbl)
     -- Handle wrapping based on border parameter
    if border == 'none' then
        -- Wrap the table within a navigation div with ARIA attributes
        local navWrapper = mw.html.create('div')
            :attr('role', 'navigation')
            :addClass('navboxMobile')
        if args.title or args.above or (args.group1 and not args.group2) then
            navWrapper:attr(
                'aria-labelledby',
                mw.uri.anchorEncode(args.title or args.above or args.group1)
            )
        else
            navWrapper:attr('aria-label', cfg.aria_label)
        end
        navWrapper:node(tbl)
        res:node(navWrapper)
    elseif border == 'subgroup' or border == 'child' then
        -- Assume this navboxMobile is inside a parent navboxMobile's list cell
        -- Insert closing and opening divs to manage padding
        local subgroupWrapper = mw.html.create('div')
            :addClass('navboxMobile-container') -- Consistent wrapping container
            :node(tbl) -- Add the table as a child
 
        res:node(subgroupWrapper)
    else
        -- Wrap the table within a navigation div with additional classes and styles
        local navWrapper = mw.html.create('div')
            :addClass('navboxMobile') -- Add consistent container
            :attr('role', 'navigation')
            :cssText(args.bodystyle)
            :cssText(args.style)
            :css('padding', '2px') -- Adjust padding as needed
        if args.title or args.above or (args.group1 and not args.group2) then
            navWrapper:attr(
                'aria-labelledby',
                mw.uri.anchorEncode(args.title or args.above or args.group1)
            )
        else
            navWrapper:attr('aria-label', cfg.aria_label)
        end
        navWrapper:node(tbl)
        res:node(navWrapper)
    end
 
    -- Render tracking categories
    renderTrackingCategories(res)


     return tostring(res)
     return tostring(res)
end
end


--
--