模組:Namespace
外观
local p = {}
local data = require('Module:Namespace/data')
local function Error (msg)
return mError.error{'[[Module:Namespace]]錯誤:' + msg}
end
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
return ''
end
local function ifempty (ret, val)
return ret ~= '' and ret or val
end
local MsgCallFunc = {
['NS'] = (function (nsid)
return data.Namespace[tostring(nsid) .. '-display'] or data.Namespace[tostring(nsid)]
end),
['NS1'] = (function (nsid)
return data.Namespace[tostring(nsid)]
end),
}
function logObject( object )
local doneTable = {}
local doneObj = {}
local ct = {}
local function sorter( a, b )
local ta, tb = type( a ), type( b )
if ta ~= tb then
return ta < tb
end
if ta == 'string' or ta == 'number' then
return a < b
end
if ta == 'boolean' then
return tostring( a ) < tostring( b )
end
return false -- Incomparable
end
local function _logObject( object, indent, expandTable )
local tp = type( object )
if tp == 'number' or tp == 'nil' or tp == 'boolean' then
return tostring( object )
elseif tp == 'string' then
return string.format( "%q", object )
elseif tp == 'table' then
if not doneObj[object] then
local s = tostring( object )
if s == 'table' then
ct[tp] = ( ct[tp] or 0 ) + 1
doneObj[object] = 'table#' .. ct[tp]
else
doneObj[object] = s
doneTable[object] = true
end
end
if doneTable[object] or not expandTable then
return doneObj[object]
end
doneTable[object] = true
local ret = { doneObj[object], ' {\n' }
local mt = getmetatable( object )
if mt then
ret[#ret + 1] = string.rep( " ", indent + 2 )
ret[#ret + 1] = 'metatable = '
ret[#ret + 1] = _logObject( mt, indent + 2, false )
ret[#ret + 1] = "\n"
end
local doneKeys = {}
for key, value in ipairs( object ) do
doneKeys[key] = true
ret[#ret + 1] = string.rep( " ", indent + 2 )
ret[#ret + 1] = _logObject( value, indent + 2, true )
ret[#ret + 1] = ',\n'
end
local keys = {}
for key in pairs( object ) do
if not doneKeys[key] then
keys[#keys + 1] = key
end
end
table.sort( keys, sorter )
for i = 1, #keys do
local key = keys[i]
ret[#ret + 1] = string.rep( " ", indent + 2 )
ret[#ret + 1] = '['
ret[#ret + 1] = _logObject( key, indent + 3, false )
ret[#ret + 1] = '] = '
ret[#ret + 1] = _logObject( object[key], indent + 2, true )
ret[#ret + 1] = ",\n"
end
ret[#ret + 1] = string.rep( " ", indent )
ret[#ret + 1] = '}'
return table.concat( ret )
else
if not doneObj[object] then
ct[tp] = ( ct[tp] or 0 ) + 1
doneObj[object] = tostring( object ) .. '#' .. ct[tp]
end
return doneObj[object]
end
end
return _logObject( object, 0, true )
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 lang = ifempty(lang and lang:lower(), mw.getCurrentFrame():callParserFunction{ name = 'int', args = {'Conversionname'} })
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
if p._ispseudo(ns) then
nsid = p._ispseudo(ns)
else
nsid = -3
end
else
nsid = nsid_info.id
end
end
else
nsid = mw.title.getCurrentTitle().namespace
end
if type(nsid) == type('') then
return lan(data['PseudoNamespace'][nsid])
elseif nsid < -2 then
error('Input namespace error.')
end
return 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(
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)
if not title or type(title) ~= 'string' then
return nil
end
title = title:gsub('^[Tt]alk:', '')
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']
if not arg then
return Error('unknow $1', 'args[1]')
end
return p._ispseudo(arg) or ''
end
p._PNSArray = data['PseudoNamespace']['list']
return p