Gaan na inhoud

Wikipedia:Lua

in Wikipedia, die vrye ensiklopedie
Hierdie artikel of onderafdeling van die artikel is onder ontwikkeling.
As u wil bydra tot die ontwikkeling daarvan, spring gerus in, maar moet dit asseblief nie uitvee nie.
Software Development
Wikipedianaamruimtes
Onderwerpnaamruimtes Besprekingsnaamruimtes
0 (Hoof/Artikel) Bespreking 1
2 Gebruiker Gebruikerbespreking 3
4 Wikipedia Wikipediabespreking 5
6 Lêer Lêerbespreking 7
8 MediaWiki MediaWikibespreking 9
10 Sjabloon Sjabloonbespreking 11
12 Hulp Hulpbespreking 13
14 Kategorie Kategoriebespreking 15
100 Portaal Portaalbespreking 101
108 [[Wikipedia:Boeke|]] 109
118 [[Wikipedia:Konsepte|]] 119
446 [[Wikipedia:Kursusblaaie|]] 447
710 TimedText TimedText talk 711
828 Module Module talk 829
2300 [[Wikipedia:Gadget|]] 2301
2302 [[Wikipedia:Gadget|]] 2303
2600 [[Wikipedia:Floei|]]
Virtuele naamruimtes
-1 Spesiaal
-2 Media

Lua is 'n programmeertaal wat nou beskikbaar is vir die Afrikaanse Wikipedia via die MediaWiki-uitbreiding Scribunto. Lua-kode kan binne wiki-sjablone verskans word deur die "{{#invoke:}}"-funksionaliteit van Scribunto in te span. Die uitbreiding steun Lua 5.1 sedert Julie 2015.

"Hallo, wêreld!" in Lua

[wysig bron]

