Difference between revisions of "Module:Ns has subpages"

From validwiki
Jump to: navigation, search
(convert this to use Module:Ns has subpages - this gets the subpage status directly from MediaWiki, avoiding the need to update the template when namespaces change)
 
m (Protected Module:Ns has subpages: High-risk Lua module ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)))
Line 1: Line 1:
{{<includeonly>safesubst:</includeonly>#invoke:Ns has subpages|main}}<noinclude>
+
-- This module implements [[Template:Ns has subpages]].
{{documentation}}
+
-- While the template is fairly simple, this information is made available to
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
+
-- Lua directly, so using a module means that we don't have to update the
</noinclude>
+
-- template as new namespaces are added.
 +
 
 +
local p = {}
 +
 
 +
function p._main(ns, frame)
 +
-- Get the current namespace if we were not passed one.
 +
if not ns then
 +
ns = mw.title.getCurrentTitle().namespace
 +
end
 +
 
 +
-- Look up the namespace table from mw.site.namespaces. This should work
 +
-- for a majority of cases.
 +
local nsTable = mw.site.namespaces[ns]
 +
 
 +
-- Try using string matching to get the namespace from page names.
 +
-- Do a quick and dirty bad title check to try and make sure we do the same
 +
-- thing as {{NAMESPACE}} in most cases.
 +
if not nsTable and type(ns) == 'string' and not ns:find('[<>|%[%]{}]') then
 +
local nsStripped = ns:gsub('^[_%s]*:', '')
 +
nsStripped = nsStripped:gsub(':.*$', '')
 +
nsTable = mw.site.namespaces[nsStripped]
 +
end
 +
 
 +
-- If we still have no match then try the {{NAMESPACE}} parser function,
 +
-- which should catch the remainder of cases. Don't use a mw.title object,
 +
-- as this would increment the expensive function count for each new page
 +
-- tested.
 +
if not nsTable then
 +
frame = frame or mw.getCurrentFrame()
 +
local nsProcessed = frame:callParserFunction('NAMESPACE', ns)
 +
nsTable = nsProcessed and mw.site.namespaces[nsProcessed]
 +
end
 +
 +
return nsTable and nsTable.hasSubpages
 +
end
 +
 
 +
function p.main(frame)
 +
local ns = frame:getParent().args[1]
 +
if ns then
 +
ns = ns:match('^%s*(.-)%s*$') -- trim whitespace
 +
ns = tonumber(ns) or ns
 +
end
 +
local hasSubpages = p._main(ns, frame)
 +
return hasSubpages and 'yes' or ''
 +
end
 +
 
 +
return p

Revision as of 01:37, 10 December 2014

Lua error: Internal error: The interpreter has terminated with signal "11". This module finds whether a given namespace can have subpages.

Usage

From wikitext

From wikitext this module must be used via the {{ns has subpages}} template. Please see the template page for documentation.

From Lua

Usually Lua modules should use mw.site.namespaces[namespace].hasSubpages rather than this module. But if you have a good reason, it can be accessed like this:

Load the module:

local mNsHasSubpages = require('Module:Ns has subpages')

The subpage information can be found with the ._main function:

mNsHasSubpages._main(ns, frame)
  • ns is the namespace name, number, or a page name. It defaults to the current namespace.
  • frame is a frame object with which we can call frame:callParserFunction if necessary. This is optional, and intended for internal use.



Script error: Lua error: Internal error: The interpreter has terminated with signal "11".

-- This module implements [[Template:Ns has subpages]].
-- While the template is fairly simple, this information is made available to
-- Lua directly, so using a module means that we don't have to update the
-- template as new namespaces are added.

local p = {}

function p._main(ns, frame)
	-- Get the current namespace if we were not passed one.
	if not ns then
		ns = mw.title.getCurrentTitle().namespace
	end

	-- Look up the namespace table from mw.site.namespaces. This should work
	-- for a majority of cases.
	local nsTable = mw.site.namespaces[ns]

	-- Try using string matching to get the namespace from page names.
	-- Do a quick and dirty bad title check to try and make sure we do the same
	-- thing as {{NAMESPACE}} in most cases.
	if not nsTable and type(ns) == 'string' and not ns:find('[<>|%[%]{}]') then
		local nsStripped = ns:gsub('^[_%s]*:', '')
		nsStripped = nsStripped:gsub(':.*$', '')
		nsTable = mw.site.namespaces[nsStripped]
	end

	-- If we still have no match then try the {{NAMESPACE}} parser function,
	-- which should catch the remainder of cases. Don't use a mw.title object,
	-- as this would increment the expensive function count for each new page
	-- tested.
	if not nsTable then
		frame = frame or mw.getCurrentFrame()
		local nsProcessed = frame:callParserFunction('NAMESPACE', ns)
		nsTable = nsProcessed and mw.site.namespaces[nsProcessed]
	end
	
	return nsTable and nsTable.hasSubpages
end

function p.main(frame)
	local ns = frame:getParent().args[1]
	if ns then
		ns = ns:match('^%s*(.-)%s*$') -- trim whitespace
		ns = tonumber(ns) or ns
	end
	local hasSubpages = p._main(ns, frame)
	return hasSubpages and 'yes' or ''
end

return p