<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>https://wikijoo.ir/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3ANamespace_detect</id>
	<title>پودمان:Namespace detect - تاریخچهٔ نسخه‌ها</title>
	<link rel="self" type="application/atom+xml" href="https://wikijoo.ir/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3ANamespace_detect"/>
	<link rel="alternate" type="text/html" href="https://wikijoo.ir/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Namespace_detect&amp;action=history"/>
	<updated>2026-04-09T03:18:31Z</updated>
	<subtitle>تاریخچهٔ نسخه‌ها برای این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wikijoo.ir/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Namespace_detect&amp;diff=1251416&amp;oldid=prev</id>
		<title>DaneshGostar: ۱ نسخه واردشده</title>
		<link rel="alternate" type="text/html" href="https://wikijoo.ir/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Namespace_detect&amp;diff=1251416&amp;oldid=prev"/>
		<updated>2019-07-24T05:23:50Z</updated>

		<summary type="html">&lt;p&gt;۱ نسخه واردشده&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحهٔ تازه&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>DaneshGostar</name></author>
	</entry>
</feed>