模块(Module)是一个MediaWiki的官方插件功能。该插件允许编写者在MediaWiki中,使用Lua语言来编写模块,完成一些批量工作的处理。模块可以理解为是一个“高级形态”的模板

什么是模块

模块是Lua在MediaWiki执行的基础,Lua代码必须被写成若干个“模块”进行使用。

所有模块,需要建立在命名空间Module:模块:)下。

为什么要使用模块

括海无边,回头是岸。
—— SerGawen

在复杂的模板中,我们通常会使用各种解析器函数来实现类似程序语言的逻辑判断和循环(比如{{#if}})。

当一个模板比较简单,只会使用到少量解析器函数的时候,解析器函数是一个非常方便的功能。

但是,当一个模板需要做大量逻辑判断、循环之类功能的时候,就会导致模板的代码臃肿不堪,陷入由{{}}组成的花括号地狱当中,这样的模板难以阅读和维护。

这种时候就更适合使用模块来进行编写。

  1. 模块使用了真正的程序语言Lua,使其可以处理更复杂的逻辑判断;
  2. Lua代码的可读性更高,所以可以更轻松的制作出功能更丰富、也更利于维护的模板,也更有利于多人协奏。
  3. Lua的运行效率也比解析器函数更高,根据页面解析器函数的嵌套层次、复杂程度,改写成Lua可以显著提升页面的加载速度,解析器函数嵌套越多、调用次数越多、使用的SMW和Loop类函数越多,改写成Lua的效果就越明显。

如何调用模块

在MediaWiki中,可以使用解析器函数|{{#invoke}}{{#调用}})调用一个模块中的一个函数。

{{#invoke:模块名|函数名|参数1|参数2...}}

模块名指的是页面标题Module:XXX中的XXX。参数的写法和模板参数的写法是相同。

基础教程

Lua.jpg

基础教程部分,是通过一系列例子,来讲解如何编写模块,让模块可以完成原本通过模板承担的工作。阅读这部分内容,需要对MediaWiki的模板有一定了解。

标题 说明
Hello world 编写我们的第一个Hello world模块
替换模板入门 使用模块来替换掉简单的模板
function的调用 模块之间不同function之间的调用
HTML的渲染 讲解在Lua中,如何来生成HTML内容

进阶教程

进阶教程部分,是讲解Lua语言的基本知识,以及常用的Lua函数/库,以及MediaWiki额外提供的库。

Lua难学吗?

Lua是一个入门级别的编程语言,对于已经能够熟练运用解析器函数的维基开发者而言,只需要简单学习Lua的语法即可。如果您学习过甚至掌握任意一种真正的编程语言(譬如JS、Python甚至是VBA)都可以迅速的上手Lua

标题 说明
保留字 介绍Lua中的系统保留字
注释 介绍Lua中如何添加注释
数据类型 介绍Lua中的数据类型
字符串 介绍Lua中的数据类型string,以及MediaWiki中对UTF-8编码的string操作库Ustring
变量 介绍Lua中变量的声明、赋值等
运算符 介绍Lua中可以使用的运算符
分支结构 介绍Lua中的分支结构(if
循环结构 介绍Lua中的循环结构(forwhilerepeat...until
函数 介绍Lua中的函数(数据类型function
介绍Lua中的表(数据类型table),以及操作表的库table的使用方法
数组 介绍Lua中的数组(数据类型table的一种应用方式)
跨模块调用 介绍Mediawiki中,模块文件之间的互相引用,用来优化代码结构(require
获取模板参数 介绍Mediawiki中,模块获取外部页面模板参数的2种方法(args
MongoDB读取JSON内容 NEW 介绍在huijiWiki中,如何使用MongoDB语法来操作JSON数据(mw.huiji.db.*
库与函数 NEW 索引Lua在MediaWiki环境下可以直接调用的库和常用函数(manual
使用译名表 在Lua中读取和使用huiji-translation-pairs

tips

下面是一些关于Lua的tip,方便有编程基础的开发者迅速了解Lua与其他语言,特别是JavaScript的区别

  1. Lua中所有的集合类型都是(table),写作 { }
  2. Lua中表的索引是从1开始,而不是0
  3. Lua中的变量必须先声明才可以使用
  4. Lua中的空值叫做nil而不是null
  5. Lua中没有switch函数,一般通过多次elseif或者建立一个table作为枚举来进行索引,以实现类似JavaScript或解析器函数中“switch”的效果。
  6. Lua中没有replace函数,但是可以用mw.ustring.gsub或来替代。
  7. Lua中没有split函数,但是可以用mw.text.split或来替代。
  8. Lua中的字符串连接符是..而不是JavaScript或者Python中的+
  9. Lua中的“不等于”是~=而不是JavaScript或者Python中的!=
  10. Lua中没有三元运算符? :,但可以通过andor实现类似的效果
  11. Lua中的假值只有nilfalse0''{}在逻辑判断中都视为真)
  12. 想要在table中删除一个值,只需将其设为nil
  13. type函数的返回值是一个字符串而不是保留字,比较时需要这么写type(xxx) == "string/table/..."

其他

相关文档

WIKI开发实例

以下托管在灰机wiki的站点大量使用的Lua构建的模块,您可以自行访问该站点并阅读代码,以作为学习的参考

除此之外,灰机上还有许多使用Lua模块的站点,您可以自行发现或者在我们的交流群中向开发者提问

常见问题

Lua错误:模块xxx第n行:attempt to index local ‘<some key>’(a nil value)

可能的出错代码

local id = data['id']

原因:data为空值(nil)

解决方法:对data进行校验

local id = 'default'
if data ~= nil and data['id'] ~= nil then
  id = data['id']
end

上述代码可以简写为:

local id = data and data['id'] or 'default'
avatar
1

@SerGawen 请问SMW的Lua接口有没有文档?

3年
1

看到了,有action

3年
avatar
Reasno
1

这页就这样吧,代码这种东西,还是应该看英文文档 不懂得也很难教 强行翻译成中文的话可能还会丢失很多信息。

5年
avatar
Reasno
1

@SerGawen 你看如何

5年
avatar
SerGawen
1

回复@Reasno:我看行 挺好的~

5年