Module:Main Page

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",		stretch = true,	}) end

function p.printGameContainer(games) local html = mw.html.create("div"):addClass("game-container") 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("game-container") local gamesByFamily = utilsTable.groupBy(games, Franchise.family) for _, game in ipairs(gamesByFamily[""]) do		p.addGame(html, game) end gamesByFamily[""] = nil local biggestFamilyLength = 0 for k, v in pairs(gamesByFamily) do		biggestFamilyLength = math.max(biggestFamilyLength, #v) end html = html:tag("div"):addClass("family-container") for _, family in ipairs(SPINOFF_FAMILIES) do		html:node(p.printFamily(family, gamesByFamily, biggestFamilyLength)) end html = html:done return tostring(html) end

function p.printFamily(family, gamesByFamily, biggestFamilyLength) local games = gamesByFamily[family.name] local paddingCount = biggestFamilyLength - #games local logo = utilsMarkup.file(family.name .. " Family Tile.png", {		link = family.page	}) local html = mw.html.create("div"):addClass("spin-off-family") html:tag("div") :addClass("spin-off-logo") :wikitext(logo) :done for i = 1, paddingCount do		html:tag("div"):addClass("spin-off-padding"):done end for _, game in ipairs(games) do		p.addGame(html, game) end for i = 1, paddingCount do		html:tag("div"):addClass("spin-off-padding"):done 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 = ""}) if tileExists then html:tag("div") :addClass("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("year", release) end

return p