Module:Video game review score/sandbox
Appearance
![]() | This is the module sandbox page for Module:Video game review score (diff). |
![]() | This module is rated as alpha. It is ready for third-party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome. |
Usage
![]() | This module depends on the following other modules: |
This module uses the Wikidata properties:
platform (P400) (see uses)
review score (P444) (see uses)
review score by (P447) (see uses)
reference URL (P854) (see uses)
retrieved (P813) (see uses)
publisher (P123) (see uses)
title (P1476) (see uses)
published in (P1433) (see uses)
Implements {{Video game review score}}
local Date = require('Module:Date')._Date
local vgwd = require('Module:Video game wikidata')
local yesno = require('Module:Yesno')
local p = {}
-- Local variables.
local reviewer = nil;
local df = "mdy";
local entity = nil;
local genRefs = true;
local proseScore = false;
local system = nil;
local systemId = nil;
function setReviewer(iReviewer)
-- No reviewer, stop. Must have reviewer at least.
if(iReviewer == nil or iReviewer == "") then
return "Missing reviewer";
end;
-- See if supplied reviewer is in the aggregator table.
iReviewer = string.upper(iReviewer)
reviewer = vgwd.getAggregatorID(iReviewer);
if(reviewer == nil or reviewer == "") then
-- No? Maybe in the reviewer table.
reviewer = vgwd.getReviewerID(iReviewer);
if(reviewer == nil or reviewer == "") then
return "Invalid reviewer";
end;
end;
end;
function setDateFormat(iDf)
-- Check for a date format parameter. Default to mdy if missing.
if(iDf) then
df = string.lower(iDf);
end;
end;
function setGame(iGame)
-- Check for a game parameter. If missing, default to current article.
if(iGame) then
entity = mw.wikibase.getEntity(iGame);
else
entity = mw.wikibase.getEntity();
end;
if(not entity) then
return "No matching wikidata entity found";
end;
end;
function setSystem(iSystem)
-- Check for system parameter, and resolve it's QID if possible.
if(iSystem) then
system = string.upper(iSystem);
systemId = vgwd.getSystemID(system);
elseif(proseScore) then
-- If no system was specified, force proseScore off.
proseScore = false;
end;
end;
function setGenerateReferences(iGenRefs)
-- Reference suppression.
if(iGenRefs) then
genRefs = yesno(iGenRefs, true);
end;
end;
function setProseScore(iProseScore)
-- Prose score formatting.
if(iProseScore) then
proseScore = yesno(iProseScore, false);
end;
end;
local function sortByPlatform(a,b)
local platformA = nil;
local platformB = nil;
if(not(a['qualifiers']['P400'] == nil or b['qualifiers']['P400'][1] == nil)) then
platformA = vgwd.getSystemAlias(a['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
if(platformA == nil) then
platformA = mw.wikibase.label('Q'..a['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
end;
end;
if(not(b['qualifiers']['P400'] == nil or b['qualifiers']['P400'][1] == nil)) then
platformB = vgwd.getSystemAlias(b['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
if(platformB == nil) then
platformB = mw.wikibase.label('Q'..b['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
end;
end;
return platformA < platformB
end;
local function buildCite(reference)
local referenceUrl = nil;
local cite = nil;
if(not(reference['snaks']['P854'] == nil or reference['snaks']['P854'][1] == nil)) then
referenceUrl = reference['snaks']['P854'][1]['datavalue']['value'];
end;
if(not (referenceUrl == nil or referenceUrl == "")) then
cite = "{{cite web|url="..referenceUrl;
local timestamp = nil;
local publisher = nil;
local work = nil;
local title = nil;
if(not (reference['snaks']['P813'] == nil or reference['snaks']['P813'][1] == nil)) then
timestamp = reference['snaks']['P813'][1]['datavalue']['value']['time'];
end;
if(not (reference['snaks']['P123'] == nil or reference['snaks']['P123'][1] == nil)) then
publisher = mw.wikibase.label('Q'..reference['snaks']['P123'][1]['datavalue']['value']['numeric-id']);
end;
if(not (reference['snaks']['P1433'] == nil or reference['snaks']['P1433'][1] == nil)) then
work = mw.wikibase.label('Q'..reference['snaks']['P1433'][1]['datavalue']['value']['numeric-id']);
end;
if(not (reference['snaks']['P1476'] == nil or reference['snaks']['P1476'][1] == nil)) then
title = reference['snaks']['P1476'][1]['datavalue']['value']['text'];
end;
if(not(title == nil or title == "")) then
cite = cite .. "|title="..title;
end;
if(not(publisher == nil or publisher == "")) then
cite = cite .. "|publisher="..publisher;
end;
if(not(work == nil or work == "")) then
cite = cite .. "|work="..work;
end;
if(not(timestamp == nil or timestamp == "")) then
local year = string.sub(timestamp,2,5);
local month = string.sub(timestamp,7,8);
local day = string.sub(timestamp,10,11);
local accessdate = Date(year, month, day):text(df);
cite = cite .. "|accessdate="..accessdate;
end;
cite = cite..'}}';
end;
return cite;
end;
local function printReviewRow(frame, reviewscore)
local ret = ""
local system = nil;
local score = nil;
local reference = nil;
if(not(reviewscore['qualifiers']['P400'] == nil or reviewscore['qualifiers']['P400'][1] == nil)) then
system = vgwd.getSystemAlias(reviewscore['qualifiers']['P400'][1]['datavalue']['value']['numeric-id']);
end
if(not (system == nil or system == "") and not(proseScore)) then
ret = ret.."("..system..") ";
end;
score = reviewscore['mainsnak']['datavalue']['value'];
if(not (score == nil or score == "")) then
ret = ret..score;
end;
if(not (reviewscore['references'] == nil or reviewscore['references'][1] == nil) and genRefs and not(proseScore)) then
local cite = buildCite(reviewscore['references'][1], df);
if(not(cite == nil)) then
local scoreBy = vgwd.getAggregatorAlias(reviewscore['qualifiers']['P447'][1]['datavalue']['value']['numeric-id']);
if(scoreBy == nil) then
scoreBy = vgwd.getReviewerAlias(reviewscore['qualifiers']['P447'][1]['datavalue']['value']['numeric-id']);
end;
local name = entity:getLabel()..'-'..scoreBy;
if(not (system == nil or system == "")) then
name = name..system;
end;
cite = frame:extensionTag{ name = "ref", args = {name=name}, content=cite };
ret = ret..cite;
end;
end;
return ret.."<br />";
end
local function printReviewScores(frame)
-- Loop all of "review scores" for this title
local ret = "";
local reviewscores = entity['claims']['P444'];
if(reviewscores) then
-- Find reviews that qualify for printing and insert into array.
local reviewsToPrint = {}
for i,review in pairs(reviewscores) do
local scoreBy = nil
if(not(review['qualifiers']['P447'] == nil or review['qualifiers']['P447'][1] == nil)) then
scoreBy = review['qualifiers']['P447'][1]['datavalue']['value']['numeric-id'];
end;
if(scoreBy == reviewer) then
-- If template specified a system, we need to check for the specific system and only output that one.
if(system == nil or system == "") then
-- No system specified, so output each one found.
table.insert(reviewsToPrint,review);
else
-- Get platform if it exists.
if(not(review['qualifiers']['P400'] == nil or review['qualifiers']['P400'][1] == nil)) then
-- Try to match based on QID.
local reviewSysId = review['qualifiers']['P400'][1]['datavalue']['value']['numeric-id'];
if(systemId == reviewSysId) then
table.insert(reviewsToPrint,review);
else
-- If that failed, try to match based on label.
local systemName = mw.wikibase.label('Q'..reviewSysId);
if(not(systemName == nil) and string.upper(systemName) == system) then
table.insert(reviewsToPrint,review);
end;
end;
end;
end;
end;
end
-- Sort the array by platform label.
table.sort(reviewsToPrint, sortByPlatform)
-- Print the reviews
for i,review in ipairs(reviewsToPrint) do
ret = ret .. printReviewRow(frame, review);
end;
end;
-- Add edit link at end. If proseScore is set, suppress.
if(not(proseScore)) then
ret = string.sub(ret, 1, -7)..'<sub>[[d:'..entity['id']..'#P444|[±]]]</sub>';
--ret = ret..'<sup>[[d:'..entity['id']..'#P444|[±]]]</sup>';
else
ret = string.sub(ret, 1, -7);
end;
return ret;
end;
function p._main(frame, args)
local ret = setReviewer(args["reviewer"])
setDateFormat(args["df"])
ret = setGame(args["game"])
setSystem(args["system"])
setGenerateReferences(args['showRefs'])
setProseScore(args['proseScore'])
if(ret == nil) then
ret = printReviewScores(frame);
end;
return ret;
end;
-- Template main function
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Video game review score'
})
return p._main(frame, args);
end;
return p