Module:LuaCall
Uiterlijk
Deze module biedt de mogelijkheid om een voorgeïnstalleerde Lua-functie aan te roepen, zodat je niet een aparte module hoeft te schrijven om het resultaat van een enkele functie of berekening weer te geven. De module kan scriptfouten genereren wanneer een niet geldige Lua-code wordt aangeroepen.
Dit script is gekopieerd van en:Module:LuaCall en is nog in een alpha-stadium.
Gebruik
[brontekst bewerken]{{#invoke:LuaCall|main|''willekeurige variabelen''|''parameters''|''functie''}}
Zie ook en:Module:LuaCall/doc. }}
-- Dit script is gekopiëerd vanaf https://en.wikipedia.org/wiki/Module:LuaCall
local p={}
function p.main(frame)
local parent=frame.getParent(frame) or {}
local reserved_value={}
local reserved_function,reserved_contents
for k,v in pairs(parent.args or {}) do
if tonumber(v)~=NaN then v=tonumber(v) end
_G[k]=v -- transfer every parameter directly to the global variable table
-- debuglog=debuglog..k.."="..v.."</nowiki><br /><nowiki>"
end
for k,v in pairs(frame.args or {}) do
if tonumber(v)~=NaN then v=tonumber(v) end
_G[k]=v -- transfer every parameter directly to the global variable table
end
--- Alas Scribunto does NOT implement coroutines, according to
--- http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#string.format
--- this will not stop us from trying to implement one single lousy function call
if _G[1] then
reserved_function,reserved_contents=mw.ustring.match(_G[1],"^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$")
end
if reserved_contents then
local reserved_counter=0
repeat
reserved_counter=reserved_counter+1
reserved_value[reserved_counter]=_G[mw.ustring.match(reserved_contents,"([^%,]+)")]
reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$")
until not reserved_contents
end
local reserved_arraypart=_G
while mw.ustring.match(reserved_function,"%.") do
reserved_functionpart,reserved_function=mw.ustring.match(reserved_function,"^(%a[^%.]*)%.(.*)$")
reserved_arraypart=reserved_arraypart[reserved_functionpart]
end
local reserved_call=reserved_arraypart[reserved_function]
if type(reserved_call)~="function" then
return tostring(reserved_call)
elseif reserved_debug or not reserved_function then return frame.preprocess(frame,"<nowiki>"..debuglog.."</nowiki>")
else reserved_output={reserved_call(unpack(reserved_value))}
return reserved_output[reserved_return or 1]
end
end
return p