Jump to content

Module:Update history navbox: Difference between revisions

From Bconomy Wiki
Add shared presentation support for game update navigation
 
Render large year headers with month rows and inline release links
Line 6: Line 6:
}
}


local function collapsible(parent, label, open)
    local panel = parent:tag('div')
        :addClass('bc-release-group mw-collapsible')
    if not open then
        panel:addClass('mw-collapsed')
    end
    panel:tag('div'):addClass('bc-release-group-label'):wikitext(label)
    return panel:tag('div'):addClass('mw-collapsible-content')
end


function p.render()
function p.render()
Line 23: Line 14:
     end
     end


     local root = mw.html.create('div'):addClass('bc-release-groups')
     local root = mw.html.create('table'):addClass('bc-navbox-table bc-navbox-years')
     local latestYear, latestMonth, year, month, yearBody, list
     local latestYear, year, month, monthTable, list
     for y, m, link in region:gmatch('| data%-sort%-value="(%d%d%d%d)%-(%d%d)%-%d%d"[^\n]*\n| (%[%[[^\n]+%]%])\n') do
     for y, m, link in region:gmatch('| data%-sort%-value="(%d%d%d%d)%-(%d%d)%-%d%d"[^\n]*\n| (%[%[[^\n]+%]%])\n') do
         if not latestYear then
         if not latestYear then
             latestYear, latestMonth = y, m
             latestYear = y
         end
         end
         if year ~= y then
         if year ~= y then
             year, month = y, nil
             year, month = y, nil
             yearBody = collapsible(root, y, y == latestYear)
             local row = root:tag('tr')
            row:tag('th'):attr('scope', 'row'):addClass('bc-navbox-year'):wikitext(y)
            local panel = row:tag('td'):addClass('bc-navbox-year-body')
                :tag('div'):addClass('bc-navbox-year-details mw-collapsible')
                :attr('data-expandtext', 'Show months')
                :attr('data-collapsetext', 'Hide months')
            if y ~= latestYear then
                panel:addClass('mw-collapsed')
            end
            panel:tag('div'):addClass('bc-navbox-month-heading'):wikitext('Updates by month')
            monthTable = panel:tag('div'):addClass('mw-collapsible-content')
                :tag('table'):addClass('bc-navbox-months')
         end
         end
         if month ~= m then
         if month ~= m then
             month = m
             month = m
             list = collapsible(yearBody, months[tonumber(m)] or m, y == latestYear and m == latestMonth)
             local monthRow = monthTable:tag('tr')
                :tag('ul'):addClass('bc-release-links')
            monthRow:tag('th'):attr('scope', 'row'):wikitext(months[tonumber(m)] or m)
            list = monthRow:tag('td'):tag('ul'):addClass('bc-release-links')
         end
         end
         local target, label = link:match('^%[%[([^|%]]+)|?([^%]]*)%]%]$')
         local target, label = link:match('^%[%[([^|%]]+)|?([^%]]*)%]%]$')

Revision as of 22:07, 3 November 2026

Documentation for this module may be created at Module:Update history navbox/doc

local p = {}

local months = {
    'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'
}


function p.render()
    local index = mw.title.new('Version history'):getContent() or ''
    local region = index:match('<!%-%- bconomy:begin version%-index %-%->(.-)<!%-%- bconomy:end version%-index %-%->')
    if not region then
        return '[[Version history|Browse the chronological index]]'
    end

    local root = mw.html.create('table'):addClass('bc-navbox-table bc-navbox-years')
    local latestYear, year, month, monthTable, list
    for y, m, link in region:gmatch('| data%-sort%-value="(%d%d%d%d)%-(%d%d)%-%d%d"[^\n]*\n| (%[%[[^\n]+%]%])\n') do
        if not latestYear then
            latestYear = y
        end
        if year ~= y then
            year, month = y, nil
            local row = root:tag('tr')
            row:tag('th'):attr('scope', 'row'):addClass('bc-navbox-year'):wikitext(y)
            local panel = row:tag('td'):addClass('bc-navbox-year-body')
                :tag('div'):addClass('bc-navbox-year-details mw-collapsible')
                :attr('data-expandtext', 'Show months')
                :attr('data-collapsetext', 'Hide months')
            if y ~= latestYear then
                panel:addClass('mw-collapsed')
            end
            panel:tag('div'):addClass('bc-navbox-month-heading'):wikitext('Updates by month')
            monthTable = panel:tag('div'):addClass('mw-collapsible-content')
                :tag('table'):addClass('bc-navbox-months')
        end
        if month ~= m then
            month = m
            local monthRow = monthTable:tag('tr')
            monthRow:tag('th'):attr('scope', 'row'):wikitext(months[tonumber(m)] or m)
            list = monthRow:tag('td'):tag('ul'):addClass('bc-release-links')
        end
        local target, label = link:match('^%[%[([^|%]]+)|?([^%]]*)%]%]$')
        if target then
            label = (label ~= '' and label or target):gsub('^V(%d)', 'v%1')
            list:tag('li'):wikitext('[[' .. target .. '|' .. label .. ']]')
        end
    end
    if not latestYear then
        return '[[Version history|Browse the chronological index]]'
    end
    return tostring(root)
end

return p