Module:UtilsPage

local p = {} local h = {}

local utilsString = require("Module:UtilsString") local utilsTable = require("Module:UtilsTable")

local function stripNamespace(category) return string.gsub(category, "Category:%s+", "") end

function p.exists(fullPageName, noRedirect) local title = mw.title.new(fullPageName) local isMainNamespace = utilsString.isEmpty(title.nsText) local result = p.dpl({		title = title.text,		namespace = title.nsText,		skipthispage = "no",		notnamespace = (not isMainNamespace) and "" or nil, -- For some reason it'll return results for the main namespace without this line		redirects = noRedirect and "exclude" or "include"	}) return #result > 0 end

local SEPARATOR = "#" function p.dpl(args) local dplArgs = "" for k, v in pairs(args) do		if k == "format" or type(v) == "table" and v.value == "format" then mw.addWarning(" argument cannot be used here. Format the resulting Lua table instead.") elseif type(v) == "table" then dplArgs = dplArgs .. h.appendArg(v.param, v.value) else dplArgs = dplArgs .. h.appendArg(k, v)		end end dplArgs = dplArgs .. h.appendArg("format", SEPARATOR..",,%PAGE%" .. SEPARATOR .. ",") local result = mw.getCurrentFrame:preprocess("") if not utilsString.endsWith(result, SEPARATOR) then return {} end result = string.gsub(result, SEPARATOR .. ":", SEPARATOR) -- strip : prefix from Category results result = utilsString.trim(result, SEPARATOR) result = utilsString.split(result, SEPARATOR) return result end function h.appendArg(param, value) value = tostring(value) value = string.gsub(value, "\|", "|") if param and value then return "|" .. param .. "=" .. value .. "\n" else return "" end end

function p.inCategory(category, fullPageName) if (not category) or (not fullPageName) then return false end local title = mw.title.new(fullPageName) local dplResult = p.dpl({		category= stripNamespace(category),		namespace= title.nsText,		title= title.text,	}) return #dplResult ~= 0 end

function p.inNamespace(namespaces, fullPageName) if type(namespaces) == "string" then namespaces = {namespaces} end local title = fullPageName and mw.title.new(fullPageName) or mw.title.getCurrentTitle return utilsTable.includes(namespaces, title.nsText) end

p.Schemas = { exists = { fullPageName = { type = "string", required = true, desc = "Full page name with namespace prefix.", },		noRedirect = { type = "boolean", desc = "If true, redirects are not considered." },	},	inCategory = { category = { type = "string", required = true, desc = "Category name with or without namespace prefix.", },		fullPageName = { type = "string", required = true, desc = "Full page name with namespace prefix." },	},	inNamespace = { namespaces = { desc = "A namespace or array of namespaces.", required = true, oneOf = { { type = "string" }, { type = "array", items = { type = "string" } } },		},		fullPageName = { type = "string", desc = "Full pagename. Defaults to the name of the current page." }	} }

p.Documentation = { exists = { desc = 'Check whether a page exists. Unlike, this function does not register a link in Special:WantedPages. It also does not count as an "expensive parser function."', params = {"fullPageName", "noRedirect"}, returns = "Boolean indicating whether the page exists.", cases = { {				args = {"OoT"}, expect = true, },			{				args = {"OoT", true}, expect = false, },		},	},	dpl = { desc = "This function is wrapper for the DPL parser function.", params = {"args"}, returns = "Array of results. Results are limited to a 500 maximum.", cases = { {				args = { {titlematch = "Link|Zelda", namespace = "Category"} }, expect = {"Category:Link", "Category:Zelda"} },			{				desc = "A special array format exists for specifying repeated arguments", args = { {						{							param = "category", value = "Lynels", },						{							param = "notcategory", value = "Enemies in Breath of the Wild", },						{							param = "notcategory", value = "Enemies in A Link Between Worlds", },					}				},				expect = {"Purple Lynel", "Blue Lynel"}, },		},	},	inCategory = { params = {"category", "fullPageName"}, returns = "A boolean indicating whether the given page is a member of the given category.", cases = { {				desc = "Works with or without the namespace prefix.", args = {"Characters in Breath of the Wild", "Link"}, expect = true, },			{				args = {"Category:Characters", "Link"}, expect = true, },			{				args = {"Items", "Link"}, expect = false, },			{				args = {"Fakecategory", "Link"}, expect = false, },			{				desc = "For pages not in the main namespace, the namespace prefix is required.", args = {"Characters by Game", "Characters in Breath of the Wild"}, expect = false, },			{				args = {"Characters by Game", "Category:Characters in Breath of the Wild"}, expect = true, },		},	},	inNamespace = { params = {"namespaces", "fullPageName"}, returns = " if and only if   (or the current page) has a namespace prefix that is one of , regardless of whether the page actually exists.", cases = { {				desc = "Main namespace is the empty string.", args = {"", "Link"}, expect = true, },			{				args = {"Category", "Link"}, expect = false, },			{				args = {"Category", "Category:Link"}, expect = true, },			{				desc = "Can evaluate to true even when page does not exist.", args = {"Category", "Category:Flippityfloppityfloo"}, expect = true, },			{				desc = "Current page", args = {"Module"}, expect = true, },			{				desc = "Multiple namespaces", args = {{"User", "MediaWiki"}, "Princess Zelda"}, expect = false, },			{				args = {{"User", "MediaWiki"}, "User:Abdullah"}, expect = true, },		},	}, }

return p