Lua es un lenguaje de programación que está disponible a través de la extensión Scribunto MediaWiki en la Wikipedia en inglés. Desde febrero de 2013, el código Lua se puede incrustar en plantillas wiki empleando la funcionalidad "{{#invoke:}}" de Scribunto. Esta extensión es compatible con Lua 5.1 a partir de octubre de 2022 [actualizar].
El código fuente de Lua se almacena en páginas llamadas módulos (por ejemplo, Módulo:Ejemplo ). Estos módulos individuales se invocan luego (mediante código {{#invoke:<Module name>|<Function name>|(optional) param1 | param2...}}
). Ejemplo:
Los módulos se ejecutan en páginas wiki normales utilizando la función de análisis #invoke. La sintaxis de #invoke es similar a la sintaxis de plantilla, pero con algunas diferencias. La diferencia más importante es que necesitas especificar un nombre de función . Una función es un conjunto de instrucciones que toma valores de entrada, los procesa y devuelve un valor de salida. [1] Esto es muy parecido a lo que hace una plantilla: le das argumentos, los procesa y obtienes un resultado. Sin embargo, puedes definir muchas funciones en un módulo Lua, mientras que solo puedes definir una plantilla en una página.
Además, no se puede ejecutar un módulo Lua directamente, sino que solo se puede ejecutar una de las funciones del módulo. El módulo es solo un contenedor de las funciones y no hace nada por sí mismo. Por lo tanto, hay dos razones por las que necesitamos ingresar un nombre de función: no podemos ejecutar un módulo por sí solo y, sin especificar un nombre de función, Lua no sabrá qué función es la que queremos ejecutar.
La forma más sencilla de ejecutar un módulo desde una página wiki es la siguiente:
{{#invoke: nombre del módulo | nombre de la función }}
Por ejemplo, podemos ejecutar Módulo:Example de esta manera, que tiene una función llamada "hola".
{{#invoke:Example|hello}}
→ ¡Hola mundo!Los argumentos se pasan a los módulos de la misma manera que se pasan a las plantillas. Sin embargo, tenga en cuenta que el texto después del primer carácter de barra vertical es siempre el nombre de la función; el primer argumento posicional es el texto después del segundo carácter de barra vertical.
{{#invoke: nombre del módulo | nombre de la función | primer argumento posicional | segundo argumento posicional | argumento nombrado = valor }}
En Module:Example , la función "hello_to" saluda a distintas personas según el primer argumento posicional. Funciona de la siguiente manera:
{{#invoke:Example|hello_to|Kate}}
→ ¡Hola, Kate!{{#invoke:Example|hello_to|Fred}}
→ ¡Hola, Fred!Una tercera función en Module:Example , llamada "count_fruit", utiliza los argumentos nombrados bananas
y apples
para contar la cantidad de plátanos y manzanas que tenemos. Se puede ejecutar de la siguiente manera:
{{#invoke:Example|count_fruit|apples=3|bananas=4}}
→ Tengo 4 plátanos y 3 manzanas.{{#invoke:Example|count_fruit|bananas=5|apples=2}}
→ Tengo 5 plátanos y 2 manzanas.La mayoría de los módulos tienen una página de documentación que explica qué argumentos se pueden usar y cuáles serán sus efectos.
Actualmente, VisualEditor no permite invocar módulos a través de su interfaz, aunque puede editar invocaciones de módulos existentes. Una posible solución para esto es usar {{ invoke }} en su lugar. La sintaxis es muy similar a #invoke, por lo que, para usarlo en VisualEditor, su primer argumento sin nombre debe ser el nombre del módulo, el segundo el nombre de la función y todos los argumentos pasados al módulo se pueden especificar de la misma manera que para las plantillas normales . Tenga en cuenta que no funcionará para los módulos que esperan leer datos de la plantilla que realiza la llamada (ya que la plantilla que realiza la llamada es {{ invoke }} en sí misma en lugar de la página que la utiliza), como lo demuestra el siguiente ejemplo:
{{#invoke:TEMPLATENAME|main}}
→ Wikipedia:Lua{{invoke|TEMPLATENAME|main}}
→ Plantilla:InvocarSin embargo, ese es un caso patológico, la mayoría de los módulos se comportarán de la misma manera.
Visita Wikipedia discusión:Lua para solicitar ayuda para escribir un script Lua para realizar una tarea específica en Wikipedia u otro proyecto de la Fundación Wikimedia.
Historia sórdida. {{ qif }} , ParserFunctions, extensión Lua, debate sobre el lenguaje de scripting wiki (JavaScript v. Lua), mw:Extension:WikiScripts, Tim escribe Scribunto con soporte inicial para Lua.
Lua, que se ha debatido durante años, se instaló en 2012 para realizar pruebas en test2.wikipedia.org, con una invitación abierta a todos los editores para que experimentaran con el desarrollo de módulos Lua. Lua se instaló en la Wikipedia en inglés en febrero de 2013, después de realizar pruebas en mediawiki.org y en los wikis de prueba de Wikimedia.
Lua es un lenguaje de programación que se puede utilizar para analizar datos, calcular expresiones y dar formato a resultados mediante funciones o programación orientada a objetos . Aunque algunos scripts de Lua pueden mantenerse simples, para facilitar su comprensión, Lua permite estructuras complejas que incluyen tablas, funciones dinámicas y matrices asociativas donde los subíndices de índice pueden ser palabras y números de índice. Lua también admite la recursión de funciones re-anidadas, por lo que se debe tener cuidado para evitar una complejidad excesiva donde otros usuarios no entiendan cómo mantener un módulo de Lua. El siguiente es el código fuente del módulo utilizado para los ejemplos anteriores.
local p = {}; --Todos los módulos Lua en Wikipedia deben comenzar definiendo una variable --que mantendrán sus funciones accesibles externamente. --Estas variables pueden tener cualquier nombre que desees y pueden -También contiene varios datos y funciones.p . hola = función ( marco ) --Agrega una función a "p". --Estas funciones se pueden llamar en Wikipedia. --a través del comando #invoke. --"frame" contendrá los datos que Wikipedia --envía esta función cuando se ejecuta. -- "Hola" es un nombre de su elección. Se debe hacer referencia al mismo nombre cuando se utiliza el módulo. local str = "¡Hola mundo!" --Declara una variable local y configúrala igual a --"¡Hola Mundo!". return str --Esto nos indica que salgamos de esta función y enviemos la información en --"str" volver a Wikipedia. fin - fin de la función "hola"función p . hello_to ( frame ) – Agregar otra función nombre local = frame.args [ 1 ] – Para acceder a los argumentos pasados a un módulo, utilice `frame.args` -- `frame.args[1]` hace referencia al primer parámetro sin nombre -- entregado al módulodevuelve "Hola, " .. nombre .. "!" -- `..` concatena cadenas. Esto devolverá un -- saludo dependiendo del nombre dado, como por ejemplo "¡Hola, Fred!"finfunción p . count_fruit ( marco )local num_bananas = tonumber ( frame . args . bananas ) o 0 - Argumentos nombrados ({{#invoke:Example|count_fruit|foo=bar}})local num_apples = tonumber ( frame . args . apples ) o 0 - también se accede indexando `frame.args` por nombre (`frame.args["bananas"]`,-- o equivalentemente `frame.args.bananas`. conj_bananas local = num_bananas == 1 y 'banana' o 'bananas' conj_manzanas local = num_manzanas == 1 y 'manzana' o 'manzanas' -- Los operadores ternarios asignan valores en función de una condición de forma compacta.-- Aquí, `conj_bananas` obtiene `'banana'` si `num_bananas` es 1, de lo contrario `'bananas'`.-- De manera similar, `conj_apples` obtiene `'apple'` si `num_apples` es 1, de lo contrario `'apples'`. devuelve 'Tengo ' .. num_bananas .. ' ' .. conj_bananas .. ' y ' .. num_apples .. ' ' .. conj_apples -- Como se indicó anteriormente, concatene un montón de cadenas para producir --una oración basada en los argumentos dados.finretorna p --Todos los módulos terminan devolviendo la variable que contiene sus funciones a Wikipedia.-- Ahora podemos usar este módulo llamando a {{#invoke: Example | hello }},-- {{#invoke: Ejemplo | hola_a | foo }}, o {{#invoke:Example|contar_frutas|bananas=5|manzanas=6}}-- Tenga en cuenta que la primera parte de la invocación es el nombre de la página wiki del módulo,-- y la segunda parte es el nombre de una de las funciones asociadas a la--variable que usted devolvió.-- La función "imprimir" no está permitida en Wikipedia. Toda la salida se realiza-- a través de cadenas "devueltas" a Wikipedia.
Se destaca una muestra de Lua mediante una etiqueta <syntaxhighlight lang="lua">...</syntaxhighlight>
colocada alrededor del código fuente de Lua. Para ver algunos ejemplos más complejos de Lua, consulte el artículo: " Lua (lenguaje de programación) ".
Para obtener instrucciones sobre cómo utilizar Lua dentro de MediaWiki (y por lo tanto, Wikipedia), consulte mw:Extension:Scribunto/Manual de referencia de Lua.
En Wikipedia hay disponibles algunos marcos de pruebas unitarias para scripts de Lua. Estos permiten que un editor ejecute el módulo con un conjunto determinado de entradas y verifique que se produzcan los resultados esperados. Son útiles para detectar rápidamente regresiones de software , donde las modificaciones a un script introducen problemas nuevos (o identifican problemas antiguos).
Por convención, las pruebas unitarias para un módulo como Module:Example se colocan en Module:Example/testcases y se ejecutan en Module talk:Example/testcases .
Módulo: UnitTests es el código precargado que se utiliza al crear una página de casos de prueba. Estas pruebas unitarias se ejecutan colocándolas{{#invoke:Example/testcases|run_tests}}
en la página de discusión de casos de prueba.
Módulo: ScribuntoUnit es otro marco de pruebas muy utilizado. Categoría: Módulos para herramientas de prueba tiene algunos otros para revisar que pueden resultar interesantes.
En general: Lua solo puede recibir entradas como cadenas de texto que se pasan a la {{#invoke:}}
y lo que se puede obtener a través de mw.title.new(...):getContent() y frame:expandTemplate(). La salida de Lua no se preprocesará a menos que se llame explícitamente a frame:preprocess(), lo que significa que las llamadas a plantillas, funciones de análisis, etc. en la salida no funcionarán correctamente. Además, todo Lua en la página está limitado a 10 segundos de tiempo de CPU (puede buscar en el código fuente de una página renderizada para ver cuánto tiempo tardó en analizarse una plantilla o un módulo). Y en relación con Lua estándar, Lua de Scribunto carece de todo tipo de funciones (consulte mw:Extension:Scribunto/Manual de referencia de Lua § Diferencias con Lua estándar).
El código Lua en Scribunto solo se ejecuta cuando se analiza la página. Por lo tanto, la única entrada de usuario que Lua puede recibir es la edición de la página : no puede crear un cuadro que calcule la raíz cuadrada de un número que escribas ni recalcular una parte del conjunto de Mandelbrot según en qué parte del conjunto principal hagas clic. La entrada que Lua puede recibir incluye cualquier página de texto transcluible en Wikipedia. Esto no incluye archivos gráficos (ni siquiera archivos .SVG , aunque en realidad son texto, a menos que los cortes y los pegues en una página de texto de Wiki), la lista de páginas enumeradas en una categoría ni los contenidos de páginas especiales no transcluibles .
Los encabezados de Wikipedia transcluidos con frecuencia contienen un código oculto como "UNIQ5ae8f2aa414ff233-h-3--QINU" que puede ser necesario eliminar para poder analizarlos de manera efectiva.
Los enlaces wiki que utilizan el truco de la tubería [[Wikipedia:Help| ]] no funcionarán si se devuelven como salida; deben escribirse explícitamente como [[Wikipedia:Help|Help]]. Otras transformaciones previas al guardado, como la sustitución ~~~~con firmas, tampoco se procesarán. Las transclusiones de plantillas, las llamadas a funciones del analizador y las sustituciones de variables (es decir, cualquier cosa con un {{...}}
) no se procesarán, ni tampoco las etiquetas como <ref>
o <nowiki>
. Utilice frame:extensionTag para agregar etiquetas como <ref>
o <syntaxhighlight>
a la salida.
Coloque la plantilla {{ lua }} en la subpágina de documentación de todas las plantillas que utilizan Lua. Esto ayudará a comunicar mejor el uso de Lua y las conversiones de plantillas.