| 本页面全部或部分内容原来自中文维基百科页面Module:VG Reviews,依 CC BY-SA 3.0 授权引入;原贡献者可以在这里看到。 |
本模块经过了较多修改以适应萌娘百科。
修改内容包括:
--[[
本页面原来自中文维基百科的 Module:VG_Reviews,依 CC BY-SA 3.0 授权引入。
经过双方编者的修改,本页面可能已与来源有很大差异。
]] --
local p = {}
local data = require('Module:VG Reviews/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 function getActiveSystems(args)
local activeSystems = {}
for k, v in pairs(args) do
if data.systems[k] and yesno(v) then
table.insert(activeSystems, k)
end
end
table.sort(activeSystems, function(a, b)
return data.systems[a].sortkey < data.systems[b].sortkey
end)
return activeSystems
end
local function getArgKeyTables(args)
local reviewers, aggregators, platforms = {}, {}, {}
for k in pairs(args) do
if string.match(k, '^rev%d+$') then
table.insert(reviewers, k)
elseif string.match(k, '^agg%d+$') then
table.insert(aggregators, k)
elseif string.match(k, '^platform%d+$') then
table.insert(platforms, k)
end
end
local function comparator(a, b)
return tonumber(a:match('%d+')) < tonumber(b:match('%d+'))
end
table.sort(reviewers, comparator)
table.sort(aggregators, comparator)
table.sort(platforms, comparator)
return reviewers, aggregators, platforms
end
local function getProvidedReviewersAndAggregators(args, usePlatforms)
local providedReviewers, providedAggregators = {}, {}
if usePlatforms then
local seen = {}
for k in pairs(args) do
local splitPos = string.find(k, '_')
if splitPos then
local halfarg = string.sub(k, 1, splitPos - 1)
if not seen[halfarg] then
seen[halfarg] = true
if data.reviewers[halfarg] then
table.insert(providedReviewers, halfarg)
elseif data.aggregators[halfarg] then
table.insert(providedAggregators, halfarg)
end
end
elseif data.reviewers[k] then
table.insert(providedReviewers, k)
elseif data.aggregators[k] then
table.insert(providedAggregators, k)
end
end
else
for k in pairs(args) do
if not string.find(k, '_') then
if data.reviewers[k] then
table.insert(providedReviewers, k)
elseif data.aggregators[k] then
table.insert(providedAggregators, k)
end
end
end
end
table.sort(providedReviewers, function(a, b)
return data.reviewers[a].sortkey < data.reviewers[b].sortkey
end)
table.sort(providedAggregators, function(a, b)
return data.aggregators[a].sortkey < data.aggregators[b].sortkey
end)
return providedReviewers, providedAggregators
end
local function renderMainHeading(builder, colspan, headingText, borderTop)
builder:tag('tr'):tag('th')
:attr('colspan', colspan)
:addClass('infobox3-table-bar')
:wikitext(headingText)
end
local function renderHeadingRowWithSystems(builder, mainHeading, activeSystems, customPlatformKeys, nameHeading, args)
renderMainHeading(builder, #activeSystems + #customPlatformKeys + 1, mainHeading)
builder:tag('tr')
:tag('th')
:attr('rowspan', '2')
:wikitext(nameHeading)
:done()
:tag('th')
:attr('colspan', #activeSystems + #customPlatformKeys)
:wikitext(data.i18n.score)
builder = builder:tag('tr')
for _, v in ipairs(activeSystems) do
builder:tag('th'):wikitext(data.systems[v].name)
end
for _, v in ipairs(customPlatformKeys) do
builder:tag('th'):wikitext(args[v])
end
end
local function renderHeadingRow(builder, mainHeading, nameHeading)
renderMainHeading(builder, 2, mainHeading)
builder
:tag('tr')
:tag('th')
:wikitext(nameHeading)
:done()
:tag('th')
:wikitext(data.i18n.score)
end
local function renderRatingsBySystem(builder, code, name, activeSystems, customPlatformKeys, args, na, isCustom)
builder = builder:tag('tr')
builder:tag('th')
:wikitext(name)
if args[code] and not isCustom then
builder:tag('td')
:attr('colspan', #activeSystems + #customPlatformKeys)
:wikitext(args[code])
return
elseif args[code .. 'Score'] and isCustom then
builder:tag('td')
:attr('colspan', #activeSystems + #customPlatformKeys)
:wikitext(args[code .. 'Score'])
return
end
for _, v in ipairs(activeSystems) do
local combinedCode = code .. '_' .. v
local cell = builder:tag('td')
if args[combinedCode] then
cell
:wikitext(args[combinedCode])
elseif na then
cell
:css('color', 'lightgray')
:addClass('table-na')
:wikitext(data.i18n.na)
end
end
for _, v in ipairs(customPlatformKeys) do
local combinedCode = code .. '_' .. v
local cell = builder:tag('td')
if args[combinedCode] then
cell
:wikitext(args[combinedCode])
elseif na then
cell
:css('color', 'lightgray')
:addClass('table-na')
:wikitext(data.i18n.na)
end
end
end
local function renderRating(builder, name, rating)
builder:tag('tr')
:tag('th')
:wikitext(name)
:done()
:tag('td')
:wikitext(rating)
end
local function renderReviews(builder, providedReviewers, providedAggregators, activeSystems, customAggregatorKeys,
customReviewerKeys, customPlatformKeys, args)
local reviewerCount = #providedReviewers + #customReviewerKeys
local aggregatorCount = #providedAggregators + #customAggregatorKeys
local reviewScore = data.i18n.reviewScores
local aggregateScore = data.i18n.aggregateScores
if (#activeSystems + #customPlatformKeys) ~= 0 then
local na = yesno(args.na)
local showplatforms = (#activeSystems + #customPlatformKeys) ~= 1 or yesno(args.showplatforms)
if aggregatorCount ~= 0 then
if showplatforms then
renderHeadingRowWithSystems(builder, aggregateScore, activeSystems, customPlatformKeys, data.i18n.aggregator,
args)
else
renderHeadingRow(builder, aggregateScore, data.i18n.aggregator)
end
for _, v in ipairs(providedAggregators) do
renderRatingsBySystem(builder, v, data.aggregators[v].name, activeSystems, customPlatformKeys, args, na, false)
end
for _, v in ipairs(customAggregatorKeys) do
renderRatingsBySystem(builder, v, args[v], activeSystems, customPlatformKeys, args, na, true)
end
end
if reviewerCount ~= 0 then
if showplatforms then
renderHeadingRowWithSystems(builder, reviewScore, activeSystems, customPlatformKeys, data.i18n.publication, args)
else
renderHeadingRow(builder, reviewScore, data.i18n.publication)
end
for _, v in ipairs(providedReviewers) do
renderRatingsBySystem(builder, v, data.reviewers[v].name, activeSystems, customPlatformKeys, args, na, false)
end
for _, v in ipairs(customReviewerKeys) do
renderRatingsBySystem(builder, v, args[v], activeSystems, customPlatformKeys, args, na, true)
end
end
else
if aggregatorCount ~= 0 then
renderHeadingRow(builder, aggregateScore, data.i18n.aggregator)
for _, v in ipairs(providedAggregators) do
renderRating(builder, data.aggregators[v].name, args[v])
end
for _, v in ipairs(customAggregatorKeys) do
renderRating(builder, args[v], args[v .. 'Score'])
end
end
if reviewerCount ~= 0 then
renderHeadingRow(builder, reviewScore, data.i18n.publication)
for _, v in ipairs(providedReviewers) do
renderRating(builder, data.reviewers[v].name, args[v])
end
for _, v in ipairs(customReviewerKeys) do
renderRating(builder, args[v], args[v .. 'Score'])
end
end
end
end
local function renderMainTable(providedReviewers, providedAggregators, activeSystems, customAggregatorKeys,
customReviewerKeys, customPlatformKeys, args)
local tbl = mw.html.create('table')
:addClass('infobox3-table')
:addClass('infobox3-table-float-' .. (args.align or 'right'))
: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)
elseif (#activeSystems + #customPlatformKeys) == 0 then
-- Width: 20% Seems better since it scales with the article size.
tbl
:css('width', '18rem')
else
tbl
:css('width', (15 + (#activeSystems + #customPlatformKeys) * 3) .. 'rem')
end
renderReviews(tbl, providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys,
customPlatformKeys, args)
local style = mw.getCurrentFrame():extensionTag('templatestyles', '', { src = 'Template:VG Reviews/styles.css' })
return tostring(tbl) .. style
end
function p.renderTable(args)
local activeSystems = getActiveSystems(args)
local customReviewerKeys, customAggregatorKeys, customPlatformKeys = getArgKeyTables(args)
local providedReviewers, providedAggregators = getProvidedReviewersAndAggregators(args,
(#activeSystems + #customPlatformKeys) ~= 0)
if #customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 then
return renderMainTable(providedReviewers, providedAggregators, activeSystems, customAggregatorKeys,
customReviewerKeys, customPlatformKeys, 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