Module:Release: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
No edit summary
m (PhantomCaleb moved page Module:Releases to Module:Release without leaving a redirect)
(No difference)

Revision as of 14:40, 31 October 2022

Lua error in package.lua at line 80: module 'Module:UtilsRegion' not found.


local p = {}
local h = {}

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

local data = mw.loadData("Module:Releases/Data")

local TABLES = {
	Games = "GameReleases"
}
local FIELDS = {
	Games = {
		game = "String",
		system = "String",
		service = "String",
		program = "String",
		region = "String",
		date = "Date",
		reference = "Wikitext",
	}
}

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
	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)
	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.fetchReleases(medium, title)
	local tbl = TABLES[medium]
	local fields = utilsTable.keys(FIELDS[medium])
	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
	return utilsTable.compact(sortedReleasesByName)
end

function h.printReleases(medium, releases)
	releases = h.evaluateReleases(medium, releases)
	for i, release in ipairs(releases) do
		local dates = {}
		local regionDates = utilsTable.keyBy(release.regionDates, "region")
		for _, region in ipairs(data.regions) do
			local regionCode = data.regionsByParam[region.param].code
			local regionDate = regionDates[regionCode]
			if regionDate then
				local formattedDate = mw.language.getContentLanguage():formatDate("M d, Y", regionDate.date)
				local date = utilsRegion.flag(regionCode) .. " " .. formattedDate
				if not utilsString.isEmpty(regionDate.reference) then
					date = date .. mw.getCurrentFrame():extensionTag("ref", regionDate.reference)
				end
				table.insert(dates, date)
			end
		end
		releases[i] = utilsTable.concat({release.name}, dates)
	end
	return utilsMarkup.definitionList(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

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

local regionParams = {}
local regionParamsOrder = {}
for _, region in ipairs(data.regions) do
	regionParams[region.param] = {
		type = "string",
		desc = "Release date in " .. utilsRegion.region(region.code),
		trim = 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

p.Templates = {
	["Game Releases/Store"] = {
		wip = true,
		purpose = "Store information about game releases.",
		storesData = "Data:Releases/Games",
		format = "block",
		paramOrder = utilsTable.concat({1, 2, 3, 4}, regionParamsOrder),
		params = {
			[1] = {
				name = "game",
				type = "string",
				required = true,
				enum = Franchise.enum(),
				desc = "Game identifier.",
				inline = true,
				trim = true,
			},
			[2] = {
				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