모듈: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