Difference between revisions of "Module:Ns has subpages/sandbox"

From blackwiki
Jump to navigation Jump to search
blackwiki>Mr. Stradivarius
(try simplifying this by using title objects)
blackwiki>Mr. Stradivarius
(undo - we would need to add colon-stripping logic, and it's probably not worth it)
Line 7: Line 7:
  
 
function p._main(ns, frame)
 
function p._main(ns, frame)
local nsData -- The subtable of mw.site.namespaces for the target namespace
+
-- Get the current namespace if we were not passed one.
 +
if not ns then
 +
ns = mw.title.getCurrentTitle().namespace
 +
end
  
-- First check to see if the namespace we were passed is a valid namespace
+
-- Look up the namespace table from mw.site.namespaces. This should work
-- number or namespace name.
+
-- for a majority of cases.
if ns then
+
local nsTable = mw.site.namespaces[ns]
nsData = mw.site.namespaces[ns]
 
end
 
  
-- If the namespace wasn't valid, assume we were passed a page name. We find
+
-- Try using string matching to get the namespace from page names.
-- the namespace from the page's title object, or use the current title if
+
-- Do a quick and dirty bad title check to try and make sure we do the same
-- we weren't passed a namespace.
+
-- thing as {{NAMESPACE}} in most cases.
if not nsData then
+
if not nsTable and type(ns) == 'string' and not ns:find('[<>|%[%]{}]') then
local title
+
local nsStripped = ns:gsub('^[_%s]*:', '')
if ns then
+
nsStripped = nsStripped:gsub(':.*$', '')
title = mw.title.new(ns)
+
nsTable = mw.site.namespaces[nsStripped]
else
 
title = mw.title.getCurrentTitle()
 
end
 
if title then
 
nsData = mw.site.namespaces[title.namespace]
 
end
 
 
end
 
end
  
-- If we found a valid namespace, return a boolean, otherwise return nil.
+
-- If we still have no match then try the {{NAMESPACE}} parser function,
if nsData then
+
-- which should catch the remainder of cases. Don't use a mw.title object,
return nsData.hasSubpages
+
-- as this would increment the expensive function count for each new page
else
+
-- tested.
return nil
+
if not nsTable then
 +
frame = frame or mw.getCurrentFrame()
 +
local nsProcessed = frame:callParserFunction('NAMESPACE', ns)
 +
nsTable = nsProcessed and mw.site.namespaces[nsProcessed]
 
end
 
end
 +
 +
return nsTable and nsTable.hasSubpages
 
end
 
end
  

Revision as of 00:51, 17 June 2016

Documentation for this module may be created at Module:Ns has subpages/sandbox/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