Help:Lua/frame

来自滚动的天空Wiki

框架(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)。不建议使用,为考虑向后兼容而保留。