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。
上述文档内容嵌入自Module:Tl/doc编辑 | 历史
编者可以在本模块的沙盒创建 | 镜像和测试样例创建页面进行实验。
请将模块自身所属的分类添加在文档中。本模块的子页面
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 = '&#123;&#123;' .. table.concat(argsList,'&#124;') .. '&#125;&#125;'
	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