Zelda Wiki

Want to contribute to this wiki?
Sign up for an account, and get started!

Come join the Zelda Wiki community Discord server!

READ MORE

Zelda Wiki
No edit summary
No edit summary
Line 23: Line 23:
 
["Hylians"] = {"Hyruleans", "Terminans"},
 
["Hylians"] = {"Hyruleans", "Terminans"},
 
["Hyruleans"] = {"Gorons", "Hylians", "Rito", "Zoras"},
 
["Hyruleans"] = {"Gorons", "Hylians", "Rito", "Zoras"},
  +
["Materials"] = {"Items in Breath of the Wild", "Items in Hyrule Warriors", "Items in Hyrule Warriors Legends", "Items in Tri Force Heroes"},
 
["Terminans"] = {"Gorons", "Hylians", "Zoras"},
 
["Terminans"] = {"Gorons", "Hylians", "Zoras"},
 
["Water-Related Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},
 
["Water-Related Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},

Revision as of 13:10, 31 January 2020

Lua error in package.lua at line 80: module 'Module:UtilsCode' not found.


local p = {}
local cargo = mw.ext.cargo
local utilsCode = require("Module:UtilsCode")
local utilsGame = require("Module:UtilsGame")
local utilsNavbox = require("Module:UtilsNavbox")
local utilsTable = require("Module:UtilsTable")

-- This list allows further categorization in the navbox. The module will create
-- a row for all members of the main category that fits both the latter and the
-- one entered here. It will then create a second row for the second category
-- entered here. And so on.
local CUSTOM_CATEGORIES = {
	["Bags"] = {"Bomb Bags", "Wallets"},
	["Bat-Like Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},
	["Books"] = {"Comics", "Guides", "Items", "Manga", "Objects"},
	["Companions"] = {"Fairies"},
	["Fairies"] = {"Great Fairies"},
	["Fire-Related Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},
	["Electricity-Related Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},
	["Flying Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},
	["Ice-Related Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},
	["Koholint Islanders"] = {"Animals", "Humans", "Hylians"},
	["Hylians"] = {"Hyruleans", "Terminans"},
	["Hyruleans"] = {"Gorons", "Hylians", "Rito", "Zoras"},
	["Materials"] = {"Items in Breath of the Wild", "Items in Hyrule Warriors", "Items in Hyrule Warriors Legends", "Items in Tri Force Heroes"},
	["Terminans"] = {"Gorons", "Hylians", "Zoras"},
	["Water-Related Enemies"] = {"Enemies", "Sub-Bosses", "Bosses"},
}

function p._CategorizeEntries(frame)
	local args = frame:getParent().args
	return p.CategorizeEntries(frame.args["plain"], args["bosses"], args["characters"], args["dungeons"], args["enemies"], args["items"], args["objects"], args["places"], args["songs"], args["stages"], args["sub-bosses"])
end

function p.CategorizeEntries(plain, bosses, characters, dungeons, enemies, items, objects, places, songs, stages, subbosses)
	local result = ""
	result = result .. p.PlainToNavboxes(plain)
	result = result .. p.PlainToCategories(plain)
	result = result .. p.GamesToCategories(bosses, characters, dungeons, enemies, items, objects, places, songs, stages, subbosses)
	return result
end

function p.PlainToNavboxes(plain)
	result = ""
	local plaintable = mw.text.split(plain, '%s*,%s*')
	
	local navboxTitle = ""
	local rows = {}
	local notCategories = ""
	local dplQuery = ""
	
	-- For every category entered in the template
	for key, category in ipairs(plaintable) do
		rows = {}
		if not utilsCode.IsEmpty(category) then
			
			-- Sets the title, which is "[[:Category:X|X]] in {{TLoZ|Series}}"
			navboxTitle = "[[:Category:" .. category .. "|" .. category .. "]] in " .. mw.getCurrentFrame():expandTemplate{ title = "TLoZ", args = { "Series" } }
			
    		-- If custom categories exist, handles that
			if not utilsCode.IsEmpty(CUSTOM_CATEGORIES[category]) then
				notCategories = ""
				for key2, customCategory in ipairs(CUSTOM_CATEGORIES[category]) do
					notCategories = notCategories .. "|notcategory=" .. customCategory
					dplQuery = mw.getCurrentFrame():preprocess("{{#dpl:|category=" .. category .. "|category=" .. customCategory .. "|namespace=|includesubpages=false|skipthispage=no|mode=inline|inlinetext={{·}}|ordermethod=titlewithoutnamespace|noresultsheader= }}")
					
					if not (dplQuery == " ") then
						table.insert(rows, {title = customCategory, content = dplQuery})
					end
				end
				
				-- Other(s) row
				dplQuery = mw.getCurrentFrame():preprocess("{{#dpl:|category=" .. category .. notCategories .. "|namespace=|includesubpages=false|skipthispage=no|mode=inline|inlinetext={{·}}|ordermethod=titlewithoutnamespace|noresultsheader= }}")
				if not (dplQuery == " ") then
					table.insert(rows, {title = "Other(s)", content = dplQuery})
				end
				result = result .. utilsNavbox.CreateRowNavbox(rows, navboxTitle)
				
			-- else just outputs everything
			else
				dplQuery = mw.getCurrentFrame():preprocess("{{#dpl:|category=" .. category .. "|namespace=|includesubpages=false|skipthispage=no|mode=inline|inlinetext={{·}}|ordermethod=titlewithoutnamespace|noresultsheader= }}")
				if not (dplQuery == " ") then
					result = result .. utilsNavbox.CreateNavbox(dplQuery, navboxTitle)
				end
			end
			
		end
	end
	return tostring(result)
end

function p.PlainToCategories(plain)
	result = ""
	local plaintable = mw.text.split(plain, '%s*,%s*')
	for key, category in ipairs(plaintable) do
		if not utilsCode.IsEmpty(category) then
			result = result .. "[[Category:" .. category .. "]]"
		end
	end
	return result
end

function p.GamesToCategories(bosses, characters, dungeons, enemies, items, objects, places, songs, stages, subbosses)
	local result = ""
	local categories = {}
	local sortOrder = utilsGame.GetSortOrder("canon")

	if not (utilsCode.IsEmpty(bosses)) then
		bosses = mw.text.split(bosses, '%s*,%s*')
		for _, value in ipairs(bosses) do
			table.insert(categories, {"Bosses", value})
		end
	end
	if not (utilsCode.IsEmpty(characters)) then
		characters = mw.text.split(characters, '%s*,%s*')
		for _, value in ipairs(characters) do
			table.insert(categories, {"Characters", value})
		end
	end
	if not (utilsCode.IsEmpty(dungeons)) then
		dungeons = mw.text.split(dungeons, '%s*,%s*')
		for _, value in ipairs(dungeons) do
			table.insert(categories, {"Dungeons", value})
		end
	end
	if not utilsCode.IsEmpty(enemies) then
		enemies = mw.text.split(enemies, '%s*,%s*')
		for _, value in ipairs(enemies) do
			table.insert(categories, {"Enemies", value})
		end
	end
	if not utilsCode.IsEmpty(items) then
		items = mw.text.split(items, '%s*,%s*')
		for _, value in ipairs(items) do
			table.insert(categories, {"Items", value})
		end
	end
	if not (utilsCode.IsEmpty(objects)) then
		objects = mw.text.split(objects, '%s*,%s*')
		for _, value in ipairs(objects) do
			table.insert(categories, {"Objects", value})
		end
	end
	if not (utilsCode.IsEmpty(places)) then
		places = mw.text.split(places, '%s*,%s*')
		for _, value in ipairs(places) do
			table.insert(categories, {"Places", value})
		end
	end
		if not (utilsCode.IsEmpty(songs)) then
		songs = mw.text.split(songs, '%s*,%s*')
		for _, value in ipairs(songs) do
			table.insert(categories, {"Songs", value})
		end
	end
		if not (utilsCode.IsEmpty(stages)) then
		stages = mw.text.split(stages, '%s*,%s*')
		for _, value in ipairs(stages) do
			table.insert(categories, {"Stages", value})
		end
	end
		if not (utilsCode.IsEmpty(subbosses)) then
		subbosses = mw.text.split(subbosses, '%s*,%s*')
		for _, value in ipairs(subbosses) do
			table.insert(categories, {"Sub-Bosses", value})
		end
	end
	
	for _, game in ipairs(sortOrder) do
		for _2, category in ipairs(categories) do
			if game == category[2] then
				result = result .. "[[Category:" .. category[1] .. " in " .. utilsGame.AbbToGame(category[2], "true") .. "]]"
			end
		end
	end
	
	
	return result
end

return p