Helpo:Lua/Modulo por certa ŝablono
| |||
Kategorioj | |||
---|---|---|---|
Ŝablonoj | |||
| |||
Vidu ankaŭ | |||
Komentoj | |||
|
|||
Ĉi tiu helpopaĝo donas por Lua-programistoj startan punkton, kiel eblas skribi modulon, kiu subtenu ekzakte unu ŝablonon.
La malo estus biblioteka modulo, kiu povas esti alvokata de iom ajn multaj diversaj ŝablonoj.
Baza principo
[redakti | redakti fonton]- La modulo ricevas la nomon
Modulo:Ŝablono:
Ŝablona titolo
- Per tio estas facile ekkompreni la grupigon.
- La laboro de la ŝablono estas eksklude farata per la modulo.
- La ŝablono enhavas kutime nur ununura linion:
{{#invoke:Ŝablono:
Ŝablona titolo|f}}<noinclude>{{Dok}}</noinclude>
- La ŝablono enhavas kutime nur ununura linion:
- La funkcio
f
(aŭ laŭ prefero alie nomita) estas la ununura por ŝablonoj disponebla interfaco. - Parametroj de la ŝablona enplektado ne devas esti transdonataj; ili povas esti determinataj pli bone kaj pli komplete ene de la modulo.
- Ene de Vikia projekto ne necesas aliaj parametroj; apartaj kazoj estus Pluraj ŝablonoj aŭ Internaciigo.
Modelo
[redakti | redakti fonton]--[=[ 2013-05-19
Subteno por {{Ŝablona titolo}}
f() test()
]=]
--
--
local function x( u )
local r
--
return r
end -- x()
local function main( a )
local r
--
r = x( u )
--
return r or ""
end -- main()
-- Export
local p = {}
function p.test( a )
local lucky, r = pcall( main, a )
return r
end
function p.f( frame )
local lucky, r = pcall( main, frame:getParent().args )
return r
end
return p
Ŝablona interfaco
[redakti | redakti fonton]La funkcio f
transprenas per getParent()
la parametrojn de la ŝablona enplekto.
Ĝi alvokas la ĉefan funkcion en protekta ekzekutado.
Redona valoro estas la de main()
redonita signoĉeno aŭ la de pcall()
asignita signoĉeno de la erarmesaĝo.
Testa interfaco
[redakti | redakti fonton]- Por aŭtomatigitaj testoj povas esti antaŭdifintaj de koncerna Lua-modulo pli granda serio de parametraj aroj kaj esti komparataj kun la atendataj rezultoj.
- La parametraj aroj estas aranĝataj en sama maniero, kiel ili estus uzataj ĉe la ŝablona enplektado.
- La ĉefa funkcio estas alvokata ekzakte analoge.
Ĉefa funkcio
[redakti | redakti fonton]- La funkcio
main()
(aŭ laŭ prefero alie nomita) estas la vera labora funkcio. - Ĝi ricevas ĉiujn parametrajn asignojn kiel
a
, egale ĉu tiuj devenas al#invoke
aŭ de la simulado. - La redona valoro estas la por ŝablonoj taŭga signoĉeno; kaj tio identa por la ŝablona enplekto kaj la simulado, por ke la rezultoj estu kompareblaj.
frame
ne estas transdonata. Se la objekto foje estas bezonata, ĝi povas esti determinata per mw.getCurrentFrame(). Ĝi estus tiu de la ŝablona enplekto aŭ eble tiu nepre ie ekzistanta#invoke
de la simulado.- La loka funkcio
main()
devas esti fiksita kiel lasta de ĉiuj lokaj funkcioj.
Protekta ekzekutado
[redakti | redakti fonton]La alvoko de la ĉefa funkcio estas ĉiam protektata en pcall()
.
- Se okazas nun iu eraro dum ekzekutado, aŭ eraro estas kaŭzata per la propra modulo per
assert()
aŭerror()
, tiamr
estas la erarmesaĝo. - Per tio estas evitata la notore nespecifa „Skripteraro“.
Pluraj ŝablonoj
[redakti | redakti fonton]Se ekzistas sufiĉe limigita grupo de ŝablonoj (ekzemple Ŝablono:Lin*), ĉe kiuj ne valoras la penon por unuopaj moduloj, ili povas esti lokataj en unu komuna modulo.
Jen ekzemplo de Ŝablono:Lin longo[noto 1]:
{{#invoke:S|f|f=len}}
kun ununura Modulo:String por ĉiuj.
La funkcio f
devas esti tiam modifata kiel sekvas:[noto 1]
function p.f( frame )
local a = frame:getParent().args
a.f = frame.args.f
local lucky, r = pcall( main, a )
return r
end
Dum ke ĉiuj aliaj parametroj devenas de la ĉirkaŭanta ŝablono, f
estas prenata el la argumentoj de #invoke
.
La funkcio test
devas konvene antaŭdifini al si la ŝablonan nomon en sia simulado.