模块:Namespace

来自戏曲百科

可在模块:Namespace/doc创建此模块的帮助文档

local p = {}
local data = mw.loadData('Module:Namespace/data')
local mLan = require('Module:Lan2')

local function Error (msg)
	return mError.error{'[[Module:Namespace]]錯誤:' + msg}
end

local function ifempty (ret, val)
	return ret ~= '' and ret or val
end

function p._lan (args, lang)
	return mLan.main(args, ifempty(lang and lang:lower(), mw.getCurrentFrame():callParserFunction{ name = 'int', args = {'Lang'} }), {
		['def'] = {'en'}
	})
end

function p.isNamespace (id)
	id = tostring(id)
	return 
		mw.site.namespaces[tonumber(id) or id:lower()] and mw.site.namespaces[tonumber(id) or id:lower()].id
		or p._ispseudoNS(id)
		or nil
end

function p.namespace (frame)
	local args
	if frame == mw.getCurrentFrame() then
		-- We're being called via #invoke. The args are passed through to the module
		-- from the template page, so use the args that were passed into the template.
		if not getArgs then
			getArgs = require('Module:Arguments').getArgs
		end
		args = getArgs(frame, {parentFirst=true})
	else
		-- We're being called from another module or from the debug console, so assume
		-- the args are passed in directly.
		args = frame
		if type(args) ~= type({}) then args = {frame} end
	end
	id = tostring(args.namespace or args[1])
	return (p._ispseudo() or mw.title.getCurrentTitle().namespace) == p.isNamespace(id) and (args['then'] or args[2]) or (args['else'] or args[3])
end

local MsgCallFunc = {
	['NamespacesDisplay'] = (function (nsid) 
		return data.Namespace[tostring(nsid)]
	end),
	['NamespacesConversionDisplay'] = (function (nsid) 
		return data.Namespace[tostring(nsid) .. '-display'] or data.Namespace[tostring(nsid)]
	end),
	
}

for key, func in pairs(MsgCallFunc) do
	p['_' .. key] = function (lang, ns)
		if type(lang)  == 'table' then
			ns = lang[2]
			lang = lang[1]
		end
		local PNS
		local lang = lang
		local nsid
		if ns then
			if ns == '' then
				nsid = -3
			else
				local nsid_info = mw.site.namespaces[tonumber(ns)] or mw.site.namespaces[ns]
				if not nsid_info then
					PNS = p._ispseudo(ns)
					if PNS then
						if ns:match('^[Tt][Aa][Ll][Kk]:') then
							nsid = 'Talk:' .. PNS
						else
							nsid = PNS
						end
					else
						nsid = -3
					end
				else
					nsid = nsid_info.id
				end
			
			end
		else
			PNS = p._ispseudo()
			if PNS then
				nsid = (mw.title.getCurrentTitle().namespace == 1 and 'Talk:' or '') .. PNS
			else
				nsid = mw.title.getCurrentTitle().namespace
			end
		end
		if type(nsid) == 'string' then
			return p._lan(data['PseudoNamespace'][nsid], lang)
		elseif nsid < -2 then
			error('Input namespace error.')
		end
		return p._lan(MsgCallFunc[key](nsid), lang)
	end
	
	p[key] = function (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
		})
		local statue, wt = pcall(p['_' .. key], args)
		if statue then
			return wt
		end
		return tostring(mw.html.create('span'):attr('style', 'color:red;'):wikitext(
			p._lan ({
				['zh'] = 'Input namespace error',
				['zh-hans'] = '输入名字空间错误',
				['zh-hant'] = '輸入命名空間錯誤'
			}, lang)
		):done())
	end
end

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

function p._ispseudo (title)
	local success, titleObj = pcall(mw.title.new, title)
	if not success or not titleObj then
		if title == '' then
			return nil
		elseif not title then
			titleObj = mw.title.getCurrentTitle()
		elseif type(title) == 'table' and tostring(title) ~= 'table' then -- for arg title is mw.title obj
			local titleText = title.fullText
			if not titleText then
				return nil
			end
			success, titleObj = pcall(mw.title.new, title)
			if not success or not titleObj or titleObj ~= title then
				return nil
			end
		else
			return nil
		end
	end
	title = titleObj.fullText:gsub('^Talk:', '')
	local split = mw.text.split(title, ':')
	if inArray(split[1], data['PseudoNamespace']['list']) then
		return split[1]
	end
	return nil
end

function p.ispseudo (frame)
	local arg = require('Module:Arguments').getArgs(frame)['1']
	return p._ispseudo(arg) or ''
end

function p._ispseudoNS (ns)
	if not ns or ns == '' then
		return nil
	end
	local success, titleObj = pcall(mw.title.new, ns .. ':$1')
	if not success or not titleObj then
		return nil
	end
	ns = titleObj.fullText:gsub('^Talk:', ''):gsub(':%$1$', '')
	if inArray(ns, data['PseudoNamespace']['list']) then
		return ns
	end
	return nil
end

p._PNSArray = data['PseudoNamespace']['list']

return p