본문으로 이동

모듈:Wikidata lexicographical data/ko

위키낱말사전, 말과 글의 누리

이 모듈은 Module:Wikidata lexicographical data의 한국어 특화 기능을 담고 있는 하위 모듈입니다. 본 모듈에서 이 모듈을 자동으로 불러와 한국어 어휘소에 대한 특별한 처리를 수행합니다.

함수

[편집]

p.getEtymology

[편집]

function p.getEtymology(frame, current_lexeme)

한국어 어휘소의 어원을 생성합니다. 특히 한자어에 대한 처리를 담당합니다. 어휘소에 P31:Q1142087(한국어의 한자어) 속성이 있는지 먼저 확인하고, 있다면 ko-hani 표기를 찾아 ko-etym-Sino 틀을 생성합니다. 만약 P31 속성은 있지만 ko-hani 표기가 없으면 오류를 표시합니다. P31 속성이 없는 경우 ko와 ko-hani 표기가 모두 있으면 ko-etym-Sino 틀을 생성합니다.

p.getPronunciation

[편집]

function p.getPronunciation(frame, args, current_lexeme)

한국어 발음 정보를 생성합니다. 위키데이터의 P898(IPA) 대신, 한국어 위키낱말사전의 ko-IPA 틀을 직접 호출합니다. 사용자가 모듈 호출 시 |pron_...= 형식으로 넘겨준 매개변수를 ko-IPA 틀에 그대로 전달합니다.

p.get_pos_specific_template

[편집]

function p.get_pos_specific_template(frame, args, current_lexeme)

어휘소의 품사(어휘 범주)를 확인하고, 그에 맞는 특정 템플릿을 호출하여 반환합니다. pos_template_map 테이블에 품사별로 호출할 템플릿의 이름과 전달할 인자를 설정할 수 있습니다. 모듈:module_categorization 221번째 줄에서 Lua 오류: Did not recognize inferred module-type keyword 'lexicographical data' from root pagename 'Wikidata lexicographical data'.


local p = {}

--[==[
한국어 어휘소의 어원을 생성합니다. 특히 한자어에 대한 처리를 담당합니다.
어휘소에 P31:Q1142087(한국어의 한자어) 속성이 있는지 먼저 확인하고, 있다면 ko-hani 표기를 찾아 {ko-etym-Sino} 틀을 생성합니다.
만약 P31 속성은 있지만 ko-hani 표기가 없으면 오류를 표시합니다. P31 속성이 없는 경우 ko와 ko-hani 표기가 모두 있으면 {ko-etym-Sino} 틀을 생성합니다.
]==]
function p.getEtymology(frame, current_lexeme)
    -- '다음 종류에 속함(P31)' 속성으로 '한국어의 한자어(Q1142087)'가 있는지 먼저 확인
    local is_sino_korean = false
    local p31_statements = current_lexeme:getAllStatements('P31')
    for _, stmt in ipairs(p31_statements) do
        if stmt.mainsnak and stmt.mainsnak.datavalue and stmt.mainsnak.datavalue.value.id == 'Q1142087' then
            is_sino_korean = true
            break
        end
    end

    if not is_sino_korean then
        return nil
    end

    -- 1순위: '복합어의 성분'(P5238)이 있는지 확인
    local p5238_statements = current_lexeme:getAllStatements('P5238')

    if #p5238_statements > 0 then
        -- 1-1. 복합어 성분들을 '순번'(P1545)에 따라 정렬하기 위해 임시 테이블에 저장
        local components = {}
        for _, stmt in ipairs(p5238_statements) do
            -- 각 성분(P5238)에 순번(P1545) 한정자가 있는지 확인
            if stmt.mainsnak and stmt.mainsnak.datavalue and stmt.mainsnak.datavalue.value.id and stmt.qualifiers and stmt.qualifiers.P1545 then
                local component_lexeme_id = stmt.mainsnak.datavalue.value.id
                local order = tonumber(stmt.qualifiers.P1545[1].datavalue.value)
                table.insert(components, { id = component_lexeme_id, order = order })
            end
        end

        -- 순번(order)에 따라 오름차순으로 정렬
        table.sort(components, function(a, b) return a.order < b.order end)

        -- 1-2. 정렬된 성분들의 ko-hani 표기를 찾아 ko-etym-Sino 틀의 인자로 전달
        local template_args = {}
        if #components > 0 then
	        for _, comp in ipairs(components) do
	            local component_lexeme = mw.wikibase.getEntity(comp.id)
	            if component_lexeme then
	                local hanja_rep = nil
	                for _, rep in ipairs(component_lexeme:getLemmas()) do
	                    if rep[2] == 'ko-hani' then
	                        hanja_rep = rep[1]
	                        break
	                    end
	                end

	                if hanja_rep then
	                    table.insert(template_args, hanja_rep) -- 홀수 번째 매개변수: 한자 성분
	                    table.insert(template_args, "")      -- 짝수 번째 매개변수: 뜻
	                end
	            end
	        end
	    end

        -- 1-3. 최종적으로 ko-etym-Sino 틀을 호출
        if #template_args > 0 then
            template_args.from_module = "1" -- etymid 오류 회피용 신호
            return frame:expandTemplate{ title = 'ko-etym-Sino', args = template_args }
        end
    end

    -- 2순위: 복합어 성분(P5238)이 없는 경우 (단일어 처리)
    local hanja_text = nil
    for _, rep in ipairs(current_lexeme:getLemmas()) do
        if rep[2] == 'ko-hani' then
            hanja_text = rep[1]
            break
        end
    end

    if hanja_text then
        -- 복합어의 성분 값이 없는 경우 ko-hani 값 전체를 첫 번째 매개변수로 전달
        local template_args = {
            hanja_text,
            from_module = "1" -- etymid 오류 회피
        }
        return frame:expandTemplate{ title = 'ko-etym-Sino', args = template_args }
    else
        -- 한자어로 명시되어 있는데, 한자 표기가 없는 경우 오류 표시
        return '<strong class="error">오류: 이 어휘소는 한국어 한자어로 지정되어 있으나, ko-hani 표기가 없습니다.</strong>'
    end

    return nil
