Hjælp:Lua-fejlretning

Denne side er en hjælpeside på den danske Wikipedia.
Siden indeholder basal eller avanceret information om dansk Wikipedia og eventuelt teknisk vejledning. Se oversigten over alle hjælpesider under Hjælp.

Det kan være svært at finde fejl i Wikipedia-moduler skrevet i programmeringssproget Lua, fordi man ikke har alle de redskaber til rådighed som man ellers ofte bruger ved programmering, men her er nogle tips til hvad man gøre.

Brug sandkasser! redigér

Det vigtigste ved programmering af moduler til Wikipedia, er at ikke at røre ved eksisterende moduler som er i drift. Afprøv altid ny kode i en sandkasse. Komplicerede ændringer som omfatter flere forskellige moduler og skabeloner kan afprøves i forhold til eksisterende sider eller vilkårlig wikikode på specialsiden Skabelonsandkassen (se Hjælp:Skabelon-sandkassen for mere om hvordan det gøres).

I forbindelse med moduler kan det være en fordel at oprette en sandkasse i Modul-navnerummet i stedet for som ellers anbefalet som undersider til ens brugerside i brugernavnerummet. Det er fordi man ved redigering i modulnavnerummet får en fejlsøgningskonsol og miniudgave af skabelonsandkassen (kaldet "Forhåndsvis en side med denne skabelon"), som begge kan være en stor hjælp ved programmeringsarbejdet. Det anbefales at oprette sine private sandkasser i modulnavnerummet som undersider til "Modul:Sandkasse/<dit brugernavn>" hvor man udskifter "<dit brugernavn>" med ens rigtige brugernavn.

Den lille formular "Forhåndsvis en side med denne skabelon" under redigeringsvinduet som fremkommer ved redigering på sider i modulnavnerummet (se bort fra at teksten er "denne skabelon", der burde have stået "denne skabelon eller dette modul") er som nævnt en miniudgave af skabelonsandkassen. Man kan se virkningen af ændringer i modulkoden på artikler eller andre sider uden at man behøver at gemme først. Dette kan være praktisk til kontrol af små, simple ændringer, men det egner sig ikke til større eller mere komplicerede ændringer. Brug i stedet rigtige sandkasser og skabelonsandkasse-specialsiden til disse.

Fejlsøgningskonsollen redigér

Fejlsøgningskonsollen som er under redigeringsvinduet ved redigering på sider i modulnavnerummet kan bruges til at indtaste og udføre vilkårlig Lua-kode. Specielt kan man kalde funktioner som defineret i Lua-koden i modulet som man er ved at redigere i.

Man kan indsætte kald af funktionerne mw.log og mw.logObject i modulkoden og få resultatet af kaldet vist i fejlsøgningskonsollen, så man på forskellige steder under programafviklingen kan kontrollere at variable har de forventede værdier.

Output fra mw.log og mw.logObject vises også når modulkoden udføres ved brug af skabelonkassen. Det er i feltet "Lua logs" som er nederst på siden efter visning en side eller wikikode i sandkassen. Log-indholdet vises ved at trykke knappen "Fold ud".

Når en funktion i et modul kaldes ved af en {{#invoke}}-kode fra wikitekst, dannes et frameobjekt som indeholder bl.a. de brugte parametre. Et sådant kald kan simuleres fra fejlsøgningskonsollen med funktionen frame:newChild. Har man for eksempel funktionen "plus" i et modul:

local p = {}

p.plus = function(frame)
	local tal1 = tonumber(frame.args.tal1) or 0
	local tal2 = tonumber(frame.args.tal2) or 0
	mw.logObject(tal1,'tal1')
	return tostring(tal1) .. ' + ' .. tostring(tal2) .. ' = ' .. tostring(tal1 + tal2)
end

return p

kan man simulere kaldet {{#invoke:Mit modul|plus|tal1=2|tal2=3}} med denne Lua-kode i fejlsøgningskonsollen:

print(p.plus(mw.getCurrentFrame():newChild{title='Mit modul', args={tal1='2',tal2='3'}}))

Hvilket giver følgende output:

tal1 = 2
2 + 3 = 5

Man kan også bruge "=" som en forkortelse for print() i fejlsøgningskonsollen. Så

=p.plus(mw.getCurrentFrame():newChild{title='Mit modul', args={tal1='2',tal2='3'}})

giver samme resultat.

Hvis man arbejder med Wikidata, vil kald af mw.wikibase.getEntity uden en id-parameter fra fejlsøgningskonsollen give det Wikidata-emne som selve modulet, man arbejder med, er tilknyttet (eller nil, hvis det ikke er tilknyttet Wikidata). Til testformål kan det være praktisk at også kunne angive en id-parameter eksplicit, selvom man måske ikke har brug for det ved normal brug.