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 |
local function callWithTonumberOrStringOnPairs(f, ...) |
||
local args = {} |
local args = {} |
||
for _, v in ... do |
for _, v in ... do |
||
table.insert(args, |
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 |
return callWithTonumberOrStringOnPairs(get(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 |
||