Difference between revisions of "Module:Video game reviews/sandbox"
Jump to navigation
Jump to search
blackwiki>Ahecht (sync sandbox) |
blackwiki>Ahecht (support non-plural titles) |
||
| Line 22: | Line 22: | ||
local function getArgKeyTables(args) | local function getArgKeyTables(args) | ||
local reviewers, aggregators, awards = {}, {}, {} | local reviewers, aggregators, awards = {}, {}, {} | ||
| + | local reviewersCount, aggregatorsCount, awardsCount = 0, 0, 0 | ||
for k in pairs(args) do | for k in pairs(args) do | ||
if string.match(k, '^rev%d+$') then | if string.match(k, '^rev%d+$') then | ||
table.insert(reviewers, k) | table.insert(reviewers, k) | ||
| + | reviewersCount = reviewersCount +1 | ||
elseif string.match(k, '^agg%d+$') then | elseif string.match(k, '^agg%d+$') then | ||
table.insert(aggregators, k) | table.insert(aggregators, k) | ||
| + | aggregatorsCount = aggregatorsCount + 1 | ||
elseif string.match(k, '^award%d+$') then | elseif string.match(k, '^award%d+$') then | ||
table.insert(awards, k) | table.insert(awards, k) | ||
| + | awardsCount = awardsCount + 1 | ||
end | end | ||
end | end | ||
| Line 37: | Line 41: | ||
table.sort(aggregators, comparator) | table.sort(aggregators, comparator) | ||
table.sort(awards, comparator) | table.sort(awards, comparator) | ||
| − | return reviewers, aggregators, awards | + | return reviewers, aggregators, awards, reviewersCount, aggregatorsCount, awardsCount |
end | end | ||
local function getProvidedReviewersAndAggregators(args, usePlatforms) | local function getProvidedReviewersAndAggregators(args, usePlatforms) | ||
local providedReviewers, providedAggregators = {}, {} | local providedReviewers, providedAggregators = {}, {} | ||
| + | local providedReviewersCount, providedAggregatorsCount = 0, 0 | ||
if usePlatforms then | if usePlatforms then | ||
local seen = {} | local seen = {} | ||
| Line 52: | Line 57: | ||
if data.reviewers[halfarg] then | if data.reviewers[halfarg] then | ||
table.insert(providedReviewers, halfarg) | table.insert(providedReviewers, halfarg) | ||
| + | providedReviewersCount = providedReviewersCount +1 | ||
elseif data.aggregators[halfarg] then | elseif data.aggregators[halfarg] then | ||
table.insert(providedAggregators, halfarg) | table.insert(providedAggregators, halfarg) | ||
| + | providedAggregatorsCount = providedAggregatorsCount +1 | ||
end | end | ||
end | end | ||
| Line 63: | Line 70: | ||
if data.reviewers[k] then | if data.reviewers[k] then | ||
table.insert(providedReviewers, k) | table.insert(providedReviewers, k) | ||
| + | providedReviewersCount = providedReviewersCount +1 | ||
elseif data.aggregators[k] then | elseif data.aggregators[k] then | ||
table.insert(providedAggregators, k) | table.insert(providedAggregators, k) | ||
| + | providedAggregatorsCount = providedAggregatorsCount +1 | ||
end | end | ||
end | end | ||
| Line 75: | Line 84: | ||
return data.aggregators[a].sortkey < data.aggregators[b].sortkey | return data.aggregators[a].sortkey < data.aggregators[b].sortkey | ||
end) | end) | ||
| − | return providedReviewers, providedAggregators | + | return providedReviewers, providedAggregators, providedReviewersCount, providedAggregatorsCount |
end | end | ||
| Line 176: | Line 185: | ||
end | end | ||
| − | local function renderReviews(builder, providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args) | + | local function renderReviews(builder, providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount) |
builder = builder:tag('table') | builder = builder:tag('table') | ||
:addClass('infobox wikitable') | :addClass('infobox wikitable') | ||
| Line 187: | Line 196: | ||
local hasReviewers = #providedReviewers ~= 0 or #customReviewerKeys ~= 0 | local hasReviewers = #providedReviewers ~= 0 or #customReviewerKeys ~= 0 | ||
local hasAggregators = #providedAggregators ~= 0 or #customAggregatorKeys ~= 0 | local hasAggregators = #providedAggregators ~= 0 or #customAggregatorKeys ~= 0 | ||
| + | |||
| + | if reviewerCount == 1 then | ||
| + | local reviewScore = data.i18n.reviewScore | ||
| + | else | ||
| + | local reviewScore = data.i18n.reviewScores | ||
| + | end | ||
| + | if aggregatorCount == 1 then | ||
| + | local aggregateScore = data.i18n.aggregateScore | ||
| + | else | ||
| + | local aggregateScore = data.i18n.aggregateScores | ||
| + | end | ||
| + | |||
builder:css('font-size', '100%') | builder:css('font-size', '100%') | ||
if #activeSystems ~= 0 then | if #activeSystems ~= 0 then | ||
| Line 194: | Line 215: | ||
if hasReviewers then | if hasReviewers then | ||
if showplatforms then | if showplatforms then | ||
| − | renderHeadingRowWithSystems(builder, | + | renderHeadingRowWithSystems(builder, reviewScore, activeSystems) |
else | else | ||
| − | renderHeadingRow(builder, | + | renderHeadingRow(builder, reviewScore, data.i18n.publication) |
end | end | ||
| Line 208: | Line 229: | ||
if hasAggregators then | if hasAggregators then | ||
if hasReviewers then | if hasReviewers then | ||
| − | renderMainHeading(builder, #activeSystems+1, | + | renderMainHeading(builder, #activeSystems+1, aggregateScore) |
elseif showplatforms then | elseif showplatforms then | ||
| − | renderHeadingRowWithSystems(builder, | + | renderHeadingRowWithSystems(builder, aggregateScore, activeSystems) |
else | else | ||
| − | renderHeadingRow(builder, | + | renderHeadingRow(builder, aggregateScore, data.i18n.aggregator) |
end | end | ||
| Line 226: | Line 247: | ||
builder:css('font-size', '100%') | builder:css('font-size', '100%') | ||
if hasAggregators then | if hasAggregators then | ||
| − | renderHeadingRow(builder, | + | renderHeadingRow(builder, aggregateScore, data.i18n.aggregator) |
for _,v in ipairs(providedAggregators) do | for _,v in ipairs(providedAggregators) do | ||
renderRating(builder, data.aggregators[v].name, args[v]) | renderRating(builder, data.aggregators[v].name, args[v]) | ||
| Line 235: | Line 256: | ||
end | end | ||
if hasReviewers then | if hasReviewers then | ||
| − | renderHeadingRow(builder, | + | renderHeadingRow(builder, reviewScore, data.i18n.publication) |
for _,v in ipairs(providedReviewers) do | for _,v in ipairs(providedReviewers) do | ||
renderRating(builder, data.reviewers[v].name, args[v]) | renderRating(builder, data.reviewers[v].name, args[v]) | ||
| Line 246: | Line 267: | ||
end | end | ||
| − | local function renderAwards(builder, args, awardKeys, borderTop) | + | local function renderAwards(builder, args, awardKeys, borderTop, awardCount) |
builder = builder:tag('table') | builder = builder:tag('table') | ||
:addClass('infobox wikitable') | :addClass('infobox wikitable') | ||
| Line 255: | Line 276: | ||
:attr('cellspacing', 0) | :attr('cellspacing', 0) | ||
| − | renderMainHeading(builder, 2, data.i18n.awards, borderTop) | + | if awardCount == 1 then |
| + | renderMainHeading(builder, 2, data.i18n.award, borderTop) | ||
| + | else | ||
| + | renderMainHeading(builder, 2, data.i18n.awards, borderTop) | ||
| + | end | ||
builder:tag('tr') | builder:tag('tr') | ||
| Line 277: | Line 302: | ||
end | end | ||
| − | local function renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args) | + | local function renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount, awardCount) |
local tbl = mw.html.create('table') | local tbl = mw.html.create('table') | ||
:attr('cellpadding', 0) | :attr('cellpadding', 0) | ||
| Line 309: | Line 334: | ||
end | end | ||
| − | renderReviews(tbl:tag('tr'):tag('td'), providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args) | + | renderReviews(tbl:tag('tr'):tag('td'), providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount) |
if #awardKeys ~= 0 then | if #awardKeys ~= 0 then | ||
| − | renderAwards(tbl:tag('tr'):tag('td'), args, awardKeys, (#customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0) and 'none' or nil) | + | renderAwards(tbl:tag('tr'):tag('td'), args, awardKeys, (#customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0) and 'none' or nil, awardCount) |
end | end | ||
return tbl | return tbl | ||
| Line 318: | Line 343: | ||
function p._reviewbox(args) | function p._reviewbox(args) | ||
local activeSystems = getActiveSystems(args) | local activeSystems = getActiveSystems(args) | ||
| − | local customReviewerKeys, customAggregatorKeys, awardKeys = getArgKeyTables(args) | + | local customReviewerKeys, customAggregatorKeys, awardKeys, customReviewerCount, customAggregatorCount, awardCount = getArgKeyTables(args) |
| − | local providedReviewers, providedAggregators = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0) | + | local providedReviewers, providedAggregators, providedReviewersCount, providedAggregatorsCount = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0) |
| + | local reviewerCount = customReviewerCount + providedReviewersCount | ||
| + | local aggregatorCount = customAggregatorCount + providedAggregatorsCount | ||
if #customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 or #awardKeys ~= 0 then | if #customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 or #awardKeys ~= 0 then | ||
| − | return renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args) | + | return renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount, awardCount) |
elseif mw.title.getCurrentTitle().namespace == 0 then | elseif mw.title.getCurrentTitle().namespace == 0 then | ||
return data.i18n.emptyCategory | return data.i18n.emptyCategory | ||
Revision as of 16:19, 4 February 2016
Documentation for this module may be created at Module:Video game reviews/sandbox/doc
require('Module:No globals')
local p = {}
local data = require('Module:Video game reviews/data/sandbox')
local yesno = require('Module:Yesno')
local getArgs
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, awards = {}, {}, {}
local reviewersCount, aggregatorsCount, awardsCount = 0, 0, 0
for k in pairs(args) do
if string.match(k, '^rev%d+$') then
table.insert(reviewers, k)
reviewersCount = reviewersCount +1
elseif string.match(k, '^agg%d+$') then
table.insert(aggregators, k)
aggregatorsCount = aggregatorsCount + 1
elseif string.match(k, '^award%d+$') then
table.insert(awards, k)
awardsCount = awardsCount + 1
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(awards, comparator)
return reviewers, aggregators, awards, reviewersCount, aggregatorsCount, awardsCount
end
local function getProvidedReviewersAndAggregators(args, usePlatforms)
local providedReviewers, providedAggregators = {}, {}
local providedReviewersCount, providedAggregatorsCount = 0, 0
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)
providedReviewersCount = providedReviewersCount +1
elseif data.aggregators[halfarg] then
table.insert(providedAggregators, halfarg)
providedAggregatorsCount = providedAggregatorsCount +1
end
end
end
end
else
for k in pairs(args) do
if not string.find(k, '_') then
if data.reviewers[k] then
table.insert(providedReviewers, k)
providedReviewersCount = providedReviewersCount +1
elseif data.aggregators[k] then
table.insert(providedAggregators, k)
providedAggregatorsCount = providedAggregatorsCount +1
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, providedReviewersCount, providedAggregatorsCount
end
local function renderTitleRow(tbl, title)
local titleCell = tbl:tag('tr'):tag('th'):css('font-size', '120%')
if title then
titleCell
:wikitext(title)
else
titleCell
:addClass('Reception')
:wikitext(data.i18n.reception)
end
end
local function renderMainHeading(builder, colspan, headingText, borderTop)
builder:tag('tr'):tag('th')
:attr('colspan', colspan)
:css('background', '#d1dbdf')
:css('font-size', '120%')
:css('border-top', borderTop)
:wikitext(headingText)
end
local function renderHeadingRowWithSystems(builder, mainHeading, activeSystems)
renderMainHeading(builder, #activeSystems + 1, mainHeading)
builder:tag('tr')
:tag('th')
:attr('rowspan', '2')
:css('background', '#e8f4f8')
:css('text-align', 'center')
:css('vertical-align', 'middle')
:wikitext(data.i18n.publication)
:done()
:tag('th')
:attr('colspan', #activeSystems)
:css('background', '#e8f4f8')
:css('vertical-align', 'middle')
:wikitext(data.i18n.score)
builder = builder:tag('tr')
for _,v in ipairs(activeSystems) do
builder:tag('th'):wikitext(data.systems[v].name)
end
end
local function renderHeadingRow(builder, mainHeading, nameHeading)
renderMainHeading(builder, 2, mainHeading)
builder
:tag('tr')
:tag('th')
:css('background', '#e8f4f8')
:css('text-align', 'center')
:css('vertical-align', 'middle')
:wikitext(nameHeading)
:done()
:tag('th')
:css('background', '#e8f4f8')
:css('vertical-align', 'middle')
:wikitext(data.i18n.score)
end
local function renderRatingsBySystem(builder, code, name, activeSystems, args, na)
builder = builder:tag('tr')
builder:tag('td')
:css('vertical-align','middle')
:wikitext(name)
for _,v in ipairs(activeSystems) do
local combinedCode = code .. '_' .. v
local cell = builder:tag('td')
if args[combinedCode] then
cell
:css('vertical-align', 'middle')
:css('font-size', '110%')
:wikitext(args[combinedCode])
elseif na then
cell
:css('color', 'lightgray')
:css('vertical-align','middle')
:css('text-align', 'center')
:css('font-size', '110%')
:addClass('table-na')
:wikitext(data.i18n.na)
end
end
end
local function renderRating(builder, name, rating)
builder:tag('tr')
:tag('td')
:css('text-align', 'center')
:css('vertical-align', 'middle')
:wikitext(name)
:done()
:tag('td')
:css('text-align', 'center')
:css('font-size', '110%')
:wikitext(rating)
end
local function renderReviews(builder, providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount)
builder = builder:tag('table')
:addClass('infobox wikitable')
:attr('cellpadding', 0)
:attr('cellspacing', 0)
:css('width', '100%')
:css('border-bottom', 'none')
:css('margin', '0em')
local hasReviewers = #providedReviewers ~= 0 or #customReviewerKeys ~= 0
local hasAggregators = #providedAggregators ~= 0 or #customAggregatorKeys ~= 0
if reviewerCount == 1 then
local reviewScore = data.i18n.reviewScore
else
local reviewScore = data.i18n.reviewScores
end
if aggregatorCount == 1 then
local aggregateScore = data.i18n.aggregateScore
else
local aggregateScore = data.i18n.aggregateScores
end
builder:css('font-size', '100%')
if #activeSystems ~= 0 then
builder:wikitext(data.i18n.multiplatformCategory)
local na = yesno(args.na)
local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms)
if hasReviewers then
if showplatforms then
renderHeadingRowWithSystems(builder, reviewScore, activeSystems)
else
renderHeadingRow(builder, reviewScore, data.i18n.publication)
end
for _,v in ipairs(providedReviewers) do
renderRatingsBySystem(builder, v, data.reviewers[v].name, activeSystems, args, na)
end
for _,v in ipairs(customReviewerKeys) do
renderRatingsBySystem(builder, v, args[v], activeSystems, args, na)
end
end
if hasAggregators then
if hasReviewers then
renderMainHeading(builder, #activeSystems+1, aggregateScore)
elseif showplatforms then
renderHeadingRowWithSystems(builder, aggregateScore, activeSystems)
else
renderHeadingRow(builder, aggregateScore, data.i18n.aggregator)
end
for _,v in ipairs(providedAggregators) do
renderRatingsBySystem(builder, v, data.aggregators[v].name, activeSystems, args, na)
end
for _,v in ipairs(customAggregatorKeys) do
renderRatingsBySystem(builder, v, args[v], activeSystems, args, na)
end
end
else
builder:wikitext(data.i18n.singleplatformCategory)
builder:css('font-size', '100%')
if hasAggregators 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 hasReviewers 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 renderAwards(builder, args, awardKeys, borderTop, awardCount)
builder = builder:tag('table')
:addClass('infobox wikitable')
:css('width', '100%')
:css('margin', '0em')
:css('border-top', borderTop)
:attr('cellpadding', 3)
:attr('cellspacing', 0)
if awardCount == 1 then
renderMainHeading(builder, 2, data.i18n.award, borderTop)
else
renderMainHeading(builder, 2, data.i18n.awards, borderTop)
end
builder:tag('tr')
:tag('th')
:wikitext(data.i18n.publication)
:done()
:tag('th')
:wikitext(data.i18n.award)
for _,v in ipairs(awardKeys) do
builder:tag('tr')
:tag('td')
:css('font-weight','bold')
:css('background-color','#f2f2f2')
:wikitext(args[v .. 'Pub'])
:done()
:tag('td')
:css('background-color','#f2f2f2')
:wikitext(args[v])
end
end
local function renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount, awardCount)
local tbl = mw.html.create('table')
:attr('cellpadding', 0)
:attr('cellspacing', 0)
:css('background', 'transparent')
:css('padding', '0em')
:css('margin', '0em 1em 1em 1em')
:css('text-align', 'center')
:css('font-size', '80%')
:css('float', args.align or 'right')
:css('clear', args.align or 'right')
if #activeSystems == 0 then
-- Width: 20% Seems better since it scales with the article size.
tbl
:css('width', args.width or '23em')
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
renderTitleRow(tbl, args.title)
if args.subtitle then
tbl:tag('tr'):tag('th')
:css('font-size', '120%')
:wikitext(args.subtitle)
end
renderReviews(tbl:tag('tr'):tag('td'), providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount)
if #awardKeys ~= 0 then
renderAwards(tbl:tag('tr'):tag('td'), args, awardKeys, (#customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0) and 'none' or nil, awardCount)
end
return tbl
end
function p._reviewbox(args)
local activeSystems = getActiveSystems(args)
local customReviewerKeys, customAggregatorKeys, awardKeys, customReviewerCount, customAggregatorCount, awardCount = getArgKeyTables(args)
local providedReviewers, providedAggregators, providedReviewersCount, providedAggregatorsCount = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0)
local reviewerCount = customReviewerCount + providedReviewersCount
local aggregatorCount = customAggregatorCount + providedAggregatorsCount
if #customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 or #awardKeys ~= 0 then
return renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args, reviewerCount, aggregatorCount, awardCount)
elseif mw.title.getCurrentTitle().namespace == 0 then
return data.i18n.emptyCategory
end
end
function p.reviewbox(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._reviewbox(getArgs(frame, {wrappers = data.i18n.wrapper, trim = false, translate = data.argi18n}))
end
return p