社区中心
社区中心
35,782
页码
本博客假设您熟悉编程概念,如变量和条件。如果你没有,在学习如何在Fandom上使用Lua之前,你应该先找一个初学者课程。


如果你一直在wiki上创建模板,迟早你可能需要学习如何使用解析器函数创建更复杂的代码。要么是{{#if:}}{{#开关:}},这些可以帮助您为内容提供更强大的构建块。

然而,在某些时候你可能会面临一个问题:使用太多#如果使阅读源代码变得更加困难。假设您想按照以下规则自动对wiki中关于电视节目的剧集页面进行分类:

  1. 如果有{{季节}}参数,它将添加[[类别:第{{季}}]].
  2. 如果{{{季节}}参数丢失,它将添加[[类别:无季剧集]]所以你可以很容易地找到它。

在模板中,您需要一个#如果:简单如:

{{#if:{{季|}}|[[类别:季{{期}}]]|[类别:没有季的季]}}


这么多{{ }}[[ ]]可能开始让人困惑,但这并不可怕。。。然而。如果我们需要添加一个新规则怎么办?

  1. 如果有{{{特殊}}参数,它决定该集是特殊集还是常规集,它必须改为添加[[类别:第{{season}}}季的特别集]].

我们怎么能这样做?可能是这样的:

{{#if:{{season|}}|{{#if:{{special|}}|[[类别:第{{seaseon}}]]|[类别:第一季的特别集


现在读起来有点难了,不是吗?我们只是在逻辑中添加了一条规则!解析器函数在简单检查方面表现出色,但当您尝试使用它们实现更复杂的逻辑时,它们会变得更加复杂。那么我们该怎么办?作为一种编程语言,Lua是一种功能更强大的工具,可以帮助您向模板中添加高级逻辑,如果您熟悉它,则更容易阅读。但在转换之前的示例之前,我们需要了解它是什么,以及如何通过以下方式在Wiki上使用它模块.

Lua快速入门[]

Lua脚本在模块:默认情况下,所有wiki中的命名空间。就像所有模板都以开始一样模板:,所有Lua脚本都位于以开头的页面中模块:。大多数模块将如下所示:

地方的 第页 = {}

功能 第页.主要的(框架)
  --代码
结束

返回 第页


让我们快速总结一下前面的示例:

  • 局部p是一个变量,它存储一个空表{}。您需要它来将所有导出的函数捆绑在一起,以便返回-结尾处为ed。其他模块和页面将能够使用导出表中的任何内容。
  • 我们正在创建一个函数主要的在我们的桌子里第页.框架是从页面调用所有函数时收到的参数;你可以阅读更多关于框架对象,但现在我们只需要知道它允许您访问页面中使用的参数。例如,在“{{模板|第一个|第二个|hello=world}}“,它可以让您访问第一个参数,第二个参数和名为你好,这是世界.

请记住:主要的只是一个例子!您可以为函数使用任何有效的名称。

创建我们的模块[]

现在,让我们进入实际代码!关注新内容,即主要的功能。

地方的 第页 = {}

功能 第页.分类(框架)
  地方的 参数 = 要求(“Dev:参数”).获取参数(框架)
  地方的 季节 = 参数.季节
  地方的 特殊的 = 参数.特殊的
  
  如果 季节 然后
    如果 特殊的 然后
      返回 字符串格式( “[[类别:第%s季的特别集]]”, 季节 )
    其他的
      返回 字符串格式( '[[类别:第%s季的剧集]]', 季节 )
    结束
  其他的
    返回 “[[类别:无季剧集]]”
  结束
结束

返回 第页


一步一步地[]

让我们看看这是什么。

访问参数
有其他方法可以访问从页面传递给模块的参数,但最推荐的方法是使用论据,一个全局Lua模块在所有wiki中都可用。它导出一个函数获取参数这将为您提供一个包含您的所有参数的表框架对象。使用我们以前的模板调用,“{{模板|第一个|第二个|hello=world}}”,它将在一个表中为您提供所有参数,如:
{
  “第一个”,
  “第二个”,
  你好 = “世界”
}
记住,Lua表从1开始索引!因此,您可以访问所需的任何参数参数[1](第一),参数[2](第二)和args.hello参数(世界)。访问任何不存在的密钥将返回值,相当于JavaScript的未定义或Python的.
实现您的逻辑
你应该已经熟悉了如果编程中的语句。Lua的语法可能不同,但很容易理解。
就像之前使用解析器函数一样,我们首先检查如果季节参数已设置。如果不是这样,我们就会有一个我们的价值参数表,其计算结果为.
另一个让你疑惑的部分是字符串格式.Lua有不同的方法来“插入”字符串,而这只是其中之一。此函数的第一个参数是模板字符串,其中的每个实例%秒将按顺序替换为以下参数(在这种情况下,存储在季节).
  • 如果季节已设置,检查如果特殊的也已设置.
    • 如果特殊的已设置,添加类别[[类别:第%s季的特别集]],其中%秒将替换为中的值季节.
    • 其他,添加类别[[类别:第%s季的剧集]].
  • 如果季节设置,添加类别[[类别:无季剧集]].
就像模板一样,从模块返回的值将被插入到文章中。

我该如何使用它?[]

如果我们在模块:第集,您可以使用在任何页面中调用它{{#invoke:剧集|分类|季=1}}}然而,你应该避免这样。虽然语法与模板非常相似,但可能会混淆新编辑器:#调用? 为什么?分类? 这个在哪里模板?

通常,编辑器不会直接使用模块,而是通过模板。例如,在您的模板:剧集信息框您可以在末尾将模块调用为:{{#调用:第集|分类}}.

你可能会想:它怎么知道这个季节?好吧,你的框架对象将可以访问传递给的任何参数{{剧集信息框}}! 多亏了论据我们以前使用的全局模块,它可以让您轻松访问这些参数,而无需修改您的模块。这不是很棒吗?

总结[]

这个博客只让您了解了如何使用Lua来简化模板中的逻辑,希望您能够将其应用到更好的场景中,以便更容易维护!下面是一个简短的列表何时应该考虑使用Lua:

  • 您的模板有许多解析器函数,特别是如果它们是嵌套的。
  • 您需要处理任意数量的参数。而不是手动添加{{{参数1}},{{{参数2}}},{{{参数3}}等等,您可以使用Lua管理它们。
  • 尽管对wiki来说,集中数据被认为是一种糟糕的做法,有时它可能是满足您需求的最佳解决方案。集中数据的最佳方法是通过Lua模块。

请记住,Lua模块需要知道该语言的人才能维护它。请尝试在模块中遵循良好的编程实践,以便其他人能够理解它应该做什么,并在需要修复任何问题时轻松浏览它。例如:使用描述性变量(本地ip提供的信息不如本地项目_价格)并将代码拆分为不同的函数,以便于阅读。当然,还要添加一些评论,以便让其他人明白!

您可以使用编程语言中的所有可用工具来创建强大的模块,以便在文章中使用,而不仅仅依赖解析器函数和其他基本特性。