跳转到内容

模組:Namespace pagename

被永久保护的模块
维基百科,自由的百科全书

这是本页的一个历史版本,由SunAfterRain留言 | 贡献2021年2月6日 (六) 14:14编辑。这可能和当前版本存在着巨大的差异。

local p = {}
local yesno = require('Module:Yesno')
local mError = require('Module:Error')
local mNS = require('Module:Namespace')
local data = require('Module:Namespace_pagename/data')

local function lan (args, lang)
	-- from [[Module:Lan]]
	local userlanguage = lang or mw.getCurrentFrame():callParserFunction{ name = 'int', args = {'Conversionname'} }
	local fallbackList = require('Module:Lan').fallbackList
	local fallback = fallbackList[userlanguage]
	if fallback == nil then
		fallback = fallbackList['zh']
	end
	for _,langArgName in ipairs(fallback)  do
		if 	args[langArgName] ~= nil then
			return args[langArgName]
		end
	end
end

local function getNSbyID (key, lang) 
	return mNS._Namespace({lang, key})
end

local function msg (group, key, lang) 
	return lan(data[tostring(group)][tostring(key)] or {}, lang)
end

local function Error (msg, arg)
	return mError.error{'[[Module:Namespace_pagename]]錯誤:' + msg:gsub('$1', arg)}
end

local function inArray (str, arr)
	for i, v in ipairs(arr) do
		if str == v then
			return v
		end
	end
	return nil
end

local no_need_suffix = {-2, 0, 14, 100, 118, 119, 2300, 2600}

local can_add_extend_suffix = {2, 10, 828}
	
local function def_suffix (ns, lang)
	if ns == -1 then
		return lan({
			['zh'] = ' page',
			['zh-hans'] = '页面',
			['zh-hant'] = '頁面'
		}, lang)
	elseif ns == 2 then
		return lan({
			['zh'] = ' page',
			['zh-hans'] = '页',
			['zh-hant'] = '頁',
			['zh-tw'] = '頁面' -- 使用者頁面
		}, lang)
	elseif inArray(ns, {-2, 0, 6, 10, 14, 100, 118, 828, 2300}) then
		return ''
	else
		return lan({
			['zh'] = ' page',
			['zh-hans'] = '页',
			['zh-hant'] = '頁'
		}, lang)
	end
end

p._ispseudo = mNS._ispseudo
p.ispseudo = mNS.ispseudo

