Module:Main Page: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
No edit summary
No edit summary
 
(13 intermediate revisions by 3 users not shown)
Line 1: Line 1:
local p = {}
local p = {}
local cargo = mw.ext.cargo
 
local tab2 = require("Module:Tab2")
local File = require("Module:File")
local utilsCode = require("Module:UtilsCode")
local Franchise = require("Module:Franchise")
local utilsLayout = require("Module:UtilsLayout")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsString = require("Module:UtilsString")
local utilsTable = require("Module:UtilsTable")
local utilsTable = require("Module:UtilsTable")


function p._DisplayGameList(frame)
local SPINOFF_FAMILIES = {
return p.DisplayGameList()
{
name = "Hyrule Warriors",
page = "Hyrule Warriors",
},
{
name = "Tingle",
page = "Tingle (Series)",
},
{
name = "BS-X",
page = "BS-X",
},
{
name = "CD-i",
page = "Philips CD-i"
},
}
 
function p.Games(frame)
return p.printGames()
end
end


function p.DisplayGameList()
function p.printGames()
-- Get all stored games
local gamesByType = utilsTable.groupBy(Franchise.enumGames(), Franchise.type)
local tables = "Games"
local fields = "name, subtitle, initialism, mainrelease, type, family"
local main = gamesByType["main"]
local args = {
local remakes = gamesByType["remake"]
orderBy = "mainrelease DESC"
local spinoffs = gamesByType["spin-off"]
}
local games = cargo.query(tables, fields, args)
-- Generate tabs
-- By default remakes are placed after their originals, so we have to re-sort by release date
local maingames = mw.html.create("div")
table.sort(remakes, function(a, b)
:addClass("game-container")
local aRelease = Franchise.releaseDate(a)
local remakes = mw.html.create("div")
local bRelease = Franchise.releaseDate(b)
:addClass("game-container")
return aRelease < bRelease and aRelease ~= bRelease and aRelease ~= ""
local spinoffs = mw.html.create("div")
end)
:addClass("game-container")
-- Create a table of game families
main = utilsTable.reverse(main)
local gameFamilies = {}
remakes = utilsTable.reverse(remakes)
for key, game in ipairs(games) do
spinoffs = utilsTable.reverse(spinoffs)
-- Check if the game belongs to a family
if not utilsCode.IsEmpty(game["family"]) then
local familyExists = false
--Check if it exists
for key2, family in ipairs(gameFamilies) do
if family["name"] == game["family"] then
familyExists = true
end
end
-- If the family doesn't exist, create it first
if familyExists == false then
table.insert(gameFamilies, { name = game["family"], games= {} })
end
-- Add the game to the family
for key2, family in ipairs(gameFamilies) do
if family["name"] == game["family"] then
table.insert(family["games"], game)
end
end
end
end
-- Categorizes games in the proper tabs
local mainTiles = p.printGameContainer(main)
-- Run first to add all TBA games so that they appear first despite being
local remakeTiles = p.printGameContainer(remakes)
-- last in the query since it's sorted and they're empty
local spinoffTiles = p.printSpinoffContainer(spinoffs)
for key, game in ipairs(games) do
if p.FormatReleaseDate(game["mainrelease"]) == "TBA" then
if game["type"] == "main" then
p.AddGameToFlexList(maingames, game)
elseif game["type"] == "remake" then
p.AddGameToFlexList(remakes, game)
elseif game["type"] == "spin-off" and utilsCode.IsEmpty(game["family"]) then
p.AddGameToFlexList(spinoffs, game)
end
end
end
-- Run again for other games
local tabData = {
for key, game in ipairs(games) do
{
if not (p.FormatReleaseDate(game["mainrelease"]) == "TBA") then
label = "Main Series",
if game["type"] == "main" then
content = mainTiles,
p.AddGameToFlexList(maingames, game)
},
elseif game["type"] == "remake" then
{
p.AddGameToFlexList(remakes, game)
label = "Remakes",
elseif game["type"] == "spin-off" and utilsCode.IsEmpty(game["family"]) then
content = remakeTiles,
p.AddGameToFlexList(spinoffs, game)
},
end
{
end
label = "Spin-Offs",
content = spinoffTiles
}
}
return utilsLayout.tabs(tabData, {
align = "center",
tabOptions = {
stretch = true,
},
})
end
 
