모듈:Category

최근 편집: 2017년 4월 13일 (목) 20:32
낙엽1124 (토론 | 기여)님의 2017년 4월 13일 (목) 20:32 판 (계층분류 구현 변경)

알려진 문제

순환 참조가 발생했을 시 ?action=edit으로 내용을 변경하기 전까지 문서 로딩이 되지 않습니다.


local p = {}

--frame.args의 원소 수를 세어서 반환하는 함수, --더 쉬운 방법이 있다면 알려주세요.
local function argumentCount(frame) 
    local count = 0
    for i,v in frame:argumentPairs() do
        count = count+1
    end
    return count
end

function p.main(frame) 
    local argc = argumentCount(frame)
    if (not frame.args['calledRecursively'] and argc % 2 ~= 0) or 
    	(frame.args['calledRecursively'] and argc % 2 ~= 1) then 
    		return '매개변수가 짝이 맞지 않습니다.[[분류:매개변수가 잘못된 문서]]' end

    local returnText = ''

	--만약 "{{#invoke:Category|main|성격|단체|분야|페미니즘}}""
	--과 같이 호출되었다면 다음 작업을 수행합니다.
	--	"분류:분야/페미니즘"이라는 문서가 있는지, 있다면 상위분류가 있는지를 확인합니다.
	--		둘다 맞다면 문서에 "분류:분야/페미니즘"을 전개하여 추가합니다.(해당 틀은 이 함수를 재귀호출합니다.)
	--	아니라면,
	--		문서에 "[[분류:분야/페미니즘]]"만 추가합니다.
    for i=1,argc/2 do
    	if mw.title.new('분류:' .. frame.args[(i*2)-1] .. '/' .. frame.args[(i*2)]).exists 
    		and frame:expandTemplate{ title = '분류:' .. frame.args[(i*2)-1] .. '/' .. frame.args[(i*2)], args = {'상위분류'} } == '있음' then
            returnText = returnText .. frame:expandTemplate{ title = frame.args[(i*2)-1] .. "/" .. frame.args[(i*2)] , args = { calledRecursively = 'true' } }
        else
            returnText = returnText .. '[[분류:' .. frame.args[(i*2)-1] .. '/' .. frame.args[(i*2)] .. '|'.. frame.args[(i*2)] ..']]'
        end
    end

   	--분류 문서면서 재귀호출된 게 아니라면 → 분류 div를 출력합니다.
    if (mw.title.getCurrentTitle():inNamespace('분류') and not frame.args['calledRecursively']) then
        local lis = ""
        for i=1,(argc)/2 do
            lis = lis .. frame:callParserFunction( '#tag:li', '[[:분류:'..frame.args[(i*2)-1]..'/'..frame.args[(i*2)]..'|'..frame.args[(i*2)-1]..'/'..frame.args[(i*2)]..']]' )
        end
        returnText = returnText .. frame:callParserFunction{
            name = '#tag:div', 
            args = {
                class = 'fw-catlinks', 
                ['data-mw'] = 'interface', 
                frame:callParserFunction{
                    name = '#tag:div', args = {
                        class = 'mw-normal-catlinks',
                        '[[특수:분류|분류]]:'.. frame:callParserFunction('#tag:ul', lis)
                    }
                }
            }
        }
    end

    return returnText
end

--"A/B"를 인자로 받으면 패싯인 A를 반환하는 함수
function p.facet(frame)
    local slash = string.find(frame.args[1],'/')
    if slash == nil then return frame.args[1] end 
    return string.sub(frame.args[1],1,slash-1)
end

--"A/B"를 인자로 받으면 멤버인 B를 반환하는 함수
function p.member(frame)
    local slash = string.find(frame.args[1],'/')
    if slash == nil then return frame.args[1] end
    return string.sub(frame.args[1],slash+1,#frame.args[1])
end

return p