Module:LuaCall: Difference between revisions

From Test Wiki
Jump to navigation Jump to search
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