모듈:Loop

설명문서 [편집] [역사] [새로고침]

사용방법[원본 편집]

반복되는 표현을 입력할 때 사용하실 수 있습니다. variable이 없는 simple 함수와 variable이 있는 variable 함수 둘 중에 하나를 사용할 수 있습니다.

simple[원본 편집]

{{#invoke:Loop|simple|(표현)|(반복횟수)}}

형식으로 입력하시면 됩니다. 예를 들면 "대한독립 만세"라는 표현을 5번 반복하기 위한 표현은

{{#invoke:Loop|simple|대한독립 만세<br />|5}} 

이며, 결과는 아래와 같이 나타나게 됩니다.

대한독립 만세
대한독립 만세
대한독립 만세
대한독립 만세
대한독립 만세

variable[원본 편집]

때로는 반복할 때마다 다른 변수를 입력해야 할 경우도 있습니다. 이 경우에는 variable 함수를 사용하면 편리합니다. 모듈 입력 구조는 다음과 같습니다.

{{#invoke:Loop|variable|(표현)|(반복횟수)|(변수명)=(변수의 값 리스트)}}
  • 표현 부분에서 변수로 처리하고 싶으신 부분은 변수명 양 옆에 중괄호로 묶으시면 됩니다. 반드시 중괄호는 변수명과 띄어쓰기 없이 사용하셔야 오류가 생기지 않습니다. 예를 들면 "제{i}의아해가무섭다고그리오."라는 표현에서 i를 1부터 12까지의 숫자로 대입해서 표현이 가능합니다.
  • 반복 횟수는 자연수를 입력하시면 됩니다.
  • 그 다음에 표현 부분에서 처리한 변수명을 인덱스로 잡고, 뒤의 리스트는 반점으로 구분된 형태로 표시합니다. 중괄호로 묶거나(예: i={1,2,3}) 그냥 반점으로 나누어주시면(예: i=1,2,3) 됩니다.

예시 - 인디언 노래에서 나타나는 표현.

{{#invoke:Loop|variable|{i} 꼬마 {j} 꼬마 {k} 꼬마 인디언<br />|3|i=한, 네, 일곱|j=두, 다섯, 여덟|k=세, 여섯, 아홉}}

결과
한 꼬마 두 꼬마 세 꼬마 인디언
네 꼬마 다섯 꼬마 여섯 꼬마 인디언
일곱 꼬마 여덟 꼬마 아홉 꼬마 인디언

연습장이나 사용자 문서에서 틀의 사용이나 수정을 연습할 수 있습니다.
분류는 /설명문서에 넣어주세요.

local p = {}

-- 단순 반복문. {{#invoke:Loop|simple|대한독립 만세<br />|5}} -> 대한독립 만세 5번 반복
function p.simple(frame)
    local sentence = frame.args[1]
    local cnt = tonumber(frame.args[2])
    local res = ''
    for i =1, cnt do
        res = res..sentence
    end
    return res
end

-- 문자 + 테이블을 이용한 반복문
-- {{#invoke:Loop|variable|{i} 꼬마 {j} 꼬마 {k} 꼬마 인디언<br />|3|i=한, 네, 일곱|j=두, 다섯, 여덟|k=세, 여섯, 아홉}}
function p.variable(frame)
    local sentence = frame.args[1]
    local cnt = tonumber(frame.args[2])
    local iterator = mw.ustring.gmatch(sentence, '{([^{]*)}')
    local set_params = {}
    local res = ''

    -- 빈 테이블 만들기
    for idx =1, cnt do
        set_params[idx] = {}
    end

    for w in iterator do
        local val_args = frame.args[w]
        -- 프레임 형식이든 콤마 형식이든 호환성을 확보하기 위해서 --> {1, 4, 5} => 1,4,5, 형식으로 바꿔주기
        val_args = mw.ustring.gsub(mw.ustring.gsub(val_args, ',%s*', ','), '^{?([^}]*)}?$', '%1,')
        -- val_args에서 유도
        local val_parse = mw.ustring.gmatch(val_args, '(.-),')
        local idx = 1
        -- 패턴 집어넣기
        for pat in val_parse do
            set_params[idx][w] = pat
            idx = idx +1
        end
        
    end
    
    for idx =1, cnt do
        local iterator = mw.ustring.gmatch(sentence, '{([^{]*)}')
        local res_part = sentence
        for w in iterator do
            res_part = mw.ustring.gsub(res_part, '{'..w..'}', set_params[idx][w])
        end
        res = res..res_part
    end

    return res


end

return p