모듈:User:ChongDae/sandbox

위키백과, 우리 모두의 백과사전.
--[[ ChongDae's sandbox
   working: hanp
   ]]

local func = {}

local ustring = mw.ustring

-- Helper Function
--[[
Helper Function to interpret boolean strings
]]
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

-- data definition

local final_vowel = 1
local final_consonant = 2
local final_rieul = 3
local final_unknown = 4

local handata = {}

-- 한글 이외 글자의 읽는법 --
final_map = {
    ["ㄱ"]= final_consonant,--기역/기윽
    ["ㄴ"]= final_consonant,--니은
    ["ㄷ"]= final_consonant,--디귿/디읃
    ["ㄹ"]= final_rieul,    --리을
    ["ㅁ"]= final_consonant,--미음
    ["ㅂ"]= final_consonant,--비읍
    ["ㅅ"]= final_consonant,--시옷/시읏
    ["ㅇ"]= final_consonant,--이응
    ["ㅈ"]= final_consonant,--지읒
    ["ㅊ"]= final_consonant,--치읓
    ["ㅋ"]= final_consonant,--키읔
    ["ㅌ"]= final_consonant,--티읕
    ["ㅍ"]= final_consonant,--피읖
    ["ㅎ"]= final_consonant,--히읗
    ["ㄲ"]= final_consonant,--쌍기역/된기윽
    ["ㄸ"]= final_consonant,--쌍디귿/된디읃
    ["ㅃ"]= final_consonant,--쌍비읍/된비읍
    ["ㅆ"]= final_consonant,--쌍시옷/된시읏
    ["ㅉ"]= final_consonant,--씽지읒/된지읒

    ["0"] = final_consonant,-- 영, 십, 백, 천, 만, 억 (조 이상은 에러)
    ["1"] = final_rieul,    -- 일
    ["2"] = final_vowel,    -- 이
    ["3"] = final_consonant,-- 삼
    ["4"] = final_vowel,    -- 사
    ["5"] = final_vowel,    -- 오
    ["6"] = final_consonant,-- 육
    ["7"] = final_rieul,    -- 칠
    ["8"] = final_rieul,    -- 팔
    ["9"] = final_vowel,    -- 구

    A = final_vowel,        -- 에이
    B = final_vowel,        -- 비
    C = final_vowel,        -- 시
    D = final_vowel,        -- 디
    E = final_vowel,        -- 이
    F = final_vowel,        -- 에프
    G = final_vowel,        -- 지
    H = final_vowel,        -- 에이치
    I = final_vowel,        -- 아이
    J = final_vowel,        -- 제이
    K = final_vowel,        -- 케이
    L = final_rieul,        -- 엘
    M = final_consonant,    -- 엠
    N = final_consonant,    -- 엔
    O = final_vowel,        -- 오
    P = final_consonant,    -- 피
    Q = final_consonant,    -- 큐
    R = final_vowel,        -- 아르 (알?)
    S = final_vowel,        -- 에스
    T = final_vowel,        -- 티
    U = fianl_vowel,        -- 유
    V = final_vowel,        -- 브이
    W = final_vowel,        -- 더블유
    X = final_vowel,        -- 엑스
    Y = final_vowel,        -- 와이
    Z = final_vowel,        -- 지, 제드, 제트
}

--[[
    Return값
        0: 받침이 없는 경우
        1: 'ㄹ' 받침인 경우
        2: 기타 받침인 경우
        3: 처리할 수 없는 경우
 ]]
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

local particle_map = {
    -- 기본형, 배~, 감~, 귤~
    { "은(는)", "는", "은", "은"},
    { "이(가)", "가", "이", "이"},
    { "을(를)", "를", "을", "을"},
    { "와(과)", "와", "과", "과"},
    { "야(아)", "야", "아", "아"},
    { "(으)로", "로", "으로", "로"},
    { "(으)로서", "로서", "으로서", "로서"},
    { "(으)로써", "로써", "으로써", "로써"},
    { "(이)랑", "랑", "이랑", "이랑"},
    { "(이)나", "나", "이나", "이나"},
    { "(이)여", "여", "이여", "이여"},
    { "(이)시여", "시여", "이시여", "이시여"},
    { "(이)다", "다", "이다", "이다"},
}

finalform_basic = {}
finalform_vowel = {}
finalform_consonant = {}
finalform_rieul = {}

local function registerParticleMap(rules)
    local finalform = { {}, {}, {}, {} }
    mw.log(#rules)
    for i = 1, #rules do
        rule = rules[i]
        for j = 1, 4 do
            finalform_basic[ rule[j] ] = rule[1]
            finalform_vowel[ rule[j] ] = rule[2]
            finalform_consonant[ rule[j] ] = rule[3]
            finalform_rieul[ rule[j] ] = rule[4]
        end
    end
    
    return #rules
end

registerParticleMap(particle_map)

func.particle_map = particle_map
func.registerParticleMap =  registerParticleMap
func.finalform_basic = finalform_basic
func.finalform_vowel = finalform_vowel
func.finalform_consonant =finalform_consonant
func.fonalform_rieul = finalform_rieul

--[[
    사용법:
    {{#invoke|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

--[[ 동음이의어 구분이 된 문서 링크를 간편하게 처리 ]]
function func.pipetrick(frame)
    local input_string = (frame.args[1] or '')
    local input_title = frame.args[2]
    local first_char = string.sub(input_string, 1, 1)
    
    if first_char == '[' then
        return input_string
    elseif first_char == ':' then
        input_string = string.sub(input_string, 2)
    end
        
    local title_part = input_title or string.gsub(input_string, ' %(.*%)$', '')

    if title_part == input_string then
        return '[[:' .. input_string .. ']]'
    else
        return '[[:' .. input_string .. '|' .. title_part .. ']]'
    end
end

local langdata = mw.loadData('Module:Langname/data')

function func.langdata(frame)
    codes = {}
    for k, v in pairs(langdata.lang_name) do
        table.insert(codes, k)
    end
    
    table.sort(codes)
    
    for i, code in ipairs(codes) do
        l1 = langdata.lang_name[code]
        l2 = mw.language.fetchLanguageName(code, 'ko')
        if l1 ~= l2 then
            mw.log(string.format('* %s: [[%s]] [[%s]]', code, l1, l2))
        end
    end
end

    
function func.langname(frame)
    local code = frame.args.code or frame.args.code[1]
    local lang = frame.args.lang or frame.args.code[2]
    
    return mw.language.fetchLanguageName(code, lang)
end

return func

--]==]