Module:Gallery List

local p = {}

local Franchise = require("Module:Franchise") local List = require("Module:List") local Term = require("Module:Term") local utilsLayout = require("Module:UtilsLayout") local utilsPackage = require("Module:UtilsPackage") local utilsString = require("Module:UtilsString") local _utilsError = utilsPackage.lazyLoad("Module:UtilsError")

local CATEGORY_INVALID_ARGS = ""

-- Generally the latest remake is the default tab but some remakes don't have enough images uploaded yet local DEFAULT_TAB_BLACKLIST = { ["OoT3D"] = true, ["MM3D"] = true, ["TPHD"] = true, ["SSHD"] = true, }

-- Enhanced ports may have the same assets as the original game -- There's no need to show a separate tab in those cases local ENHANCED_PORTS = { --["FSAE"] = true -- turns out FSAE does have its own sprites }

function p.Main(frame) local args = frame:getParent.args local tabData = {} local defaultTab = 1 local errors = {} local categories = "" local seenParams = {} local fileType = args.fileType local subjectType = args[1] seenParams["fileType"] = true seenParams[1] = true

for i, game in ipairs(Franchise.enumGames) do		local subjects = args[game] seenParams[game] = true if subjects then table.insert(tabData, {				label = Franchise.display(game),				content = p.printGallery(subjectType, game, subjects, fileType),			}) if not DEFAULT_TAB_BLACKLIST[game] then defaultTab = #tabData end local pagename = mw.title.getCurrentTitle.text local isListing = utilsString.endsWith(pagename, " in "..Franchise.shortName(game)) if not isListing then for j, remake in ipairs(Franchise.remakes(game)) do					if not ENHANCED_PORTS[remake] then table.insert(tabData, {							label = Franchise.display(remake),							content = p.printGallery(subjectType, remake, subjects, fileType),						}) if not DEFAULT_TAB_BLACKLIST[remake] then defaultTab = #tabData end end end end end end local tabs = utilsLayout.tabs(tabData, {		default = defaultTab,		tabOptions = {			collapse = true,		},	}) for k, v in pairs(args) do		if not seenParams[k] then local errorMessage = string.format("Invalid game ", k)			table.insert(errors, _utilsError.error(errorMessage, true)) categories = categories..CATEGORY_INVALID_ARGS end end errors = table.concat(errors, "\n") local output = errors..tabs return output, categories end

function p.printGallery(subjectType, game, subjects, fileType) if not fileType then local graphics = Franchise.graphics(game) if subjectType == "Locations" then fileType = "" elseif graphics == "2D" then fileType = "Sprite" else fileType = "Model" end end subjects = utilsString.split(subjects)

local links, terms = List.termList(game, subjects, { link = true }) local galleryEntries = {} for i= 1, #subjects do		local suffix = fileType local startIdx, endIdx, variant = string.find(terms[i], "%s*%[(%w+)]$") if variant then local term = string.sub(terms[i], 1, startIdx-1) terms[i] = Term.fetchTerm(term, game) or term links[i] = Term.link(term, game) if tonumber(variant) then suffix = suffix .. " " .. variant else suffix = variant .. " " .. suffix end end local file = string.format("File:%s %s %s.png", game, terms[i], suffix) local galleryEntry = string.format("%s|%s", file, links[i]) galleryEntries[i] = galleryEntry end galleryEntries = table.concat(galleryEntries, "\n") return mw.getCurrentFrame:extensionTag({		name = "gallery",		content = galleryEntries,	}) end

function p.templateData local paramOrder = {"subjectType"} local params = { subjectType = { required = true, type = "string", enum = {"Characters", "Creatures", "Enemies", "Locations", "Items", "Materials", "Objects"}, desc = "The type of subject being listed.", },	}	for i, game in ipairs(Franchise.enumGames) do		if Franchise.isCanon(game) then table.insert(paramOrder, game) params[game] = { type = "string", desc = "Comma-separated list of wiki page names referring to subjects in "..Franchise.display(game) }		end end return { format = "block", params = params, paramOrder = paramOrder, } end

p.Templates = { ["Gallery List"] = p.templateData }

return p