Модул:Video game reviews — разлика између измена

Iz Vojne Enciklopedije
Пређи на навигацију Пређи на претрагу
м (Враћене измене Ранко Николић (разговор) на последњу измену корисника Obsuser)
 
м (1 измена увезена)
 
(Нису приказане 2 међуизмене 2 корисника)
Ред 2: Ред 2:


local p = {}
local p = {}
local data = require('Module:Video game reviews/data')
local data = require('Module:Video game reviews/data')
local yesno = require('Module:Yesno')
local yesno = require('Module:Yesno')
local vgwd = require('Module:Video game wikidata')
local getArgs
local getArgs


Ред 21: Ред 21:


local function getArgKeyTables(args)
local function getArgKeyTables(args)
local reviewers, reviewersRu, 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+$') or mw.ustring.match(k, '^рец%d+$') then
if string.match(k, '^rev%d+$') or mw.ustring.match(k, '^рец%d+$') then
table.insert(reviewers, k)
table.insert(reviewers, k)
elseif string.match(k, '^revRu%d+$') or mw.ustring.match(k, '^рецРус%d+$') then
reviewersCount = reviewersCount +1
table.insert(reviewersRu, k)
elseif string.match(k, '^agg%d+$') or mw.ustring.match(k, '^агр%d+$') then
elseif string.match(k, '^agg%d+$') or mw.ustring.match(k, '^агр%d+$') then
table.insert(aggregators, k)
table.insert(aggregators, k)
aggregatorsCount = aggregatorsCount + 1
elseif string.match(k, '^award%d+$') or mw.ustring.match(k, '^наг%d+$') then
elseif string.match(k, '^award%d+$') or mw.ustring.match(k, '^наг%d+$') then
table.insert(awards, k)
table.insert(awards, k)
awardsCount = awardsCount + 1
end
end
end
end
Ред 37: Ред 39:
end
end
table.sort(reviewers, comparator)
table.sort(reviewers, comparator)
table.sort(reviewersRu, comparator)
table.sort(aggregators, comparator)
table.sort(aggregators, comparator)
table.sort(awards, comparator)
table.sort(awards, comparator)
return reviewers, reviewersRu, aggregators, awards
return reviewers, aggregators, awards, reviewersCount, aggregatorsCount, awardsCount
end
end


local function getProvidedReviewersAndAggregators(args, usePlatforms)
local function getProvidedReviewersAndAggregators(args, usePlatforms)
local providedReviewers, providedReviewersRu, providedAggregators = {}, {}, {}
local providedReviewers, providedAggregators = {}, {}
local providedReviewersCount, providedAggregatorsCount = 0, 0
if usePlatforms then
if usePlatforms then
local seen = {}
local seen = {}
Ред 55: Ред 57:
if data.reviewers[halfarg] then
if data.reviewers[halfarg] then
table.insert(providedReviewers, halfarg)
table.insert(providedReviewers, halfarg)
elseif data.reviewersRu[halfarg] then
providedReviewersCount = providedReviewersCount +1
table.insert(providedReviewersRu, halfarg)
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
Ред 68: Ред 70:
if data.reviewers[k] then
if data.reviewers[k] then
table.insert(providedReviewers, k)
table.insert(providedReviewers, k)
elseif data.reviewersRu[k] then
providedReviewersCount = providedReviewersCount +1
table.insert(providedReviewersRu, k)
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
Ред 78: Ред 80:
table.sort(providedReviewers, function(a, b)
table.sort(providedReviewers, function(a, b)
return data.reviewers[a].sortkey < data.reviewers[b].sortkey
return data.reviewers[a].sortkey < data.reviewers[b].sortkey
end)
table.sort(providedReviewersRu, function(a, b)
return data.reviewersRu[a].sortkey < data.reviewersRu[b].sortkey
end)
end)
table.sort(providedAggregators, function(a, b)
table.sort(providedAggregators, function(a, b)
return data.aggregators[a].sortkey < data.aggregators[b].sortkey
return data.aggregators[a].sortkey < data.aggregators[b].sortkey
end)
end)
return providedReviewers, providedReviewersRu, providedAggregators
return providedReviewers, providedAggregators, providedReviewersCount, providedAggregatorsCount
end
end


