Module:Release: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
No edit summary
No edit summary
 
(18 intermediate revisions by the same user not shown)
Line 2: Line 2:
local h = {}
local h = {}


local Region = require("Module:Region")
local utilsArg = require("Module:UtilsArg")
local utilsArg = require("Module:UtilsArg")
local utilsCargo = require("Module:UtilsCargo")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsRegion = require("Module:UtilsRegion")
local utilsString = require("Module:UtilsString")
local utilsTable = require("Module:UtilsTable")
local utilsTable = require("Module:UtilsTable")


local data = mw.loadData("Module:Releases/Data")
local regionCodes = Region.enum()
local regionsByParam = utilsTable.keyBy(data.regions, "param")
local systemsByCode = utilsTable.keyBy(data.Games.systems, "code")
local systemCodes = utilsTable.map(data.Games.systems, "code")
local TABLES = {
Games = "GameReleases"
}
local FIELDS = {
Games = {
title = "String",
system = "String",
service = "String",
program = "String",
region = "String",
date = "Date",
reference = "Wikitext",
}
}


function p.CargoDeclare(frame)
function p.Main(frame)
local medium = frame.args[1]
local args, err = utilsArg.parse(frame:getParent().args, p.Templates.Release)
return utilsCargo.declare(TABLES[medium], FIELDS[medium])
local categories = err and err.categoryText or ""
end
 
-- List releases using the region flag, unless there is at least one release using a multi-flag (i.e. multi-country) region
function p.CargoStore(frame)
-- In that case, we use abbrevations instead of flags for consistency
local medium = frame.args[1]
local hasMultiFlags = utilsTable.find(utilsTable.keys(args), function(code)
local args, err = h.evaluateArgs(medium, frame:getParent().args)
local flags = Region.getRegion(code).flags
if err then
return #flags > 1
return utilsMarkup.categories(err)
end
local rows = {}
for _, regionDate in ipairs(args.regionDates) do
local row = utilsTable.merge({}, args, regionDate)
row.regionDates = nil
row.regions = nil
utilsCargo.store(TABLES[medium], row)
table.insert(rows, row)
end
return h.printReleases(medium, rows)
end
 
function p.Releases(frame)
return p.printReleases(frame.args[1], frame:getParent().args[1])
end
 
function p.printReleases(medium, title)
local releases = h.fetchReleases(medium, title)
local result = h.printReleases(medium, releases)
return result
end
 
function h.evaluateArgs(medium, frameArgs)
frameArgs = utilsTable.mapValues(frameArgs, utilsString.trim)
frameArgs = utilsTable.mapValues(frameArgs, utilsString.nilIfEmpty)
local regions = utilsTable.filter(utilsTable.stringKeys(frameArgs), function(arg)
return not utilsString.endsWith(arg, "R")
end)
local regionDates = utilsTable.map(regions, function(region)
return {
region = regionsByParam[region].code,
date = frameArgs[region],
reference= frameArgs[region .. "R"],
}
end)
end)
local releases = hasMultiFlags and h.getReleasesWithAbbrs(args) or h.getReleasesWithFlags(args)
local mediumArgs, mediumValidators = h.argEvaluators[medium](frameArgs)
-- escape commas in the date format so that the year doesn't get rendered on a separate line in the infobox
local args = utilsTable.merge(mediumArgs, {
for i in ipairs(releases) do
regions = regions,
releases[i] = string.gsub(releases[i], ",", ",")
regionDates = regionDates
end
})
local validators = utilsTable.merge(mediumValidators, {
regions = {
enum = utilsTable.map(data.regions, "param")
}
})
local err = utilsArg.validate(args, validators)
return args, err
end


function h.fetchReleases(medium, title)
local list = utilsMarkup.list(releases)
local tbl = TABLES[medium]
return list, categories
local fields = utilsTable.keys(FIELDS[medium])
local query = utilsCargo.allOf({title = title})
local queryResults = utilsCargo.query(tbl, table.concat(fields, ","), game)
return queryResults
end
end
 
function h.getReleasesWithFlags(args)
function h.evaluateReleases(medium, releases)
local releases = {}
local releasesByName = utilsTable.groupBy(releases, h.labelers[medium])
for i, code in ipairs(regionCodes) do
local sortedReleasesByName = {}
local releaseDate = args[code]
for k, v in pairs(releasesByName) do
if releaseDate then
local sortedIndex = h.sorters[medium](v[1])
local region = Region.getRegion(code, { flagTooltip = "name" })
sortedReleasesByName[sortedIndex] = {
local flag = region.flags[1]
name = k,
local releaseWithFlag = string.format("%s %s", flag, releaseDate)
regionDates = v
table.insert(releases, releaseWithFlag)
}
end
end
end
return utilsTable.compact(sortedReleasesByName)
return releases
end
end


function h.printReleases(medium, releases)
function h.getReleasesWithAbbrs(args)
releases = h.evaluateReleases(medium, releases)
local releases = {}
for i, release in ipairs(releases) do
local regionCodesByAbbr = Region.enum({ sortBy = "abbr" })
local dates = {}
for i, code in ipairs(regionCodesByAbbr) do
local regionDates = utilsTable.keyBy(release.regionDates, "region")
local releaseDate = args[code]
for _, region in ipairs(data.regions) do
if releaseDate then
local regionCode = regionsByParam[region.param].code
local region = Region.getRegion(code)
local regionDate = regionDates[regionCode]
local abbr = region.abbr
if regionDate then
if region.name == "United Kingdom" then -- for UK the tooltip is "United Kingdom" and the abbreviation is "GBR" which doesn't line up - needs a bit more explaining
local formattedDate = mw.language.getContentLanguage():formatDate("M d, Y", regionDate.date)
abbr = mw.getCurrentFrame():expandTemplate({
local date = utilsRegion.flag(regionCode) .. " " .. formattedDate
title = "Exp",
if not utilsString.isEmpty(regionDate.reference) then
args = {"United Kingdom (Great Britain)", "GBR"}
date = date .. mw.getCurrentFrame():extensionTag("ref", regionDate.reference)
})
end
table.insert(dates, date)
end
end
local releaseWithAbbr = string.format("'''%s''': %s", abbr, releaseDate)
table.insert(releases, releaseWithAbbr)
end
end
releases[i] = utilsTable.concat({release.name}, dates)
end
end
return utilsMarkup.definitionList(releases, {
return releases
class = "releases"
})
end
end


