Module:LuaCall: Difference between revisions
Richardpruen (talk | contribs) m 1 revision imported: Wikipedia article on Nicotine templates needed |
imported>Lemondoge m Modified code formatting |
||
Line 2: | Line 2: | ||
function p.main(frame) | function p.main(frame) | ||
local parent=frame.getParent(frame) or {} | local parent = frame.getParent(frame) or {} | ||
local reserved_value={} | local reserved_value = {} | ||
local reserved_function,reserved_contents | local reserved_function, reserved_contents | ||
for k,v in pairs(parent.args or {}) do | for k, v in pairs(parent.args or {}) do | ||
_G[k]=tonumber(v) or v -- transfer every parameter directly to the global variable table | _G[k] = tonumber(v) or v -- transfer every parameter directly to the global variable table | ||
end | end | ||
for k,v in pairs(frame.args or {}) do | for k, v in pairs(frame.args or {}) do | ||
_G[k]=tonumber(v) or v -- transfer every parameter directly to the global variable table | _G[k] = tonumber(v) or v -- transfer every parameter directly to the global variable table | ||
end | end | ||
--- Alas Scribunto does NOT implement coroutines, according to | --- Alas Scribunto does NOT implement coroutines, according to | ||
Line 15: | Line 15: | ||
--- this will not stop us from trying to implement one single lousy function call | --- this will not stop us from trying to implement one single lousy function call | ||
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*$") | ||
end | end | ||
if reserved_contents then | if reserved_contents then | ||
local reserved_counter=0 | local reserved_counter = 0 | ||
repeat | repeat | ||
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, "([^%,]+)")] | ||
reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$") | reserved_contents = mw.ustring.match(reserved_contents, "[^%,]+,(.*)$") | ||
until not reserved_contents | until not reserved_contents | ||
end | end | ||
local reserved_arraypart=_G | local reserved_arraypart = _G | ||
while mw.ustring.match(reserved_function,"%.") do | while mw.ustring.match(reserved_function, "%.") do | ||
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] | ||
end | end | ||
local reserved_call=reserved_arraypart[reserved_function] | local reserved_call = reserved_arraypart[reserved_function] | ||
if type(reserved_call)~="function" then | if type(reserved_call) ~= "function" then | ||
return tostring(reserved_call) | return tostring(reserved_call) | ||
else reserved_output={reserved_call(unpack(reserved_value))} | else | ||
reserved_output = {reserved_call(unpack(reserved_value))} | |||
return reserved_output[reserved_return or 1] | return reserved_output[reserved_return or 1] | ||
end | end | ||
Line 144: | Line 145: | ||
--]] | --]] | ||
function p.invoke(frame) | function p.invoke(frame) | ||
local | local pframe, usedpargs = frame:getParent(), {} | ||
-- get module and function names from parent args if not provided | |||
local pfargs = setmetatable({frame.args[1], frame.args[2]}, {__index = table}) | |||
if not pfargs[1] then | |||
if | pfargs[1], usedpargs[1] = pframe.args[1], true | ||
if not pfargs[2] then | |||
pfargs[2], usedpargs[2] = pframe.args[2], true | |||
end | |||
elseif not pfargs[2] then | |||
pfargs[2], usedpargs[1] = pframe.args[1], true | |||
end | |||
-- repack sequential args | |||
for i, v in ipairs(pframe.args) do | |||
if not usedpargs[i] then | |||
pfargs:insert(v) | |||
usedpargs[i] = true | |||
end | end | ||
end | end | ||
-- copy other args | |||
for | for k, v in pairs(pframe.args) do | ||
if not pfargs[k] and not usedpargs[k] then | |||
pfargs[k], usedpargs[k] = v, true | |||
end | |||
end | end | ||
frame | -- #invoke off parent frame so the new frame has the same parent | ||
return | return pframe:callParserFunction{name = '#invoke', args = pfargs} | ||
end | end | ||
return p | return p |