Module:UtilsPage: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
m (Protected "Module:UtilsPage": Critical wiki page ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)))
No edit summary
Line 118: Line 118:
desc = "This function is wrapper for the [[gphelp:Extension:DPL3/Manual|DPL]] parser function.",
desc = "This function is wrapper for the [[gphelp:Extension:DPL3/Manual|DPL]] parser function.",
params = {"args"},
params = {"args"},
returns = "Array of results",
returns = "Array of results. '''Results are limited to a 500 maximum.'''",
cases = {
cases = {
{
{

Revision as of 02:58, 28 July 2020

Lua error in Module:Documentation/Module at line 351: attempt to call field 'Documentation' (a table value).


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("<code>format</code> 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 {{Scribunto Manual|lib=mw.title}}, 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 [[gphelp:Extension:DPL3/Manual|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 = "<code>true</code> if and only if <code>fullPageName</code> (or the current page) has a namespace prefix that is one of <code>namespaces</code>, 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