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
maindentro 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 parametere 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
getArgsque 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ódigoundefineddo JavaScript ouNonedo Python.
- Implementando a sua lógica
- Você já deve estar familiarizado com o
ifna 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
episodeparameter was set). Se não foi, nós teremos um valornildas 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%sserá substituída pelos seguintes parâmetros em ordem (nesse caso, o valor armazenado emseason).- If
seasonis set, cheque ifspecialis also set.- If
specialis set, adicione uma categoria[[Category:Special episodes from season %s]], onde%sserá substituída com o valor emseason. - Else, adicione uma categoria
[[Category:Episodes from season %s]].
- If
- If
seasonis 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.
