Module:Categories

local p = {} local h = {} 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")

-- See the module for documentation about subcategories. local SUBCATEGORIES = require("Module:Categories/Subcategories")

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 = "" local dplParameters = '|namespace=|includesubpages=false|skipthispage=no|mode=userformat|format=,%PAGE%,;,|ordermethod=titlewithoutnamespace|noresultsheader= }}' -- 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 "X in " navboxTitle = "" .. category .. " in " .. mw.getCurrentFrame:expandTemplate{ title = "TLoZ", args = { "Series" } } -- If subcategories exist, handles that if not utilsCode.IsEmpty(SUBCATEGORIES[category]) then notCategories = "" for key2, subCategory in ipairs(SUBCATEGORIES[category]) do notCategories = notCategories .. "|notcategory=" .. subCategory dplQuery = h.dplToExternalLinks(mw.getCurrentFrame:preprocess("{{#dpl:|category=" .. category .. "|category=" .. subCategory .. dplParameters)) if not (dplQuery == " ") then table.insert(rows, {title = subCategory, content = dplQuery}) end end -- Other(s) row dplQuery = h.dplToExternalLinks(mw.getCurrentFrame:preprocess("{{#dpl:|category=" .. category .. notCategories .. dplParameters)) 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 = h.dplToExternalLinks(mw.getCurrentFrame:preprocess("{{#dpl:|category=" .. category .. dplParameters)) if not (dplQuery == " ") then result = result .. utilsNavbox.CreateNavbox(dplQuery, navboxTitle) end end end end return tostring(result) end

function h.dplToExternalLinks(dplResult) local result = "" local firstLink = true dplResult = mw.text.split(dplResult, '%s*;%s*') -- Removing the last entry in the table since it's "empty" due to how DPL -- adds a ";" at the end of each entry instead of just in-between entries table.remove(dplResult) for key, link in ipairs(dplResult) do		if firstLink == true then firstLink = false else result = result .. ' · '		end result = result .. ' [https://zelda.gamepedia.com/' .. mw.getCurrentFrame:callParserFunction{name = 'urlencode', args = {link, "WIKI"}} .. ' ' .. link .. '] '	end return 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 .. ""		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 .. ""			end end end return result end

return p