function p._main (args)
	local lang = args[1]
	local title
	local nsid
	local isCallFromNs = false
	local arg = args[2]
	if arg then
		if arg == '' then
			title = nil
			nsid = 0
		elseif arg:match('([Pp]age):') then -- 兼容:早期版本
			arg = arg:gsub('[Pp]age:', '')
			title = mw.title.new(arg)
			if not title then
				return Error(msg('Error', 'pg-error', lang), arg)
			end
			nsid = title.namespace
		elseif arg:match('([Nn]ame):') then -- 兼容:早期版本
			title = nil
			arg = arg:gsub('([Nn]ame):', '')
			nsid_info = mw.site.namespaces[tonumber(arg)] or mw.site.namespaces[arg]
			if mw.text.split(arg, ':')[2] and not nsid_info and not p._ispseudo(arg) then
				return Error(msg('Error', 'ns-error', lang), arg)
			end
			nsid = nsid_info and nsid_info.id
			isCallFromNs = true
		else
			local arg_title = mw.title.new(arg)
			local arg_ns = mw.site.namespaces[tonumber(arg)] or mw.site.namespaces[arg]
			if not arg_title then -- args2 無法被mediawiki正確解析
				return Error(msg('Error', 'pg-error', lang), arg)
			elseif arg_ns then -- args2 是{{ns:}}能解析的
				title = nil
				nsid = arg_ns.id
				isCallFromNs = true
			else -- 其他正常標題,無效的命名空間也被當條目處理
				title = arg_title
				nsid = arg_title.namespace
			end
		end
	else -- 以標題讀取
		arg = mw.title.getCurrentTitle().fullText
		title = mw.title.getCurrentTitle()
		nsid = title.namespace
	end
	if p._ispseudo(arg) then --偽命名空間
		return getNSbyID((nsid == 1 and 'Talk:' .. p._ispseudo(arg) or p._ispseudo(arg)), lang)
	end
	if title and title.isExternal then
		return msg('Type', 'External', lang)
	end
	local statue, wt = pcall(getNSbyID, nsid, lang)
	if not statue then
		return Error(msg('Error', 'ns-error', lang), 'namespace number = ' .. nsid)
	end
	if not isCallFromNs or not inArray(nsid, no_need_suffix) then
		if title then
			local content = title:getContent() or ''
			local titletext = title.fullText
			if 
				(
					content:match('%{%{[Dd]ocumentation[_%s]subpage')
					or content:match('%{%{[Tt]emplate[_%s]doc[_%s]inline')
					or content:match('%{%{[Tt]emplate[_%s]doc[_%s]viewed[_%s]directly')
					or titletext:match('%/[Dd]oc$')
				) and inArray(nsid, can_add_extend_suffix)
			then
				return wt .. msg('Type', 'doc', lang)
			elseif 
				content:match('%{%{[Ss]andbox')
				or content:match('%{%{[Tt]emplate[_%s]sandbox[_%s]notice')
				or content:match('%{%{請注意:請在這行文字底下進行您的測試,請不要刪除或變更這行文字以及這行文字以上的部份。')
				or content:match('%{%{请注意:请在这行文字底下进行您的测试,请不要删除或变更这行文字以及这行文字以上的部分。')
				or content:match('%{%{[Pp]D%-self%/沙盒%|')
				or titletext:match('^[A-Za-z]+%:沙盒$')
				or titletext:match('^File%:沙盒%.[A-Za-z]+$')
				or titletext:match('^Template%:沙盒%/')
				or titletext:match('^Template%:X%d')
				or (
					(
						titletext:match('%/[Ss]andbox$')
						or titletext:match('%/沙盒$')
					)
					and inArray(nsid, can_add_extend_suffix)
				)
			then
				return wt .. msg('Type', 'sandbox', lang)
			elseif 
				(
					content:match('%{%{[Tt]emplate[_%s]testcases[_%s]notice')
					or content:match('%{%{[Tt]est[_%s]cases[_%s]notice')
					or content:match('%{%{测试样例')
					or content:match('%{%{測試樣例')
					or titletext:match('%/[Tt]estcases$')
					or titletext:match('%/测试样例$')
					or titletext:match('%/測試樣例$')
				)
				and inArray(nsid, can_add_extend_suffix)
			then
				return wt .. msg('Type', 'testcases', lang)
			elseif 
				(
					titletext:match('%/[Tt]emp$')
					or titletext:match('%/[Tt]emporary$')
				)
				and inArray(nsid, can_add_extend_suffix)
			then
				return wt .. msg('Type', 'temp', lang)
			elseif
				titletext:match('^Template%:[^/]+%/?[Ii]ntro$')
				or titletext:match('^Template%:[^/]+%/?[Ii]ntroduction$')
				or titletext:match('^Template%:[^/]+%/?说明$')
				or titletext:match('^Template%:[^/]+%/?說明$')
			then
				return wt .. msg('Type', 'intro', lang)
			elseif
				titletext:match('^Template%:Editnotices%/')
				or titletext:match('^User%:[^/]+%/Editnotice$')
				or titletext:match('^User[_%s]talk%:[^/]+%/Editnotice$')
			then
				return msg('Type', 'editnotice', lang)
			elseif
				titletext:match('^User%:[^/]+%/Emailnotice$')
			then
				local user = titletext:gsub('^User%:([^/]+)%/Emailnotice$', '%1')
				return '[[User:' .. user .. '|' .. user .. ']]' .. lan({
					['zh'] = "'s ",
					['zh-hans'] = '的',
					['zh-hant'] = '的'
				}, lang) .. msg('Type', 'mailnotice', lang)
			elseif
				titletext:match('{{捷徑重定向([^}]+)}}')
				or titletext:match('{{捷径重定向([^}]+)}}')
				or titletext:match('{{快捷(方式)?重定向([^}]+)}}')
				or titletext:match('{{RTL([^}]+)%|捷徑')
			then
				return string.format(msg('Type', 'shortcut', lang), wt)
			end
		end
		return wt .. def_suffix(nsid, lang)
	end
	return wt
end

function p.main (frame) 
	local args = require('Module:Arguments').getArgs(frame, {
		valueFunc = function (key, value)
			if key == 2 then
				return type(value) == 'string' and mw.text.trim(value) or value
			elseif value then
				value = mw.text.trim(value)
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	})
	return p._main(args)
end

return p