Comunidad Central
Advertisement
Comunidad Central
Este blog asume que estás familiarizado con algunos conceptos de programación como variables y condiciones. Si no es así, te recomendamos buscar un curso para principiantes que te brinde conceptos básicos antes de aprender cómo usar Lua en Fandom.


Si has estado creando plantillas para tu wiki, tarde o temprano habrás descubierto cómo usar las funciones parser para crear código más complejo. Ya sea usando {{#if:}} o {{#switch:}}, estas te ayudan a crear bloques más poderosos para tu contenido.

Sin embargo, en algún punto puede que te hayas topado con un problema: usar demasiados #if va volviendo el código más difícil de leer. Imagina que quisieras auto-categorizar las páginas para los episodios en tu wiki sobre una serie de televisión siguiendo las siguientes reglas:

  1. Si hay un parámetro {{{temporada}}}, añadirá [[Categoría:Episodios de la temporada {{{temporada}}}]].
  2. Si el parámetro {{{temporada}}} no está presente, añadirá [[Categoría:Episodios sin temporada]] para facilitar encontrarlos.

En una plantilla, necesitarías un #if: bastante simple como el siguiente código:

{{#if:{{{temporada|}}}|[[Categoría:Episodios de la temporada {{{temporada}}}]]|[[Categoría:Episodios sin temporada]]}}

Hay unos cuantos {{ }} y [[ ]] que pueden parecer un poco confusos, pero no es nada terrible... todavía. ¿Qué tal si necesitáramos añadir una nueva regla?

  1. Si hay un parámetro {{{especial}}}, el cual determina si el episodio es especial o regular, deberá de añadir en su lugar [[Categoría:Episodios especiales de la temporada {{{temporada}}}]].

¿Cómo hacemos esto? Quizás algo como:

{{#if:{{{temporada|}}}|{{#if:{{{especial|}}}|[[Categoría:Episodios especiales de la temporada {{{temporada}}}]]|[[Categoría:Episodios de la temporada {{{temporada}}}]]}}|[[Categoría:Episodios sin temporada]]}}


Ahora se está haciendo un poco más difícil de leer, ¿no crees? ¡Y eso que solo hemos añadido una regla a nuestra lógica! Las funciones parser se lucen en comprobaciones sencillas, pero la complejidad va creciendo conforme intentas implementar lógica más compleja usando solo estas funciones. ¿Qué deberíamos de hacer, entonces? Siendo un lenguaje de programación, Lua es una herramienta más poderosa que te ayuda a agregar lógica avanzada a tus plantillas, a la vez que lo mantiene fácil de leer si ya estás familiarizado con el lenguaje. Pero antes de que podamos convertir nuestro ejemplo anterior, hay que entender qué es Lua y cómo puedes usarlo en tus wikis a través de módulos.

Guía rápida de Lua[]

Los scripts de Lúa están disponibles en todos los wikis de manera predeterminada a través del espacio de nombres Módulo. Al igual que todas tus plantillas comienzan con Plantilla:, todos los scripts de Lua están en páginas que empiezan por Módulo:. La mayoría de módulos lucirán algo parecido así:

local p = {}

function p.main(frame)
  -- code
end

return p


Hagamos un resumen rápido de este ejemplo:

  • local p es una variable que almacena una tabla vacía {}. La necesitas para agrupar todas las funciones que exportes y que puedas devolverla (return) al final del módulo. Otros módulos y páginas podrán usar todo lo que se encuentre en la tabla exportada.
  • Estamos creando una función main dentro de nuestra tabla p. frame es un argumento que todas las funciones reciben automáticamente cuando son llamadas desde una página; puedes leer más acerca del objeto frame, pero por ahora solo necesitarás saber que este objeto te da acceso a todos los parámetros usados en la página. Por ejemplo, en el caso de {{Plantilla|Primero|Segundo|hola=mundo}}, te daría acceso a Primero, Segundo y el valor de un parámetro llamado hola, que sería mundo.

Recuerda: ¡main es solo un ejemplo! Puedes usar cualquier nombre válido para tus funciones.

Creando nuestro módulo[]

Ahora, ¡comencemos con el código que nos interesa! Enfócate en el contenido nuevo, que sería todo lo que está en el interior de la función main.

local p = {}

function p.categorize(frame)
  local args = require('Dev:Arguments').getArgs(frame)
  local temporada = args.temporada
  local especial = args.especial
  
  if temporada then
    if especial then
      return string.format( '[[Category:Episodios especiales de la temporada %s]]', temporada )
    else
      return string.format( '[[Category:Episodios de la temporada %s]]', temporada )
    end
  else
    return '[[Category:Episodios sin temporada]]'
  end
end

return p


Paso a paso[]

Revisemos detenidamente qué es todo lo que hemos hecho:

Acceder a los parámetros
Hay varias maneras de acceder a los parámetros que son pasados desde la página a tu módulo, pero la más recomendable es usar Arguments, un Módulo Global de Lua disponible en todos los wikis. Este exporta una función getArgs que te devolverá una tabla con todos los argumentos a partir de tu objeto frame. Usar la misma plantilla de ejemplo que teníamos antes, "{{Plantilla|Primero|Segundo|hola=mundo}} te devolvería todos los argumentos en una tabla como la siguiente:
{
  "Primero",
  "Segundo",
  hola = "mundo"
}
¡Recuerda que las tablas de Lua se indizan desde 1! Puedes acceder a los argumentos que necesites como args[1] (Primero), args[2] (Segundo) y args.hola (mundo). Si intentas acceder a un índice que no existe regresará un valor nil, equivalente a undefined en JavaScript o None en Python.
Implementando tu lógica
Si ya conoces las instrucciones condicionales if en la programación, no debería de ser muy difícil entender la sintaxis de Lua aunque sea un poco diferente.
Tal como hicimos antes usando funciones parser, primero revisamos si el parámetro temporada existe. Si no lo está, recibiremos un valor nil de nuestra tabla de argumentos, el cual sería evaluado como false.
La otra parte que puede que te esté generando dudas es string.format. Lua tiene varias formas para "interpolar" textos, y esta es solo una de ellas. El primer parámetro de esta función es tu "plantilla de texto", donde cada %s será reemplazado por los siguientes parámetros en ese orden (en este caso, sería el valor que haya en temporada.
  • Si temporada existe, revisa si especial también existe.
    • Si especial existe, añade la categoría [[Categoría:Episodios especiales de la temporada %s]], donde %s será reemplazado por el valor de temporada.
    • Si no, añade la categoría [[Categoría:Episodios de la temporada %s]].
  • Si temporada no existe, añade la categoría [[Categoría:Episodios sin temporada]].
Justo como la plantilla, el valor que sea devuelto desde tu módulo será insertado en el artículo.

¿Cómo lo uso?[]

Si tuviéramos el ejemplo anterior en Módulo:Episodio, podrías llamarlo en cualquier página usando {{#invoke:Episodio|categorizar|temporada=1}}. Sin embargo, deberías de evitar hacer esto siempre que puedas. Aunque la sintaxis es muy similar a la que se usa para las plantillas, esto podría confundir a tus editores más nuevos: ¿#invoke? ¿Por qué categorizar? ¿Dónde encuentro esta plantilla?

Por lo general, tus editores nunca usarán los módulos directamente, sino a través de plantillas. Por ejemplo, en tu Plantilla:Infobox Episodio podrías llamar al módulo al final usando {{#invoke:Episodio|categorizar}}.

Probablemente te estés preguntando: ¿cómo sabrá a qué temporada pertenece? Bueno, ¡resulta que tu objeto frame tendrá acceso a todos los parámetros que sean pasados a {{Infobox Episodio}}! Y gracias al módulo global Arguments que usamos antes, tendrás acceso a ellos sin que tengas que modificar absolutamente nada en tu módulo. ¿No es genial?

Resumen[]

Este blog solo te ha dado una idea de cómo puedes usar Lua para simplificar la lógica de tus plantillas, y ojalá puedas usarlo en otros escenarios para que sea más fácil mantener tu wiki. Aquí hay una corta lista de cuándo deberías de considerar usar Lua:

  • Tu plantilla usa muchas funciones parser, sobretodo si están anidadas.
  • Necesitas procesar cualquier número de parámetros. En lugar de añadir manualmente {{{parámetro 1}}}, {{{parámetro 2}}}, {{{parametro 3}}} y así sucesivamente, puedes manejarlo usando Lua.
  • Aunque centralizar tus datos se considera una mala práctica para los wikis, a veces puede que sea la mejor solución para tus necesidades, y la mejor manera de centralizar datos es a través de módulos de Lua.

Ten en cuenta que los módulos de Lua necesitan que haya alguien que conozca el lenguaje para poder darles mantenimiento. Intenta seguir buenas prácticas de programación en tus módulos para que otras personas puedan entender cómo pueden modificarlos y facilitar la navegación a través del código si necesitaran arreglar algo. Por ejemplo: usa variables descriptivas (local ip no te da tanta información como sí lo hace local item_price), y divide tu código en varias funciones para hacerlo más legible. Y, por supuesto, ¡añade algunos comentarios para mantener las cosas claras y fáciles de entender para otros!

Tienes a tu disposición todas las herramientas disponibles en un lenguaje de programación para crear poderosos módulos que puedas usar en tus artículos, y ya no dependes únicamente de funciones parser y otras características más básicas.

Advertisement