end

--[==[
한국어 발음 정보를 생성합니다.
위키데이터의 P898(IPA) 대신, 한국어 위키낱말사전의 {ko-IPA} 틀을 직접 호출합니다.
사용자가 모듈 호출 시 {|pron_...=} 형식으로 넘겨준 매개변수를 `ko-IPA` 틀에 그대로 전달합니다.
]==]
function p.getPronunciation(frame, args, current_lexeme)
    local ipa_args = {}
    
    -- 1. 어휘소의 표제어 목록에서 언어 코드가 'ko'인 한글 표기 탐색
    local hangul_lemma_text = nil
    for i, lemma_rep in ipairs(current_lexeme:getLemmas()) do
        if lemma_rep[2] == 'ko' then
            hangul_lemma_text = lemma_rep[1]
            break -- 한글 표기를 찾았으면 중단
        end
    end

    -- 만약 'ko' 표기를 찾지 못했을 경우 목록의 첫 번째 항목 사용
    if not hangul_lemma_text then
        hangul_lemma_text = current_lexeme:getLemmas()[1][1]
    end
    
    -- 찾은 한글 표제어를 ko-IPA 틀의 첫 번째 매개변수로 설정
    ipa_args[1] = hangul_lemma_text
    
    -- 2. 사용자가 #invoke 시 입력한 `pron_` 접두사를 가진 모든 매개변수를 찾음
    for key, value in pairs(args) do
        if type(key) == 'string' and mw.ustring.find(key, '^pron_') then
            -- 'pron_l' -> 'l', 'pron_2' -> 2
            local new_key = mw.ustring.gsub(key, '^pron_', '')
            ipa_args[new_key] = value
        end
    end
    
    -- 3. 찾은 매개변수들을 사용하여 ko-IPA 틀 호출
    return frame:expandTemplate{
        title = 'ko-IPA',
        args = ipa_args
    }
end

--[==[
어휘소의 품사(어휘 범주)를 확인하고, 그에 맞는 특정 템플릿을 호출하여 반환합니다.
`pos_template_map` 테이블에 품사별로 호출할 템플릿의 이름과 전달할 인자를 설정할 수 있습니다.
]==]
function p.get_pos_specific_template(frame, args, current_lexeme)
    local cat_id = current_lexeme:getLexicalCategory()
    
    -- 품사 ID를 키로 사용하여, 호출할 틀 정보(이름, 인자)를 설정합니다.
    local pos_template_map = {
        ['Q24905'] = { -- 동사(Verb)
            title = '한국어 동사',
            args = {} -- 아무 인자도 전달하지 않음
        },
        ['Q1084'] = { -- 명사(Noun)
            title = '한국어 명사',
            args = {}
        },
    }

    local config = pos_template_map[cat_id]

    -- 호출할 틀에 대한 설정이 있으면 실행
    if config then
        local template_args = {} -- 틀에 최종적으로 전달할 인자를 담을 테이블
        
        -- 1. 어휘소의 표제어에서 'ko-hani' 표기를 찾아 'hanja' 인자로 추가
        for i, lemma_rep in ipairs(current_lexeme:getLemmas()) do
            if lemma_rep[2] == 'ko-hani' then
                template_args['hanja'] = lemma_rep[1]
                break
            end
        end
        
        -- 'ko-hani' 인자를 찾지 못한 경우 사용자가 직접 입력한 'pos_' 접두사 인자 처리
        for key, value in pairs(args) do
            if type(key) == 'string' and mw.ustring.find(key, '^pos_') then
                local new_key = mw.ustring.gsub(key, '^pos_', '') -- 'pos_' 접두사 제거
                template_args[new_key] = value
            end
        end
        
        -- 최종적으로 틀 호출
        return frame:expandTemplate{
            title = config.title,
            args = template_args
        }
    end

    return '' -- 해당하는 틀 설정이 없으면 빈 문자열 반환
end

--[==[
한국어 활용/곡절표를 생성하는 함수 (자리표시자).
나중에 {Module:ko-verb-conj} 같은 기존 활용표 생성 모듈을 여기서 호출하도록 구현할 수 있습니다. 
]==]
-- function p.getInflectionTable(frame, args, current_lexeme)
--     -- 예시: 품사가 동사일 경우에만 활용표 생성
--     if current_lexeme:getLexicalCategory() == 'Q24905' then -- 동사(Verb)
--         -- return frame:expandTemplate{ title = 'ko-conj', args = { current_lexeme:getLemmas()[1][1] } }
--         return ''
--     end
--     return ''
-- end

return p