<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://159.13.49.45/index.php?action=history&amp;feed=atom&amp;title=Module%3ALua_call</id>
	<title>Module:Lua call - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://159.13.49.45/index.php?action=history&amp;feed=atom&amp;title=Module%3ALua_call"/>
	<link rel="alternate" type="text/html" href="http://159.13.49.45/index.php?title=Module:Lua_call&amp;action=history"/>
	<updated>2026-04-03T23:09:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://159.13.49.45/index.php?title=Module:Lua_call&amp;diff=874&amp;oldid=prev</id>
		<title>Nat: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://159.13.49.45/index.php?title=Module:Lua_call&amp;diff=874&amp;oldid=prev"/>
		<updated>2025-04-07T11:38:40Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:38, 7 April 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key mediawiki:diff:1.41:old-873:rev-874 --&gt;
&lt;/table&gt;</summary>
		<author><name>Nat</name></author>
	</entry>
	<entry>
		<id>http://159.13.49.45/index.php?title=Module:Lua_call&amp;diff=873&amp;oldid=prev</id>
		<title>wikipedia&gt;HouseBlaster: HouseBlaster moved page Module:LuaCall to Module:Lua call: expand module name in the spirit of WP:TPN</title>
		<link rel="alternate" type="text/html" href="http://159.13.49.45/index.php?title=Module:Lua_call&amp;diff=873&amp;oldid=prev"/>
		<updated>2025-02-12T06:59:57Z</updated>

		<summary type="html">&lt;p&gt;HouseBlaster moved page &lt;a href=&quot;/index.php/Module:LuaCall&quot; class=&quot;mw-redirect&quot; title=&quot;Module:LuaCall&quot;&gt;Module:LuaCall&lt;/a&gt; to &lt;a href=&quot;/index.php/Module:Lua_call&quot; title=&quot;Module:Lua call&quot;&gt;Module:Lua call&lt;/a&gt;: expand module name in the spirit of &lt;a href=&quot;/index.php?title=WP:TPN&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;WP:TPN (page does not exist)&quot;&gt;WP:TPN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p={}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local parent = frame.getParent(frame) or {}&lt;br /&gt;
    local reserved_value = {}&lt;br /&gt;
    local reserved_function, reserved_contents&lt;br /&gt;
    for k, v in pairs(parent.args or {}) do&lt;br /&gt;
        _G[k] = tonumber(v) or v -- transfer every parameter directly to the global variable table&lt;br /&gt;
    end&lt;br /&gt;
    for k, v in pairs(frame.args or {}) do&lt;br /&gt;
        _G[k] = tonumber(v) or v -- transfer every parameter directly to the global variable table&lt;br /&gt;
    end&lt;br /&gt;
     --- Alas Scribunto does NOT implement coroutines, according to&lt;br /&gt;
     --- http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#string.format&lt;br /&gt;
     --- this will not stop us from trying to implement one single lousy function call&lt;br /&gt;
    if _G[1] then&lt;br /&gt;
        reserved_function, reserved_contents = mw.ustring.match(_G[1], &amp;quot;^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if reserved_contents then&lt;br /&gt;
        local reserved_counter = 0&lt;br /&gt;
        repeat&lt;br /&gt;
            reserved_counter = reserved_counter + 1&lt;br /&gt;
            reserved_value[reserved_counter] = _G[mw.ustring.match(reserved_contents, &amp;quot;([^%,]+)&amp;quot;)]&lt;br /&gt;
            reserved_contents = mw.ustring.match(reserved_contents, &amp;quot;[^%,]+,(.*)$&amp;quot;)&lt;br /&gt;
        until not reserved_contents&lt;br /&gt;
    end&lt;br /&gt;
    local reserved_arraypart = _G&lt;br /&gt;
    while mw.ustring.match(reserved_function, &amp;quot;%.&amp;quot;) do&lt;br /&gt;
        reserved_functionpart, reserved_function = mw.ustring.match(reserved_function, &amp;quot;^(%a[^%.]*)%.(.*)$&amp;quot;)&lt;br /&gt;
        reserved_arraypart = reserved_arraypart[reserved_functionpart]&lt;br /&gt;
    end&lt;br /&gt;
    local reserved_call = reserved_arraypart[reserved_function]&lt;br /&gt;
    if type(reserved_call) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
        return tostring(reserved_call)&lt;br /&gt;
    else &lt;br /&gt;
    	reserved_output = {reserved_call(unpack(reserved_value))}&lt;br /&gt;
        return reserved_output[reserved_return or 1]&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tonumberOrString(v)&lt;br /&gt;
	return tonumber(v) or v:gsub(&amp;quot;^\\&amp;quot;, &amp;quot;&amp;quot;, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function callWithTonumberOrStringOnPairs(f, ...)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for _, v in ... do&lt;br /&gt;
		table.insert(args, tonumberOrString(v))&lt;br /&gt;
	end&lt;br /&gt;
	return (f(unpack(args)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- ipairsAtOffset&lt;br /&gt;
&lt;br /&gt;
-- This is an iterator for arrays. It can be used like ipairs, but with&lt;br /&gt;
-- specified i as first index to iterate. i is an offset from 1&lt;br /&gt;
--&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
local function ipairsAtOffset(t, i)&lt;br /&gt;
	local f, s, i0 = ipairs(t)&lt;br /&gt;
	return f, s, i0+i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get(s)&lt;br /&gt;
	local G = _G; for _ in mw.text.gsplit(&lt;br /&gt;
		mw.text.trim(s, &amp;#039;%s&amp;#039;), &amp;#039;%s*%.%s*&amp;#039;&lt;br /&gt;
	) do&lt;br /&gt;
		G = G[_]&lt;br /&gt;
	end&lt;br /&gt;
	return G&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- call&lt;br /&gt;
--&lt;br /&gt;
-- This function is usually useful for debugging template parameters.&lt;br /&gt;
-- Prefix parameter with backslash (\) to force interpreting parameter as string.&lt;br /&gt;
-- The leading backslash will be removed before passed to Lua function.&lt;br /&gt;
--&lt;br /&gt;
-- Example:&lt;br /&gt;
--    {{#invoke:LuaCall|call|mw.log|a|1|2|3}} will return results of mw.log(&amp;#039;a&amp;#039;, 1, 2, 3)&lt;br /&gt;
--    {{#invoke:LuaCall|call|mw.logObject|\a|321|\321| \321 }} will return results of mw.logObject(&amp;#039;a&amp;#039;, 321, &amp;#039;321&amp;#039;, &amp;#039; \\321 &amp;#039;)&lt;br /&gt;
--&lt;br /&gt;
-- This example show the debugging to see which Unicode characters are allowed in template parameters,&lt;br /&gt;
--    {{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x0061}}}} return 97&lt;br /&gt;
--    {{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x0000}}}} return 65533&lt;br /&gt;
--    {{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x0001}}}} return 65533&lt;br /&gt;
--    {{#invoke:LuaCall|call|string.format|0x%04x|{{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x0002}}}}}} return 0xfffd&lt;br /&gt;
--    {{#invoke:LuaCall|call|string.format|0x%04x|{{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x007e}}}}}} return 0x007e&lt;br /&gt;
--    {{#invoke:LuaCall|call|string.format|0x%04x|{{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x007f}}}}}} return 0x007f&lt;br /&gt;
--    {{#invoke:LuaCall|call|string.format|0x%04x|{{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x0080}}}}}} return 0x0080&lt;br /&gt;
--    {{#invoke:LuaCall|call|string.format|0x%04x|{{#invoke:LuaCall|call|mw.ustring.codepoint|{{#invoke:LuaCall|call|mw.ustring.char|0x00a0}}}}}} return 0x00a0&lt;br /&gt;
--&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.call(frame)&lt;br /&gt;
	return callWithTonumberOrStringOnPairs(get(frame.args[1]),&lt;br /&gt;
		ipairsAtOffset(frame.args, 1)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--local TableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- get&lt;br /&gt;
--&lt;br /&gt;
-- Example:&lt;br /&gt;
--    {{#invoke:LuaCall|get| math.pi }} will return value of math.pi&lt;br /&gt;
--    {{#invoke:LuaCall|get|math|pi}} will return value of math.pi&lt;br /&gt;
--    {{#invoke:LuaCall|get| math |pi}} will return value of _G[&amp;#039; math &amp;#039;].pi&lt;br /&gt;
--    {{#invoke:LuaCall|get|_G| math.pi }} will return value of _G[&amp;#039; math.pi &amp;#039;]&lt;br /&gt;
--    {{#invoke:LuaCall|get|obj.a.5.c}} will return value of obj.a[&amp;#039;5&amp;#039;].c&lt;br /&gt;
--    {{#invoke:LuaCall|get|obj|a|5|c}} will return value of obj.a[5].c&lt;br /&gt;
--&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
	-- #frame.args always return 0, regardless of number of unnamed&lt;br /&gt;
	-- template parameters, so check manually instead&lt;br /&gt;
	if frame.args[2] == nil then&lt;br /&gt;
		-- not do tonumber() for this args style,&lt;br /&gt;
		-- always treat it as string,&lt;br /&gt;
		-- so &amp;#039;obj.1&amp;#039; will mean obj[&amp;#039;1&amp;#039;] rather obj[1]&lt;br /&gt;
		return get(frame.args[1])&lt;br /&gt;
	else&lt;br /&gt;
		local G = _G&lt;br /&gt;
		for _, v in ipairs(frame.args) do&lt;br /&gt;
			G = G[tonumberOrString(v)]&lt;br /&gt;
		end&lt;br /&gt;
		return G&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- invoke&lt;br /&gt;
--&lt;br /&gt;
-- This function is used by Template:Invoke&lt;br /&gt;
--&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.invoke(frame)&lt;br /&gt;
	local pframe, usedpargs = frame:getParent(), {}&lt;br /&gt;
	-- get module and function names from parent args if not provided&lt;br /&gt;
	local pfargs = setmetatable({frame.args[1], frame.args[2]}, {__index = table})&lt;br /&gt;
	if not pfargs[1] then&lt;br /&gt;
		pfargs[1], usedpargs[1] = pframe.args[1], true&lt;br /&gt;
		if not pfargs[2] then&lt;br /&gt;
			pfargs[2], usedpargs[2] = pframe.args[2], true&lt;br /&gt;
		end&lt;br /&gt;
	elseif not pfargs[2] then&lt;br /&gt;
		pfargs[2], usedpargs[1] = pframe.args[1], true&lt;br /&gt;
	end&lt;br /&gt;
	-- repack sequential args&lt;br /&gt;
	for i, v in ipairs(pframe.args) do&lt;br /&gt;
		if not usedpargs[i] then&lt;br /&gt;
			pfargs:insert(v)&lt;br /&gt;
			usedpargs[i] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- copy other args&lt;br /&gt;
	for k, v in pairs(pframe.args) do&lt;br /&gt;
		if not pfargs[k] and not usedpargs[k] then&lt;br /&gt;
			pfargs[k], usedpargs[k] = v, true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- #invoke off parent frame so the new frame has the same parent&lt;br /&gt;
	return pframe:callParserFunction{name = &amp;#039;#invoke&amp;#039;, args = pfargs}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;HouseBlaster</name></author>
	</entry>
</feed>