Module:NavboxUpgraded: Difference between revisions

From Ikwipedia
No edit summary
No edit summary
Line 1: Line 1:
-- Module:NavboxUpgraded
-- Module:NavboxUpgraded
local p = {}
local p = {}
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs


Line 13: Line 12:
             local container = html:tag('div')
             local container = html:tag('div')
                 :addClass('navbox-subgroup')
                 :addClass('navbox-subgroup')
                 :css('margin', '0.5em 0')
                 :css('margin-left', '1em') -- Indent for nesting
                 :css('padding', '0.25em')
                 :css('padding', '0.25em')


Line 19: Line 18:
             if subgroup then
             if subgroup then
                 container:tag('div')
                 container:tag('div')
                     :addClass('navbox-subgroup-heading')
                     :addClass('navbox-group')
                     :css('background-color', '#e6e6ff') -- Light shade
                     :css('background-color', '#e6e6ff') -- Lighter shade
                     :css('padding', '0.25em 1em')
                     :css('padding', '0.25em 1em')
                     :css('font-weight', 'bold')
                     :css('font-weight', 'bold')
Line 28: Line 27:
             -- Subgroup list
             -- Subgroup list
             if sublist then
             if sublist then
                 container:tag('ul')
                 if sublist:lower() == 'subgroup' then
                    :addClass('navbox-list')
                    -- Recursively render nested subgroups
                    :css('padding-left', '1.5em')
                    local childArgs = {}
                    :css('list-style', 'disc') -- Bullet points
                    for k, v in pairs(args) do
                    :wikitext(sublist)
                        local prefix = groupPrefix .. '_list' .. i .. '_'
                        if k:sub(1, #prefix) == prefix then
                            childArgs[k:sub(#prefix + 1)] = v
                        end
                    end
                    local nestedSubgroup = renderSubgroups(childArgs, groupPrefix .. '_list' .. i)
                    container:wikitext(nestedSubgroup)
                else
                    container:tag('ul')
                        :addClass('navbox-list')
                        :css('padding-left', '1.5em')
                        :css('list-style', 'disc')
                        :wikitext(sublist)
                end
             end
             end
            html:node(container)
         end
         end
     end
     end
Line 44: Line 57:
     navbox
     navbox
         :addClass('navbox')
         :addClass('navbox')
         -- [Rest of your styling code]
         :css('width', '100%')
        :css('margin', 'auto')
        :css('clear', 'both')
        :css('border', '1px solid #a2a9b1')
        :css('padding', '1px')
        :css('font-size', '88%')
        :css('text-align', 'center')


     -- Handle title
     -- Handle title
     -- [Existing code for title]
     if args.title then
        local titleRow = navbox:tag('tr')
        local titleCell = titleRow:tag('th')
        titleCell
            :attr('colspan', '2')
            :addClass('navbox-title')
            :css('background-color', '#ccf')
            :css('padding', '0.25em 1em')
            :wikitext(args.title)
    end


     -- Handle above
     -- Handle above
     -- [Existing code for above]
     if args.above then
        local aboveRow = navbox:tag('tr')
        local aboveCell = aboveRow:tag('td')
        aboveCell
            :attr('colspan', '2')
            :addClass('navbox-abovebelow')
            :css('background-color', '#ddf')
            :css('padding', '0.25em 1em')
            :wikitext(args.above)
    end


     -- Handle groups and lists
     -- Handle groups and lists
    local rowIndex = 0
     for i = 1, 10 do
     for i = 1, 10 do
         local group = args['group' .. i]
         local group = args['group' .. i]
         local list = args['list' .. i]
         local list = args['list' .. i]
         if group or list then
         if group or list then
            rowIndex = rowIndex + 1
             local row = navbox:tag('tr')
             local row = navbox:tag('tr')
            -- Apply striped classes
            if rowIndex % 2 == 1 then
                row:attr('class', 'navbox-odd')
            else
                row:attr('class', 'navbox-even')
            end


             -- Group heading
             -- Group heading
             if group then
             if group then
                 -- [Existing code for groupCell]
                 local groupCell = row:tag('th')
                groupCell
                    :addClass('navbox-group')
                    :css('text-align', 'right')
                    :css('background-color', '#ddf') -- Parent shade
                    :css('padding', '0.25em 1em')
                    :wikitext(group)
             end
             end


Line 67: Line 119:
             if list then
             if list then
                 local listCell = row:tag('td')
                 local listCell = row:tag('td')
                listCell
                     :addClass('navbox-list')
                     :addClass('navbox-list')
                    -- [Rest of your styling code]


                 if list == 'subgroup' then
                -- Apply list classes if specified
                if args.listclass then
                    listCell:addClass(args.listclass) -- e.g., 'hlist' or 'plainlist'
                end
 
                -- Render subgroups or standard lists
                 if list:lower() == 'subgroup' then
                     -- Process subgroup
                     -- Process subgroup
                     local childArgs = {}
                     local childArgs = {}
Line 80: Line 136:
                         end
                         end
                     end
                     end
                     local subgroupContent = p._navboxDesktop(childArgs)
                     local subgroupContent = renderSubgroups(childArgs, 'list' .. i)
                     listCell:wikitext(subgroupContent)
                     listCell:wikitext(subgroupContent)
                 else
                 else
                     listCell:tag('ul')
                     listCell:tag('ul')
                         :addClass('navbox-list')
                         :addClass('navbox-list')
                         -- [Rest of your styling code]
                         :css('list-style', 'disc')
                        :css('padding-left', '1.5em')
                         :wikitext(list)
                         :wikitext(list)
                 end
                 end
Line 93: Line 150:


     -- Handle below
     -- Handle below
     -- [Existing code for below]
     if args.below then
        local belowRow = navbox:tag('tr')
        local belowCell = belowRow:tag('td')
        belowCell
            :attr('colspan', '2')
            :addClass('navbox-abovebelow')
            :css('background-color', '#ddf')
            :css('padding', '0.25em 1em')
            :wikitext(args.below)
    end


     return tostring(navbox)
     return tostring(navbox)
end
end


-- Function to generate the mobile navbox
-- Function to generate the mobile navbox
Line 172: Line 237:
     local args = getArgs(frame)
     local args = getArgs(frame)
     local desktopNavbox = p._navboxDesktop(args)
     local desktopNavbox = p._navboxDesktop(args)
     local mobileNavbox = p._navboxMobile(args)
     local mobileNavbox = p._navboxMobile(args) -- Assuming you've handled mobile similarly


     local res = mw.html.create()
     local res = mw.html.create()

Revision as of 06:27, 22 November 2024

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

-- Module:NavboxUpgraded
local p = {}
local getArgs = require('Module:Arguments').getArgs

-- Recursive function to process subgroups
local function renderSubgroups(args, groupPrefix)
    local html = mw.html.create()
    for i = 1, 10 do
        local subgroup = args[groupPrefix .. '_group' .. i]
        local sublist = args[groupPrefix .. '_list' .. i]
        if subgroup or sublist then
            local container = html:tag('div')
                :addClass('navbox-subgroup')
                :css('margin-left', '1em') -- Indent for nesting
                :css('padding', '0.25em')

            -- Subgroup heading
            if subgroup then
                container:tag('div')
                    :addClass('navbox-group')
                    :css('background-color', '#e6e6ff') -- Lighter shade
                    :css('padding', '0.25em 1em')
                    :css('font-weight', 'bold')
                    :wikitext(subgroup)
            end

            -- Subgroup list
            if sublist then
                if sublist:lower() == 'subgroup' then
                    -- Recursively render nested subgroups
                    local childArgs = {}
                    for k, v in pairs(args) do
                        local prefix = groupPrefix .. '_list' .. i .. '_'
                        if k:sub(1, #prefix) == prefix then
                            childArgs[k:sub(#prefix + 1)] = v
                        end
                    end
                    local nestedSubgroup = renderSubgroups(childArgs, groupPrefix .. '_list' .. i)
                    container:wikitext(nestedSubgroup)
                else
                    container:tag('ul')
                        :addClass('navbox-list')
                        :css('padding-left', '1.5em')
                        :css('list-style', 'disc')
                        :wikitext(sublist)
                end
            end
            html:node(container)
        end
    end
    return tostring(html)
end

-- Function to generate the desktop navbox
function p._navboxDesktop(args)
    local navbox = mw.html.create('table')
    navbox
        :addClass('navbox')
        :css('width', '100%')
        :css('margin', 'auto')
        :css('clear', 'both')
        :css('border', '1px solid #a2a9b1')
        :css('padding', '1px')
        :css('font-size', '88%')
        :css('text-align', 'center')

    -- Handle title
    if args.title then
        local titleRow = navbox:tag('tr')
        local titleCell = titleRow:tag('th')
        titleCell
            :attr('colspan', '2')
            :addClass('navbox-title')
            :css('background-color', '#ccf')
            :css('padding', '0.25em 1em')
            :wikitext(args.title)
    end

    -- Handle above
    if args.above then
        local aboveRow = navbox:tag('tr')
        local aboveCell = aboveRow:tag('td')
        aboveCell
            :attr('colspan', '2')
            :addClass('navbox-abovebelow')
            :css('background-color', '#ddf')
            :css('padding', '0.25em 1em')
            :wikitext(args.above)
    end

    -- Handle groups and lists
    local rowIndex = 0
    for i = 1, 10 do
        local group = args['group' .. i]
        local list = args['list' .. i]
        if group or list then
            rowIndex = rowIndex + 1
            local row = navbox:tag('tr')

            -- Apply striped classes
            if rowIndex % 2 == 1 then
                row:attr('class', 'navbox-odd')
            else
                row:attr('class', 'navbox-even')
            end

            -- Group heading
            if group then
                local groupCell = row:tag('th')
                groupCell
                    :addClass('navbox-group')
                    :css('text-align', 'right')
                    :css('background-color', '#ddf') -- Parent shade
                    :css('padding', '0.25em 1em')
                    :wikitext(group)
            end

            -- Group content
            if list then
                local listCell = row:tag('td')
                    :addClass('navbox-list')

                -- Apply list classes if specified
                if args.listclass then
                    listCell:addClass(args.listclass) -- e.g., 'hlist' or 'plainlist'
                end

                -- Render subgroups or standard lists
                if list:lower() == 'subgroup' then
                    -- Process subgroup
                    local childArgs = {}
                    for k, v in pairs(args) do
                        local prefix = 'list' .. i .. '_'
                        if k:sub(1, #prefix) == prefix then
                            childArgs[k:sub(#prefix + 1)] = v
                        end
                    end
                    local subgroupContent = renderSubgroups(childArgs, 'list' .. i)
                    listCell:wikitext(subgroupContent)
                else
                    listCell:tag('ul')
                        :addClass('navbox-list')
                        :css('list-style', 'disc')
                        :css('padding-left', '1.5em')
                        :wikitext(list)
                end
            end
        end
    end

    -- Handle below
    if args.below then
        local belowRow = navbox:tag('tr')
        local belowCell = belowRow:tag('td')
        belowCell
            :attr('colspan', '2')
            :addClass('navbox-abovebelow')
            :css('background-color', '#ddf')
            :css('padding', '0.25em 1em')
            :wikitext(args.below)
    end

    return tostring(navbox)
end

-- Function to generate the mobile navbox
function p._navboxMobile(args)
    local navbox = mw.html.create('div')
    navbox
        :addClass('navbox-mobile')
        :css('width', '100%')
        :css('margin', 'auto')
        :css('clear', 'both')
        :css('border', '1px solid #a2a9b1')
        :css('padding', '1px')
        :css('font-size', '88%')
        :css('text-align', 'center')

    -- Handle title
    if args.title then
        navbox:tag('div')
            :addClass('navbox-title-mobile')
            :css('background-color', '#ccf')
            :css('padding', '0.25em 1em')
            :wikitext(args.title)
    end

    -- Handle above
    if args.above then
        navbox:tag('div')
            :addClass('navbox-abovebelow-mobile')
            :css('background-color', '#ddf')
            :css('padding', '0.25em 1em')
            :wikitext(args.above)
    end

    -- Handle groups and lists
    for i = 1, 10 do
        local group = args['group' .. i]
        local list = args['list' .. i]
        if group or list then
            if group then
                navbox:tag('div')
                    :addClass('navbox-group-mobile')
                    :css('background-color', '#ddf') -- Parent shade
                    :css('padding', '0.25em 1em')
                    :css('font-weight', 'bold')
                    :wikitext(group)
            end
            if list then
                navbox:tag('div')
                    :addClass('navbox-list-mobile')
                    :css('background-color', '#f7f7f7')
                    :css('padding', '0.25em 1em')
                    :tag('ul')
                        :css('list-style', 'disc') -- Bullets
                        :css('padding-left', '1.5em')
                        :wikitext(list)
            end
        end
    end

    -- Handle below
    if args.below then
        navbox:tag('div')
            :addClass('navbox-abovebelow-mobile')
            :css('background-color', '#ddf')
            :css('padding', '0.25em 1em')
            :wikitext(args.below)
    end

    return tostring(navbox)
end

-- Main function
function p.navbox(frame)
    local args = getArgs(frame)
    local desktopNavbox = p._navboxDesktop(args)
    local mobileNavbox = p._navboxMobile(args) -- Assuming you've handled mobile similarly

    local res = mw.html.create()
    res
        :tag('div')
            :addClass('nomobile')
            :wikitext(desktopNavbox)
            :done()
        :tag('div')
            :addClass('onlymobile')
            :wikitext(mobileNavbox)
            :done()

    return tostring(res)
end

return p