<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="vi">
	<id>https://bktt.vn/index.php?action=history&amp;feed=atom&amp;title=M%C3%B4_%C4%91un%3ALuaCall</id>
	<title>Mô đun:LuaCall - Lịch sử thay đổi</title>
	<link rel="self" type="application/atom+xml" href="https://bktt.vn/index.php?action=history&amp;feed=atom&amp;title=M%C3%B4_%C4%91un%3ALuaCall"/>
	<link rel="alternate" type="text/html" href="https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:LuaCall&amp;action=history"/>
	<updated>2026-04-04T13:12:25Z</updated>
	<subtitle>Lịch sử thay đổi của trang này ở wiki</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:LuaCall&amp;diff=1492&amp;oldid=prev</id>
		<title>Tttrung: Tạo trang mới với nội dung “local p={}  function p.main(frame)     local parent=frame.getParent(frame) or {}     local reserved_value={}     local reserved_function,reserved_contents…”</title>
		<link rel="alternate" type="text/html" href="https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:LuaCall&amp;diff=1492&amp;oldid=prev"/>
		<updated>2020-10-06T03:48:59Z</updated>

		<summary type="html">&lt;p&gt;Tạo trang mới với nội dung “local p={}  function p.main(frame)     local parent=frame.getParent(frame) or {}     local reserved_value={}     local reserved_function,reserved_contents…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Trang mới&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 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, '%s'), '%s*%.%s*'&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;
--&lt;br /&gt;
-- Example:&lt;br /&gt;
--    {{#invoke:LuaCall|call|mw.log|a|1|2|3}} will return results of mw.log('a', 1, 2, 3)&lt;br /&gt;
--    {{#invoke:LuaCall|call|mw.logObject|a|321}} will return results of mw.logObject('a', 321)&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('Module:TableTools')&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[' math '].pi&lt;br /&gt;
--    {{#invoke:LuaCall|get|_G| math.pi }} will return value of _G[' math.pi ']&lt;br /&gt;
--    {{#invoke:LuaCall|get|obj.a.5.c}} will return value of obj.a['5'].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 'obj.1' will mean obj['1'] 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 func&lt;br /&gt;
	local offset&lt;br /&gt;
	if frame.args[1] ~= nil then&lt;br /&gt;
		local m = require('Module:' .. frame.args[1])&lt;br /&gt;
		if frame.args[2] ~= nil then&lt;br /&gt;
			func = m[frame.args[2]]&lt;br /&gt;
			frame.args = frame:getParent().args&lt;br /&gt;
			offset = 0&lt;br /&gt;
		else&lt;br /&gt;
			frame.args = frame:getParent().args&lt;br /&gt;
			func = m[frame.args[1]]&lt;br /&gt;
			offset = 1&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		frame.args = frame:getParent().args&lt;br /&gt;
		func = require('Module:' .. frame.args[1])[frame.args[2]]&lt;br /&gt;
		offset = 2&lt;br /&gt;
	end&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for _, v in ipairsAtOffset(frame.args, offset) do&lt;br /&gt;
		table.insert(args, v)&lt;br /&gt;
	end&lt;br /&gt;
	frame.args = args&lt;br /&gt;
	return func(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Tttrung</name></author>
	</entry>
</feed>