Module:Release: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
m (PhantomCaleb moved page Module:Releases to Module:Release without leaving a redirect)
No edit summary
 
(13 intermediate revisions by the same user not shown)
Line 2: Line 2:
local h = {}
local h = {}


local Franchise = require("Module:Franchise")
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 TABLES = {
function p.Main(frame)
Games = "GameReleases"
local args, err = utilsArg.parse(frame:getParent().args, p.Templates.Release)
}
local categories = err and err.categoryText or ""
local FIELDS = {
Games = {
-- List releases using the region flag, unless there is at least one release using a multi-flag (i.e. multi-country) region
game = "String",
-- In that case, we use abbrevations instead of flags for consistency
system = "String",
local hasMultiFlags = utilsTable.find(utilsTable.keys(args), function(code)
service = "String",
local flags = Region.getRegion(code).flags
program = "String",
return #flags > 1
region = "String",
end)
date = "Date",
local releases = hasMultiFlags and h.getReleasesWithAbbrs(args) or h.getReleasesWithFlags(args)
reference = "Wikitext",
}
-- 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], ",", ",")
function p.CargoStore(frame)
local medium = frame.args[1]
local args, err = utilsArg.parse(frame:getParent().args, p.Templates["Game Releases/Store"])
if err then
return utilsMarkup.categories(err.categories)
end
end
local rows = {}
for _, region in ipairs(data.regions) do
if args[region.param] then
local row = utilsTable.merge({}, args, {
region = region.code,
date = args[region.param],
reference = args[region.param .. "R"],
})
frame:callParserFunction({
        name = "#cargo_store:_table=" .. TABLES[medium],
        args = row
    })
table.insert(rows, row)
end
end
return h.printReleases(medium, rows)
end


function p.Releases(frame)
local list = utilsMarkup.list(releases)
return p.printReleases(frame.args[1], frame:getParent().args[1])
return list, categories
end
end
 
function h.getReleasesWithFlags(args)
function p.printReleases(medium, title)
local releases = {}
local releases = h.fetchReleases(medium, title)
for i, code in ipairs(regionCodes) do
local result = h.printReleases(medium, releases)
local releaseDate = args[code]
return result
if releaseDate then
end
local region = Region.getRegion(code, { flagTooltip = "name" })
 
local flag = region.flags[1]
function h.fetchReleases(medium, title)
local releaseWithFlag = string.format("%s %s", flag, releaseDate)
local tbl = TABLES[medium]
table.insert(releases, releaseWithFlag)
local fields = utilsTable.keys(FIELDS[medium])
end
local query = {
where = utilsCargo.allOf({ title = title })
}
local queryResults = utilsCargo.query(tbl, table.concat(fields, ","), query)
return queryResults
end
 
function h.evaluateReleases(medium, releases)
local releasesByName = utilsTable.groupBy(releases, h.labelers[medium])
local sortedReleasesByName = {}
for k, v in pairs(releasesByName) do
local sortedIndex = h.sorters[medium](v[1])
sortedReleasesByName[sortedIndex] = {
name = k,
regionDates = v
}
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 = data.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
 
-- GAMES
 
function h.labelGameRelease(release)
local label
if not utilsString.isEmpty(release.service) then
label = data.Games.services[release.system][release.service].displayName
else
label = data.Games.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(data.Games.systemCodes, release.system)
end
end


h.labelers = {
Games = h.labelGameRelease,
}
h.sorters = {
Games = h.sortGameRelease,
}


local regionParams = {}
regionCodes.reference = nil
local regionParamsOrder = {}
local params = {}
for _, region in ipairs(data.regions) do
for i, code in ipairs(regionCodes) do
regionParams[region.param] = {
params[code] = {
type = "string",
type = "date",
desc = "Release date in " .. utilsRegion.region(region.code),
desc = "Release date in "..Region.getRegion(code).name,
trim = true,
trim = true,
nilIfEmpty = true,
}
}
regionParams[region.param .. "R"] = {
type = "string",
desc = "Source reference for release date.",
inline = true,
trim = true,
}
table.insert(regionParamsOrder, region.param)
table.insert(regionParamsOrder, region.param .. "R")
end
end
 
local countryCodes, multiCountryCodes = utilsTable.partition(regionCodes, function(str)
return str:len() == 2
end)
p.Templates = {
p.Templates = {
["Game Releases/Store"] = {
["Release"] = {
wip = true,
purpose = "Store information about game releases.",
storesData = "Data:Releases/Games",
format = "block",
format = "block",
paramOrder = utilsTable.concat({1, 2, 3, 4}, regionParamsOrder),
indent = 1,
params = {
paramOrder = utilsTable.concat(countryCodes, multiCountryCodes),
[1] = {
params = params,
name = "game",
boilerplate = {
type = "string",
tabs = {
required = true,
{
enum = Franchise.enum(),
label = "Countries",
desc = "Game identifier.",
params = countryCodes,
inline = true,
},
trim = true,
{
},
label = "Multi-Country Regions",
[2] = {
params = multiCountryCodes,
name = "system",
},
type = "string",
required = true,
enum = data.Games.systemCodes,
desc = "Console or handheld that the game was released for.",
inline = true,
trim = true,
},
[3] = {
name = "service",
type = "string",
enumDependsOn = "system",
enum = function(system)
return utilsTable.keys(data.Games.services[system] or {})
end,
desc = "Software through which this game release is offered (e.g. Virtual Console).",
inline = true,
canOmit = true,
trim = true,
},
[4] = {
name = "program",
type = "string",
enumDependsOn = "system",
enum = function(system)
return utilsTable.keys(data.Games.programs[system] or {})
end,
desc = "Loyalty program through which this release is offered (e.g. Nintendo 3DS Ambassador Program).",
inline = true,
canOmit = true,
trim = true,
}
}
}
}
}
}
}
}
utilsTable.merge(p.Templates["Game Releases/Store"].params, regionParams)


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