Se você tem criado predefinições em sua wiki, mais cedo ou mais tarde você terá que aprender a como usar funções parser para criar códigos mais complexos. Seja {{#if:}}
ou {{#switch:}}
, eles ajudam você a ter blocos de construção mais poderosos para o seu conteúdo.
No entanto, em algum momento você encontrará um problema: usar muitos códigos #if
torna difícil para ler o código fonte. Imagine que você quer auto-categorizar as páginas para os episódios em sua wiki sobre um programa de TV com as seguintes regras:
- Se houver um parâmetro
{{{season}}}
, será adicionado[[Categoria:Episódios da temporada {{{season}}}]]
. - Se o parâmetro
{{{season}}}
estiver faltando, será adicionado[[Categoria:Episódios sem uma temporada]]
para que você pode encontrá-lo mais facilmente.
Em uma predefinição, você precisará de um #if:
tão simples quanto:
{{#if:{{{season|}}}|[[Categoria:Episódios da temporada {{{season}}}]]|[[Categoria:Episódios sem uma temporada]]}}
Então tendo muitos {{ }}
e [[ ]]
pode começar a parecer confuso, mas isso não é terrível... ainda. E se nós precisamos adicionar uma nova regra?
- Se houver um parâmetro
{{{special}}}
, o que determina se o episódio é um episódio especial ou regular, ela deve adicionar uma[[Categoria:Episódios especiais da temporada {{{season}}}]]
.
Como nós podemos fazer isso? Talvez algo assim:
{{#if:{{{season|}}}|{{#if:{{{special|}}}|[[Categoria:Episódios especiais da temporada {{{season}}}]]|[[Categoria:Episódios da temporada {{{season}}}]]}}|[[Categoria:Episódios sem uma temporada]]}}
Agora está ficando um pouco mais difícil de ler, não é? Acabámos de adicionar uma única regra à nossa lógica! As funções parser se destacam em verificações simples, mas ficam mais complicadas quando você tenta implementar uma lógica mais complexa ao usá-las. O que nós devemos fazer então? Como linguagem de programação, a Lua é uma ferramenta mais poderosa que ajuda você a adicionar lógicas avançadas às suas predefinições, além de ser mais fácil de ler se você estiver familiarizado com ela. Mas antes de podermos converter o exemplo anterior, precisamos entender o que é e como você pode utilizá-la em suas wikis através dos módulos.
Iniciação rápido do Lua[]
Scripts Lua estão disponíveis nos namespace Módulo: em todas as wikis por padrão. Assim como todas as suas predefinições começam em Predefinição:, todos os scripts Lua estão em páginas que começam em Módulo:. A maioria dos módulos se parecerão dessa forma:
local p = {}
function p.main(frame)
-- code
end
return p
Vamos fazer um resumo rápido dos exemplos anteriores:
local p
é uma variável, que abriga uma tabela vazia{}
. Você precisa dela para manter todas as suas funções exportadas agrupadas juntas para que elas possam ser retornadas (return
) no final. Outros módulos e páginas serão capazes de usar qualquer coisa na tabela exportada.- Nós estamos criando uma função
main
dentro de nossa tabelap
.frame
é um agrupamento que todas as funções recebem quando elas são chamadas de uma página; você pode ler mais sobre os frame object, mas por enquanto nós somente precisamos saber que ele permite que você acesse os parâmetros usados na página. Por exemplo, em "{{Template|First|Second|hello=world}}
", ele lhe daria acesso aoFirst parameter
,Second parameter
e o valor de um parâmetro nomeadohello
, que éworld
.
Mantenha em mente: main
é apenas um exemplo! Você pode usar qualquer nome válido para as suas funções.
Criando o nosso módulo[]
Agora, vamos olhar o código em si! Foque no conteúdo novo, que é tudo que está dentro da função main
.
local p = {}
function p.categorize(frame)
local args = require('Dev:Arguments').getArgs(frame)
local season = args.season
local special = args.special
if season then
if special then
return string.format( '[[Category:Special episodes from season %s]]', season )
else
return string.format( '[[Category:Episodes from season %s]]', season )
end
else
return '[[Category:Episodes with no season]]'
end
end
return p
Passo-a-passo[]
Vamos dar uma olhada no que é tudo isso.
- Acessando os parâmetro
- Existem outras formas de acessar os parâmetros passados para o seu módulo a partir da página, porém o mais recomendado é usar Argumentos, um Módulo Lua Global disponível em todas as wikis. Ele exporta uma função
getArgs
que lhe dará uma tabela com todos os argumentos de seu objetoframe
. Usando a mesma chamada de predefinição que tínhamos antes, "{{Template|First|Second|hello=world}}
", ele fornecerá todos os argumentos em uma tabela como:
{ "First", "Second", hello = "world" }
- Lembre-se que as tabelas Lua começam indexando a partir de 1! Então você poderá acessar qualquer parâmetro que você precisa como
args[1]
(First),args[2]
(Second) eargs.hello
(world). Acessando qualquer chave que não existe irá retornar um valornil
, equivalente ao códigoundefined
do JavaScript ouNone
do Python.
- Implementando a sua lógica
- Você já deve estar familiarizado com o
if
na programação. A sintaxe Lua pode ser diferente, mas é fácil de entender. - Assim como nós fizemos antes usando as funções parser, nós primeiramente checamos se o parâmetro episódio foi configurado (if the
episode
parameter was set). Se não foi, nós teremos um valornil
das nossas tabelasargs
, que seriam avaliadas comofalse
. - A outra parte pode ter feito você se perguntar sobre o seu significado é o
string.format
. Lua possui formas diferentes para "interpolarizar" as strings, e essa é apenas uma delas. O primeiro parâmetro dessa função é a string da sua predefinição, onde cada instância de%s
será substituída pelos seguintes parâmetros em ordem (nesse caso, o valor armazenado emseason
).- If
season
is set, cheque ifspecial
is also set.- If
special
is set, adicione uma categoria[[Category:Special episodes from season %s]]
, onde%s
será substituída com o valor emseason
. - Else, adicione uma categoria
[[Category:Episodes from season %s]]
.
- If
- If
season
is not set, adicione uma categoria[[Category:Episodes with no season]]
.
- If
- Assim como uma predefinição, o valor retornado de seu módulo será inserido no artigo.
Como eu uso isso?[]
Se tivéssemos o exemplo anterior em Module:Episode
, você poderia chamá-lo em qualquer página usando {{#invoke:Episode|categorize|season=1}}
. No entanto, você deve evitar isso. Embora a sintaxe seja muito semelhante aos modelos, ela pode confundir os novos editores: #invoke
? Por que categorize
? Onde está esse modelo?
Usualmente, os seus editores nunca usarão os módulos diretamente, mas ao invés de fazê-lo pela predefinição. Por exemplo, em sua Predefinição:Episode Infobox
você pode chamar o seu módulo no final como: {{#invoke:Episode|categorize}}
.
Você pode estar se perguntando: como ele saberá a temporada? Bem, seu objeto frame
terá acesso a quaisquer parâmetros passados ao {{Episode Infobox}}
! E graças ao módulo global Argumentos que usamos antes, ele lhe dará acesso fácil a esses parâmetros sem ter que modificar o seu módulo. Isso não é ótimo?
Resumo[]
Esse blog apenas lhe dá uma ideia de como você pode usar o Lua para simplificar a l´[ogica de suas predefinições, esperamos que você possa ser capaz de aplicá-los em cenários melhores para que elas sejam mais fáceis de manter! Aqui está uma pequena lista de quando você deve considerar usar o Lua:
- A sua predefinição possui muitas funções parser, especialmente se elas estiverem aninhadas.
- Você precisa processar qualquer número de parâmetros. Ao invés de manualmente adicionar
{{{parameter 1}}}
,{{{parameter 2}}}
,{{{parameter 3}}}
e assim por diante conforme as suas necessidades, você pode gerenciá-las usando o Lua. - Apesar da centralização dos seus dados ser considerada uma má prática para as wikis, às vezes ele pode ser a melhor solução para as suas necessidades. E a melhor forma de centralizar os dados é através dos módulos Lua.
Mantenha em mente que os módulos Lua requerem alguém que conheça a linguagem para ser capaz de mantê-la. Tente seguir boas práticas de programação em seu módulo para que as outras pessoas seja capazes de entender o que ela deve fazer para que seja facilmente navegada caso precise de qualquer tipo de concerto. Por exemplo: use variáveis descritivas (local ip
não dá tantas informações quanto local item_price
) e separe o seu código em funções diferentes para deixá-la mais fácil de ler. E, é claro, adicione alguns comentários para deixá-la mais clara para os outros!
Você tem à sua disposição todas as ferramentas disponíveis em uma linguagem de programação para criar módulos poderosos para usar em seus artigos, ao invés de contar apenas com funções parser e outras funcionalidades básicas.