모듈:FrameWrapper

리버티게임, 모두가 만들어가는 자유로운 게임
Hsl0 (토론 | 기여)님의 2024년 9월 26일 (목) 14:02 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)


모듈 설명문서[보기] [편집] [역사] [새로 고침]

wrap

위키텍스트용 함수를 루아에서 실행합니다. 첫번째 인자에 위키텍스트용 함수를, 그 뒤에 함수 인자를 전달합니다. 인자에 이름을 지정하고 싶다면 인자를 테이블로 묶어 전달할 수 있습니다.

function func(frame)
    ...
end

local fw = require('모듈:FrameWrapper')
fw.wrap(func, ...)
fw.wrap(func, {...})

unwrap

루아용 함수를 위키텍스트에서 실행합니다. 모듈 이름은 require 함수에 사용되는 모듈 이름을 작성하며, 모듈: 이름공간의 모듈은 이름공간 접두어도 포함해야 합니다.

{{#invoke:FrameWrapper|unwrap|(모듈 이름)|(함수 이름)|...}}
require('(모듈 이름)').(함수 이름)(...) -- 익명 인자만 있을 경우
require('(모듈 이름)').(함수 이름)({...}) -- 이름이 있는 인자가 있는 경우

이름을 지정한 인자가 있으면 모든 인자가 테이블 하나로 묶여 전달됩니다.


local p = {}

function p.unwrap(frame)
	local modulename = frame.args[1]
	local funcname = frame.args[2]
	local len = 0 -- 인자의 갯수
	local args = {}
	local seq = false -- 익명 인자만 있는지 여부
	
	-- 인자 테이블 복사 및 개수 세기
	for key, value in pairs(frame.args) do
		len = len + 1
		args[key] = value
	end
	
	-- 익명 인자만 있는지 확인
	if #args == len then -- 연속적 숫자 키만 있는지 확인 (연속적 숫자 키 개수 == 전체 키 갯수)
		table.remove(args, 1)
		table.remove(args, 1)
		seq = true
	end
	
	local pk = require(modulename)
	local func = pk[funcname]
	
	if seq then -- 익명 인자만 있는 경우
		return func(unpack(args)) -- 풀어서 전달
	else
		return func(args) -- 테이블로 묶어서 전달
	end
end

-- 여러 인자와 테이블 모두 받을 수 있음
function p.wrap(func, tbl, ...)
	local args = type(tbl) == 'table' and tbl or {tbl, ...}
	local cframe = mw.getCurrentFrame()
	local frame = cframe:newChild{
		title = cframe:getTitle(),
		args = args
	}
	return func(frame)
end

return p