모듈:Pipeline: 두 판 사이의 차이
편집 요약 없음 |
편집 요약 없음 |
||
3번째 줄: | 3번째 줄: | ||
local passSuffix = 'pipe-passed-data' | local passSuffix = 'pipe-passed-data' | ||
local passSuffixPattern = 'pipe%-passed%-data' | local passSuffixPattern = 'pipe%-passed%-data' | ||
function printLog(...) | |||
local txt = table.concat({...}) | |||
print(txt) | |||
return txt .. '\n' | |||
end | |||
function p.pipe(frame) | function p.pipe(frame) | ||
44번째 줄: | 50번째 줄: | ||
.. mw.text.jsonEncode(frame.args) | .. mw.text.jsonEncode(frame.args) | ||
.. '</includeonly ' .. passSuffix .. '>' | .. '</includeonly ' .. passSuffix .. '>' | ||
end | |||
function p.debug(frame) | |||
local returned = '' | |||
local passed = nil | |||
local printed = '' | |||
-- 한 단계씩 파싱 | |||
for i, source in ipairs(frame.args) do | |||
local title = mw.title.new(source, 'Template') | |||
printed = printed .. printLog('[#', i, ']') | |||
-- RETURNED 파싱 | |||
source = mw.text.unstripNoWiki(mw.text.decode(source)):gsub('{{RETURNED}}', function(default) | |||
return returned or '' | |||
end) | |||
if title and title.exists then | |||
-- 틀/문서 제목과 일치할 경우 틀로 처리 | |||
printed = printed .. printLog('template = ', source) | |||
returned = tf.load(source):parse(passed) | |||
printed = printed .. printLog('RETURNED = ', returned) | |||
elseif not pcall(function() | |||
-- 파서 함수 이름과 일치할 경우 파서 함수로 처리 | |||
printed = printed .. printLog('parserFunction = ', source) | |||
name, arg0 = unpack(mw.text.split(source, ':')) | |||
returned = frame:callParserFunction(name, arg0 == '' and returned or arg0, passed) | |||
printed = printed .. printLog('RETURNED = ', source) | |||
end) then | |||
-- 아니면 인라인 틀로 처리 | |||
printed = printed .. printLog('source = ', source) | |||
-- RETURNED로 넘겨줄 부분: #pass 부분 제외 | |||
returned = source:gsub('<includeonly ' .. passSuffixPattern .. '>.-</includeonly ' .. passSuffixPattern .. '>', '') | |||
returned = tf.create(returned):parse(passed) | |||
printed = printed .. printLog('RETURNED = ', returned) | |||
-- pass 인자로 넘겨줄 부분: #pass 부분만 추출 | |||
passed = source:match('<includeonly ' .. passSuffixPattern .. '>(.-)</includeonly ' .. passSuffixPattern.. '>') | |||
passed = passed and mw.text.jsonDecode(passed) | |||
printed = printed .. printLog('#passed = ', passed) | |||
end | |||
end | |||
return returned | |||
end | end | ||
return p | return p |
2024년 12월 11일 (수) 19:13 판
이전 값에 종속되는 여러 틀을 연속적으로 실행합니다. 이를 통해 복잡한 로직을 함수형으로 구현하거나 중첩된 틀을 가독성 좋게 바꿀 수 있습니다.
사용법
code_blocks 코드
{{#invoke:Pipeline|pipe
|{{#invoke:pipeline|pass|9|a=10}}11
|<nowiki>{{#expr:{{{1}}}+{{{a}}}+{{RETURNED}}}}</nowiki>
}}
code
description 결과
30
이전에 실행된 함수의 값을 RETURNED 상수를 통해 통째로 다음 함수에 넘겨줍니다. pass 함수를 활용하여 여러 값을 넘겨줄 수 있습니다.
위 설명은 모듈:Pipeline/설명문서의 내용을 가져와 보여주고 있습니다. (편집 | 역사) 이 모듈에 대한 수정 연습과 시험은 연습장 (만들기 | 미러)과 시험장 (만들기)에서 할 수 있습니다. 분류는 /설명문서에 넣어주세요. 이 모듈에 딸린 문서. |
local p = {}
local tf = require('모듈:TemplateFunction')
local passSuffix = 'pipe-passed-data'
local passSuffixPattern = 'pipe%-passed%-data'
function printLog(...)
local txt = table.concat({...})
print(txt)
return txt .. '\n'
end
function p.pipe(frame)
local returned = ''
local passed = nil
-- 한 단계씩 파싱
for _, source in ipairs(frame.args) do
local title = mw.title.new(source, 'Template')
-- RETURNED 파싱
source = mw.text.unstripNoWiki(mw.text.decode(source)):gsub('{{RETURNED}}', function(default)
return returned or ''
end)
if title and title.exists then
-- 틀/문서 제목과 일치할 경우 틀로 처리
returned = tf.load(source):parse(passed)
elseif not pcall(function()
-- 파서 함수 이름과 일치할 경우 파서 함수로 처리
name, arg0 = unpack(mw.text.split(source, ':'))
returned = frame:callParserFunction(name, arg0 == '' and returned or arg0, passed)
end) then
-- 아니면 인라인 틀로 처리
-- RETURNED로 넘겨줄 부분: #pass 부분 제외
returned = source:gsub('<includeonly ' .. passSuffixPattern .. '>.-</includeonly ' .. passSuffixPattern .. '>', '')
returned = tf.create(returned):parse(passed)
-- pass 인자로 넘겨줄 부분: #pass 부분만 추출
passed = source:match('<includeonly ' .. passSuffixPattern .. '>(.-)</includeonly ' .. passSuffixPattern.. '>')
passed = passed and mw.text.jsonDecode(passed)
end
end
return returned
end
function p.pass(frame)
return '<includeonly ' .. passSuffix .. '>'
.. mw.text.jsonEncode(frame.args)
.. '</includeonly ' .. passSuffix .. '>'
end
function p.debug(frame)
local returned = ''
local passed = nil
local printed = ''
-- 한 단계씩 파싱
for i, source in ipairs(frame.args) do
local title = mw.title.new(source, 'Template')
printed = printed .. printLog('[#', i, ']')
-- RETURNED 파싱
source = mw.text.unstripNoWiki(mw.text.decode(source)):gsub('{{RETURNED}}', function(default)
return returned or ''
end)
if title and title.exists then
-- 틀/문서 제목과 일치할 경우 틀로 처리
printed = printed .. printLog('template = ', source)
returned = tf.load(source):parse(passed)
printed = printed .. printLog('RETURNED = ', returned)
elseif not pcall(function()
-- 파서 함수 이름과 일치할 경우 파서 함수로 처리
printed = printed .. printLog('parserFunction = ', source)
name, arg0 = unpack(mw.text.split(source, ':'))
returned = frame:callParserFunction(name, arg0 == '' and returned or arg0, passed)
printed = printed .. printLog('RETURNED = ', source)
end) then
-- 아니면 인라인 틀로 처리
printed = printed .. printLog('source = ', source)
-- RETURNED로 넘겨줄 부분: #pass 부분 제외
returned = source:gsub('<includeonly ' .. passSuffixPattern .. '>.-</includeonly ' .. passSuffixPattern .. '>', '')
returned = tf.create(returned):parse(passed)
printed = printed .. printLog('RETURNED = ', returned)
-- pass 인자로 넘겨줄 부분: #pass 부분만 추출
passed = source:match('<includeonly ' .. passSuffixPattern .. '>(.-)</includeonly ' .. passSuffixPattern.. '>')
passed = passed and mw.text.jsonDecode(passed)
printed = printed .. printLog('#passed = ', passed)
end
end
return returned
end
return p