Die Lua-bronkode word in bladsye genaamd modules gestoor (bv. Module:Piesangs). Die onderskeie modules word dan op sjabloonblaaie ingeroep (deur kode {{#invoke:}}), byvoorbeeld, Module:Piesangs/doc gebruik die kode {{#invoke:Piesangs|hallo}} om die teks "Hallo, wêreld!" te vertoon.

Om 'n module te loop

Modules word op normale wiki-blaaie geloop deur die #invoke-ontlederfunksie te gebruik. Die sintaksis van #invoke is vergelykbaar met sjabloonsintaksis, maar met 'n paar verskille. Die belangrikste verskil is dat 'n funksienaam verskaf moet word. 'n Funksie is 'n groep instruksies wat insetwaardes aanneem, dit verwerk, en 'n uitsetwaarde terugstuur.[1] Dit stem tot 'n groot mate ooreen met wat 'n sjabloon doen – parameters word verskaf, dit word verwerk, en 'n resultaat word verkry. Baie funksies kan egter vir 'n Lua-module gedefinieer word, terwyl daar slegs een sjabloon op 'n bladsy gedefinieer kan word.

Verder kan 'n Lua-module ook nie direk geloop word nie – slegs een van die module se funksies kan geloop word. Die module is net 'n houer vir die funksies en doen nie self enige verwerking nie. Daar is dus twee redes waarom 'n funksienaam verskaf moet word:

  1. 'n Module kan nie op sy eie geloop word nie.
  2. Deur nie 'n funksienaam te verskaf nie, sal Lua nie weet watter funksie geloop moet word nie.


Die eenvoudigste moontlike skrip, verskaf 'n enkele funksie met geen argumente nie.

Die eenvoudigste manier om 'n module vanaf 'n wiki-blad te loop is as volg:

{{#invoke:ModuleNaam|funksieNaam}}

Byvoorbeeld, Module:Piesangs, wat een funksie genaamd "hallo" het, kan as volg geloop word:

Jy hoef niks te installeer of te stoor nie.

  1. Wysig jou gebruikersblad.
  2. Plak die volgende oproep aan die begin van 'n nuwe reël op jou Gebruikersblad:
{{#invoke:Piesangs|hallo}}
  1. Klik "Wys voorskou". Die oproep van die funksie hallo in Module:Piesangs word vervang met die volgende:
Hallo, wêreld!
  1. Klik "Kanselleer". Wanneer gevra word, klik Leave.
  2. Jou gebruikersblad bly ongewysig.

Ontfoutkonsole: Begin om Lua te leer

[wysig bron]

Die Lua Scribunto Ontfoutkonsole is 'n veilige, interaktiewe hulpmiddel om Lua in Wikipedia te leer.

  1. Klik "Wys bronteks" op die Module:Yesno-blad.
  2. Blaai na onder na die Debug console-afdeling.
  3. Plak die kommentaar en die oproep in die grys invoerkassie (bo die Clear (Vee)-knoppie).
--[[Jou aller eerste Lua "Hallo Wêreld"-soort program]]--
print("Welkom by " .. _VERSION .. "!") -- Voeg die Lua-weergawe saam met `..`
  1. Druk ↵ Enter een keer om die twee Lua-opdragte uit te voer.
  2. Die resultaat sal onder die Lua print-opdragreël verskyn:
Welkom by Lua 5.1!
  1. Druk Oppyltjie om deur vorige Lua-opdragte te blaai.
  2. Indien nodig, klik Vee om slegs die Ontfoutkonsole skoon te maak; die Lua-redigeerder hierbo sal ongewysig bly.


HTML-genereerder in die Ontfoutkonsole

Roep die funksie hallo aan in Module:Piesangs:

local modPiesangs = require('Module:Piesangs') -- laai die module in Debug console
print(modPiesangs.hallo()) -- wys "Hallo, wêreld!"
Hallo, wêreld!
Identiteitsfunksie

callParserFunction #if

local yesno = require('Module:Yesno') -- #if yesno dan gee dit sy insetparameter terug
print(mw.getCurrentFrame():callParserFunction("#if", yesno("Yes"), "Yes", 'no'))
print(mw.getCurrentFrame():callParserFunction("#if", yesno("nee"), "Ja",  'nee'))
Yes
nee
  1. Maak die beskermde Module:Yesno toe wat ongewysig bly.

Die gebruik van argumente

[wysig bron]

Argumente word aan modules gegee op dieselfde metode as wat dit aan sjablone gegee word. Neem kennis dat die teks na die eerste pypkarakter altyd die funksienaam is; die eerste posisionele argument is die teks na die tweede pypkarakter.

{{#invoke:ModuleNaam|funksieNaam|posisioneleArgument1|arg2|benoemdeArg=waarde}}
Demonstreer hoe om parameters te gebruik.

Byvoorbeeld, in Module:PiesangsArgumente groet die hallo-funksie verskillende mense afhangende van die eerste posisionele argument.

PiesangsArgumente verskaf ook 'n funksie genaamd tel_vrugte, wat die benoemde argumente piesangs en appels gebruik om die aantal piesangs en appels wat gegee word te tel. Dit kan as volg geloop word:

Wysig jou gebruikersblad.

# {{#invoke:PiesangsArgumente|hallo|Karen}}
# {{#invoke:PiesangsArgumente|hallo|Ferdie}}
# {{#invoke:PiesangsArgumente|tel_vrugte|appels=3|piesangs=4}}
# {{#invoke:PiesangsArgumente|tel_vrugte|piesangs=5|appels=2}}
  1. Hallo, Karen!
  2. Hallo, Ferdie!
  3. Ek het 4 piesangs en 3 appels
  4. Ek het 5 piesangs en 2 appels

In die Ontfoutingskonsol van Module:Yesno:

local modArg = require('Module:PiesangsArgumente') -- laai die module
local frame = mw.getCurrentFrame(); 
frame.args[1] = "Karen";  print("1. " .. modArg.hallo(frame)) -- "Hallo, Karen!"
frame.args[1] = "Ferdie"; print("2. " .. modArg.hallo(frame)) -- "Hallo, Ferdie!"

frame.args["appels"] = "3"; frame.args["piesangs"] = "4" -- getal as 'n string
print("3. " .. modArg.tel_vrugte(frame)) -- wys "Ek het 4 piesangs en 3 appels"
frame.args["piesangs"] = "5"; frame.args["appels"] = "2"
print("4. " .. modArg.tel_vrugte(frame)) -- wys "Ek het 5 piesangs en 2 appels"
1. Hallo, Karen!
2. Hallo, Ferdie!
3. Ek het 4 piesangs en 3 appels
4. Ek het 5 piesangs en 2 appels

Meeste modules behoort 'n dokumentasieblad te hê wat verduidelik watter argumente gebruik kan word, en die uitwerking wat hulle sal hê.

Vra 'n skrip aan

[wysig bron]

Besoek Wikipedia:Lua-versoeke om hulp aan te vra met die skryf van 'n Lua-skrip om 'n spesifieke taak op Wikipedia of 'n ander projek van die Wikimedia-stigting te verrig.

Geskiedenis

[wysig bron]

Sordid history. {{qif}}, ParserFunctions, Lua extension, debat oor wiki-skriptaal (JavaScript v. Lua), mw:Extension:WikiScripts, Tim skryf Scribunto met aanvanklike ondersteuning vir Lua.

Na jare se bespreking is Lua in 2012 vir toetsdoeleindes geïnstalleer op test2.wikipedia.org, met 'n ope uitnodiging aan alle bydraers om te eksperimenteer met die ontwikkeling van Lua-modules. Lua word in Februarie 2013 op die Engelse Wikipedia geïnstalleer na toetslopies op mediawiki.org en Wikimedia se toets-wikis.

Oor Lua

[wysig bron]
Sien ook (en) Brad Jorsch se kort voorlegging van 'n basiese voorbeeld van hoe om 'n wikitext-sjabloon om te skakel na 'n Lua-module.

Lua is 'n skriptaal wat gebruik kan word om data te analiseer, uitdrukkings uit te werk en resultate te formateer met behulp van funksies en objekgeoriënteerde programmering. Hoewel sekere Lua-skripte eenvoudig gehou kan word om maklik te begryp, laat Lua komplekse strukture toe soos tabelle, dinamiese funksies, en assosiatiewe skikkings waar indekssubskripte woorde sowel as indeksnommers kan wees. Lua ondersteun ook rekursie van hergeneste funksies, neem dus sorg om oordrewe kompleksiteit te vermy, veral waar ander bydraers sal sukkel om die Lua-modules te onderhou. Die volgende voorbeeld toon Lua-bronkode vir 'n "Hallo, wêreld!"-funksie binne Module:HalloWereld.

Alle Lua-modules op Wikipedia moet afskop deur die definiëring van 'n veranderlike wat hul eksterne toeganklike funksies sal bevat. Hulle kan enige naam kry en ook data bevat.

--[[Module:HalloWereld]]--
local p = {} -- Inisialiseer die (p)akket-tabel
-- Voeg 'n funksie tot die veranderlike. Dit is oproepbaar binne Wikipedia via die #invoke-bevel.
-- "raam" sal die data bevat wat Wikipedia aan hierdie funksie stuur wanneer dit geroep word.
function p.hallo(frame) -- Met betrekking tot [[Module:Piesangs]] word frame bygevoeg, maar nie gebruik nie.
    local str = "Hallo, wêreld!" -- Verklaar 'n plaaslike veranderlike en ken data aan dit toe.
    return str -- Verlaat hierdie funksie en stuur die inligting binne "str" terug na Wikipedia.
end -- Beëindig die funksie.
return p -- Gee die (p)akket-tabel terug
  1. Alle modules word beëindig deur die veranderlike wat hul funksies bevat, terug te stuur na Wikipedia.
  2. Die print-funksie word nie toegelaat nie, so alle uitsette word bewerkstellig via terugkerende stringe.
  3. Die module kan nou gebruik word deur {{#invoke:HalloWereld|hallo}} te roep.
  4. Die #invoke-bevel skop af met die module se naam, in die geval HalloWereld, en neem daarna die naam van een van sy funksies as argument aan, in die geval hallo.

'n Voorbeeld van Lua word uitgelig deur die merker <syntaxhighlight lang="lua" line highlight=1 copy> ... </syntaxhighlight> weerskante van die Lua-bronkode te plaas. Om meer komplekse voorbeelde te sien, gaan na die artikel: "Lua (programmeertaal)".

Vir instruksies oor hoe om Lua binne MediaWiki (en dus ook Wikipedia) te gebruik, sien mw:Extension:Scribunto/Lua reference manual.

Moduletoetsing

[wysig bron]

'n Moduletoetsraamwerk vir Lua-skripte op Wikipedia is beskikbaar by Module:UnitTests. Dit laat die uitvoer van 'n skrip toe op 'n gegewe stel insette, en bevestig dat die verwagte uitsette gelewer word. Moduletoetsing is veral handig by die vinnige bespeuring van regressie, waar bywerkings op 'n skrip nuwe (of ou) probleme na vore kan bring.

In die Ontfoutingskonsol van Module:Yesno:

local self = {
    preprocess_equals = function(_, wikitext, expected)
        local got = mw.getCurrentFrame():preprocess(wikitext)
        print('Verwag : "' .. expected .. '"')
        print('Werklik: "' .. got      .. '"')
        return got == expected
    end
}
-- Skeier  `:`
print(self:preprocess_equals(      '{{#invoke:Piesangs|hallo}}', 'Hallo, wêreld!'))
-- Skeier  `.`
print(self.preprocess_equals(self, '{{#invoke:Piesangs|hallo}}', 'Hallo, wêreld!'))
Verwag : "Hallo, wêreld!"
Werklik: "Hallo, wêreld!"
true
Verwag : "Hallo, wêreld!"
Werklik: "Hallo, wêreld!"
true

Volgens konvensie word moduletoetse vir 'n module soos Module:Piesangs in Module:Piesangs/toetsgevalle geplaas, en word dan uitgevoer op Modulebespreking:Piesangs/toetsgevalle met bv.

  1. Wysig jou gebruikersblad:
{{#invoke:Piesangs/toetsgevalle|run_tests}}
  1. Klik "Wys voorskou":

Alle toetse geslaag.

test_hallo:

TeksVerwagWerklik
{{#invoke:Piesangs | hallo}} Hallo, wêreld! Hallo, wêreld!
  1. Klik "Kanselleer". Jou gebruikersblad bly ongewysig.


In die Ontfoutingskonsol van Module:Yesno:

local modTest = require('Module:Piesangs/toetsgevalle')
print(modTest.run_tests(mw.getCurrentFrame()))
<span style="color:#008000">'''Alle toetse geslaag.'''</span>

'''test_hallo''':
{|class="wikitable"
! !! Teks !! Verwag !! Werklik
|-
| [[Lêer:Yes check.svg|links|15px]]
 
| &#123;&#123;#invoke:Piesangs &#124; hallo&#125;&#125; 
| Hallo, wêreld! 
| Hallo, wêreld!
|-
|}

Om test_hallo() in die Ontfoutingskonsol uit te voer sonder om 'n toegewyde Module:Piesangs/toetsgevalle-wiki-bladsy te stoor:

local modTest = require('Module:UnitTests')
function modTest:test_hallo()
    self:preprocess_equals('{{#invoke:Piesangs|hallo}}', 'Hallo, wêreld!')
end
print(modTest.run_tests(mw.getCurrentFrame()))

Die gegenereerde HTML is identies.

Die metodes moet met p:test_ begin.

'n Eenvoudige voorbeeld uit Module:Piesangs/toetsgevalle volg hieronder.

--[[Module:Piesangs/toetsgevalle]]--
local p = require('Module:UnitTests')
-- Klik op besprekingsblad om toetse te loop.
function p:test_hallo() -- Moduletoetse vir [[Module:Piesangs]].
    self:preprocess_equals('{{#invoke:Piesangs|hallo}}', 'Hallo, wêreld!')
end
return p

Sien die lys van alle modules wat eenheidstoetse gebruik.

Daar bestaan ook 'n alternatiewe moduletoetsraam genaamd Module:ScribuntoUnit, oorspronklik uit die Hongaarse Wikipedia. Kenmerkgewys is dit baie dieselfde as Module:UnitTests, maar dit besit 'n ander kodestyl, en werp regte foute wat dan gevang word met behulp van beskermde oproepe. Dit besit ook 'n metode om wisselveranderlikes binne 'n sekere akkuraatheid te vergelyk.

Wikipedia-spesifieke kenmerke

[wysig bron]

Algeheel: Lua kan slegs insette as teks aanstuur na {{#invoke:}} en wat ook al gekry word via mw.title.new(...):getContent() en frame:expandTemplate(). Lua-uitsette sal nie vooraf verwerk word nie tensy frame:preprocess() eksplisiet geroep word, menende dat sjabloonoproepe, ontledingsfunksies ens. in die uitsette nie na behore sal werk nie.

Verder is alle Lua in die bladsy beperk tot 10 sekondes SVE-tyd (daar kan in die bronkode van 'n verbeelde bladsy gekyk word om te sien hoe lank 'n module of sjabloon sal neem om te ontleed). Relatief tot standaard Lua kort Scribunto se Lua 'n verskeidenheid funksies (sien Verskille van standaard Lua).

Insetbeperkings in Lua

[wysig bron]

Lua-kode in 'n Scribunto-lus word slegs uitgevoer terwyl die bladsy ontleed word. Daarom is die enigste insette wat 'n gebruiker aan Lua kan gee deur middel van bladredigering – dit kan nie 'n blokkie skep wat 'n Fahrenheit-temperatuur in 'n invoerkassie bereken en dan, wanneer jy op 'n knoppie druk, die ooreenstemmende Celsius-temperatuur terugkry nie; ook kan dit nie 'n gedeelte van die Mandelbrot-stel herbereken op grond van die gedeelte van die voorafberekende stel waarop jy klik nie.

In die Ontfoutingskonsol van Module:Yesno:

local function toCelsius(tempFahrenheit) return (tempFahrenheit - 32) * 5 / 9 end
print(("toCelsius(32°F) = %s°C. toCelsius(68°F) = %d°C"):format(toCelsius(32), toCelsius(68)))
toCelsius(32°F) = 0°C. toCelsius(68°F) = 20°C

Prioritiseer Unicode-gebaseerde mw.ustring.len bo ASCII-gebaseerde string.len.

--[[ASCII]]--
local content_lang = mw.getContentLanguage().code -- af
local lang = mw.getCurrentFrame():callParserFunction("#language", content_lang)
local lenUnicode, lenByte, lenSharp = mw.ustring.len(lang), string.len(lang), #lang
print(("lang: \"%s\". Mw.ustring.len = %d String.len = %d Sharp = %d"):format(lang, lenUnicode, lenByte, lenSharp))

--[[Unicode]]--
-- 'n String van 2 karakters (ASCII). 2 * ê = +2 Unicode.
lang = "Daar is 'n wêreld se verskil tussen 'n rêrigte plan en 'n blote idee."
lenUnicode, lenByte, lenSharp = mw.ustring.len(lang), string.len(lang), #lang
print(("lang: \"%s\"\nMw.ustring.len = %d String.len = %d Sharp = %d"):format(lang, lenUnicode, lenByte, lenSharp))
lang: "Afrikaans". Mw.ustring.len = 9 String.len = 9 Sharp = 9
lang: "Daar is 'n wêreld se verskil tussen 'n rêrigte plan en 'n blote idee."
Mw.ustring.len = 69 String.len = 71 Sharp = 71

Die insette wat Lua kan ontvang sluit enige traskluseerbare teksblaaie op Wikipedia in. Dit sluit nie grafiese lêers in nie (nie eers SVG-lêers nie, hoewel hulle teks is. Behalwe as jy dit sny en op 'n Wiki-teksblad plak), ook nie die lys bladsye gelys in 'n kategorie nie, verder ook nie die inhoud van nie-transkluseerbare spesiale bladsye nie.

Wikitext

[wysig bron]

Getranskluseerde Wikipedia-opskrifte bevat baiemaal verborge kode soos "UNIQ5ae8f2aa414ff233-h-3--QINU" wat verwyder moet word sodat hulle effektief ontleed kan word.

print(string.reverse("UNIQ"))
QINU

Wikilinks van die soort [[WP:Hulp|]] sal nie werk indien dit as uitset teruggegee word nie – hulle moet eksplisiet geskryf word as [[WP:Hulp|Hulp]].

Ander voorafstoor-transformasies, soos die vervanging van ~~~~ met handtekeninge, sal ook nie verwerk word nie. Sjabloontransklusies, ontlederfunksieoproepe en vervanging van veranderlikes (bv. enige iets met 'n {{...}}) sal nie verwerk word nie, ook nie merkers soos <ref> of <nowiki> nie.

Etiketteer verwerkte sjablone

[wysig bron]

Plaas asseblief die {{lua}}-sjabloon op die dokumentasiesubblad van alle sjablone wat van Lua gebruik maak. Dit sal help om Lua-gebruik en sjabloonverwerkings beter deur te gee.

Sien ook

[wysig bron]
Afrikaanse Wikipedia-spesifieke hulpbronne

Notas

[wysig bron]
  1. Veelvuldige uitsetwaardes is ook moontlik, maar funksies wat dit bewerkstellig is nie normaalweg bedoel vir toegang vanaf wiki-blaaie nie.
Hierdie artikel is in sy geheel of gedeeltelik vanuit die Engelse Wikipedia vertaal.