帮助:模块/替换模板入门
本节将会讲解,如何用Lua来替换掉简单的模板 最简单的模板形式,一般就是“填空”,使用模板做好一个样子,其中挖一些空,使用传入的参数填入这些空中。 那么放到Lua中,需要解决的就是:
- 获取到这些传入的参数
- 填入那些空中
一个简单的模板
那么我们先描述一个简单的模板,这个模板描述一件装备的名字、等级和装备类型:
模板(假设模板名称为模板:Foo
):
{{{1}}}是一件{{{2}}}级的{{{3}}}。
调用模板的方法:
{{Foo|青铜大剑|5|双手剑}}
显示结果:
青铜大剑是一件5级的双手剑。
模块写法
这个模板,换成Lua的写法如下(假设模块名称为模块:Foo
):
local p = {} function p.print_text(frame) local args = frame.args local text = args[1]..'是一件'..args[2]..'级的'..args[3]..'。' return text end return p
调用模块的方法:
{{#invoke:Foo|print_text|青铜大剑|5|双手剑}}
文件:Lua 1.jpg 最终显示结果与刚才的模板一样:
青铜大剑是一件5级的双手剑。
代码拆分说明
local p
以下代码是在MediaWiki中使用Lua模块必需
的内容,即最开始的声明和最后的返回,这两块在上一节《Hello World》中已经讲过。
p
可以换成别的名字,只要最后将声明的名称,用return返回即可
local p = {} ... return p -- 在Mediawiki中,每个模块都必须有返回值。如果是用于在条目页进行调用的模块,返回值必须是个table
原理阐释:
MediaWiki中使用解析器函数{{#invoke}}
进行调用的任意一个模块,实际上的返回值都是一个表类型的结果(table
),所有的子函数(function)都是在这个叫做“p”的表中(当然您也可以叫别的名字)。
执行用函数function
中间的部分,是声明了一个函数
关键词 function 用于声明函数,这里声明的函数名为 p.print_text,这代表是p这个table中的一个名为print_text的函数
函数想被条目页调用的话,必须是返回的table的子项,比如这里返回值是p,那么如果我想让条目页可以调用这个函数,就必须声明成p.xxxx的形式
当模块被条目页调用时,会默认传入一个frame
对象,这是MediaWiki用于控制页面使用的,如果您是新手那么不需要理解这个东西,只需要知道,用于被调用的函数,需要且只能传入一个参数,这个参数可以随便命名,一般方便理解会起名叫frame
function p.print_text(frame) ... end
function获取模板参数
参数frame
是由解析器函数{{#invoke}}
调用时传入的唯一一个参数,该参数是Mediawiki的Frame对象
(Frame object
),里面存储了页面的基础信息,以及一些常用方法。最常用的就是frame
会有一个索引为args
的子值,里面是所有外部传入的参数。
local p = {} function p.print_text(frame) local args = frame.args local text = args[1]..'是一件'..args[2]..'级的'..args[3]..'。' return text end return p
所以这段示例代码, args[1]、 args[2]、 args[3]分别对应了模板中#invoke函数后的前三个序号参(无命名的参数,也就是模板里是{{{1|}}}、{{{2|}}}、{{{3|}}})。
本地变量的声明(local)
这里在函数内一共有三个句子。
第一句首先声明了一个变量args
,并将frame.args
的值赋予给了它。frame.args
是一个table,里面存储的就是通过外部调用传入的参数。
注意,Lua中所有变量如果不声明,将会是全局变量,虽然也可以使用,但是根据经验一般会因此容易遇到一些难以发现的Bug,所以除非您非常清晰知道这个变量需要作为全局变量存在,否则任何变量都要用local
声明。
local args = frame.args
一般来说,如果变量不是跟在函数后()中做了预先声明的,都需要在第一次使用时用local
进行本地声明,例如
local text = args[1]..'是一件'..args[2]..'级的'..args[3]..'。'
第二句中args[1]就是指获取传入的第1个参数,这和模板中的{{{1}}}
是一个意思,而..
是Lua的字符串链接符,用于将两段字符串连成一段。所以第二行命令,就是使用传入的3个参数,拼合成了一个字符串,并赋值给了text
变量。
当然上述代码块等价于下面的写法
local text = '' text =args[1]..'是一件'..args[2]..'级的'..args[3]..'。'
先声明text是一个空的字符串之后,第二次引用text就无需进行local声明了。
最后一句是将刚才生成好的text
变量作为返回值进行返回。在MediaWiki的模块中,函数最终返回值的字符串,将会作为内容最终显示在调用模块的位置。
return text