Main module for {{ Video game series reviews}}.
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local Vgwd = require('Module:Video game wikidata')
local p = {}
local columns = {
'mc' = nil,
'gr' = nil,
'oc' = nil,
'fam' = nil,
'sales' = nil,
'year' = nil,
}
local function sortByNumber(a,b)
return a'num' < b'num'
end;
local function sortByPublicationDate(a,b)
local aP = a'pubDate'];
local bP = b'pubDate'];
if(aP ~= nil and bP ~= nil) then
return aP < bP;
end;
-- fallback sorting, let's assume the oldest wikidata entity is the oldest game
local aQ = a'qid'];
local bQ = b'qid'];
if(aQ ~= nil and bQ ~= nil) then
return aQ < bQ;
end;
-- still nothing? okay, let's just use the initial order
return a'num' < b'num'];
end;
local function getVGWD(frame, reviewer)
-- Obey local override on displaying this reviewer, don't bother trying to get Wikidata.
if(columnsreviewer == false) then
return nil;
end;
local vgwdScore = Vgwd.setReviewer(reviewer);
if(vgwdScore ~= nil) then
return vgwdScore;
end;
-- Because a game with no platforms may disable show system, we have to reenable for each game.
Vgwd.setShowSystem(true);
return Vgwd.printReviewScores(frame);
end;
local function checkColumn(game, column)
if(gamecolumn ~= nil and gamecolumn ~= "" and columnscolumn ~= false) then
columnscolumn = true;
end;
end;
local function buildGameEntry(args, num, qid)
local game = {}
game'num' = num;
game'name' = args"game"..num];
game'mc' = args"mc"..num];
game'gr' = args"gr"..num];
game'oc' = args"oc"..num];
game'fam' = args"fam"..num];
game'sales' = args"sales"..num];
game'year' = args"year"..num];
if(qid ~= nil) then
-- If a qid was supplied, we are doing a series pull and won't check columns here.
game'qid' = qid;
else
-- Pulling game data purely from arguments, so check columns.
game'qid' = args"qid"..num];
checkColumn(game, 'mc');
checkColumn(game, 'gr');
checkColumn(game, 'oc');
checkColumn(game, 'fam');
checkColumn(game, 'year');
checkColumn(game, 'sales');
end;
return game;
end;
local function buildGameWikidata(frame, game)
if(game'qid' ~= nil) then
local vgwdScore = Vgwd.setGame(game"qid"]);
if(vgwdScore == nil) then
game'updateLink' = Vgwd.getUpdateLink();
if(game'mc' == nil) then
game'mc' = getVGWD(frame, 'mc')
end;
if(game'gr' == nil and columns'gr']) then
game'gr' = getVGWD(frame, 'gr')
end;
if(game'oc' == nil and columns'oc']) then
game'oc' = getVGWD(frame, 'oc')
end;
if(game'fam' == nil and columns'fam']) then
game'fam' = getVGWD(frame, 'fam')
end;
if(game'name' == nil) then
local sitelink = Vgwd.getSitelink();
local label = Vgwd.getLabel();
if(sitelink ~= nil) then
if(sitelink ~= label) then
game'name' = "[[" .. sitelink .. "|" .. label .. "]]";
else
game'name' = "[[" .. sitelink .. "]]";
end;
else
game'name' = label;
end;
end;
if(game'year' == nil) then
local pubDate = Vgwd.getEarliestPublicationDate();
game'pubDate' = pubDate;
if(pubDate ~= nil) then
game'year' = pubDate.year;
end;
end;
else
-- Entity wasn't found... How to represent? TODO.
end;
end;
-- We don't check GR and FAM because they must be explicitly enabled by arguments.
checkColumn(game, 'mc');
checkColumn(game, 'oc');
checkColumn(game, 'year');
checkColumn(game, 'sales');
return game;
end;
function p.main(frame)
local args = getArgs(frame)
return p._main(frame, args)
end
function p._main(frame, args)
-- Get specified values of column display parameters. Nil = Unspecified.
if(args"mc"]) then
columns'mc' = yesno(args.mc);
end
if(args"gr"]) then
columns'gr' = yesno(args.gr);
end
if(args"oc"]) then
columns'oc' = yesno(args.oc);
end
if(args"fam"]) then
columns'fam' = yesno(args.fam);
end
if(args"sales"]) then
columns'sales' = yesno(args.sales);
end
if(args"years"]) then
columns'year' = yesno(args.years);
end
local seriesQid = args"seriesQid"]; -- Should be nil, but for testing we have to be able to supply one.
Vgwd.setDateFormat(args"df"]);
Vgwd.setSystem(nil);
Vgwd.setGenerateReferences(true);
Vgwd.setShowUpdateLink(false);
Vgwd.setUpdateLinkStyle("pen");
local games = {};
local gameRead = {};
-- Look for locally provided gameN and qidN parameters first. Build a table containing all the arguments.
for k, v in pairs(args) do
if(string.find(k, "game%d+") or string.find(k, "qid%d+")) then
local num = tonumber(string.match(k, "%d+"))
if(num ~= nil) then
if(gameReadnum == nil) then
gameReadnum = true;
table.insert(games, buildGameEntry(args,num));
end;
end;
end;
end;
-- Did we find any games specified on the arguments?
if(#games > 0) then
-- Sort by entry.
table.sort(games, sortByNumber);
-- Retrieve missing data with Wikidata if possible, for each entry.
for i, game in ipairs(games) do
gamesi = buildGameWikidata(frame,game);
end;
else
-- If we didn't get any games from the arguments, try to pull the parts of the series from Wikidata.
-- Reset vgwd to current page, presumably a series.
local vgwdScore = Vgwd.setGame(seriesQid);
if(vgwdScore == nil) then
local parts = Vgwd.getParts();
for i, qid in ipairs(parts) do
-- Build an entry.
local game = buildGameEntry({},i,qid)
-- Retrieve the data from Wikidata and store in the table.
table.insert(games, buildGameWikidata(frame,game));
end;
table.sort(games, sortByPublicationDate);
else
-- Entity wasn't found... How to represent? TODO.
end;
end;
local ret = "{| class=\"wikitable plainrowheaders\" style=\"font-size: 90%; float: right; clear: right; margin:0.5em 0 0.5em 1em;\"\n"
ret = ret .."|+ style=\"font-size: 111.11%;\" | "
if args.title then
ret = ret .. args.title
elseif columns'sales' then
if columns'fam' then
ret = ret .. "Sales and review scores"
elseif columns'gr' or columns'mc' or columns'oc' then
ret = ret .. "Sales and aggregate review scores"
else
ret = ret .. "Sales"
end
elseif columns'fam' then
if columns'gr' or columns'mc' or columns'oc' then
ret = ret .. "Japanese and Western review scores"
else
ret = ret .. "Famitsu review scores"
end
else
ret = ret .. "Aggregate review scores"
end
if args.updated then
ret = ret .. "<br /><small>''As of " .. args.updated ..".''</small>"
end
ret = ret .. " \n"
ret = ret .. "! scope=\"col\" | Game \n"
if columns'year' then
ret = ret .. "! scope=\"col\" | Year\n"
end
if columns'sales' then
ret = ret .. "! scope=\"col\" | " .. (args.sales_title or "Units sold") .. " \n"
end
if columns'fam' then
ret = ret .. "! scope=\"col\" | " .. (args.fam_title or "''[[Famitsu scores|Famitsu]]''") .. " \n"
end
if columns'gr' then
ret = ret .. "! scope=\"col\" | " .. (args.gr_title or "[[GameRankings]]") .. " \n"
end
if columns'mc' then
ret = ret .. "! scope=\"col\" | " .. (args.mc_title or "[[Metacritic]]") .. " \n"
end
if columns'oc' then
ret = ret .. "! scope=\"col\" | " .. (args.oc_title or "[[OpenCritic]]") .. " \n"
end
-- Print the reviews
for i,game in ipairs(games) do
ret = ret .. "|-\n"
ret = ret .. "! scope=\"row\" | ''" .. game'name' .. "''"
if(game'updateLink']) then
ret = ret .. " " .. game'updateLink'];
end;
ret = ret .. "\n"
if columns'year' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'year' or '') .. " \n"
end
if columns'sales' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'sales' or '') .. " \n"
end
if columns'fam' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'fam' or '') .. " \n"
end
if columns'gr' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'gr' or '') .. " \n"
end
if columns'mc' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'mc' or '') .. " \n"
end
if columns'oc' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'oc' or '') .. " \n"
end
end;
ret = ret .. "|}"
return ret
end
return p
Main module for {{ Video game series reviews}}.
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local Vgwd = require('Module:Video game wikidata')
local p = {}
local columns = {
'mc' = nil,
'gr' = nil,
'oc' = nil,
'fam' = nil,
'sales' = nil,
'year' = nil,
}
local function sortByNumber(a,b)
return a'num' < b'num'
end;
local function sortByPublicationDate(a,b)
local aP = a'pubDate'];
local bP = b'pubDate'];
if(aP ~= nil and bP ~= nil) then
return aP < bP;
end;
-- fallback sorting, let's assume the oldest wikidata entity is the oldest game
local aQ = a'qid'];
local bQ = b'qid'];
if(aQ ~= nil and bQ ~= nil) then
return aQ < bQ;
end;
-- still nothing? okay, let's just use the initial order
return a'num' < b'num'];
end;
local function getVGWD(frame, reviewer)
-- Obey local override on displaying this reviewer, don't bother trying to get Wikidata.
if(columnsreviewer == false) then
return nil;
end;
local vgwdScore = Vgwd.setReviewer(reviewer);
if(vgwdScore ~= nil) then
return vgwdScore;
end;
-- Because a game with no platforms may disable show system, we have to reenable for each game.
Vgwd.setShowSystem(true);
return Vgwd.printReviewScores(frame);
end;
local function checkColumn(game, column)
if(gamecolumn ~= nil and gamecolumn ~= "" and columnscolumn ~= false) then
columnscolumn = true;
end;
end;
local function buildGameEntry(args, num, qid)
local game = {}
game'num' = num;
game'name' = args"game"..num];
game'mc' = args"mc"..num];
game'gr' = args"gr"..num];
game'oc' = args"oc"..num];
game'fam' = args"fam"..num];
game'sales' = args"sales"..num];
game'year' = args"year"..num];
if(qid ~= nil) then
-- If a qid was supplied, we are doing a series pull and won't check columns here.
game'qid' = qid;
else
-- Pulling game data purely from arguments, so check columns.
game'qid' = args"qid"..num];
checkColumn(game, 'mc');
checkColumn(game, 'gr');
checkColumn(game, 'oc');
checkColumn(game, 'fam');
checkColumn(game, 'year');
checkColumn(game, 'sales');
end;
return game;
end;
local function buildGameWikidata(frame, game)
if(game'qid' ~= nil) then
local vgwdScore = Vgwd.setGame(game"qid"]);
if(vgwdScore == nil) then
game'updateLink' = Vgwd.getUpdateLink();
if(game'mc' == nil) then
game'mc' = getVGWD(frame, 'mc')
end;
if(game'gr' == nil and columns'gr']) then
game'gr' = getVGWD(frame, 'gr')
end;
if(game'oc' == nil and columns'oc']) then
game'oc' = getVGWD(frame, 'oc')
end;
if(game'fam' == nil and columns'fam']) then
game'fam' = getVGWD(frame, 'fam')
end;
if(game'name' == nil) then
local sitelink = Vgwd.getSitelink();
local label = Vgwd.getLabel();
if(sitelink ~= nil) then
if(sitelink ~= label) then
game'name' = "[[" .. sitelink .. "|" .. label .. "]]";
else
game'name' = "[[" .. sitelink .. "]]";
end;
else
game'name' = label;
end;
end;
if(game'year' == nil) then
local pubDate = Vgwd.getEarliestPublicationDate();
game'pubDate' = pubDate;
if(pubDate ~= nil) then
game'year' = pubDate.year;
end;
end;
else
-- Entity wasn't found... How to represent? TODO.
end;
end;
-- We don't check GR and FAM because they must be explicitly enabled by arguments.
checkColumn(game, 'mc');
checkColumn(game, 'oc');
checkColumn(game, 'year');
checkColumn(game, 'sales');
return game;
end;
function p.main(frame)
local args = getArgs(frame)
return p._main(frame, args)
end
function p._main(frame, args)
-- Get specified values of column display parameters. Nil = Unspecified.
if(args"mc"]) then
columns'mc' = yesno(args.mc);
end
if(args"gr"]) then
columns'gr' = yesno(args.gr);
end
if(args"oc"]) then
columns'oc' = yesno(args.oc);
end
if(args"fam"]) then
columns'fam' = yesno(args.fam);
end
if(args"sales"]) then
columns'sales' = yesno(args.sales);
end
if(args"years"]) then
columns'year' = yesno(args.years);
end
local seriesQid = args"seriesQid"]; -- Should be nil, but for testing we have to be able to supply one.
Vgwd.setDateFormat(args"df"]);
Vgwd.setSystem(nil);
Vgwd.setGenerateReferences(true);
Vgwd.setShowUpdateLink(false);
Vgwd.setUpdateLinkStyle("pen");
local games = {};
local gameRead = {};
-- Look for locally provided gameN and qidN parameters first. Build a table containing all the arguments.
for k, v in pairs(args) do
if(string.find(k, "game%d+") or string.find(k, "qid%d+")) then
local num = tonumber(string.match(k, "%d+"))
if(num ~= nil) then
if(gameReadnum == nil) then
gameReadnum = true;
table.insert(games, buildGameEntry(args,num));
end;
end;
end;
end;
-- Did we find any games specified on the arguments?
if(#games > 0) then
-- Sort by entry.
table.sort(games, sortByNumber);
-- Retrieve missing data with Wikidata if possible, for each entry.
for i, game in ipairs(games) do
gamesi = buildGameWikidata(frame,game);
end;
else
-- If we didn't get any games from the arguments, try to pull the parts of the series from Wikidata.
-- Reset vgwd to current page, presumably a series.
local vgwdScore = Vgwd.setGame(seriesQid);
if(vgwdScore == nil) then
local parts = Vgwd.getParts();
for i, qid in ipairs(parts) do
-- Build an entry.
local game = buildGameEntry({},i,qid)
-- Retrieve the data from Wikidata and store in the table.
table.insert(games, buildGameWikidata(frame,game));
end;
table.sort(games, sortByPublicationDate);
else
-- Entity wasn't found... How to represent? TODO.
end;
end;
local ret = "{| class=\"wikitable plainrowheaders\" style=\"font-size: 90%; float: right; clear: right; margin:0.5em 0 0.5em 1em;\"\n"
ret = ret .."|+ style=\"font-size: 111.11%;\" | "
if args.title then
ret = ret .. args.title
elseif columns'sales' then
if columns'fam' then
ret = ret .. "Sales and review scores"
elseif columns'gr' or columns'mc' or columns'oc' then
ret = ret .. "Sales and aggregate review scores"
else
ret = ret .. "Sales"
end
elseif columns'fam' then
if columns'gr' or columns'mc' or columns'oc' then
ret = ret .. "Japanese and Western review scores"
else
ret = ret .. "Famitsu review scores"
end
else
ret = ret .. "Aggregate review scores"
end
if args.updated then
ret = ret .. "<br /><small>''As of " .. args.updated ..".''</small>"
end
ret = ret .. " \n"
ret = ret .. "! scope=\"col\" | Game \n"
if columns'year' then
ret = ret .. "! scope=\"col\" | Year\n"
end
if columns'sales' then
ret = ret .. "! scope=\"col\" | " .. (args.sales_title or "Units sold") .. " \n"
end
if columns'fam' then
ret = ret .. "! scope=\"col\" | " .. (args.fam_title or "''[[Famitsu scores|Famitsu]]''") .. " \n"
end
if columns'gr' then
ret = ret .. "! scope=\"col\" | " .. (args.gr_title or "[[GameRankings]]") .. " \n"
end
if columns'mc' then
ret = ret .. "! scope=\"col\" | " .. (args.mc_title or "[[Metacritic]]") .. " \n"
end
if columns'oc' then
ret = ret .. "! scope=\"col\" | " .. (args.oc_title or "[[OpenCritic]]") .. " \n"
end
-- Print the reviews
for i,game in ipairs(games) do
ret = ret .. "|-\n"
ret = ret .. "! scope=\"row\" | ''" .. game'name' .. "''"
if(game'updateLink']) then
ret = ret .. " " .. game'updateLink'];
end;
ret = ret .. "\n"
if columns'year' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'year' or '') .. " \n"
end
if columns'sales' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'sales' or '') .. " \n"
end
if columns'fam' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'fam' or '') .. " \n"
end
if columns'gr' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'gr' or '') .. " \n"
end
if columns'mc' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'mc' or '') .. " \n"
end
if columns'oc' then
ret = ret .. "| style=\"text-align: center;\" | " .. (game'oc' or '') .. " \n"
end
end;
ret = ret .. "|}"
return ret
end
return p