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
Register
(attempted performance improvement. Didn't achieve the desired result, but keeping here for the record)
(Undid revision 844777 by PhantomCaleb (Talk))
Tag: Undo
Line 23: Line 23:
 
local SEPARATOR = "#"
 
local SEPARATOR = "#"
 
function p.dpl(args)
 
function p.dpl(args)
local dplArgs = {}
+
local dplArgs = ""
 
for k, v in pairs(args) do
 
for k, v in pairs(args) do
 
if k == "format" or type(v) == "table" and v.value == "format" then
 
if k == "format" or type(v) == "table" and v.value == "format" then
 
mw.addWarning("<code>format</code> argument cannot be used here. Format the resulting Lua table instead.")
 
mw.addWarning("<code>format</code> argument cannot be used here. Format the resulting Lua table instead.")
 
elseif type(v) == "table" then
 
elseif type(v) == "table" then
dplArgs = h.appendArg(dplArgs, v.param, v.value)
+
dplArgs = dplArgs .. h.appendArg(v.param, v.value)
 
else
 
else
dplArgs = h.appendArg(dplArgs, k, v)
+
dplArgs = dplArgs .. h.appendArg(k, v)
 
end
 
end
 
end
 
end
dplArgs = h.appendArg(dplArgs, "format", SEPARATOR..",,%PAGE%" .. SEPARATOR .. ",")
+
dplArgs = dplArgs .. h.appendArg("format", SEPARATOR..",,%PAGE%" .. SEPARATOR .. ",")
local result = h.evaluate(dplArgs)
+
local result = mw.getCurrentFrame():preprocess("{{#dpl:" .. dplArgs .. "}}")
 
if not utilsString.endsWith(result, SEPARATOR) then
 
if not utilsString.endsWith(result, SEPARATOR) then
 
return {}
 
return {}
Line 43: Line 43:
 
return result
 
return result
 
end
 
end
function h.appendArg(args, param, value)
+
function h.appendArg(param, value)
 
value = tostring(value)
 
value = tostring(value)
if not param or not value then
 
return args
 
elseif type(args) == "table" and args[param] then
 
-- DPL allows for repeated arguments but this is incompatible with frame:callParserFunction.
 
-- In this case we must convert the argument set to string and use the more expensive frame:preprocess
 
args = h.argsToString(args)
 
end
 
 
if type(args) == "table" then
 
args[param] = value
 
end
 
if type(args) == "string" then
 
args = args .. h.argToString(param, value)
 
end
 
return args
 
end
 
function h.argsToString(args)
 
local result = ""
 
for k, v in pairs(args) do
 
result = result .. h.argToString(k, v)
 
end
 
return result
 
end
 
function h.argToString(param, value)
 
 
value = string.gsub(value, "\|", "{{!}}")
 
value = string.gsub(value, "\|", "{{!}}")
return "|" .. param .. "=" .. value .. "\n"
+
if param and value then
  +
return "|" .. param .. "=" .. value .. "\n"
end
 
function h.evaluate(args)
 
if type(args) == "string" then
 
return mw.getCurrentFrame():preprocess("{{#dpl:" .. args .. "}}")
 
 
else
 
else
 
return ""
return mw.getCurrentFrame():callParserFunction({ name = "#dpl:", args = args })
 
 
end
 
end
 
end
 
end

Revision as of 10:38, 22 October 2020

This module exports the following functions.

exists

exists(fullPageName, [noRedirect])

Check whether a page exists. Unlike mw.title, this function does not register a link in Special:WantedPages. It also does not count as an "expensive parser function."

Parameters

Returns

  • Boolean indicating whether the page exists.

Examples

#InputOutputResult
1
exists("OoT")
true
Green check
2
exists("OoT", true)
false
Green check

dpl

dpl(args)

This function is wrapper for the DPL parser function.

Returns

  • Array of results. Results are limited to a 500 maximum.

Examples

#InputOutputResult
3
dpl({
  namespace = "Category",
  titlematch = "Link|Zelda",
})
{"Category:Link", "Category:Zelda"}
Green check
A special array format exists for specifying repeated arguments
4
dpl({
  {
    value = "Lynels",
    param = "category",
  },
  {
    value = "Enemies in Breath of the Wild",
    param = "notcategory",
  },
  {
    value = "Enemies in A Link Between Worlds",
    param = "notcategory",
  },
})
Expected
{"Purple Lynel", "Blue Lynel"}
Actual
{
  "Purple Lynel",
  "Blue Lynel",
  "Electric Lynel",
  "Fire Lynel",
  "Ice Lynel",
  "Malice Lynel",
  "Armored Lynel",
}
TFH Red Link desperate

inCategory

inCategory(category, fullPageName)

Parameters

  • category
    Category name with or without namespace prefix.
  • fullPageName
    Full page name with namespace prefix.

Returns

  • A boolean indicating whether the given page is a member of the given category.

Examples

#InputOutputResult
Works with or without the namespace prefix.
5
inCategory("Characters in Breath of the Wild", "Link")
true
Green check
6
inCategory("Category:Characters", "Link")
true
Green check
7
inCategory("Items", "Link")
false
Green check
8
inCategory("Fakecategory", "Link")
false
Green check
For pages not in the main namespace, the namespace prefix is required.
9
inCategory(
  "Characters by Game",
  "Characters in Breath of the Wild"
)
false
Green check
10
inCategory(
  "Characters by Game",
  "Category:Characters in Breath of the Wild"
)
true
Green check

inNamespace

inNamespace(namespaces, [fullPageName])

Parameters

Returns

  • true if and only if fullPageName (or the current page) has a namespace prefix that is one of namespaces, regardless of whether the page actually exists.

Examples

#InputOutputResult
Main namespace is the empty string.
11
inNamespace("", "Link")
true
Green check
12
inNamespace("Category", "Link")
false
Green check
13
inNamespace("Category", "Category:Link")
true
Green check
Can evaluate to true even when page does not exist.
14
inNamespace("Category", "Category:Flippityfloppityfloo")
true
Green check
Current page
15
inNamespace("Module")
true
Green check
Multiple namespaces
16
inNamespace({"User", "MediaWiki"}, "Princess Zelda")
false
Green check
17
inNamespace({"User", "MediaWiki"}, "User:Abdullah")
true
Green check

stripNamespace

stripNamespace(page, [namespace])

Parameters

  • page
    Pagename to strip namespace prefix from.
  • [namespace]
    Namespace to strip. If nil, any namespace will be stripped.

Returns

  • page with namespace prefix stripped off.

Examples

#InputOutputStatus
18
stripNamespace("Category:Items in Breath of the Wild", "Category")
"Items in Breath of the Wild"
Green check
19
stripNamespace("Items in Breath of the Wild", "Category")
"Items in Breath of the Wild"
Green check
20
stripNamespace("Category:Items in Breath of the Wild", "File")
"Category:Items in Breath of the Wild"
Green check
21
stripNamespace("File:TWWHD Tingle Model.png", "File")
"TWWHD Tingle Model.png"
Green check
22
stripNamespace("File:TWWHD Tingle Model.png")
"TWWHD Tingle Model.png"
Green check
23
stripNamespace(":Category:Items in Breath of the Wild")
"Items in Breath of the Wild"
Green check

local p = {}
local h = {}

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

function p.exists(fullPageName, noRedirect)
	local title = mw.title.new(fullPageName)
	if not title then
		return false
	end
	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("<code>format</code> 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("{{#dpl:" .. dplArgs .. "}}")
	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= p.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

function p.stripNamespace(page, namespace)
	if not namespace then
		namespace = "[^:]*"
	end
	return string.gsub(page, ":?".. namespace..":", "")
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."
		}
	},
	stripNamespace = {
		page = {
			required = true,
			type = "string",
			desc = "Pagename to strip namespace prefix from.",
		},
		namespace = {
			type = "string",
			desc = "Namespace to strip. If nil, any namespace will be stripped."
		},
	},
}

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"}
			},
			{
				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 = "<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,
			},
		},
	},
	stripNamespace = {
		params = {"page", "namespace"},
		returns = "<code>page</code> with namespace prefix stripped off.",
		cases = {
			outputOnly = true,
			{
				args = {"Category:Items in Breath of the Wild", "Category"},
				expect = "Items in Breath of the Wild",
			},
			{
				args = {"Items in Breath of the Wild", "Category"},
				expect = "Items in Breath of the Wild",
			},
			{
				args = {"Category:Items in Breath of the Wild", "File"},
				expect = "Category:Items in Breath of the Wild",
			},
			{
				args = {"File:TWWHD Tingle Model.png", "File"},
				expect = "TWWHD Tingle Model.png",
			},
			{
				args = {"File:TWWHD Tingle Model.png"},
				expect = "TWWHD Tingle Model.png",
			},
			{
				args = {":Category:Items in Breath of the Wild"},
				expect = "Items in Breath of the Wild",
			}
		}
	}
}

return p