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
mNo edit summary
Line 4: Line 4:
 
local utilsCode = require("Module:UtilsCode")
 
local utilsCode = require("Module:UtilsCode")
 
local utilsGame = require("Module:UtilsGame")
 
local utilsGame = require("Module:UtilsGame")
local utilsNavbox = require("Module:UtilsNavbox")
+
local utilsNavigation = require("Module:UtilsNavigation")
 
local utilsTable = require("Module:UtilsTable")
 
local utilsTable = require("Module:UtilsTable")
   
Line 73: Line 73:
 
table.insert(rows, {title = "Other(s)", content = dplQuery})
 
table.insert(rows, {title = "Other(s)", content = dplQuery})
 
end
 
end
result = result .. utilsNavbox.CreateRowNavbox(rows, navboxTitle)
+
result = result .. utilsNavigation.CreateRowNavbox(rows, navboxTitle)
 
 
 
-- else just outputs everything
 
-- else just outputs everything
Line 80: Line 80:
 
if not (dplQuery == "emptyCategory") then
 
if not (dplQuery == "emptyCategory") then
 
table.insert(rows, {title = "All", content = dplQuery})
 
table.insert(rows, {title = "All", content = dplQuery})
result = result .. utilsNavbox.CreateRowNavbox(rows, navboxTitle)
+
result = result .. utilsNavigation.CreateRowNavbox(rows, navboxTitle)
 
end
 
end
 
end
 
end

Revision as of 00:52, 19 April 2020

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


local p = {}
local h = {}
local cargo = mw.ext.cargo
local utilsCode = require("Module:UtilsCode")
local utilsGame = require("Module:UtilsGame")
local utilsNavigation = require("Module:UtilsNavigation")
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)
end

function p.CategorizeEntries(plain, lists)
	local result = ""
	result = result .. p.PlainToNavboxes(plain)
	result = result .. p.PlainToCategories(plain)
	result = result .. p.GamesToCategories(lists)
	return result
end

function p.PlainToNavboxes(plain)
	result = ""
	local plaintable = mw.text.split(plain, '%s*,%s*')
	
	local navboxTitle = ""
	local rows = {}
	local rowDisplayName = ""
	local notCategories = ""
	local notParentCategories = ""
	local dplQuery = ""
	local dplParameters = '|namespace=|includesubpages=false|skipthispage=no|mode=userformat|format=,%PAGE%,;,|ordermethod=titlewithoutnamespace|noresultsheader=emptyCategory}}'
	
	-- For every category entered in the template
	for key, category in ipairs(plaintable) do
		rows = {}
		if not utilsCode.IsEmpty(category) then
			if tonumber(mw.getCurrentFrame():callParserFunction{name = 'PAGESINCATEGORY', args = {category, "R", "pages"}}) <= 100 then
				-- Sets the title, which is "[[:Category:X|X]] in {{TLoZ|Series}}"
				navboxTitle = "[[:Category:" .. category .. "|" .. category .. "]] in " .. mw.getCurrentFrame():expandTemplate{ title = "TLoZ", args = { "Series" } }
				
				local isPrimaryNav = h.isPrimaryNav(category, plaintable)
				
	    		-- If subcategories exist, handles that
				if not utilsCode.IsEmpty(SUBCATEGORIES[category]) then
					notCategories = ""
					for key2, subCategory in ipairs(SUBCATEGORIES[category]) do
						notParentCategories = ""
						notCategories = notCategories .. "|notcategory=" .. subCategory["category"]
						if not utilsCode.IsEmpty(subCategory["parents"]) then
							for key3, parentCategory in ipairs(subCategory["parents"]) do
								notParentCategories = notParentCategories .. "|notcategory=" .. parentCategory
							end
						end
						dplQuery = h.dplToExternalLinks(mw.getCurrentFrame():preprocess("{{#dpl:|category=" .. category .. "|category=" .. subCategory["category"] .. notParentCategories .. dplParameters))
						
						if not (dplQuery == "emptyCategory") then
							if utilsCode.IsEmpty(subCategory["display"]) then
								rowDisplayName = subCategory["category"]
							else
								rowDisplayName = subCategory["display"]
							end
							table.insert(rows, {title = rowDisplayName, content = dplQuery})
						end
					end
					
					-- Other(s) row
					dplQuery = h.dplToExternalLinks(mw.getCurrentFrame():preprocess("{{#dpl:|category=" .. category .. notCategories .. dplParameters))
					if not (dplQuery == "emptyCategory") then
						table.insert(rows, {title = "Other(s)", content = dplQuery})
					end
					result = result .. utilsNavigation.CreateRowNavbox(rows, navboxTitle)
					
				-- else just outputs everything
				else
					dplQuery = h.dplToExternalLinks(mw.getCurrentFrame():preprocess("{{#dpl:|category=" .. category .. dplParameters))
					if not (dplQuery == "emptyCategory") then
						table.insert(rows, {title = "All", content = dplQuery})
						result = result .. utilsNavigation.CreateRowNavbox(rows, navboxTitle)
					end
				end
			end
		end
	end
	return tostring(result)
end

function h.isPrimaryNav(categoryName, categoriesInList)
	local categoryConfig = SUBCATEGORIES[categoryName]
	if not categoryConfig or not categoryConfig.primary then
		return false
	end
	
	-- A nav is not primary if a subcategory is present that is primary
	for _, subcategory in ipairs(categoryConfig) do
		local subcategoryName = subcategory.category
		local pageHasSubcategory = utilsTable.keyOf(categoriesInList, subcategoryName)
		local subcategoryConfig = SUBCATEGORIES[subcategoryName]
		if pageHasSubcategory and subcategoryConfig and subcategoryConfig.primary then
			return false
		end
	end
	return true
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 .. ' <b>·</b> '
		end
		result = result .. '<span class="plainlinks">[https://zelda.gamepedia.com/' .. mw.getCurrentFrame():callParserFunction{name = 'urlencode', args = {link, "WIKI"}} .. ' ' .. link .. ']</span>'
	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 .. "[[Category:" .. category .. "]]"
		end
	end
	return result
end

function p.GamesToCategories(lists)
	local result = ""
	local categories = {}
	local acceptedLists = {
		{parameter = "bosses", display = "Bosses"},
		{parameter = "characters", display = "Characters"},
		{parameter = "dungeons", display = "Dungeons"},
		{parameter = "enemies", display = "Enemies"},
		{parameter = "items", display = "Items"},
		{parameter = "levels", display = "Levels"},
		{parameter = "objects", display = "Objects"},
		{parameter = "places", display = "Places"},
		{parameter = "playable", display = "Playable Characters"},
		{parameter = "songs", display = "Songs"},
		{parameter = "stages", display = "Stages"},
		{parameter = "sub-bosses", display = "Sub-Bosses"},
	}

	for key, list in ipairs(acceptedLists) do
		if not (utilsCode.IsEmpty(lists[list["parameter"]])) then
			for key2, entry in ipairs(mw.text.split(lists[list["parameter"]], '%s*,%s*')) do
				table.insert(categories, {list["display"], entry})
			end
		end
	end
	
	for _, game in ipairs(utilsGame.GetSortOrder("canon")) 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