Ред 186: Ред 185:
end
end


local function renderReviews(builder, providedReviewers, providedReviewersRu, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, 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')
Ред 195: Ред 194:
:css('margin', '0em')
:css('margin', '0em')


local reviewerCount = #providedReviewers + #customReviewerKeys
local hasReviewers = #providedReviewers ~= 0 or #customReviewerKeys ~= 0
local reviewerCountRu = #providedReviewersRu + #customReviewerRuKeys
local hasAggregators = #providedAggregators ~= 0 or #customAggregatorKeys ~= 0
local aggregatorCount = #providedAggregators + #customAggregatorKeys
local reviewScore, aggregateScore = "", ""
local reviewScore = data.i18n[reviewerCount == 1 and 'reviewScore' or 'reviewScores']
local reviewScoreRu = data.i18n[reviewerCountRu == 1 and 'reviewScoreRu' or 'reviewScoresRu']
if reviewerCount == 1 then
local aggregateScore = data.i18n[aggregatorCount == 1 and 'aggregateScore' or 'aggregateScores']
reviewScore = data.i18n.reviewScore
else
reviewScore = data.i18n.reviewScores
end
if aggregatorCount == 1 then
aggregateScore = data.i18n.aggregateScore
else
aggregateScore = data.i18n.aggregateScores
end
builder:css('font-size', '100%')
builder:css('font-size', '100%')
if #activeSystems ~= 0 then
if #activeSystems ~= 0 then
builder:wikitext(data.i18n.multiplatformCategory)
builder:wikitext(data.i18n.multiplatformCategory)
local na = yesno(args.na or args['N/A'] or args['Н/Д'])
local na = yesno(args.na)
local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms or args['show_platforms'] or args['прикажи_платформе'])
local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms)
if reviewerCount ~= 0 then
if hasReviewers then
if showplatforms then
if showplatforms then
renderHeadingRowWithSystems(builder, reviewScore, activeSystems)
renderHeadingRowWithSystems(builder, reviewScore, activeSystems)
Ред 220: Ред 228:
end
end
end
end
if reviewerCountRu ~= 0 then
if hasAggregators then
if showplatforms then
if hasReviewers then
renderHeadingRowWithSystems(builder, reviewScoreRu, activeSystems)
else
renderHeadingRow(builder, reviewScoreRu, data.i18n.publication)
end
 
