Lua
Lua is een programmeertaal die wordt gebruikt voor het maken van dynamische en interactieve applicaties. Het is een krachtige en flexibele taal die gemakkelijk te leren is en wordt vaak gebruikt voor het ontwikkelen van spelletjes, toepassingen voor mobiele apparaten en andere software.
Scribunto[bewerken]
In Mediawiki, de software die wordt gebruikt om Wikipedia en andere wikis te runnen, kan Lua worden gebruikt via de Scribunto-extensie. De Scribunto-extensie is een uitbreiding van Mediawiki die Lua-scripts toestaat op wikipagina's te gebruiken. Dit betekent dat gebruikers van Mediawiki Lua-scripts kunnen schrijven en opnemen op hun wikipagina's om de functionaliteit van de pagina's te verbeteren of aan te passen.
Er zijn verschillende manieren waarop Lua via de Scribunto-extensie kan worden gebruikt in Mediawiki. Bijvoorbeeld, Lua-scripts kunnen worden gebruikt om berekeningen uit te voeren op wikipagina's, om tabellen te maken of om gegevens op te halen van externe bronnen en op te nemen op een wikipagina. Lua kan ook worden gebruikt om interactieve elementen toe te voegen aan wikipagina's, zoals vormen of knoppen die door gebruikers kunnen worden ingedrukt.
In het algemeen kan Lua via de Scribunto-extensie in Mediawiki worden gebruikt om de functionaliteit en interactiviteit van wikipagina's te verbeteren. Dit kan helpen om de gebruikerservaring te verbeteren en de informatie die op de wikipagina's wordt weergegeven te verrijken. Lua is daarom een belangrijk hulpmiddel voor gebruikers van Mediawiki die hun pagina's willen verbeteren of aanpassen.
De Scribunto-extensie bevat een aantal voorgeïnstalleerde Lua-bibliotheken, die bekend staan als de Scribunto-bibliotheken. Deze bibliotheken zijn verzamelingen van Lua-functies en variabelen die gebruikers van Mediawiki kunnen gebruiken in hun Lua-scripts om bepaalde taken uit te voeren of om toegang te krijgen tot bepaalde gegevens.
In dit boek gaan we specifiek in op Scribunto en hoe dit te gebruiken op Wikibooks of op andere wikiprojecten. Er wordt niet (uitgebreid) ingegaan op Lua zelf.
Bibliotheken[bewerken]
De basisfuncties-bibliotheek is een Lua-bibliotheek die functies bevat voor basisoperaties en -bewerkingen die vaak in Lua-scripts worden gebruikt. De basisfuncties-bibliotheek is een van de voorgeïnstalleerde Lua-bibliotheken die beschikbaar zijn voor gebruik in Mediawiki via Scribunto, een uitbreiding van Mediawiki die Lua-scripts op wikipagina's toestaat.
De basisfuncties-bibliotheek bevat een aantal functies die kunnen worden gebruikt om gegevens te manipuleren of te bewerken, zoals:
- String-functies: Deze functies kunnen worden gebruikt om tekst te manipuleren of te bewerken. Bijvoorbeeld, de functie "string.sub" kan worden gebruikt om een deel van een tekststring te verkrijgen, terwijl de functie "string.gsub" kan worden gebruikt om een deel van een tekststring te vervangen.
- Tafel-functies: Deze functies kunnen worden gebruikt om met Lua-tabellen te werken. Bijvoorbeeld, de functie "table.sort" kan worden gebruikt om een tabel te sorteren, terwijl de functie "table.concat" kan worden gebruikt om de elementen van een tabel te concateneren tot een string.
- Math-functies : De math-functies zijn functies die kunnen worden gebruikt om wiskundige bewerkingen uit te voeren in Lua-scripts. Sommige voorbeelden van math-functies die in de basisfuncties-bibliotheek beschikbaar zijn, zijn:
- math.abs: Deze functie geeft de absolute waarde van een getal terug. Bijvoorbeeld, math.abs(-5) zou 5 teruggeven, terwijl math.abs(3) 3 zou teruggeven.
- math.max: Deze functie geeft het grootste getal terug uit een lijst met getallen. Bijvoorbeeld, math.max(5, 10, 3) zou 10 teruggeven.
- math.min: Deze functie geeft het kleinste getal terug uit een lijst met getallen. Bijvoorbeeld, math.min(5, 10, 3) zou 3 teruggeven.
- math.sqrt: Deze functie geeft de vierkantswortel van een getal terug. Bijvoorbeeld, math.sqrt(9) zou 3 teruggeven.
Er zijn een aantal specifieke Scribunto-bibliotheken beschikbaar voor gebruik in Mediawiki, waaronder:
- mw.title: Deze bibliotheek bevat functies en variabelen die toegang geven tot informatie over de titel en de naamruimte van een wikipagina. Dit kan bijvoorbeeld worden gebruikt om de naam van een wikipagina te verkrijgen of om te controleren of een wikipagina in een bepaalde naamruimte staat.
- mw.site: Deze bibliotheek bevat functies en variabelen die toegang geven tot informatie over de instellingen en configuratie van een Mediawiki-site. Dit kan bijvoorbeeld worden gebruikt om de naam van de site te verkrijgen of om de lijst van beschikbare naamruimten op de site te verkrijgen.
- mw.language: Deze bibliotheek bevat functies en variabelen die toegang geven tot informatie over de taal van een Mediawiki-site en de gebruikte teksten op de site. Dit kan bijvoorbeeld worden gebruikt om de naam van de standaardtaal van de site te verkrijgen of om de lijst van beschikbare vertalingen op de site te verkrijgen.
- Frame object: De Frame-bibliotheek is een Lua-bibliotheek die functies en variabelen bevat die toegang geven tot informatie over de wikipagina's en de Mediawiki-software zelf. Dit kan bijvoorbeeld worden gebruikt om de naam van een wikipagina te verkrijgen of om te controleren of een bepaalde functie in Mediawiki beschikbaar is. De Frame-bibliotheek kan ook worden gebruikt om bepaalde acties uit te voeren, zoals het opvragen van de lijst van gebruikers die op een bepaalde wikipagina hebben bijgedragen.
- mw.html: De HTML-bibliotheek is een Lua-bibliotheek die functies en variabelen bevat die toegang geven tot informatie over HTML, de taal die wordt gebruikt om webpagina's te maken en op te maken. Dit kan bijvoorbeeld worden gebruikt om HTML-tags te genereren of om de opmaak van een HTML-document te wijzigen. De HTML-bibliotheek kan ook worden gebruikt om HTML-documenten te parsen of om de structuur van een HTML-document te verkrijgen.
Er zijn nog meer Scribunto-bibliotheken beschikbaar voor gebruik in Mediawiki, en gebruikers kunnen ook hun eigen aangepaste Lua-bibliotheken maken en opnemen in hun Lua-scripts. De Scribunto-bibliotheken zijn een krachtig hulpmiddel voor gebruikers van Mediawiki die hun Lua-scripts willen verrijken met extra functionaliteit en toegang tot gegevens.
Module[bewerken]
Om te beginnen met het maken van een module in Mediawiki, moet je eerst de Scribunto-extensie installeren op je Mediawiki-site. Dat is in Wikibooks gebeurd. Scribunto is een uitbreiding van Mediawiki die Lua-scripts op wikipagina's toestaat, en modules in Mediawiki zijn Lua-scripts die worden gebruikt om bepaalde taken uit te voeren of om bepaalde gegevens te verstrekken.
Nadat je de Scribunto-extensie hebt geïnstalleerd, kun je een nieuwe module maken door een nieuwe wikipagina te maken die begint met "Module:". Bijvoorbeeld, als je een module wilt maken met de naam "Module:HelloWorld", dan moet je een nieuwe wikipagina maken met de naam "Module:HelloWorld".
Op de nieuwe wikipagina kun je dan Lua-code schrijven om de functionaliteit van je module te definiëren. Bijvoorbeeld, als je een module wilt maken die "Hallo, wereld!" op de pagina weergeeft wanneer het wordt aangeroepen, zou je de volgende code kunnen gebruiken:
function helloWorld() return "Hallo, wereld!"; end
Nadat je je module hebt geschreven, kun je deze oproepen vanuit andere wikipagina's door de naam van de module en de functie te gebruiken. Bijvoorbeeld, om de helloWorld-functie aan te roepen
Invoke[bewerken]
De invoke-parserfunctie is een speciale functie die wordt gebruikt om een module aan te roepen vanuit een gewone wikipagina in Mediawiki. De invoke-parserfunctie is beschikbaar via de Scribunto-extensie, een uitbreiding van Mediawiki die Lua-scripts op wikipagina's toestaat.
Om de invoke-parserfunctie te gebruiken, moet je een wikitekstblok maken met de volgende syntaxis:
{{#invoke:module_name|function_name|arg1|arg2|arg3|...}}
In deze syntaxis:
- "module_name" is de naam van de module die je wilt aanroepen.
- "function_name" is de naam van de functie in de module die je wilt aanroepen.
- "arg1", "arg2", "arg3", etc. zijn optionele argumenten die naar de functie worden doorgegeven.
Bijvoorbeeld, als je een module hebt met de naam "Module:HelloWorld" en een functie met de naam "helloWorld" die "Hallo, wereld!" op de pagina weergeeft, kun je deze functie aanroepen vanuit een gewone wikipagina met de volgende syntaxis:
{{#invoke:HelloWorld|helloWorld}}
De invoke-parserfunctie zal vervolgens de helloWorld-functie aanroepen in de Module:HelloWorld-module, en het resultaat van de functie zal worden weergegeven op de wikipagina.
Voorbeeld[bewerken]
In dit boek zullen we Lua verder toelichten met de Module:Layout als voorbeeld. We beginnen met de basisfuncties.
Require[bewerken]
Als eerste behandelen de basisfunctie require die wordt gebruikt om andere Lua-scripts te laden en te integreren in het huidige script. De require-functie kan worden gebruikt om bibliotheken of modules te laden die zijn opgeslagen in externe bestanden, en deze kunnen vervolgens worden gebruikt in het huidige script.
De require-functie neemt één argument aan, namelijk de naam van het script of de module die je wilt laden. In de Module:layout is de eerste require;
require( "strict" );
In Lua, is de strict module een module die extra beveiliging biedt voor je script door het toevoegen van beperkingen op bepaalde Lua-constructies die kunnen leiden tot fouten of ongewenste gedragingen. Als je de strict module inschakelt in je script, moet je bepaalde regels volgen om ervoor te zorgen dat je script veilig en robuust is. Bijvoorbeeld, de strict module zal je niet toestaan om globale variabelen te maken zonder ze expliciet te declareren met de global-constructie. Dit kan helpen om fouten te voorkomen die kunnen optreden als gevolg van het per ongeluk overschrijven van globale variabelen. De strict module biedt ook andere beperkingen, zoals het verbieden van de dubbele indeling van blokken en het verplichten van het gebruik van de local-constructie om lokale variabelen te declareren. Deze beperkingen zullen helpen om fouten te voorkomen en de kwaliteit van je script te verhogen.
Een tweede voorbeeld van de require functie die meteen daarop volgt in de Module:layout is:
local CFG = require( 'Module:Layout/Configuration' );
In dit voorbeeld wordt de module met de naam "Module:Layout/Configuration" geladen en opgeslagen in de lokale variabele CFG. Hoofdletters worden gebruikt om aan te duiden dat het om constanten gaat en omdat elke constante CFG bevat is gekozen voor deze afkorting van configuration. We zien ook aan het voorbeeld dat er een subpagina wordt geladen van de Module:layout. Op die manier kan men ordening aan brengen in de module en onderdelen afsplitsen om de pagina niet groot en onoverzichtelijke te laten worden. In het voorbeeld van Module:layout zijn er vaak twee lagen. De eerste laag waaronder de modules worden gegroepeerd zijn;
- Module:Layout/System ; modules die in productie zijn.
- Module:Layout/Test ; modules die testen.
- Module:Layout/Sandbox ; modules die in ontwikkeling zijn.
- Module:Layout/Library ; modules die bouwstenen vormen voor de systeem modules.
- Module:Layout/Configuration; modules die de werking van andere modules configureren.
Een belangrijk kenmerk van de require-functie is dat het script of de module die wordt geladen, maar één keer wordt geladen, zelfs als de require-functie meerdere keren wordt aangeroepen. Dit betekent dat als een script of module al is geladen en opgeslagen in de lokale variabele, de require-functie niet opnieuw zal proberen om het te laden en zal in plaats daarvan gewoon de bestaande versie teruggeven.
In het laatste voorbeeld werd de variabele CFG gelijkgesteld (=) aan de require functie. De require functie levert namelijk een resultaat op die we kunnen opslaan in een variabele. Een resultaat van een module geven we "terug" door return aan het eind van de module met daarachter hetgeen we teruggeven. In het geval van de Module:layout is dat de inhoud van de variabele layout die eerst als volgt is gedefinieerd als tabel en daarna teruggegeven.
local layout = {}; return layout;
Aan de table worden namelijk de functies die kunnen worden aangeroepen via de invoke parserfunctie gekoppeld. Zoals in de Module:layout de main functie.
function layout.main( frame ) ... end
Als de module een returnwaarde teruggeeft aan de invoke-parserfunctie, wordt de returnwaarde opgenomen in de wikitekst van de pagina en weergegeven als deel van de pagina's inhoud. In ons voorbeeld heeft de module een lokale variabele met de naam layout dat een tabel is. De tabel bevat één functie met de naam main, die wordt aangeroepen wanneer de module wordt aangeroepen via de invoke-parserfunctie op een wikipagina. De main-functie neemt één argument aan, namelijk een "frame" object. Het "frame" object bevat informatie over de context waarin de module wordt aangeroepen, zoals de naam van de pagina die de module aanroept en de parameters die aan de module zijn doorgegeven. Deze functie geeft de layout-tabel terug aan het script dat de module heeft aangeroepen. Deze tabel bevat de functies die kunnen worden aangeroepen via de invoke-parserfunctie op een wikipagina.