Onderwijswiki/Scribunto
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
bewerkenDe 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.
Circulair
bewerkenIn het kader van het werken met Scribunto binnen MediaWiki, een krachtige maar complexe omgeving voor Lua-programmering, stuiten ontwikkelaars vaak op specifieke beperkingen. Een dergelijke beperking betreft de omgang met paginagegevens en de interactie met categorieën binnen de MediaWiki-omgeving. Deze beperkingen zijn voornamelijk ontworpen om de integriteit en de prestaties van het systeem te waarborgen en om circulaire afhankelijkheden en eindeloze lussen te voorkomen.
Een veelvoorkomend probleem in programmeeromgevingen, vooral in een met elkaar verbonden systeem zoals MediaWiki, is het risico op circulaire bewerkingen. Dit gebeurt wanneer Module A Module B aanroept, die op zijn beurt Module C aanroept, welke weer terugkeert naar Module A. Dit kan resulteren in een oneindige lus, die niet alleen de serverprestaties beïnvloedt maar ook kan leiden tot een crash van het systeem.
Om de complexiteit en mogelijke prestatieproblemen die voortkomen uit circulaire bewerkingen te voorkomen, legt Scribunto beperkingen op aan het direct uitvoeren van API calls binnen Lua-modules. Dit betekent dat je niet rechtstreeks externe API's kunt aanroepen vanuit een Lua-script op MediaWiki. Deze maatregel helpt om de stabiliteit en veiligheid van het platform te handhaven door het voorkomen van onbedoelde of kwaadwillige scripts die het systeem kunnen overbelasten of manipuleren.
Ondanks deze beperkingen zijn er manieren om met paginagegevens en categorie-informatie te werken binnen de kaders van Scribunto:
- Gebruik van MediaWiki API via JavaScript: Een mogelijke omweg is het aanroepen van de MediaWiki API via client-side JavaScript. Dit kan door een Lua-module te gebruiken om JavaScript-code in te sluiten op een pagina, die vervolgens asynchroon gegevens kan ophalen zonder de server te belasten.
- Preloaded Data: Voor statische of semi-statische gegevens kan je ervoor kiezen om bepaalde gegevens vooraf te laden en te verwerken via een onderhoudsscript of een bot die de gegevens bijwerkt op een door Lua leesbare subpagina.
- Gebruik van Speciale Pagina's: In sommige gevallen kunnen speciale pagina's binnen MediaWiki, zoals "Speciaal:Categorieën", worden gebruikt om een overzicht te krijgen van bepaalde data, hoewel dit niet altijd de flexibiliteit biedt die een directe API-aanroep zou bieden.