Help:Lua/frame
框架(frame)可以看做是一个接口(interface),通过框架对象(frame object)来访问传递至解析器的参数,并调用一些方法。
注意MediaWiki并没有框架库,也没有frame
这个全局变量。在通过{{#invoke:}}
调用函数时,当前的框架对象会作为第一个参数传入该函数,此外,mw.getCurrentFrame()也可以用于获取框架对象。
下面的例子中,我们将框架对象命名为frame
。
args[编辑源代码]
frame.args
用来访问通过{{#invoke:}}
或模板调用时提供的参数。例如,{{#invoke:modname|funcname|第一个参数|第二个参数|name=命名参数}}
,那么在被调用的函数的第一个参数(假设叫做frame
)中,frame.args[1]
会得到"第一个参数"
,frame.args[2]
会得到"第二个参数"
,frame.args.name
会得到"第三个参数"
。
不难理解,调用模块的函数的参数中,参数名称即为args
中的键,参数的值即为args
中的值。注意:这个键可能是数字或字符串,值一定是字符串(可能是空字符串)。在调用时,命名参数和明显定义了名称的位次参数会除去多余空格,但位次参数不会。
frame.args
使用元表以实现对表的字段的访问,以及pairs和ipairs迭代器,但是“#”操作符、表库中的工具等则无法正常使用。
模块:Arguments可以为参数的访问提供一些高级功能,详见该模块文档。
callParserFunction[编辑源代码]
有三种用法:
frame:callParserFunction(name, args)
frame:callParserFunction(name, ...)
frame:callParserFunction{name = (字符串), args = (表)}
调用解析器函数并返回特定的值。例如:
{{ns:0}}
相当于frame:callParserFunction{name = 'ns', args = 0 }
{{#tag:nowiki|some text}}
相当于:frame:callParserFunction{name = '#tag', args = {'nowiki', 'some text'}}
frame:callParserFunction('#tag', {'nowiki', 'some text'})
frame:callParserFunction('#tag', 'nowiki', 'some text')
frame:callParserFunction('#tag:nowiki', 'some text')
{{#tag:ref|some text|name=foo|group=bar}}
相当于:frame:callParserFunction{name = '#tag:ref', args = {'some text', name = 'foo', group = 'bar'}}
能使用此函数的情况下,就尽可能不要使用frame:preprocess
。但是如果有现成的Lua自带的函数或者Scribunto库提供的函数,就应该要避免使用frame:callParserFunction
。
注意要调用的函数名称和参数都不会预处理。
expandTemplate[编辑源代码]
frame:expandTemplate{title = (字符串), args = (表)}
展开一个模板,相当于嵌入包含。注意标题与参数在传递到模版之前不会预处理。例如:
{{template|arg1|arg2|name=arg3}}
相当于frame:expandTemplate{title = 'template', args = {'arg1', 'arg2', name = 'arg3'}}
{{template|{{!}}}}
相当于:frame:expandTemplate{title = 'template', args = {'|'}}
extensionTag[编辑源代码]
用法:
frame:extensionTag(name, content, args)
frame:extensionTag{name = (字符串), content = (字符串), args = (表或字符串)}
使用一个扩展标签。大致相当于调用frame:callParserFunction
。
-- 这些都相同
frame:extensionTag{ name = 'ref', content = 'some text', args = { name = 'foo', group = 'bar' } }
frame:extensionTag( 'ref', 'some text', { name = 'foo', group = 'bar' } )
frame:callParserFunction{ name = '#tag:ref', args = {
'some text', name = 'foo', group = 'bar'
} }
-- 这些都相同
frame:extensionTag{ name = 'ref', content = 'some text', args = 'some other text' }
frame:callParserFunction{ name = '#tag:ref', args = {
'some text', 'some other text'
} }
getParent[编辑源代码]
frame:getParent()
返回上级框架。假如某个地方调用了模板,而模板又通过{{#invoke:}}
调用了模块,则frame
是这个{{#invoke:}}
所在的框架,而frame:getParent()
则是这个模板调用时所在的框架。如果没有再上级的框架了,则返回nil。在这种情况下,frame.args
是{{#invoke:}}
中提供的参数,而frame:getParent().args
则是模板中提供的参数。
例如,假如有个叫做“template”的模板,该模板代码会使用{{#invoke:module|my_function|invoke中的参数}}
,然后其他页面调用模板{{template|模板调用中的参数}}
,那么:
frame.args[1]
返回"invoke中的参数"
frame:getParent().args[1]
返回"模板调用中的参数"
模块:Arguments可以自动处理{{#invoke:}}
中的参数和模板调用中的参数,详见该模板文档。
getTitle[编辑源代码]
frame:getTitle()
以字符串形式返回与框架关联的标题。对于由{{#invoke:}}
创建的框架,返回被调用的模块的标题。
newChild[编辑源代码]
frame:newChild{title = (标题), args = (表)}
创建当前框架的子框架,可以有可选的参数和标题。
该函数主要用于在调试中测试一个{{#invoke:}}
环境。
preprocess[编辑源代码]
frame:preprocess(string)
或frame:preprocess{text = string}
在当前框架环境下展开维基文本,比如,模板、解析器函数以及像{{{1}}}
这样的参数都会展开。某些特殊的写成XML格式的标记,会被替换为条纹标记(strip marker)。
getArgument[编辑源代码]
frame:getArgument(arg)
或frame:getArgument{name = arg}
获得特定参数的对象,或者没有提供参数时返回nil。
返回的对象有:expand()
方法,可以返回对应参数的展开后的维基文本。
newParserValue[编辑源代码]
frame:newParserValue(text)
或frame:newParserValue{text = text}
返回有:expand()
方法的对象,该方法可以返回frame:preprocess(text)
的结果。
newTemplateParserValue[编辑源代码]
frame:newTemplateParserValue{title = title, args = args}
返回有:expand()
方法的对象,该方法可以返回使用给定的参数调用frame:expandTemplate
的结果。
argumentPairs[编辑源代码]
frame:argumentPairs()
等同于pairs(frame.args)
。不建议使用,为考虑向后兼容而保留。