local p = {} local data = require('Module:VG Awards/data') local yesno = require('Module:Yesno') local getArgs = require('Module:Arguments').getArgs local function isWonOrNominated(val) val = type(val) == 'string' and val:lower() or val if val == 'won' or val == 'w' or val == '获奖' or val == '獲獎' or val == '得奖' or val == '得獎' then return true elseif val == 'nominated' or val == 'n' or val == '提名' or val == '未获奖' or val == '未獲獎' or val == '未得奖' or val == '未得獎' then return false else return yesno(val) end end local function getArgKeyTables(args) local awardsData, hasReferences, hasRows = { _years = {} }, false, false for k, v in pairs(args) do if string.match(k, '^[^_]+_[^_]+_.+$') then local pos1 = string.find(k, '_') local pos2 = string.find(k, '_', pos1 + 1) local year = string.sub(k, 1, pos1 - 1) local award = string.sub(k, pos1 + 1, pos2 - 1) local category = string.sub(k, pos2 + 1) if not awardsData[year] then awardsData[year] = { _awards = {}, _row = 0 } table.insert(awardsData['_years'], year) end if not awardsData[year][award] then awardsData[year][award] = {} table.insert(awardsData[year]['_awards'], award) end if category == 'Name' then awardsData[year][award]['_name'] = v elseif category == 'Ref' then awardsData[year][award]['_ref'] = v hasReferences = true else table.insert(awardsData[year][award], {category, isWonOrNominated(v)}) awardsData[year]["_row"] = awardsData[year]["_row"] + 1 hasRows = true end end end table.sort(awardsData['_years'], function (a, b) return tonumber(a) < tonumber(b) end) return awardsData, hasReferences, hasRows end local function renderHeadingRow(builder, hasReferences) local line = builder:tag('tr') line:tag('th') :wikitext(data.i18n.year) :done() :tag('th') :wikitext(data.i18n.award) :done() :tag('th') :wikitext(data.i18n.awardCategory) :done() :tag('th') :wikitext(data.i18n.result) if hasReferences then line:tag('th') :wikitext(data.i18n.references) end end local function renderYearAwards(builder, year, yearAwards, hasReferences, args) local isYearRendered = false table.sort(yearAwards['_awards'], function (a, b) if data.awards[a] then if data.awards[b] then return data.awards[a].sortkey < data.awards[b].sortkey else return true end else if data.awards[b] then return false else return a < b end end end) for _, v in ipairs(yearAwards['_awards']) do table.sort(yearAwards[v], function (a, b) if a[2] then if b[2] then return a[1] < b[1] else return true end else if b[2] then return false else return a[1] < b[1] end end end) local isAwardRendered = false for _2, v2 in ipairs(yearAwards[v]) do local line = builder:tag('tr') if not isYearRendered then line:tag('th') :attr('rowspan', yearAwards['_row']) :wikitext(year) isYearRendered = true end if not isAwardRendered then line:tag('th') :attr('rowspan', #yearAwards[v]) :wikitext(yearAwards[v]['_name'] or (data.awards[v] and data.awards[v].name) or v) end line:tag('td') :wikitext(v2[1]) :done() :tag('td') :css('background-color', (v2[2] and data.i18n.wonBackground) or data.i18n.nominatedBackground) :wikitext((v2[2] and data.i18n.won) or data.i18n.nominated) if not isAwardRendered then if hasReferences then line:tag('td') :attr('rowspan', #yearAwards[v]) :wikitext(yearAwards[v]['_ref']) end isAwardRendered = true end end end end local function renderAwards(builder, awardsData, hasReferences, args) renderHeadingRow(builder, hasReferences) for _, v in ipairs(awardsData['_years']) do local yearAwards = awardsData[v] renderYearAwards(builder, v, yearAwards, hasReferences, args) end end local function renderMainTable(awardsData, hasReferences, args) local tbl = mw.html.create('table') :addClass('wikitable') :addClass('no-min-width-on-mobile') :css('text-align', 'center') :css('display', 'table') if args.align then tbl.addClass('float' .. args.align) end if args.width then tbl :css('width', args.width) else tbl :css('min-width', '30em') end if args.title and args.state and (args.state == 'autocollapse' or args.state == 'collapsed' or args.state == 'expanded') then tbl :addClass('collapsible') :addClass(args.state) end tbl:tag('caption') :wikitext(args.title or data.i18n.awardTitle) :css('display', 'table-caption') if args.subtitle then tbl:tag('tr'):tag('th') :attr('colspan', (hasReferences and 5) or 4) :wikitext(args.subtitle) end renderAwards(tbl, awardsData, hasReferences, args) local style = mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Template:VG Reviews/styles.css'}) return tostring(tbl) .. style end function p._main(frame, args) local awardsData, hasReferences, hasRows = getArgKeyTables(args) if hasRows ~= 0 then return renderMainTable(awardsData, hasReferences, args) elseif mw.title.getCurrentTitle().namespace == 0 then return data.i18n.emptyCategory end end function p.main(frame) return p._main(frame, getArgs(frame, {wrappers = "Template:VG Awards"})) end return p