Module:UtilsPage

local p = {}

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,		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) if args.format then mw.addWarning(" argument cannot be used here. Format the resulting Lua table instead.") end local dplArgs = utilsTable.merge({}, args, {		format = ",,%PAGE%" .. SEPARATOR .. ","	}) local result = mw.getCurrentFrame:callParserFunction('#dpl:', dplArgs) if not utilsString.endsWith(result, SEPARATOR) then return {} end result = utilsString.trim(result, SEPARATOR) result = utilsString.split(result, SEPARATOR) result = utilsTable.map(result, utilsString._trim(":")) return result 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"} }		}	},	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