Module:LuaCall: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
No edit summary |
Removing the debuglog stuff - if anyone really does use this in a template, processor time could become important |
||
Line 3: | Line 3: | ||
function p.main(frame) |
function p.main(frame) |
||
local parent=frame.getParent(frame) or {} |
local parent=frame.getParent(frame) or {} |
||
local debuglog="Parent: </nowiki><br /><nowiki>" |
|||
local reserved_value={} |
local reserved_value={} |
||
local reserved_function,reserved_contents |
local reserved_function,reserved_contents |
||
Line 9: | Line 8: | ||
if tonumber(v)~=NaN then v=tonumber(v) end |
if tonumber(v)~=NaN then v=tonumber(v) end |
||
_G[k]=v -- transfer every parameter directly to the global variable table |
_G[k]=v -- transfer every parameter directly to the global variable table |
||
debuglog=debuglog..k.."="..v.."</nowiki><br /><nowiki>" |
-- debuglog=debuglog..k.."="..v.."</nowiki><br /><nowiki>" |
||
end |
end |
||
debuglog=debuglog.."Frame: </nowiki><br /><nowiki>" |
|||
for k,v in pairs(frame.args or {}) do |
for k,v in pairs(frame.args or {}) do |
||
if tonumber(v)~=NaN then v=tonumber(v) end |
if tonumber(v)~=NaN then v=tonumber(v) end |
||
debuglog=debuglog..k.."="..v.."</nowiki><br /><nowiki>" |
|||
_G[k]=v -- transfer every parameter directly to the global variable table |
_G[k]=v -- transfer every parameter directly to the global variable table |
||
end |
end |
||
Line 22: | Line 19: | ||
if _G[1] then |
if _G[1] then |
||
reserved_function,reserved_contents=mw.ustring.match(_G[1],"^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$") |
reserved_function,reserved_contents=mw.ustring.match(_G[1],"^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$") |
||
debuglog=debuglog.."Function is:" .. reserved_function .. "</nowiki><br /><nowiki>Contents are:"..reserved_contents.."</nowiki><br /><nowiki>" |
|||
end |
end |
||
if reserved_contents then |
if reserved_contents then |
||
Line 29: | Line 25: | ||
reserved_counter=reserved_counter+1 |
reserved_counter=reserved_counter+1 |
||
reserved_value[reserved_counter]=_G[mw.ustring.match(reserved_contents,"([^%,]+)")] |
reserved_value[reserved_counter]=_G[mw.ustring.match(reserved_contents,"([^%,]+)")] |
||
debuglog=debuglog.."["..reserved_counter.."] = "..tostring(reserved_value[reserved_counter]) .. "</nowiki><br /><nowiki>" |
|||
reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$") |
reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$") |
||
until not reserved_contents |
until not reserved_contents |
||
Line 37: | Line 32: | ||
reserved_functionpart,reserved_function=mw.ustring.match(reserved_function,"^(%a[^%.]*)%.(.*)$") |
reserved_functionpart,reserved_function=mw.ustring.match(reserved_function,"^(%a[^%.]*)%.(.*)$") |
||
reserved_arraypart=reserved_arraypart[reserved_functionpart] |
reserved_arraypart=reserved_arraypart[reserved_functionpart] |
||
debuglog=debuglog..reserved_functionpart..","..reserved_function..tostring(reserved_arraypart).."</nowiki><br /><nowiki>" |
|||
until not mw.ustring.match(reserved_function,"%.") |
until not mw.ustring.match(reserved_function,"%.") |
||
local reserved_call=reserved_arraypart[reserved_function] |
local reserved_call=reserved_arraypart[reserved_function] |
||
debuglog=debuglog..tostring(reserved_call)..tostring(unpack(reserved_value)) |
|||
if type(reserved_call)~="function" then |
if type(reserved_call)~="function" then |
||
return tostring(reserved_call) |
return tostring(reserved_call) |
Revision as of 21:27, 10 December 2013
Documentation for this module may be created at Module:LuaCall/doc
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
repeat
reserved_functionpart,reserved_function=mw.ustring.match(reserved_function,"^(%a[^%.]*)%.(.*)$")
reserved_arraypart=reserved_arraypart[reserved_functionpart]
until not mw.ustring.match(reserved_function,"%.")
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