Module:Voorbeeld
Uiterlijk
Doel
Deze module is voorbeeld hoe modules gebruikt kunnen worden. Dit is niet bedoeld om te testen, gebruik daarvoor Module:Zandbak.
Unittesten voor deze module staan op Module:Voorbeeld/testcases.
Bekijk alle subpagina's van Module:Voorbeeld.
--- Voorbeeld module.
-- @module voorbeeld
-- @alias p
local p = {} --Alle Lua modules op Wikipedia moeten beginnen door een variabele
--te definieren die alle extern te benaderen functies bevat.
--Zo'n variabele mag elke naam hebben, en kan zowel data als functies bevatten.
--- Hello world-functie
-- @param {Frame} frame huidig frame
-- @return Hallo Wereld
-- @usage {{#invoke:Voorbeeld|hallo}}
p.hallo = function( frame ) -- Voeg een functie toe aan "p".
-- Dit soort functies kun je aanroepen vanuit Wikipedia
-- met het #invoke commando.
-- "frame" bevat de data die vanuit Wikipedia
-- verstuurd wordt wanneer het uitgevoerd wordt.
-- 'hallo' is een naam naar eigen keuze. Deze naam moet je ook gebruiken wanneer je die gebruikt.
local str = "Hallo Wereld!" -- Declareer een lokale variabele en wijs de tekst/string "Hallo Wereld!" daaraan toe.
return str -- Hiermee wordt de functie gestopt en wordt de inhoud van "str" teruggestuurd naar Wikipedia.
end -- einde van de functie "hallo"
--- Hello world-functie
-- @param {Frame} frame huidig frame
-- @param {string} frame.args[1] naam
-- @return Hallo Naam
-- @usage {{#invoke:Voorbeeld|hallo_aan|naam}}
function p.hallo_aan(frame) -- Voeg een tweede functie toe
local naam = frame.args[1] -- Om toegang te krijgen tot de parameters/argumenten die meegegeven werden gebruik je `frame.args`
-- `frame.args[1]` verwijst naar de eerste parameter (zonder naam) die meegegeven werd aan de module
return "Hallo " .. naam .. "!" -- met `..` worden strings aan elkaar geplakt (concatenatie).
-- Deze regel zal dus een aangepaste groet genereren afhankelijk van de input, zoals "Hallo Jan!"
end
--- Fruit tellen
-- @param {Frame} frame huidig frame
-- @param {string} frame.args.bananen aantal bananen
-- @param {string} frame.args.appels aantal appels
-- @return Aantal appels en bananen
-- @usage {{#invoke:Voorbeeld|tel_fruit|appels=aantal appels|bananen=aantal bananen}}
function p.tel_fruit(frame)
local num_bananen = tonumber(frame.args.bananen) or 0 -- Parameters met een naam ({{#invoke:Voorbeeld|tel_fruit|naam=waarde}})
local num_appels = tonumber(frame.args.appels) or 0 -- zijn toegankelijk door het indexeren van `frame.args` op naam (`frame.args["bananen"]`,
-- of direct door middel van `frame.args.bananen`).
local conj_bananen = num_bananen == 1 and 'banaan' or 'bananen'
local conj_appels = num_appels == 1 and 'appel' or 'appels'
-- Via een ternaire operator kun je een waarde toekennen op basis van een conditie.
-- Als `num_bananen` gelijk aan 1 is, wordt `conj_bananen` gelijk aan `'banaan'`, en anders `'bananen'`.
-- Similarly, `conj_appels` wordt `'appel'` als `num_appels` 1 is, en anders `'appels'`.
return 'Ik heb ' .. num_bananen .. ' ' .. conj_bananen .. ' en ' .. num_appels .. ' ' .. conj_appels
-- Hier worden meerdere losse strings aan elkaar geplakt om een leesbare zin te genereren.
end
--- Lokale geluks functie
-- @param {number} a
-- @param {string} b
-- @return Whether a is lucky.
-- @usage lucky(number, string)
local function lucky(a, b) -- Het is mogelijk om extra functies te definieren die alleen binnen de module gebruikt kunnen worden.
-- Hier wordt een functie 'lucky' gedefinieerd met de input parameters a en b. De namen kunnen vrij gekozen worden.
if b == 'yeah' then -- Test of b gelijk is aan de string 'yeah'. Strings hebben altijd aanhalingstekens.
-- Na een test moet het keyword 'then' gebruikt worden.
return a .. ' is mijn geluksnummer.'-- Stuur 'a is mijn geluksnummer.' terug als de bovenstaande conditie waar is.
else -- In alle andere gevallen voor de volgende regel uit. Na een 'else' moet geen 'then' gebruikt worden.
return a -- stuur simpelweg a terug.
end -- Een 'if' statement moet altijd eindigen met 'end'.
end -- Een funtie ('function') moet ook eindigen met 'end'.
--- Naam2
-- @param {Frame} frame huidig frame
-- @return Iets
function p.Naam2(frame)
-- De hieropvolgende 5 regels zijn bedoeld om de leesbaarheid te verhogen.
-- De variabele namen zijn vrij te kiezen
local pf = frame:getParent().args -- Hierdoor kun je de sjabloon parameters benaderen.
local f = frame.args -- Hiermee kun je de parameters van de {{#invoke:}} benaderen.
local M = f[1] or pf[1] -- f[1] en pf[1], verwijzen naar de eerste parameter.
local m = f[2] or pf[2] -- de tweede parameter.
local l = f.lucky or pf.lucky -- Een parameter met een naam. Let op het verschil in syntax met parameters zonder naam.
if m == nil then -- Test of the tweede parameter niet gebruikt wordt
return 'Eenzaam' -- Retourneer de string 'Eenzaam' in dat geval.
elseif M > m then -- Zo niet, controleer of M groter is dan m.
return lucky(M - m, l) -- Bereken in dat geval het verschil en roep de hierboven gedinieerde functie 'lucky' aan.
-- Het resultaat zal ervan afhangen of l gelijk is aan 'yeah'.
else
return 'Wees positief!'
end
end
return p -- Alle modules eindigen door de variabele te retourneren die alle functies bevat.
-- Nu kunnen we deze module gebruiken door middel van {{#invoke: Voorbeeld | hallo }},
-- {{#invoke: Voorbeeld | hallo_aan | naam }}, of {{#invoke:Voorbeeld|tel_fruit|bananen=5|appels=6}}
-- Het eerste deel na de invoke is de naam van de wikipagina van de module,
-- Het tweede deel is de naam van de functie die je aanroept.
-- De lua functie "print" is niet toegestaan op Wikipedia. Output is alleen mogelijk door tekst te retourneren vanuit functies.