Module:Main Page: Difference between revisions
Jump to navigation
Jump to search
MannedTooth (talk | contribs) No edit summary |
PhantomCaleb (talk | contribs) No edit summary |
||
(13 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local | |||
local | local File = require("Module:File") | ||
local | 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. | local SPINOFF_FAMILIES = { | ||
return p. | { | ||
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. | function p.printGames() | ||
local gamesByType = utilsTable.groupBy(Franchise.enumGames(), Franchise.type) | |||
local | |||
local | local main = gamesByType["main"] | ||
local | 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 | end | ||
return tostring(html) | |||
end | |||
local | |||
local | function p.printSpinoffContainer(games) | ||
for | 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 | end | ||
gamesByFamily[""] = nil | |||
for _, family in ipairs(SPINOFF_FAMILIES) do | |||
html:node(p.printFamily(family, gamesByFamily)) | |||
for | |||
end | end | ||
html = html:done() | |||
return tostring(html) | |||
return | |||
end | end | ||
function p.printFamily(family, gamesByFamily) | |||
local games = gamesByFamily[family.name] or {} | |||
local logo = utilsMarkup.file(family.name .. " Family Tile.png", { | |||
local | 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 | end | ||
return | |||
return tostring(html) | |||
end | end | ||
function p. | 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 | end | ||
function p. | function p.printRelease(game) | ||
local | local release = Franchise.releaseDate(game) | ||
if utilsString.isEmpty(release) then | |||
release = "TBA" | |||
else | |||
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