-- GAMES


function h.gameArgs(frameArgs)
regionCodes.reference = nil
local args = {
local params = {}
title = frameArgs[1],
for i, code in ipairs(regionCodes) do
system = frameArgs[2],
params[code] = {
service = frameArgs[3],
type = "date",
program = frameArgs[4],
desc = "Release date in "..Region.getRegion(code).name,
trim = true,
nilIfEmpty = true,
}
}
local validators = {
end
title = {
local countryCodes, multiCountryCodes = utilsTable.partition(regionCodes, function(str)
nonEmpty = true,
return str:len() == 2
},
end)
system = {
p.Templates = {
enum = systemCodes
["Release"] = {
},
format = "block",
service = {
indent = 1,
enum = utilsTable.keys(data.Games.services[args.system] or {})
paramOrder = utilsTable.concat(countryCodes, multiCountryCodes),
},
params = params,
program = {
boilerplate = {
enum = utilsTable.keys(data.Games.programs[args.system] or {})
tabs = {
},
{
label = "Countries",
params = countryCodes,
},
{
label = "Multi-Country Regions",
params = multiCountryCodes,
},
}
}
}
}
return args, validators
end
function h.labelGameRelease(release)
local label
if not utilsString.isEmpty(release.service) then
label = data.Games.services[release.system][release.service].displayName
else
label = systemsByCode[release.system].name
end
if not utilsString.isEmpty(release.program) then
label = label .. (" (%s)"):format(data.Games.programs[release.system][release.program])
end
return label
end
function h.sortGameRelease(release)
return utilsTable.keyOf(systemCodes, release.system)
end
h.argEvaluators = {
Games = h.gameArgs,
}
h.labelers = {
Games = h.labelGameRelease,
}
h.sorters = {
Games = h.sortGameRelease,
}
}


return p
return p

Latest revision as of 20:08, 22 November 2022

This is the main module for the following templates:
local p = {}
local h = {}

local Region = require("Module:Region")
local utilsArg = require("Module:UtilsArg")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsTable = require("Module:UtilsTable")

local regionCodes = Region.enum()

function p.Main(frame)
	local args, err = utilsArg.parse(frame:getParent().args, p.Templates.Release)
	local categories = err and err.categoryText or ""
	
	-- List releases using the region flag, unless there is at least one release using a multi-flag (i.e. multi-country) region
	-- In that case, we use abbrevations instead of flags for consistency
	local hasMultiFlags = utilsTable.find(utilsTable.keys(args), function(code)
		local flags = Region.getRegion(code).flags
		return #flags > 1
	end)
	local releases = hasMultiFlags and h.getReleasesWithAbbrs(args) or h.getReleasesWithFlags(args)
	
	-- escape commas in the date format so that the year doesn't get rendered on a separate line in the infobox
	for i in ipairs(releases) do
		releases[i] = string.gsub(releases[i], ",", ",")
	end

	local list = utilsMarkup.list(releases)
	return list, categories
end
function h.getReleasesWithFlags(args)
	local releases = {}
	for i, code in ipairs(regionCodes) do
		local releaseDate = args[code]
		if releaseDate then
			local region = Region.getRegion(code, { flagTooltip = "name" })
			local flag = region.flags[1]
			local releaseWithFlag = string.format("%s %s", flag, releaseDate)
			table.insert(releases, releaseWithFlag)
		end
	end
	return releases
end

function h.getReleasesWithAbbrs(args)
	local releases = {}
	local regionCodesByAbbr = Region.enum({ sortBy = "abbr" })
	for i, code in ipairs(regionCodesByAbbr) do
		local releaseDate = args[code]
		if releaseDate then
			local region = Region.getRegion(code)
			local abbr = region.abbr
			if region.name == "United Kingdom" then -- for UK the tooltip is "United Kingdom" and the abbreviation is "GBR" which doesn't line up - needs a bit more explaining
				abbr = mw.getCurrentFrame():expandTemplate({
					title = "Exp",
					args = {"United Kingdom (Great Britain)", "GBR"}
				})
			end
			local releaseWithAbbr = string.format("'''%s''': %s", abbr, releaseDate)
			table.insert(releases, releaseWithAbbr)
		end
	end
	return releases
end


regionCodes.reference = nil
local params = {}
for i, code in ipairs(regionCodes) do
	params[code] = {
		type = "date",
		desc = "Release date in "..Region.getRegion(code).name,
		trim = true,
		nilIfEmpty = true,
	}
end
local countryCodes, multiCountryCodes = utilsTable.partition(regionCodes, function(str)
	return str:len() == 2
end)
p.Templates = {
	["Release"] = {
		format = "block",
		indent = 1,
		paramOrder = utilsTable.concat(countryCodes, multiCountryCodes),
		params = params,
		boilerplate = {
			tabs = {
				{
					label = "Countries",
					params = countryCodes,
				},
				{
					label = "Multi-Country Regions",
					params = multiCountryCodes,
				},
			}
		}
	}
}

return p