local p = {}
local data = require('Module:VG Awards/data')
local yesno = require('Module:Yesno')
local getArgs = require('Module:Arguments').getArgs
local color_configurations = {
{ 'm-bcolor', '#fafafa', alias = { '背景颜色', '背景顏色', 'bg-color' } },
{ 'm-color', '#222222' },
{ 'l-bcolor', '#e3f6e0', alias = { '左栏颜色', '左欄顏色' } },
{ 'l-color', '#444444', alias = { '左栏字体颜色', '左欄字體顏色' } },
{ 'top-bcolor', '#6fc67e', alias = { '标题颜色', '標題顏色' } },
{ 'top-color', '#ffffff', alias = { '标题字体颜色', '標題字體顏色' } },
{ 't-bcolor', '#6fc67e', alias = { '标题颜色', '標題顏色' } },
{ 't-color', '#ffffff', alias = { '标题字体颜色', '標題字體顏色' } },
}
local status_table = {
{ '获奖', '#99ff99' },
{ '提名', '#ffdddd' },
{ '未决定', '#ffcc99' }
}
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 1
elseif val == 'nominated'
or val == 'n'
or val == '提名'
or val == '未获奖'
or val == '未獲獎'
or val == '未得奖'
or val == '未得獎'
then
return 2
elseif val == 'undecided'
or val == 'u'
or val == '未决定'
or val == '未決定'
or val == '未确定'
or val == '未確定'
or val == '未公布'
or val == '未公佈'
then
return 3
else
return yesno(val) and 1 or 2
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.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] ~= b[2] then
return a[2] < b[2]
else
return a[1] < b[1]
end
end)
local isAwardRendered = false
for _2, v2 in ipairs(yearAwards[v]) do
if not isYearRendered then
builder:tag('tr')
:tag('th')
:addClass('infobox3-table-bar')
:attr('colspan', 5)
:wikitext(year .. '年')
renderHeadingRow(builder, hasReferences)
isYearRendered = true
end
local line = builder:tag('tr')
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', status_table[v2[2]][2])
:wikitext(status_table[v2[2]][1])
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)
for _, v in ipairs(awardsData['_years']) do
local yearAwards = awardsData[v]
renderYearAwards(builder, v, yearAwards, hasReferences, args)
end
builder:tag('tr')
end
local function renderMainTable(awardsData, hasReferences, args)
local tbl = mw.html.create('table')
:addClass('infobox3-table')
:addClass('infobox3-table-float-' .. (args.align or 'none'))
:css('text-align', 'center')
for _, conf in ipairs(color_configurations) do
local key = conf[1]
local value = args[key]
if not value then
for _, alias in ipairs(conf.alias or {}) do
value = args[alias]
if value then break end
end
end
tbl:css('--infobox3-table-' .. key, value or conf[2])
end
if args.width then
tbl
:css('width', args.width)
else
tbl
:css('width', '30rem')
end
if args.title then
tbl:tag('tr'):tag('th')
:addClass('infobox3-table-top')
:attr('colspan', (hasReferences and 5) or 4)
:wikitext(args.title)
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.renderTable(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.renderTable(getArgs(frame))
end
return p