function p.printGameContainer(games)
local html = mw.html.create("div"):addClass("gamenav")
for _, game in ipairs(games) do
p.addGame(html, game)
end
end
return tostring(html)
-- Get biggest family size to add padding to smaller ones
end
local firstLoop = true
 
local biggestTableLength = 0
function p.printSpinoffContainer(games)
for key, family in ipairs(gameFamilies) do
local html = mw.html.create("div"):addClass("gamenav")
if firstLoop then
local gamesByFamily = utilsTable.groupBy(games, Franchise.family)
biggestTableLength = #family["games"]
 
firstLoop = false
for _, game in ipairs(gamesByFamily[""] or {}) do
end
p.addGame(html, game)
if #family["games"] > biggestTableLength then
biggestTableLength = #family["games"]
end
end
end
gamesByFamily[""] = nil
-- Generating spin-off families of games
 
local familyContainer = mw.html.create("div")
for _, family in ipairs(SPINOFF_FAMILIES) do
:addClass("family-container")
html:node(p.printFamily(family, gamesByFamily))
for key, family in ipairs(gameFamilies) do
local familyRow = mw.html.create("div")
:addClass("spin-off-family")
familyRow:node(mw.html.create("div")
:addClass("spin-off-logo")
:wikitext("[[File:" .. family["name"] .. " Family Tile.png|link=" .. family["name"] .. "]]"))
p.AddSpinOffFamilyPadding(familyRow, biggestTableLength - #family["games"])
for key2, game in ipairs(family["games"]) do
familyRow:node(mw.html.create("div")
:addClass("game")
:wikitext("<span class='year'>" .. p.FormatReleaseDate(game["mainrelease"]) .. "</span>[[" .. game["name"] .. "|" .. game["subtitle"] .. "]][[File:" .. game["initialism"] .. " Tile.png|link=]]"))
end
p.AddSpinOffFamilyPadding(familyRow, biggestTableLength - #family["games"])
familyContainer:node(familyRow)
end
end
spinoffs:node(familyContainer)
html = html:done()
-- Fill tabs
local tabs = {}
table.insert(tabs, 1, {tabName = "Main Series", tabCaption = "", tabContent = tostring(maingames)})
table.insert(tabs, 2, {tabName = "Remakes", tabCaption = "", tabContent = tostring(remakes)})
table.insert(tabs, 3, {tabName = "Spin-Offs", tabCaption = "", tabContent = tostring(spinoffs)})
-- Displays the result
return tostring(html)
return tab2.Main(tabs, 1, "top", 3, "", "100%", "", "center")
end
end


-- Only keeps the 4 first digit of a release date, should always return the year
function p.printFamily(family, gamesByFamily)
-- If the year provided is empty, it results TBA
local games = gamesByFamily[family.name] or {}
function p.FormatReleaseDate(release)
local logo = utilsMarkup.file(family.name .. " Family Tile.png", {
local releaseYear = "TBA"
link = family.page,
if not utilsCode.IsEmpty(release) then
})
releaseYear = string.sub(release, 1, 4)
local html = mw.html.create("div"):addClass("gamenav__spin-off-family")
html:tag("div")
:addClass("spin-off-logo")
:wikitext(logo)
:done()
for _, game in ipairs(games) do
p.addGame(html, game)
end
end
return releaseYear
return tostring(html)
end
end


function p.AddGameToFlexList(element, game)
function p.addGame(html, game)
element:node(mw.html.create("div")
local release = p.printRelease(game)
:addClass("game")
local link = utilsMarkup.link(Franchise.article(game), Franchise.shortName(game))
:wikitext("<span class='year'>" .. p.FormatReleaseDate(game["mainrelease"]) .. "</span>[[" .. game["name"] .. "|" .. game["subtitle"] .. "]][[File:" .. game["initialism"] .. " Tile.png|link=]]"))
local tile, tileExists = File.image(game .. " Tile.png", {
link = "",
class = "gamenav__game-img",
})
if tileExists then
html:tag("div")
:addClass("gamenav__game")
:wikitext(release..link..tile)
:done()
end
end
end


function p.AddSpinOffFamilyPadding(element, nb)
function p.printRelease(game)
local i = 0
local release = Franchise.releaseDate(game)
while i < nb do
if utilsString.isEmpty(release) then
element:node(mw.html.create("div")
release = "TBA"
:addClass("spin-off-padding"))
else
i = i + 1
release = release:sub(1, 4)
end
end
return utilsMarkup.class("gamenav__game-year", release)
end
end


return p
return p

Latest revision as of 14:22, 25 October 2022

Documentation for this module may be created at Module:Main Page/Documentation

local p = {}

local File = require("Module:File")
local Franchise = require("Module:Franchise")
local utilsLayout = require("Module:UtilsLayout")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsString = require("Module:UtilsString")
local utilsTable = require("Module:UtilsTable")

local SPINOFF_FAMILIES = {
	{
		name = "Hyrule Warriors",
		page = "Hyrule Warriors",
	},
	{
		name = "Tingle",
		page = "Tingle (Series)",
	},
	{
		name = "BS-X",
		page = "BS-X",
	},
	{
		name = "CD-i",
		page = "Philips CD-i"
	},
}

function p.Games(frame)
	return p.printGames()
end

function p.printGames()
	local gamesByType = utilsTable.groupBy(Franchise.enumGames(), Franchise.type)
	
	local main = gamesByType["main"]
	local remakes = gamesByType["remake"]
	local spinoffs = gamesByType["spin-off"]
	
	-- By default remakes are placed after their originals, so we have to re-sort by release date
	table.sort(remakes, function(a, b)
		local aRelease = Franchise.releaseDate(a)
		local bRelease = Franchise.releaseDate(b)
		return aRelease < bRelease and aRelease ~= bRelease and aRelease ~= ""
	end)
	
	main = utilsTable.reverse(main)
	remakes = utilsTable.reverse(remakes)
	spinoffs = utilsTable.reverse(spinoffs)
	
	local mainTiles = p.printGameContainer(main)
	local remakeTiles = p.printGameContainer(remakes)
	local spinoffTiles = p.printSpinoffContainer(spinoffs)
	
	local tabData = {
		{
			label = "Main Series",
			content = mainTiles,
		},
		{
			label = "Remakes",
			content = remakeTiles,
		},
		{
			label = "Spin-Offs",
			content = spinoffTiles
		}
	}
	return utilsLayout.tabs(tabData, {
		align = "center",
		tabOptions = {
			stretch = true,
		},
	})
end

function p.printGameContainer(games)
	local html = mw.html.create("div"):addClass("gamenav")
	for _, game in ipairs(games) do
		p.addGame(html, game)
	end
	return tostring(html)
end

function p.printSpinoffContainer(games)
	local html = mw.html.create("div"):addClass("gamenav")
	local gamesByFamily = utilsTable.groupBy(games, Franchise.family)

	for _, game in ipairs(gamesByFamily[""] or {}) do
		p.addGame(html, game)
	end
	gamesByFamily[""] = nil

	for _, family in ipairs(SPINOFF_FAMILIES) do
		html:node(p.printFamily(family, gamesByFamily))
	end
	html = html:done()
	
	
	return tostring(html)
end

function p.printFamily(family, gamesByFamily)
	local games = gamesByFamily[family.name] or {}
	local logo = utilsMarkup.file(family.name .. " Family Tile.png", {
		link = family.page,
	})
	
	local html = mw.html.create("div"):addClass("gamenav__spin-off-family")
	html:tag("div")
		:addClass("spin-off-logo")
		:wikitext(logo)
		:done()
	for _, game in ipairs(games) do
		p.addGame(html, game)
	end
	
	return tostring(html)
end

function p.addGame(html, game)
	local release = p.printRelease(game)
	local link = utilsMarkup.link(Franchise.article(game), Franchise.shortName(game))
	local tile, tileExists = File.image(game .. " Tile.png", {
		link = "",
		class = "gamenav__game-img",
	})
	
	if tileExists then
		html:tag("div")
			:addClass("gamenav__game")
			:wikitext(release..link..tile)
			:done()
	end
end

function p.printRelease(game)
	local release = Franchise.releaseDate(game)
	if utilsString.isEmpty(release) then
		release = "TBA"
	else
		release = release:sub(1, 4)
	end
	return utilsMarkup.class("gamenav__game-year", release)
end

return p