Module:Tl
来自滚动的天空Wiki
本模块用于{{tl}}、{{tlc}}、{{tlx}}、{{tls}}等模板。
函数说明[编辑源代码]
p._tlRaw[编辑源代码]
该函数传入两个参数:args和params。其中args是需要写入模板输出中的参数,包括模板名称、模板参数,而params是用于调整输出方式的参数。
p._tl[编辑源代码]
该函数同样也是传入两个参数:frameArgs和defaultParams,这两个都可以是框架项目(frame object)中的参数。这些参数会预先经过迭代重写处理,传入p._tlRaw中。
在特定情况下,frameArgs中的内容会转移到defaultParams的表中(实际上是迭代重写时的转移),frameArgs重写后的表不再有被转移的域。这里的“特定情况”包括:
- 键是特定的字段(详见#参数说明)。
- 值是字符串0或1。
请注意:重写时,不会对参数的值进行去除边界空白字符(mw.text.trim)处理,也不会忽略空白字符串值。解析器函数在调用时,命名参数的边界空白字符会被自动除去。
p.tl[编辑源代码]
这就是{{#invoke:}}
解析器函数需要直接调用的函数了。它会从调用此模板的页面中获得参数表(即frame:getParent().args)作为frameArgs,然后直接从调用{{#invoke:}}
时传入的参数表(frame.args)作为defaultParams,然后以此调用p._tl,这两个参数表被处理之后调用p._tlRaw。
参数说明[编辑源代码]
这些参数在传入p._tl函数时,其值为字符串1或0,因此无论是在{{#invoke:}}
中还是在调用模板时,调整输出方式的参数的值应该是0或1。而在p._tlRaw中,其值会转化为布尔值true和false。
参数名称 | 描述 |
---|---|
generateLinks | 若为true,则输出的内容中,模板名称会自动添加链接。链接不会应用于subst:等前缀。若模板名称以井号(# )开头,则一律不生成链接。
|
isCode | 若为true,则输出的结果会加上<code>标签。 |
isSubst | 若为true,则输出时模板名称前面自动添加“subst:”前缀。如设置了substPrefix,则substPrefix的值覆盖这一参数。 |
substPrefix | 字符串,用于替换引用时的前缀,不含冒号。它通常是subst、safesubst或msgnw。如果设置了,则会连同冒号一起自动添加在模板名称前面(若添加了链接,则在链接至外),即使isSubst没有设置为true。 |
local p = {}
function p._tlRaw(args, params)
local generateLinks = params.generateLinks
local substPrefix = params.substPrefix
local isCode = params.isCode
local templateName = args[1]
if (not templateName) or templateName=='' then
return ''
end
do
if params.isSubst then
substPrefix = substPrefix or 'subst'
end
local _subst, _templateName = templateName:match'(.-)%:(.+)'
if _subst=='subst' or _subst=='safesubst' or _subst=='msgnw' then
substPrefix = _subst
templateName = _templateName
end
end
local argsList = {}
local numKeyList = {}
local strKeyList = {}
local maxNumKey = 0
if generateLinks and not templateName:find '^%#' then
local title = mw.title.makeTitle('Template', templateName)
local currentTitle = mw.title.getCurrentTitle()
if title and (title.namespace == 10) and currentTitle.subpageText == 'doc' and currentTitle.basePageTitle == title then
-- 文档页面特殊处理
title = currentTitle
end
templateName = '[[' .. tostring(title or templateName) .. '|' .. templateName .. ']]'
end
if substPrefix then
table.insert(argsList, substPrefix .. ':'..templateName)
else
table.insert(argsList, templateName)
end
for k,v in pairs(args) do
if type(k)=='number' then
maxNumKey = math.min(math.max(maxNumKey,k),20)
elseif type(k)=='string' then
table.insert(strKeyList, k)
end
end
table.sort(strKeyList)
for k=2,maxNumKey,1 do
local v=args[k]
table.insert(argsList, v)
end
for i,k in ipairs(strKeyList) do
local v=args[k]
table.insert(argsList, k..'='..v)
end
local result = '{{' .. table.concat(argsList,'|') .. '}}'
if isCode then
return '<code>' .. result .. '</code>'
else
return result
end
end
function p._tl(frameArgs, defaultParams)
local params = {generateLinks = true}
if defaultParams then
-- 考虑传入到这里的defaultParams实质上也是frame的变量,
-- 故需要进行迭代重写。
for k,v in pairs(defaultParams) do
if v=='1' then
params[k] = true
elseif v=='0' then
params[k] = false
end
end
end
local args = {}
for k,v in pairs(frameArgs) do
-- 这种情况下,不应该忽略空白变量。
if k == 'isCode' or k == 'isSubst' or k == 'generateLinks' then
if v=='1' then
params[k] = true
elseif v=='0' then
params[k] = false
else
args[k] = v -- 这种情况下,这个变量作为正式变量,不作为params
end
elseif k == 'substPrefix' then
params[k] = v
else
args[k] = v
end
end
return p._tlRaw(args,params)
end
function p.tl(frame)
-- 这时候该函数用于模板tl、tlc……了
return p._tl(frame:getParent().args, frame.args)
-- 这里的前者相当于args,后者相当于defaultParams
end
return p