Module:Lua call
![]() | This module is rated as alpha. It is ready for third-party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome. |
This module allows you to call any one single preinstalled Lua function, so that you don't need to write a module for one desired feature.
Usage
Main
{{#invoke:LuaCall|main|arbitrary variables|parameters|functioncall}}
The arbitrary variables are any key of your choice =
any value of your choice. Values are interpreted as strings unless tonumber(value)
isn't nil
, i.e. numbers should be converted to the numeric type. No effort is made to interpret tables.
The parameters all begin with reserved_
, which arbitrary variable should use.
reserved_return
sets which output from the function you want, and defaults to 1. For example, setting it to 2 for mw.ustring.gsub will return the number of replacements made.reserved_debug
- nonzero value forces display of a not particularly useful debug text
The functioncall is written as some.function.name(a,b,c)
where some.function.name means something in the Extension:Scribunto/Lua reference manual and a,b,c are the arbitrary variable names you've chosen.
Examples
Main
{{#invoke:LuaCall|main|a=test |b=7|string.rep(a,b)}}
→ Lua error at line 26: attempt to call field '?' (a nil value).{{#invoke:LuaCall|main|pattern=(%a)|replace=%1.|string=I can't get no satisfaction|mw.ustring.gsub(string,pattern,replace)|reserved_return=1}}
→ Lua error at line 26: attempt to call field '?' (a nil value).{{#invoke:LuaCall|main|pattern=(%a)|replace=%1.|string=I can't get no satisfaction|mw.ustring.gsub(string,pattern,replace)|reserved_return=2}}
→ Lua error at line 26: attempt to call field '?' (a nil value).{{#invoke:LuaCall|main|value=1.4512|math.ceil(value)}}
→ Lua error at line 26: attempt to call field '?' (a nil value).{{#invoke:LuaCall|main|value=1.4512|math.modf(value)}}
→ Lua error at line 26: attempt to call field '?' (a nil value).{{#invoke:LuaCall|main|value=1.4512|math.modf(value)|reserved_return=2}}
→ Lua error at line 26: attempt to call field '?' (a nil value).{{#invoke:LuaCall|main|mw.text.nowiki(s)|s={{URL|1=https://www.Amazon.com/}}}}
→ Lua error at line 26: attempt to call field '?' (a nil value).
Call
{{#invoke:LuaCall|call|string.format|%04x|127}}
→ Script error: The function "call" does not exist.{{#invoke:LuaCall|call|math.modf|1.4512}}
→ Script error: The function "call" does not exist.{{#invoke:LuaCall|call|math.modf|1.4512|return=2}}
→ Script error: The function "call" does not exist.
Errors
The module may generate script errors — whenever your call is not valid Lua code, you see the error you would normally have. For example,
{{#invoke:LuaCall|main|value=1.4512|math.fmod(value)}}
→
Lua error at line 26: attempt to call field '?' (a nil value).
because the second value is lacking. No effort is made to trap these.
local p={}
function p.main(frame)
local parent=frame.getParent(frame) or {}
for k,v in pairs(parent.args or {}) do
_G[k]=v -- transfer every parameter directly to the global variable table
end
for k,v in pairs(frame.args or {}) do
_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
local reserved_function,reserved_contents=mw.ustring.match(_G[1],"^(%s*%a[^%s%(]*)%(([^%)]*)%)%s*$")
local reserved_value={}
local reserved_counter=0
if reserved_contents then
repeat
reserved_counter=reserved_counter+1
reserved_value[reserved_counter]=mw.ustring.match(reserved_contents,"([^%,]+)")
reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$")
until not reserved_contents
end
end
return _G[reserved_function](unpack(reserved_contents or {}))
end
return p