모듈:Mfunctions
버그가 많아 사용을 권장하지 않습니다. 대신 모듈:TemplateFunction을 사용해 주세요.
Lua 모듈에서 활용할 수 있는 임의의 파서 함수를 생성하고 파싱할 수 있는 모듈입니다.
함수 테이블 생성
local tbl = require('모듈:Mfunctions').new()
함수의 값을 저장하는 함수 테이블을 생성하려면 본 모듈의 new()
함수를 이용합니다. 미리 준비된 테이블이 있다면 첫번째 인자에 해당 테이블을 넣어서 파싱이 가능한 함수 테이블로 전환하실 수 있습니다.
local tbl = {}
tbl = require('모듈:Mfunctions').new(tbl)
함수 추가
임의 파서 함수를 파싱하려면 함수나 값을 함수 테이블에 추가해야 합니다. 함수 테이블에 직접 추가할 수 있지만, set()
함수를 사용할 것을 권장합니다.
tbl:set('함수a', function(frame)
...
end):set('함수b', '값b')
set()
함수는 메소드 체이닝을 지원하여 여러 함수를 인라인으로 한번에 추가할 수 있습니다. 함수의 경우 프레임을 인자로 받아 모듈과 같이 만드실 수 있습니다. 특별한 계산이 필요없고 값이 변하지 않을 경우 해당 값을 직접 입력할 수 있습니다. 단, 테이블은 지원하지 않습니다.
함수 사용
{{#(함수명)#:(변수값1)|(변수값2)|(변수a)=(값a)|(변수b)=(값b)|...}}
임의 파서 함수 문법은 일반 파서 함수와 비슷합니다. 다만 함수명의 앞뒤에 #
을 붙여야 합니다.
<nowiki>{{#switch:{{#expr:{{#func#}} - 1}}|0=ㄹ|9=ㄹㄹ|42=ㄹㄹㄹ|300=ㄹㄹㄹㄹ}}</nowiki>
만약 임의 함수를 파서 함수나 틀과 함께 사용하고, 결과에 영향을 끼칠 경우에는 <nowiki>
로 묶어 주어야 합니다.
문법 파싱
tbl:parse(frame.args[1])
함수 테이블의 parse()
함수를 사용해서 함수 테이블에 정의된 규칙대로 인자의 텍스트를 파싱합니다.
예제
- 모듈:Banana
local p = {}
function p.example(frame)
return require('모듈:Mfunctions'):set('func', function(frame)
return 'Hello, ' .. frame.args[1] .. '!'
end):parse(frame.args[1])
end
return p
- 입력
{{#invoke:Banana|example|{{#func#:World}}}}
- 출력
Hello, World!
위 설명은 모듈:Mfunctions/설명문서의 내용을 가져와 보여주고 있습니다. (편집 | 역사) 이 모듈에 대한 수정 연습과 시험은 연습장 (만들기 | 미러)과 시험장 (만들기)에서 할 수 있습니다. 분류는 /설명문서에 넣어주세요. 이 모듈에 딸린 문서. |
local hook = {}
function hook.frame(func)
local frame = {}
innfunc = func:sub(3, -3)
frame.name = innfunc:sub(1, innfunc:find(':')):sub(2, -2)
frame.args = {}
if innfunc:find(':') then
local index = 1
local args = mw.text.gsplit(innfunc:sub(innfunc:find(':') and (innfunc:find(':') + 1), -1), '|')
for arg in args do
local key
local value = ''
if arg:find('=') then
key = arg:sub(1, arg:find('='))
key = tonumber(key) or key
value = arg:sub(arg:find('='))
else
key = index
value = arg
index = index + 1
end
frame.args[key] = value
end
end
return frame
end
function hook.parse(text, name, value)
local brackets = text:gmatch('%b{}')
for bracket in brackets do
local func = bracket:sub(2, -2):match('%b{}')
if func then
local innfunc = func:sub(2, -2)
local frame = hook.frame(bracket)
if (frame.name == name) then
local response = ''
if (type(value) == 'function')
then response = value(frame)
else response = value
end
text = text:sub(1, text:find(bracket) - 1) .. response .. text:sub(text:find(bracket) + bracket:len(), -1)
end
end
end
return text
end
return hook