帮助:模块/替换模板入门

来自心百科,心灵的百科全书
< 模块
Lua与模块
Lua.jpg
基础
1.Hello world
2.替换模板入门
3.function的调用
4.HTML的渲染
进阶
1.数据类型
2.字符串(string)
3.变量(variable)
4.运算符(operator)
5.分支结构(if)
6.循环结构(for/while/iterator)
7.函数(function)
8.表(table)
9.数组(table)
10.模板参数(args)
11.跨模块调用(require)
12.MongoDB函数
使用VS Code维护代码

本节将会讲解,如何用Lua来替换掉简单的模板 ​ 最简单的模板形式,一般就是“填空”,使用模板做好一个样子,其中挖一些空,使用传入的参数填入这些空中。 ​ 那么放到Lua中,需要解决的就是:

  1. 获取到这些传入的参数
  2. 填入那些空中

一个简单的模板

​ 那么我们先描述一个简单的模板,这个模板描述一件装备的名字、等级和装备类型: ​ 模板(假设模板名称为模板: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