Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
Revision as of 19:34, 7 November 2025 by Admin (talk | contribs)

Documentation for this module may be created at Module:Appearances/doc

-- Module:Appearances
-- Renders a character's appearances using short codes or full titles.
-- Keeps order as defined in this file, not alphabetically.
-- Supports:
--   |appears=S1, Suikoden II, G1|
--   |S1=yes|G1=yes| (legacy)
--   Mixed usage.

local p = {}

-- Master order + lookup: code → { page, category, optional display name }
local games = {
	S1  = { "Suikoden", "Characters (Suikoden)" },
	S2  = { "Suikoden II", "Characters (Suikoden II)" },
	G1  = { "Genso Suikogaiden Vol.1", "Characters (Genso Suikogaiden Vol.1)" },
	G2  = { "Genso Suikogaiden Vol.2", "Characters (Genso Suikogaiden Vol.2)" },
	CS  = { "Genso Suikoden Card Stories", "Characters (Genso Suikoden Card Stories)" },
	S3  = { "Suikoden III", "Characters (Suikoden III)" },
	S4  = { "Suikoden IV", "Characters (Suikoden IV)" },
	ST  = { "Suikoden Tactics", "Characters (Suikoden Tactics)" },
	S5  = { "Suikoden V", "Characters (Suikoden V)" },
	HS  = { "Genso Suikoden Tierkreis Hoshikuzu no Shiro", "Characters (Genso Suikoden Tierkreis Hoshikuzu no Shiro)" },
	TK  = { "Suikoden Tierkreis", "Characters (Suikoden Tierkreis)" },
	PS  = { "Pachislot Genso Suikoden", "Characters (Pachislot Genso Suikoden)" },
	HT  = { "Genso Suikoden Tsumugareshi Hyakunen no Toki", "Characters (Genso Suikoden Tsumugareshi Hyakunen no Toki)" },
	SP  = { "Suikoden STAR LEAP", "Characters (Suikoden STAR LEAP)" },
	SL  = { "Suikoden STAR LEAP", "Characters (Suikoden STAR LEAP)" },
	HB  = { "Genso Suikoden STAR LEAP: Hoshi Boshi no Kiseki", "Characters (Genso Suikoden STAR LEAP: Hoshi Boshi no Kiseki)" },
	kpc = { "Konami Parody Comic Series Genso Suikoden", "Characters (Konami Parody Comic Series Genso Suikoden)" },
	SE  = { "Genso Suikoden: Soul Eater 1", "Characters (Genso Suikoden Soul Eater)", "Soul Eater 1" },
	SE3 = { "Genso Suikoden: Soul Eater 3", "Characters (Genso Suikoden Soul Eater)", "Soul Eater 3" },
	S2n = { "Genso Suikoden II: 1 (novel)", "Characters (Genso Suikoden II novel)" },
	S2n4= { "Genso Suikoden II: 4 (novel)", "Characters (Genso Suikoden II novel)" },
	SS1 = { "Genso Suikoden Short Story Collection 1", "Characters (Genso Suikoden Short Story Collection 1)" },
	SS2 = { "Genso Suikoden Short Story Collection 2", "Characters (Genso Suikoden Short Story Collection 2)" },
	SS3 = { "Genso Suikoden Short Story Collection 3", "Characters (Genso Suikoden Short Story Collection 3)" },
	SS4 = { "Genso Suikoden Short Story Collection 4", "Characters (Genso Suikoden Short Story Collection 4)" },
	S4n = { "Genso Suikoden IV: 1 (novel)", "Characters (Genso Suikoden IV novel)" },
	SPm = { "Genso Suikoden STAR LEAP: Hoshi Boshi no Kiseki", "Characters (Genso Suikoden STAR LEAP: Hoshi Boshi no Kiseki)" },
}

-- Reverse lookup: title → short code
local titleToCode = {}
for code, data in pairs(games) do
	titleToCode[data[1]] = code
end

local function trim(s)
	return (s:gsub("^%s*(.-)%s*$", "%1"))
end

local function makeLine(entry)
	local title, category, display = entry[1], entry[2], entry[3]
	return string.format("* [[%s|%s]] [[Category:%s]]", title, display or title, category)
end

function p.render(frame)
	local args = frame.args
	local requested = {}
	local seen = {}

	-- 1️⃣ Collect from |appears=
	if args.appears and args.appears ~= "" then
		for _, token in ipairs(mw.text.split(args.appears, ",")) do
			token = trim(token)
			if token ~= "" then
				local code = titleToCode[token] or token
				if games[code] and not seen[code] then
					seen[code] = true
					requested[code] = true
				end
			end
		end
	end

	-- 2️⃣ Add legacy |S1=yes| flags
	for code, _ in pairs(games) do
		if (args[code] or ""):lower() == "yes" then
			requested[code] = true
		end
	end

	-- 3️⃣ Output in canonical order (no alphabetical sort)
	local output = {}
	for code, entry in pairs(games) do
		-- preserve insertion order: we’ll iterate over an ordered key list instead
	end

	-- To preserve order, we must iterate in sequence as defined:
	local orderedKeys = {
		"S1","S2","G1","G2","CS","S3","S4","ST","S5","HS","TK","PS","HT",
		"SP","SL","HB","kpc","SE","SE3","S2n","S2n4","SS1","SS2","SS3","SS4","S4n","SPm"
	}

	for _, code in ipairs(orderedKeys) do
		if requested[code] then
			table.insert(output, makeLine(games[code]))
		end
	end

	return table.concat(output, "<br />\n")
end

return p