모듈:Hangul

카이스트 백과사전
디아블로 (토론 | 기여)님의 2018년 8월 11일 (토) 17:53 판 (판 1개를 가져왔습니다)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
둘러보기로 가기 검색하러 가기

한글 관련 라이브러리 모음입니다.

조사 처리 함수

예: {{#invoke:Hangul|josa|str= |josa = | defaultjosa = | override = | josaonly= }}

보통은 str= 과 josa= 두 옵션만 주면 됩니다. str의 마지막 글자를 분류, 자동으로 josa를 변환하여 조사를 붙입니다.

str=
체언 (예: 사과~). 위키 링크 등을 포함할 수 있습니다.
josa=
조사 (예: ~를)
defaultjosa=
체언의 마지막 받침을 알 수 없는 경우에 이 defaultjosa 값을 쓰도록 합니다. 체언의 마지막 받침이 분석되는 경우는 사용되지 않습니다. (분석을 피하려면 override 변수를 사용하세요)
override = yes/no
yes일 경우, 체언의 마지막 받침을 분석하지 않고 무조건 defaultjosa 값(없다면 josa 값)을 쓰도록 합니다. (기본값은 no)
josaonly = yes/no
yes일 경우, 체언 부분을 출력하지 않습니다. (기본값은 no)

사용 예

  • {{#invoke:Hangul|josa|str=사과|josa=은}} 맛있다.
    → 사과는 맛있다.
  • {{#invoke:Hangul|josa|str=[[사과]]|josa=를}} 먹는다.
    사과를 먹는다.
  • {{#invoke:Hangul|josa|str='''사과'''|josa=과}} 오렌지를 먹는다.
    사과와 오렌지를 먹는다.
  • {{#invoke:Hangul|josa|str=태권 V|josa=을}} 봤다.
    → 태권 V를 봤다.
  • {{#invoke:Hangul|josa|str=color|josa=는}} 색이란 뜻이다.
    → color은(는) 색이란 뜻이다.
  • {{#invoke:Hangul|josa|str=color|josa=는|defaultjosa=는}} 색이란 뜻이다.
    → color는 색이란 뜻이다.
  • {{#invoke:Hangul|josa|str=color|josa=는|override=yes}} 색이란 뜻이다.
    → color는 색이란 뜻이다.
  • {{#invoke:Hangul|josa|str=사과|josa=은|override=yes}} 맛있다.
    → 사과은 맛있다.
  • {{#invoke:Hangul|josa|str=사과|josa=은|josaonly=yes}}
    → 는

--[[
    한글 처리 관련 함수 모듈
    
    josa: 자동 조사 처리 함수
      this function is inspired by
          hanp extension: bugzilla:13712
          korean library: http://pythonhosted.org/korean/
--]]

local func = {}

local ustring = mw.ustring

local handata = mw.loadData('Module:Hangul/data')

-- load to local variables
local final_map = handata.final_map

local final_vowel = handata.final_vowel
local final_consonant = handata.final_consonant
local final_rieul = handata.final_rieul
local final_unknown = handata.final_unknown

local finalform_basic = handata.finalform_basic
local finalform_vowel = handata.finalform_vowel
local finalform_consonant = handata.finalform_consonant
local finalform_rieul = handata.finalform_rieul

 
-- Helper Functions
--[[
    Helper Function to interpret boolean strings. From Module:String
--]]

local function getBoolean( boolean_str )
    local boolean_value;
 
    if type( boolean_str ) == 'string' then
        boolean_str = boolean_str:lower();
        if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
                or boolean_str == ''  or boolean_str == '아니오' then
            boolean_value = false;
        else
            boolean_value = true;
        end
    elseif type( boolean_str ) == 'boolean' then
        boolean_value = boolean_str;
    else
        error( 'No boolean value found' );
    end    
    return boolean_value
end

local function finalclass(str)
    local lastchar = ustring.match(str, '.*([%w])')
 
    if lastchar == nil then return final_unknown end
 
    if lastchar >= '가' and lastchar <= '힣' then
        codepoint = ustring.codepoint(lastchar)
        final = (codepoint - 0xAC00) % 0x1C
        if final == 0 then
            return final_vowel
        elseif final == 8 then
            return final_rieul
        else
            return final_consonant
        end
    end
 
    return final_map[lastchar] or final_unknown
end

--[[
    사용법:
    {{#invoke:Hangul|josa|str= |josa = | defaultjosa = | override = | josaonly= }}
 
    str = 체언
    josa = 조사
    defaultjosa = 체언의 마지막 받침을 알 수 없는 경우에 defaultjosa 값을 쓴다.
    override = True/False : True이면 체언의 어미에 상관없이 defaultjosa (없다면 josa) 값을 쓴다.
    josaonly = True/False: True이면 체언 부분은 생략한다. (복잡한 틀 설계용)
    ]]
 
function func.josa(frame)
    local input_string = frame.args.str or frame.args[1] or ''
    local input_josa = frame.args.josa or frame.args[2] or ''
    local input_defaultjosa = frame.args.defaultjosa
    local override = getBoolean(frame.args.override or false)
    local josaonly = getBoolean(frame.args.josaonly or false)
 
    local output_josa
 
    if override then
        output_josa = input_defaultjosa or input_josa
    else
        local char_class = finalclass(input_string)
        if char_class == final_vowel then
            output_josa = finalform_vowel[input_josa] or input_josa
        elseif char_class == final_consonant then
            output_josa = finalform_consonant[input_josa] or input_josa
        elseif char_class == final_rieul then
            output_josa = finalform_rieul[input_josa] or input_josa
        else -- final_unknown
            output_josa = input_defaultjosa or finalform_basic[input_josa] or input_josa
        end
        -- mw.log (input_string .. '[' .. char_class .. ']' .. output_josa)
    end
 
    if josaonly then
        return output_josa
    else
        return input_string .. output_josa
    end
end

return func