Module:Ns has subpages: Difference between revisions
From Wayne's Dusty Box of Words
ll>Mr. Stradivarius (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) |
ll>Mr. Stradivarius 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: | ||
-- 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 |
Revision as of 22:37, 9 December 2014
Documentation for this module may be created at Module:Ns has subpages/doc
-- 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