Module:Sandbox/X201/Hello

.mw-parser-output .documentation,.mw-parser-output .documentation-metadata{border:1px solid var(--border-color-base,#a2a9b1);background-color:#ecfcf4;color:inhe…

Module:Sandbox/X201/Hello
require('strict')
 
local p = {}
 
local data = mw.loadData('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 = {}, {}, {}
	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, '^award%d+$') then
			table.insert(awards, 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(awards, comparator)
	return reviewers, aggregators, awards
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
			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 renderTitleRow(tbl, plain, title)
	local titleCell = tbl:tag('tr'):tag('th'):css('font-size', '120%')
 
	if plain then
		titleCell:tag('span')
			:css('padding-left', '5.7em')
			:wikitext('&nbsp;')
	end
 
	if title then
		titleCell
			:wikitext(title)
	else
		titleCell
			:addClass('Reception')
			:wikitext('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('Publication')
		:done()
		:tag('th')
			:attr('colspan', #activeSystems)
			:css('background', '#e8f4f8')
			:css('vertical-align', 'middle')
			:wikitext('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('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('N/A')
		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)
	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
	builder:css('font-size', '100%')
	if #activeSystems ~= 0 then
		local na = yesno(args.na)
		local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms)
		if hasReviewers then
			if showplatforms then
				renderHeadingRowWithSystems(builder, 'Review scores', activeSystems)
			else
				renderHeadingRow(builder, 'Review scores', '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, 'Aggregate scores')
			elseif showplatforms then
				renderHeadingRowWithSystems(builder, 'Aggregate scores', activeSystems)
			else
				renderHeadingRow(builder, 'Aggregate scores', '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:css('font-size', '100%')
		if hasAggregators then
			renderHeadingRow(builder, 'Aggregate scores', '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, 'Review scores', '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)
	builder = builder:tag('table')
		:addClass('infobox wikitable')
		:css('width', '100%')
		:css('margin', '0em')
		:css('border-top', borderTop)
		:attr('cellpadding', 3)
		:attr('cellspacing', 0)
 
	renderMainHeading(builder, 2, 'Awards', borderTop)
 
	builder:tag('tr')
		:tag('th')
			:wikitext('Publication')
		:done()
		:tag('th')
			:wikitext('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)
	local tbl = mw.html.create('table')
		:attr('cellpadding', 0)
		:attr('cellspacing', 0)
		:addClass(args.state or 'collapsible')
		: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 ~= 'plain' and args.state ~= 'off' then
		tbl
			:addClass('collapsible')
			:addClass(args.state)
	end
	renderTitleRow(tbl, args.state == 'plain', 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)
	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)
	end
	return tbl
end
 
function p._reviewbox(args)
	local activeSystems = getActiveSystems(args)
	local customReviewerKeys, customAggregatorKeys, awardKeys = getArgKeyTables(args)
	local providedReviewers, providedAggregators = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0)
	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)
	elseif mw.title.getCurrentTitle().namespace == 0 then
		return '[[Category:Empty templates on articles]]'
	end
end
 
function p.reviewbox(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	return p._reviewbox(getArgs(frame, {wrappers = 'User:X201/sandbox/Lua', trim = false}))
end
function p._mulitcheck(args)
	local activeSystems = getActiveSystems(args)
	local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms)
 		if showplatforms then
			return '[[:Category:True test]]'	
		else
			return '[[:Category:false test]]'
		end
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.