Module:LuaCall: Difference between revisions

From Test Wiki
Content deleted Content added
auto converting argument to number often lead to bug, ex. {{#invoke:LuaCall|call|mw.text.nowiki|0001}}, p.call_s is easier for user to use (and tend to produce less bug) than p.call when all argument is to be string
You can already force the value to be a string with a leading /, as Template:Nowiki2 already does
Line 42: Line 42:
end
end


local function pairs2ArrayWithFunc(f, ...)
local function callWithTonumberOrStringOnPairs(f, ...)
local args = {}
local args = {}
for _, v in ... do
for _, v in ... do
table.insert(args, f(v))
table.insert(args, tonumberOrString(v))
end
end
return args
return (f(unpack(args)))
end

local function pairs2Array(...)
local args = {}
for _, v in ... do
table.insert(args, v)
end
return args
end
end


Line 79: Line 71:
end
end
return G
return G
end

local function call(s, args, ret)
if ret then
return ({get(s)(unpack(args))})[tonumber(ret)]
end
return get(s)(unpack(args))
end
end


Line 113: Line 98:
--]]
--]]
function p.call(frame)
function p.call(frame)
return call(frame.args[1],
return callWithTonumberOrStringOnPairs(get(frame.args[1]),
pairs2ArrayWithFunc(tonumberOrString, ipairsAtOffset(frame.args, 1)),
ipairsAtOffset(frame.args, 1)
frame.args['return']
)
end

--[[
------------------------------------------------------------------------------------
-- call_n
--
-- Like call(), but passing all arguments as number
------------------------------------------------------------------------------------
--]]
function p.call_n(frame)
return call(frame.args[1],
pairs2ArrayWithFunc(tonumber, ipairsAtOffset(frame.args, 1)),
frame.args['return']
)
end

--[[
------------------------------------------------------------------------------------
-- call_s
--
-- Like call(), but passing all arguments as string (no conversion)
------------------------------------------------------------------------------------
--]]
function p.call_s(frame)
-- unpack() not work on metatable
-- enclosing result in (), so that it will return only 1st element of result
--return (get(frame.args[1])(unpack(frame.args, 2)))
return call(frame.args[1],
pairs2Array(ipairsAtOffset(frame.args, 1)),
frame.args['return']
)
)
end
end