<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wikem.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANamespace_detect</id>
	<title>Module:Namespace detect - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wikem.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANamespace_detect"/>
	<link rel="alternate" type="text/html" href="https://wikem.org/w/index.php?title=Module:Namespace_detect&amp;action=history"/>
	<updated>2026-04-17T11:29:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://wikem.org/w/index.php?title=Module:Namespace_detect&amp;diff=17015&amp;oldid=prev</id>
		<title>Ostermayer: Created page with &quot;---------------------------------------------------------------------------------------------------- --                                                                        ...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wikem.org/w/index.php?title=Module:Namespace_detect&amp;diff=17015&amp;oldid=prev"/>
		<updated>2014-02-08T01:44:35Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;---------------------------------------------------------------------------------------------------- --                                                                        ...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;----------------------------------------------------------------------------------------------------&lt;br /&gt;
--                                                                                                --&lt;br /&gt;
--                                           NAMESPACE DETECT                                     --&lt;br /&gt;
--                                                                                                --&lt;br /&gt;
--      This module implements the {{namespace detect}} template in Lua, with a few               --&lt;br /&gt;
--      improvements: all namespaces and all namespace aliases are supported, and namespace       --&lt;br /&gt;
--      names are detected automatically for the local wiki. The module can also use the          --&lt;br /&gt;
--      corresponding subject namespace value if it is used on a talk page. Parameter names       --&lt;br /&gt;
--      can be configured for different wikis by altering the values in the &amp;quot;cfg&amp;quot; table.          --&lt;br /&gt;
--                                                                                                --&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--                                          Configuration data                                    --&lt;br /&gt;
--      Language-specific parameter names can be set here.                                        --&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {}&lt;br /&gt;
&lt;br /&gt;
-- This parameter displays content for the main namespace:&lt;br /&gt;
cfg.main = 'main'&lt;br /&gt;
&lt;br /&gt;
-- This parameter displays in talk namespaces:&lt;br /&gt;
cfg.talk = 'talk'&lt;br /&gt;
&lt;br /&gt;
-- This parameter displays content for &amp;quot;other&amp;quot; namespaces (namespaces for which&lt;br /&gt;
-- parameters have not been specified, or for when cfg.demospace is set to cfg.other):&lt;br /&gt;
cfg.other = 'other'&lt;br /&gt;
&lt;br /&gt;
-- This parameter makes talk pages behave as though they are the corresponding subject namespace.&lt;br /&gt;
-- Note that this parameter is used with [[Module:Yesno]]. Edit that module to change&lt;br /&gt;
-- the default values of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc.&lt;br /&gt;
cfg.subjectns = 'subjectns'&lt;br /&gt;
&lt;br /&gt;
-- This parameter sets a demonstration namespace:&lt;br /&gt;
cfg.demospace = 'demospace'&lt;br /&gt;
&lt;br /&gt;
-- This parameter sets a specific page to compare:&lt;br /&gt;
cfg.page = 'page'&lt;br /&gt;
&lt;br /&gt;
-- The header for the namespace column in the wikitable containing the list of possible subject-space parameters.&lt;br /&gt;
cfg.wikitableNamespaceHeader = 'Namespace'&lt;br /&gt;
&lt;br /&gt;
-- The header for the wikitable containing the list of possible subject-space parameters.&lt;br /&gt;
cfg.wikitableAliasesHeader = 'Aliases'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--                                       End configuration data                                   --&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local yesno = require('Module:Yesno')&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.getPageObject(page)&lt;br /&gt;
	-- Get the page object, passing the function through pcall in case we are over the expensive function count limit.&lt;br /&gt;
	if page then&lt;br /&gt;
		local noError, pageObject = pcall(mw.title.new, page)&lt;br /&gt;
		if not noError then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return pageObject&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getParamMappings()&lt;br /&gt;
	--[[ Returns a table of how parameter names map to namespace names. The keys are the actual namespace &lt;br /&gt;
	  names, in lower case, and the values are the possible parameter names for that namespace, also in&lt;br /&gt;
	  lower case. The table entries are structured like this:&lt;br /&gt;
		{&lt;br /&gt;
			[''] = {'main'},&lt;br /&gt;
			['wikipedia'] = {'wikipedia', 'project', 'wp'},&lt;br /&gt;
			...&lt;br /&gt;
		}&lt;br /&gt;
	]] &lt;br /&gt;
	local mappings = {}&lt;br /&gt;
	mappings[mw.ustring.lower(mw.site.namespaces[0].name)] = {cfg.main}&lt;br /&gt;
	mappings[cfg.talk] = {cfg.talk}&lt;br /&gt;
	for nsid, ns in pairs(mw.site.subjectNamespaces) do&lt;br /&gt;
		if nsid ~= 0 then -- Exclude main namespace.&lt;br /&gt;
			local nsname = mw.ustring.lower(ns.name)&lt;br /&gt;
			local canonicalName = mw.ustring.lower(ns.canonicalName)&lt;br /&gt;
			mappings[nsname] = {nsname}&lt;br /&gt;
			if canonicalName ~= nsname then&lt;br /&gt;
				table.insert(mappings[nsname], canonicalName)&lt;br /&gt;
			end&lt;br /&gt;
			for _, alias in ipairs(ns.aliases) do&lt;br /&gt;
				table.insert(mappings[nsname], mw.ustring.lower(alias))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getNamespace(args)&lt;br /&gt;
	-- Gets the namespace name from the page object.&lt;br /&gt;
	local page = args[cfg.page]&lt;br /&gt;
	local demospace = args[cfg.demospace]&lt;br /&gt;
	local subjectns = args[cfg.subjectns]&lt;br /&gt;
	local ret&lt;br /&gt;
	if demospace then&lt;br /&gt;
		-- Handle &amp;quot;demospace = main&amp;quot; properly.&lt;br /&gt;
		if mw.ustring.lower(demospace) == cfg.main then&lt;br /&gt;
			ret = mw.site.namespaces[0].name&lt;br /&gt;
		else&lt;br /&gt;
			ret = demospace&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local pageObject = p.getPageObject(page)&lt;br /&gt;
		if pageObject then&lt;br /&gt;
			if pageObject.isTalkPage then&lt;br /&gt;
				-- If cfg.subjectns is set, get the subject namespace, otherwise use cfg.talk.&lt;br /&gt;
				if yesno(subjectns) then&lt;br /&gt;
					ret = mw.site.namespaces[pageObject.namespace].subject.name&lt;br /&gt;
				else&lt;br /&gt;
					ret = cfg.talk&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				ret = pageObject.nsText&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return nil -- return nil if the page object doesn't exist.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = mw.ustring.gsub(ret, '_', ' ')&lt;br /&gt;
	return mw.ustring.lower(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- Get the namespace to compare the parameters to, and the parameter mapping table.&lt;br /&gt;
	local namespace = getNamespace(args)&lt;br /&gt;
	local mappings = p.getParamMappings()&lt;br /&gt;
	-- Check for any matches in the namespace arguments. The order we check them doesn't matter,&lt;br /&gt;
	-- as there can only be one match.&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		if ns == namespace then&lt;br /&gt;
			-- Check all aliases for matches. The default local namespace is checked first, as&lt;br /&gt;
			-- {{namespace detect}} checked these before alias names.&lt;br /&gt;
			for _, param in ipairs(params) do&lt;br /&gt;
				if args[param] ~= nil then&lt;br /&gt;
					return args[param]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- If there were no matches, return parameters for other namespaces. This happens if there&lt;br /&gt;
	-- was no text specified for the namespace that was detected or if the demospace parameter&lt;br /&gt;
	-- is not a valid namespace. Note that the parameter for the detected namespace must be&lt;br /&gt;
	-- completely absent for this to happen, not merely blank.&lt;br /&gt;
	if args[cfg.other] ~= nil then&lt;br /&gt;
		return args[cfg.other]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	-- If called via #invoke, use the args passed into the invoking template, or the args&lt;br /&gt;
	-- passed to #invoke if any exist. Otherwise assume args are being passed directly in.&lt;br /&gt;
	local origArgs&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		origArgs = frame:getParent().args&lt;br /&gt;
		for k, v in pairs(frame.args) do&lt;br /&gt;
			origArgs = frame.args&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		origArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
	-- Trim whitespace and remove blank arguments for demospace and page parameters.&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for k, v in pairs(origArgs) do&lt;br /&gt;
		if type(v) == 'string' then&lt;br /&gt;
			v = mw.text.trim(v) -- Trim whitespace.&lt;br /&gt;
		end&lt;br /&gt;
		if k == cfg.demospace or k == cfg.page then&lt;br /&gt;
			if v ~= '' then&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.table(frame)&lt;br /&gt;
	--[[ Create a wikitable of all subject namespace parameters, for documentation purposes. The talk &lt;br /&gt;
	  parameter is optional, in case it needs to be excluded in the documentation.&lt;br /&gt;
	]]&lt;br /&gt;
	local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and frame.args.talk == 'yes' -- Whether to use the talk parameter.&lt;br /&gt;
	local mappings = p.getParamMappings()&lt;br /&gt;
	-- Start the wikitable.&lt;br /&gt;
	local ret = '{| class=&amp;quot;wikitable&amp;quot;'&lt;br /&gt;
		.. '\n|-'&lt;br /&gt;
		.. '\n! ' .. cfg.wikitableNamespaceHeader&lt;br /&gt;
		.. '\n! ' .. cfg.wikitableAliasesHeader&lt;br /&gt;
	&lt;br /&gt;
	-- Generate the row for the main namespace, as we want this to be first in the list.&lt;br /&gt;
	ret = ret .. '\n|-'&lt;br /&gt;
		.. '\n| &amp;lt;code&amp;gt;' .. cfg.main .. '&amp;lt;/code&amp;gt;'&lt;br /&gt;
		.. '\n|'&lt;br /&gt;
	if useTalk then&lt;br /&gt;
		ret = ret .. '\n|-'&lt;br /&gt;
			.. '\n| &amp;lt;code&amp;gt;' .. cfg.talk .. '&amp;lt;/code&amp;gt;'&lt;br /&gt;
			.. '\n|'&lt;br /&gt;
	end&lt;br /&gt;
	-- Enclose all parameter names in &amp;lt;code&amp;gt; tags.&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		if ns ~= mw.site.namespaces[0].name then&lt;br /&gt;
			for i, param in ipairs(params) do&lt;br /&gt;
				mappings[ns][i] = '&amp;lt;code&amp;gt;' .. param .. '&amp;lt;/code&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Generate the other wikitable rows.&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace.&lt;br /&gt;
			ret = ret .. '\n|-'&lt;br /&gt;
				.. '\n| ' .. params[1]&lt;br /&gt;
				.. '\n| ' .. table.concat(params, ', ', 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- End the wikitable.&lt;br /&gt;
	ret = ret .. '\n|-'&lt;br /&gt;
		.. '\n|}'&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Ostermayer</name></author>
	</entry>
</feed>