模組:Namespace pagename
外观
local p = {}
local yesno = require('Module:Yesno')
local mError = require('Module:Error')
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
return ''
end
local function msg (group, key)
return data[tostring(group)][tostring(key)]
end
local function loaddata (group, key, lang)
return lan(msg(group, key) or {}, lang)
end
local function seterror (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
function p._ispseudo (title)
local titleobj = mw.title.new(title)
if not titleobj or titleobj.namespace ~= 0 then
return nil
end
local split = mw.text.split(title, ':')
if inArray(split[1], msg('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 seterror('unknow $1', 'args[1]')
end
return p._ispseudo(arg) or ''
end
p._PNSArray = msg('PseudoNamespace', 'list')
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 seterror(loaddata('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 seterror(loaddata('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 seterror(loaddata('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.new(arg)
nsid = title.namespace
end
if p._ispseudo(arg) then --偽命名空間
return loaddata('PseudoNamespace', p._ispseudo(arg), lang)
end
if title and title.isExternal then
return loaddata('Type', 'External', lang)
end
local wt = loaddata('Namespace', nsid, lang)
if wt == '' then
return seterror(loaddata('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 .. loaddata('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 .. loaddata('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 .. loaddata('Type', 'testcases', lang)
elseif
(
titletext:match('%/[Tt]emp$')
or titletext:match('%/[Tt]emporary$')
)
and inArray(nsid, can_add_extend_suffix)
then
return wt .. loaddata('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 .. loaddata('Type', 'intro', lang)
elseif
titletext:match('^Template%:Editnotices%/')
or titletext:match('^User%:[^/]+%/Editnotice$')
or titletext:match('^User[_%s]talk%:[^/]+%/Editnotice$')
then
return loaddata('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) .. loaddata('Type', 'mailnotice', lang)
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