Module:LuaCall: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
avoid hole in array (Undo https://en.wikipedia.org/w/index.php?title=Module:Ustring&diff=885619921&oldid=885618751 ) |
|||
Line 49: | Line 49: | ||
for k, v in pairs(o) do |
for k, v in pairs(o) do |
||
p[k] = function(frame) |
p[k] = function(frame) |
||
local args = |
local args = frame.args |
||
for _, v in ipairs(args) do |
for _, v in ipairs(args) do |
||
args[_] = tonumber(v) or v:gsub("^\\", "", 1) |
|||
end |
end |
||
return (v(unpack(args))) |
return (v(unpack(args))) |
Revision as of 05:19, 4 March 2019
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) then v=tonumber(v) end
_G[k]=tonumber(v) or 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) then v=tonumber(v) end
_G[k]=tonumber(v) or 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 mw.text.nowiki(debuglog)
else reserved_output={reserved_call(unpack(reserved_value))}
return reserved_output[reserved_return or 1]
end
end
-- This function is modified from https://en.wikipedia.org/wiki/Module:Ustring?oldid=885619921
-- All frame's arguments are coerced as number type if possible. If you wish for something to remain a string, you can simply escape it by insert \ at the beginning of the string.
function p.import(o)
local p = {}
for k, v in pairs(o) do
p[k] = function(frame)
local args = frame.args
for _, v in ipairs(args) do
args[_] = tonumber(v) or v:gsub("^\\", "", 1)
end
return (v(unpack(args)))
end
end
return p
end
return p