for _,v in ipairs(providedReviewersRu) do
renderRatingsBySystem(builder, v, data.reviewersRu[v].name, activeSystems, args, na)
end
for _,v in ipairs(customReviewerRuKeys) do
renderRatingsBySystem(builder, v, args[v], activeSystems, args, na)
end
end
if aggregatorCount ~= 0 then
if reviewerCount ~= 0 or reviewerCountRu ~= 0 then
renderMainHeading(builder, #activeSystems+1, aggregateScore)
renderMainHeading(builder, #activeSystems+1, aggregateScore)
elseif showplatforms then
elseif showplatforms then
Ред 253: Ред 247:
builder:wikitext(data.i18n.singleplatformCategory)
builder:wikitext(data.i18n.singleplatformCategory)
builder:css('font-size', '100%')
builder:css('font-size', '100%')
if aggregatorCount ~= 0 then
if hasAggregators then
renderHeadingRow(builder, aggregateScore, data.i18n.aggregator)
renderHeadingRow(builder, aggregateScore, data.i18n.aggregator)
for _,v in ipairs(providedAggregators) do
for _,v in ipairs(providedAggregators) do
Ред 262: Ред 256:
end
end
end
end
if reviewerCount ~= 0 then
if hasReviewers then
renderHeadingRow(builder, reviewScore, data.i18n.publication)
renderHeadingRow(builder, reviewScore, data.i18n.publication)
for _,v in ipairs(providedReviewers) do
for _,v in ipairs(providedReviewers) do
Ред 268: Ред 262:
end
end
for _,v in ipairs(customReviewerKeys) do
for _,v in ipairs(customReviewerKeys) do
renderRating(builder, args[v], args[v .. 'Score'] or args[v .. 'Оцена'])
end
end
if reviewerCountRu ~= 0 then
renderHeadingRow(builder, reviewScoreRu, data.i18n.publication)
for _,v in ipairs(providedReviewersRu) do
renderRating(builder, data.reviewersRu[v].name, args[v])
end
for _,v in ipairs(customReviewerRuKeys) do
renderRating(builder, args[v], args[v .. 'Score'] or args[v .. 'Оцена'])
renderRating(builder, args[v], args[v .. 'Score'] or args[v .. 'Оцена'])
end
end
Ред 283: Ред 268:
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')
Ред 292: Ред 277:
:attr('cellspacing', 0)
:attr('cellspacing', 0)
renderMainHeading(builder, 2, data.i18n[#awardKeys == 1 and 'award' or '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')
Ред 314: Ред 303:
end
end


local function renderMainTable(providedReviewers, providedReviewersRu, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, args, wikidata)
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)
Ред 323: Ред 312:
:css('text-align', 'center')
:css('text-align', 'center')
:css('font-size', '80%')
:css('font-size', '80%')
:css('float', args.align or args['поравнање'] or 'right')
:css('float', args.align or 'right')
:css('clear', args.align or args['поравнање'] or 'right')
:css('clear', args.align or 'right')


if #activeSystems == 0 then
if #activeSystems == 0 then
-- Width: 20% Seems better since it scales with the article size.
-- Width: 20% Seems better since it scales with the article size.
tbl
tbl
:css('width', args.width or args['ширина'] or '23em')
:css('width', args.width or '23em')
end
end


if (args.title or args['наслов']) and (args.state or args['стање']) and (args.state == 'autocollapse'
if args.title and args.state and (args.state == 'autocollapse'
or args.state == 'collapsed' or args.state == 'expanded' or args['стање'] == 'autocollapse'
or args.state == 'collapsed' or args.state == 'expanded') then
or args['стање'] == 'collapsed' or args['стање'] == 'expanded'
or args['стање'] == 'сакриј' or args['стање'] == 'прикажи') then
tbl
tbl
:addClass('collapsible')
:addClass('collapsible')
:addClass(args.state or args['стање'])
:addClass(args.state)
end
end
renderTitleRow(tbl, args.title)
renderTitleRow(tbl, args.title)


if args.subtitle or args['поднаслов'] then
if args.subtitle then
tbl:tag('tr'):tag('th')
tbl:tag('tr'):tag('th')
:css('font-size', '120%')
:css('font-size', '120%')
:wikitext(args.subtitle or args['поднаслов'])
:wikitext(args.subtitle)
end
end


renderReviews(tbl:tag('tr'):tag('td'), providedReviewers, providedReviewersRu, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, 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 #customReviewerRuKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 or #providedReviewersRu ~= 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
if wikidata == true then
tbl:tag('tr'):tag('td')
:tag('table')
:addClass('infobox wikitable')
:css('width', '100%')
:css('margin', '0em')
:css('border-top', 'none')
:attr('cellpadding', 3)
:attr('cellspacing', 0)
:tag('tr'):tag('th')
:css('background', '#d1dbdf')
:css('font-size', '100%')
:css('border-top', 'none')
:wikitext('Уреди на Википодацима '.. vgwd.getUpdateLink('nosub'))
end
return tbl
return tbl
end
end


local function checkForWikidata(frame, args, activeSystems, providedAggregators)
function p._reviewbox(args)
local wikidata = false
vgwd.setDateFormat(args["df"])
vgwd.setGame(args["qid"])
vgwd.setSystem(nil)
vgwd.setGenerateReferences(true)
vgwd.setShowUpdateLink(false)
vgwd.setUpdateLinkStyle("pen")
vgwd.setSystemFormat(args["systemFormat"])
-- Loop through aggregators if we have any.
if #providedAggregators ~= 0 then
for _i,aggr in ipairs(providedAggregators) do
-- Check if vgwd knows this aggregator.
if vgwd.setReviewer(aggr) == nil then
-- Loop through active systems
if #activeSystems ~= 0 then
for _j,sys in ipairs(activeSystems) do
local combinedCode = aggr .. '_' .. sys
if args[combinedCode] == 'wikidata' then
vgwd.setSystem(sys)
vgwd.setShowSystem(false)
local vgwdScore = vgwd.printReviewScores(frame)
if vgwdScore then
args[combinedCode] = vgwdScore
end
wikidata = true
end
end
else
vgwd.setShowSystem(true)
    if args[aggr] == 'wikidata' then
local vgwdScore = vgwd.printReviewScores(frame)
if vgwdScore then
args[aggr] = vgwdScore
end
wikidata = true
end
end
end
end
end
 
return wikidata
end
 
function p._reviewbox(frame, args)
local activeSystems = getActiveSystems(args)
local activeSystems = getActiveSystems(args)
local customReviewerKeys, customReviewerRuKeys, customAggregatorKeys, awardKeys = getArgKeyTables(args)
local customReviewerKeys, customAggregatorKeys, awardKeys, customReviewerCount, customAggregatorCount, awardCount = getArgKeyTables(args)
local providedReviewers, providedReviewersRu, providedAggregators = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0)
local providedReviewers, providedAggregators, providedReviewersCount, providedAggregatorsCount = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0)
local wikidata = checkForWikidata(frame, args, activeSystems, providedAggregators)
local reviewerCount = customReviewerCount + providedReviewersCount
if #customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #customReviewerRuKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 or #providedReviewersRu ~= 0 or #awardKeys ~= 0 then
local aggregatorCount =  customAggregatorCount + providedAggregatorsCount
return renderMainTable(providedReviewers, providedReviewersRu, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, args, wikidata)
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
elseif mw.title.getCurrentTitle().namespace == 0 then
return data.i18n.emptyCategory
return data.i18n.emptyCategory
Ред 435: Ред 359:
getArgs = require('Module:Arguments').getArgs
getArgs = require('Module:Arguments').getArgs
end
end
return p._reviewbox(frame, getArgs(frame, {wrappers = data.i18n.wrapper, trim = false, translate = data.argi18n}))
return p._reviewbox(getArgs(frame, {wrappers = data.i18n.wrapper, trim = false, translate = data.argi18n}))
end
end


return p
return p

Тренутна верзија на датум 5. фебруар 2021. у 13:51

Овај модул покреће шаблон {{Рецензије видео-игре}}. Молимо погледајте страницу шаблона за упутство за употребу.

Категорије за праћење/одржавање

Модул са подацима


require('Module:No globals')

local p = {}

local data = require('Module:Video game reviews/data')
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+$') or mw.ustring.match(k, '^рец%d+$') then
			table.insert(reviewers, k)
			reviewersCount = reviewersCount +1
		elseif string.match(k, '^agg%d+$') or mw.ustring.match(k, '^агр%d+$') then
			table.insert(aggregators, k)
			aggregatorsCount = aggregatorsCount + 1
		elseif string.match(k, '^award%d+$') or mw.ustring.match(k, '^наг%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('Одзив')
			: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
	local reviewScore, aggregateScore = "", ""
	
	if reviewerCount == 1 then
		reviewScore = data.i18n.reviewScore
	else
		reviewScore = data.i18n.reviewScores
	end
	if aggregatorCount == 1 then
		aggregateScore = data.i18n.aggregateScore
	else
		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'] or args[v .. 'Оцена'])
			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'] or args[v .. 'Оцена'])
			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'] or args[v .. 'Пуб'])
			: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