<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sapph.group/wiki/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://sapph.group/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ANamespace_detect"/>
	<link rel="alternate" type="text/html" href="https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;action=history"/>
	<updated>2026-05-17T19:53:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=8173&amp;oldid=prev</id>
		<title>Bryan: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=8173&amp;oldid=prev"/>
		<updated>2014-06-06T20:35:23Z</updated>

		<summary type="html">&lt;p&gt;1 revision&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;
--                                                                            --&lt;br /&gt;
--                            NAMESPACE DETECT                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module implements the {{namespace detect}} template in Lua, with a    --&lt;br /&gt;
-- few improvements: all namespaces and all namespace aliases are supported,  --&lt;br /&gt;
-- and namespace names are detected automatically for the local wiki. The     --&lt;br /&gt;
-- module can also use the corresponding subject namespace value if it is     --&lt;br /&gt;
-- used on a talk page. Parameter names can be configured for different wikis --&lt;br /&gt;
-- by altering the values in the &amp;quot;cfg&amp;quot; table in                               --&lt;br /&gt;
-- Module:Namespace detect/config.                                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local data = mw.loadData(&amp;#039;Module:Namespace detect/data&amp;#039;)&lt;br /&gt;
local argKeys = data.argKeys&lt;br /&gt;
local cfg = data.cfg&lt;br /&gt;
local mappings = data.mappings&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local mArguments -- Lazily initialise Module:Arguments&lt;br /&gt;
local mTableTools -- Lazily initilalise Module:TableTools&lt;br /&gt;
local ustringLower = mw.ustring.lower&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function fetchValue(t1, t2)&lt;br /&gt;
	-- Fetches a value from the table t1 for the first key in array t2 where&lt;br /&gt;
	-- a non-nil value of t1 exists.&lt;br /&gt;
	for i, key in ipairs(t2) do&lt;br /&gt;
		local value = t1[key]&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function equalsArrayValue(t, value)&lt;br /&gt;
	-- Returns true if value equals a value in the array t. Otherwise&lt;br /&gt;
	-- returns false.&lt;br /&gt;
	for i, arrayValue in ipairs(t) do&lt;br /&gt;
		if value == arrayValue then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getPageObject(page)&lt;br /&gt;
	-- Get the page object, passing the function through pcall in case of&lt;br /&gt;
	-- errors, e.g. being over the expensive function count limit.&lt;br /&gt;
	if page then&lt;br /&gt;
		local success, pageObject = pcall(mw.title.new, page)&lt;br /&gt;
		if success then&lt;br /&gt;
			return pageObject&lt;br /&gt;
		else&lt;br /&gt;
			return nil&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;
-- Provided for backward compatibility with other modules&lt;br /&gt;
function p.getParamMappings()&lt;br /&gt;
	return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getNamespace(args)&lt;br /&gt;
	-- This function gets the namespace name from the page object.&lt;br /&gt;
	local page = fetchValue(args, argKeys.demopage)&lt;br /&gt;
	if page == &amp;#039;&amp;#039; then&lt;br /&gt;
		page = nil&lt;br /&gt;
	end&lt;br /&gt;
	local demospace = fetchValue(args, argKeys.demospace)&lt;br /&gt;
	if demospace == &amp;#039;&amp;#039; then&lt;br /&gt;
		demospace = nil&lt;br /&gt;
	end&lt;br /&gt;
	local subjectns = fetchValue(args, argKeys.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 equalsArrayValue(argKeys.main, ustringLower(demospace)) 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;
				-- Get the subject namespace if the option is set,&lt;br /&gt;
				-- otherwise use &amp;quot;talk&amp;quot;.&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 = &amp;#039;talk&amp;#039;&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&amp;#039;t exist.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret:gsub(&amp;#039;_&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
	return ustringLower(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- Check the parameters stored in the mappings table for any matches.&lt;br /&gt;
	local namespace = getNamespace(args) or &amp;#039;other&amp;#039; -- &amp;quot;other&amp;quot; avoids nil table keys&lt;br /&gt;
	local params = mappings[namespace] or {}&lt;br /&gt;
	local ret = fetchValue(args, params)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- If there were no matches, return parameters for other namespaces.&lt;br /&gt;
	-- This happens if there was no text specified for the namespace that&lt;br /&gt;
	-- was detected or if the demospace parameter is not a valid&lt;br /&gt;
	-- 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;
	--]]&lt;br /&gt;
	if ret == nil then&lt;br /&gt;
		ret = fetchValue(args, argKeys.other)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	mArguments = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
	local args = mArguments.getArgs(frame, {removeBlanks = false})&lt;br /&gt;
	local ret = p._main(args)&lt;br /&gt;
	return ret or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.table(frame)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Create a wikitable of all subject namespace parameters, for&lt;br /&gt;
	-- documentation purposes. The talk parameter is optional, in case it&lt;br /&gt;
	-- needs to be excluded in the documentation.&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	-- Load modules and initialise variables.&lt;br /&gt;
	mTableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
	local namespaces = mw.site.namespaces&lt;br /&gt;
	local cfg = data.cfg&lt;br /&gt;
	local useTalk = type(frame) == &amp;#039;table&amp;#039; &lt;br /&gt;
		and type(frame.args) == &amp;#039;table&amp;#039; &lt;br /&gt;
		and yesno(frame.args.talk) -- Whether to use the talk parameter.&lt;br /&gt;
	&lt;br /&gt;
	-- Get the header names.&lt;br /&gt;
	local function checkValue(value, default)&lt;br /&gt;
		if type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			return value&lt;br /&gt;
		else&lt;br /&gt;
			return default&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local nsHeader = checkValue(cfg.wikitableNamespaceHeader, &amp;#039;Namespace&amp;#039;)&lt;br /&gt;
	local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, &amp;#039;Aliases&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Put the namespaces in order.&lt;br /&gt;
	local mappingsOrdered = {}&lt;br /&gt;
	for nsname, params in pairs(mappings) do&lt;br /&gt;
		if useTalk or nsname ~= &amp;#039;talk&amp;#039; then&lt;br /&gt;
			local nsid = namespaces[nsname].id&lt;br /&gt;
			-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.&lt;br /&gt;
			nsid = nsid + 1 &lt;br /&gt;
			mappingsOrdered[nsid] = params&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)&lt;br /&gt;
&lt;br /&gt;
	-- Build the table.&lt;br /&gt;
	local ret = &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. nsHeader&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. aliasesHeader&lt;br /&gt;
	for i, params in ipairs(mappingsOrdered) do&lt;br /&gt;
		for j, param in ipairs(params) do&lt;br /&gt;
			if j == 1 then&lt;br /&gt;
				ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
					.. &amp;#039;\n| &amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
					.. &amp;#039;\n| &amp;#039;&lt;br /&gt;
			elseif j == 2 then&lt;br /&gt;
				ret = ret .. &amp;#039;&amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				ret = ret .. &amp;#039;, &amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
	</entry>
	<entry>
		<id>https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=7830&amp;oldid=prev</id>
		<title>Bryan: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=7830&amp;oldid=prev"/>
		<updated>2014-03-31T07:35:37Z</updated>

		<summary type="html">&lt;p&gt;1 revision&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;
--                                                                            --&lt;br /&gt;
--                            NAMESPACE DETECT                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module implements the {{namespace detect}} template in Lua, with a    --&lt;br /&gt;
-- few improvements: all namespaces and all namespace aliases are supported,  --&lt;br /&gt;
-- and namespace names are detected automatically for the local wiki. The     --&lt;br /&gt;
-- module can also use the corresponding subject namespace value if it is     --&lt;br /&gt;
-- used on a talk page. Parameter names can be configured for different wikis --&lt;br /&gt;
-- by altering the values in the &amp;quot;cfg&amp;quot; table in                               --&lt;br /&gt;
-- Module:Namespace detect/config.                                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local data = mw.loadData(&amp;#039;Module:Namespace detect/data&amp;#039;)&lt;br /&gt;
local argKeys = data.argKeys&lt;br /&gt;
local cfg = data.cfg&lt;br /&gt;
local mappings = data.mappings&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local mArguments -- Lazily initialise Module:Arguments&lt;br /&gt;
local mTableTools -- Lazily initilalise Module:TableTools&lt;br /&gt;
local ustringLower = mw.ustring.lower&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function fetchValue(t1, t2)&lt;br /&gt;
	-- Fetches a value from the table t1 for the first key in array t2 where&lt;br /&gt;
	-- a non-nil value of t1 exists.&lt;br /&gt;
	for i, key in ipairs(t2) do&lt;br /&gt;
		local value = t1[key]&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function equalsArrayValue(t, value)&lt;br /&gt;
	-- Returns true if value equals a value in the array t. Otherwise&lt;br /&gt;
	-- returns false.&lt;br /&gt;
	for i, arrayValue in ipairs(t) do&lt;br /&gt;
		if value == arrayValue then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getPageObject(page)&lt;br /&gt;
	-- Get the page object, passing the function through pcall in case of&lt;br /&gt;
	-- errors, e.g. being over the expensive function count limit.&lt;br /&gt;
	if page then&lt;br /&gt;
		local success, pageObject = pcall(mw.title.new, page)&lt;br /&gt;
		if success then&lt;br /&gt;
			return pageObject&lt;br /&gt;
		else&lt;br /&gt;
			return nil&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;
-- Provided for backward compatibility with other modules&lt;br /&gt;
function p.getParamMappings()&lt;br /&gt;
	return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getNamespace(args)&lt;br /&gt;
	-- This function gets the namespace name from the page object.&lt;br /&gt;
	local page = fetchValue(args, argKeys.page)&lt;br /&gt;
	if page == &amp;#039;&amp;#039; then&lt;br /&gt;
		page = nil&lt;br /&gt;
	end&lt;br /&gt;
	local demospace = fetchValue(args, argKeys.demospace)&lt;br /&gt;
	if demospace == &amp;#039;&amp;#039; then&lt;br /&gt;
		demospace = nil&lt;br /&gt;
	end&lt;br /&gt;
	local subjectns = fetchValue(args, argKeys.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 equalsArrayValue(argKeys.main, ustringLower(demospace)) 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;
				-- Get the subject namespace if the option is set,&lt;br /&gt;
				-- otherwise use &amp;quot;talk&amp;quot;.&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 = &amp;#039;talk&amp;#039;&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&amp;#039;t exist.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret:gsub(&amp;#039;_&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
	return ustringLower(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- Check the parameters stored in the mappings table for any matches.&lt;br /&gt;
	local namespace = getNamespace(args) or &amp;#039;other&amp;#039; -- &amp;quot;other&amp;quot; avoids nil table keys&lt;br /&gt;
	local params = mappings[namespace] or {}&lt;br /&gt;
	local ret = fetchValue(args, params)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- If there were no matches, return parameters for other namespaces.&lt;br /&gt;
	-- This happens if there was no text specified for the namespace that&lt;br /&gt;
	-- was detected or if the demospace parameter is not a valid&lt;br /&gt;
	-- 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;
	--]]&lt;br /&gt;
	if ret == nil then&lt;br /&gt;
		ret = fetchValue(args, argKeys.other)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	mArguments = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
	local args = mArguments.getArgs(frame, {removeBlanks = false})&lt;br /&gt;
	local ret = p._main(args)&lt;br /&gt;
	return ret or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.table(frame)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Create a wikitable of all subject namespace parameters, for&lt;br /&gt;
	-- documentation purposes. The talk parameter is optional, in case it&lt;br /&gt;
	-- needs to be excluded in the documentation.&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	-- Load modules and initialise variables.&lt;br /&gt;
	mTableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
	local namespaces = mw.site.namespaces&lt;br /&gt;
	local cfg = data.cfg&lt;br /&gt;
	local useTalk = type(frame) == &amp;#039;table&amp;#039; &lt;br /&gt;
		and type(frame.args) == &amp;#039;table&amp;#039; &lt;br /&gt;
		and yesno(frame.args.talk) -- Whether to use the talk parameter.&lt;br /&gt;
	&lt;br /&gt;
	-- Get the header names.&lt;br /&gt;
	local function checkValue(value, default)&lt;br /&gt;
		if type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			return value&lt;br /&gt;
		else&lt;br /&gt;
			return default&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local nsHeader = checkValue(cfg.wikitableNamespaceHeader, &amp;#039;Namespace&amp;#039;)&lt;br /&gt;
	local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, &amp;#039;Aliases&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Put the namespaces in order.&lt;br /&gt;
	local mappingsOrdered = {}&lt;br /&gt;
	for nsname, params in pairs(mappings) do&lt;br /&gt;
		if useTalk or nsname ~= &amp;#039;talk&amp;#039; then&lt;br /&gt;
			local nsid = namespaces[nsname].id&lt;br /&gt;
			-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.&lt;br /&gt;
			nsid = nsid + 1 &lt;br /&gt;
			mappingsOrdered[nsid] = params&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)&lt;br /&gt;
&lt;br /&gt;
	-- Build the table.&lt;br /&gt;
	local ret = &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. nsHeader&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. aliasesHeader&lt;br /&gt;
	for i, params in ipairs(mappingsOrdered) do&lt;br /&gt;
		for j, param in ipairs(params) do&lt;br /&gt;
			if j == 1 then&lt;br /&gt;
				ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
					.. &amp;#039;\n| &amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
					.. &amp;#039;\n| &amp;#039;&lt;br /&gt;
			elseif j == 2 then&lt;br /&gt;
				ret = ret .. &amp;#039;&amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				ret = ret .. &amp;#039;, &amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
	</entry>
	<entry>
		<id>https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=5586&amp;oldid=prev</id>
		<title>Bryan: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=5586&amp;oldid=prev"/>
		<updated>2013-11-01T06:30:10Z</updated>

		<summary type="html">&lt;p&gt;1 revision&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 = &amp;#039;main&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- This parameter displays in talk namespaces:&lt;br /&gt;
cfg.talk = &amp;#039;talk&amp;#039;&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 = &amp;#039;other&amp;#039;&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 = &amp;#039;subjectns&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- This parameter sets a demonstration namespace:&lt;br /&gt;
cfg.demospace = &amp;#039;demospace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- This parameter sets a specific page to compare:&lt;br /&gt;
cfg.page = &amp;#039;page&amp;#039;&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 = &amp;#039;Namespace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The header for the wikitable containing the list of possible subject-space parameters.&lt;br /&gt;
cfg.wikitableAliasesHeader = &amp;#039;Aliases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--                                       End configuration data                                   --&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&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;
			[&amp;#039;&amp;#039;] = {&amp;#039;main&amp;#039;},&lt;br /&gt;
			[&amp;#039;wikipedia&amp;#039;] = {&amp;#039;wikipedia&amp;#039;, &amp;#039;project&amp;#039;, &amp;#039;wp&amp;#039;},&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&amp;#039;t exist.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = mw.ustring.gsub(ret, &amp;#039;_&amp;#039;, &amp;#039; &amp;#039;)&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&amp;#039;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) == &amp;#039;string&amp;#039; 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 ~= &amp;#039;&amp;#039; 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) == &amp;#039;table&amp;#039; and type(frame.args) == &amp;#039;table&amp;#039; and frame.args.talk == &amp;#039;yes&amp;#039; -- Whether to use the talk parameter.&lt;br /&gt;
	local mappings = p.getParamMappings()&lt;br /&gt;
	-- Start the wikitable.&lt;br /&gt;
	local ret = &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. cfg.wikitableNamespaceHeader&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. 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 .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n| &amp;lt;code&amp;gt;&amp;#039; .. cfg.main .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|&amp;#039;&lt;br /&gt;
	if useTalk then&lt;br /&gt;
		ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
			.. &amp;#039;\n| &amp;lt;code&amp;gt;&amp;#039; .. cfg.talk .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
			.. &amp;#039;\n|&amp;#039;&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;#039;&amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&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 .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
				.. &amp;#039;\n| &amp;#039; .. params[1]&lt;br /&gt;
				.. &amp;#039;\n| &amp;#039; .. table.concat(params, &amp;#039;, &amp;#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- End the wikitable.&lt;br /&gt;
	ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
	</entry>
	<entry>
		<id>https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=5237&amp;oldid=prev</id>
		<title>Bryan: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://sapph.group/wiki/index.php?title=Module:Namespace_detect&amp;diff=5237&amp;oldid=prev"/>
		<updated>2013-10-22T07:11:40Z</updated>

		<summary type="html">&lt;p&gt;1 revision&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. Function names can be configured     --&lt;br /&gt;
--      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;
-- The name for the parameter to display content for the main namespace:&lt;br /&gt;
cfg.main = &amp;#039;main&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to display content in talk namespaces:&lt;br /&gt;
cfg.talk = &amp;#039;talk&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to display 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 = &amp;#039;other&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to set a demonstration namespace:&lt;br /&gt;
cfg.demospace = &amp;#039;demospace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to set a specific page to compare:&lt;br /&gt;
cfg.page = &amp;#039;page&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The header for the namespace column in the wikitable containing the list of possible&lt;br /&gt;
-- subject-space parameters.&lt;br /&gt;
cfg.wikitableNamespaceHeader = &amp;#039;Namespace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The header for the wikitable containing the list of possible subject-space parameters.&lt;br /&gt;
cfg.wikitableAliasesHeader = &amp;#039;Aliases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--                                       End configuration data                                   --&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Declare the table of functions to return.&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Get the page object. This will return the page object for the page specified, or nil if there are&lt;br /&gt;
-- errors in the title or if the expensive function count has been exceeded.&lt;br /&gt;
function p.getPageObject(page)&lt;br /&gt;
    if page then&lt;br /&gt;
        -- Get the page object, passing the function through pcall in case we are over the expensive&lt;br /&gt;
		-- function count limit.&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;
--[[ 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;
    [&amp;#039;&amp;#039;] = {&lt;br /&gt;
        {&amp;#039;main&amp;#039;},&lt;br /&gt;
    },&lt;br /&gt;
    [&amp;#039;wikipedia&amp;#039;] = {&lt;br /&gt;
        {&amp;#039;wikipedia&amp;#039;, &amp;#039;project&amp;#039;, &amp;#039;wp&amp;#039;}&lt;br /&gt;
    }&lt;br /&gt;
]] &lt;br /&gt;
function p.getParamMappings()&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;
--[[ 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;
function p.table(frame)&lt;br /&gt;
	-- Find whether to use the talk link or not.&lt;br /&gt;
    local useTalk = type(frame) == &amp;#039;table&amp;#039; and type(frame.args) == &amp;#039;table&amp;#039; and frame.args.talk == &amp;#039;yes&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    -- Get the parameter mappings.&lt;br /&gt;
    local mappings = p.getParamMappings()&lt;br /&gt;
    &lt;br /&gt;
    -- Start the wikitable.&lt;br /&gt;
    local ret = &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;&lt;br /&gt;
        .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
        .. &amp;#039;\n! &amp;#039; .. cfg.wikitableNamespaceHeader&lt;br /&gt;
        .. &amp;#039;\n! &amp;#039; .. cfg.wikitableAliasesHeader&lt;br /&gt;
    &lt;br /&gt;
    -- Generate the row for the main namespace, as we want this&lt;br /&gt;
    -- to be first in the list.&lt;br /&gt;
    ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
        .. &amp;#039;\n| &amp;lt;code&amp;gt;&amp;#039; .. cfg.main .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
        .. &amp;#039;\n|&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if useTalk then&lt;br /&gt;
        ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
            .. &amp;#039;\n| &amp;lt;code&amp;gt;&amp;#039; .. cfg.talk .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
            .. &amp;#039;\n|&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
        &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;#039;&amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &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 .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
                .. &amp;#039;\n| &amp;#039; .. params[1]&lt;br /&gt;
                .. &amp;#039;\n| &amp;#039; .. table.concat(params, &amp;#039;, &amp;#039;, 2)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- End the wikitable.&lt;br /&gt;
    ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
        .. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets the namespace name to compare to the arguments. The returned value is lower-case.&lt;br /&gt;
local function getNamespace(page, demospace)&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;
                -- {{namespace detect}} uses the same value for all talk namespaces, so that&amp;#039;s what&lt;br /&gt;
				-- the module should do too.&lt;br /&gt;
                ret = cfg.talk&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&amp;#039;t exist.&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.lower(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Compare the namespace found with the parameters that have been specified, and return content of&lt;br /&gt;
-- the appropriate parameter.&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[cfg.page], args[cfg.demospace])&lt;br /&gt;
    local mappings = p.getParamMappings()&lt;br /&gt;
    &lt;br /&gt;
    -- Check for any matches in the namespace arguments. The order we check them doesn&amp;#039;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] 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;
    &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] 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;
    &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) == &amp;#039;string&amp;#039; 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 ~= &amp;#039;&amp;#039; 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;
    &lt;br /&gt;
    return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
	</entry>
</feed>