본문으로 이동

모듈:ja-verbconj

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

이 모듈에 대한 설명문서는 모듈:ja-verbconj/설명문서에서 만들 수 있습니다

local export = {}

local util = require("Module:ja-verbconj/util")
local data = require("Module:ja-verbconj/data")

function export.show(frame)
    local lemma = mw.title.getCurrentTitle().text
    local kana = util.extract_kana_from_template()
    local type = util.extract_type_from_template()
    
    if type == nil and kana == "" then
        error("{{ja-verb}} 틀이 필요합니다.")
    end
    
    if type == "2" then
    	type = "ichidan"
    end
    
    if type == nil then
    	if kana == "" then
    		type = "1"
    		kana = lemma
    	end
    end
    
    if kana == "" then
    	kana = lemma
    end

    local romaji = util.kana_to_romaji(kana)

    local conjugation_table_html = export.generate_conjugation_table(lemma, kana, romaji, type)

    return conjugation_table_html
end

function export.generate_conjugation_table(lemma, kana, romaji, type)
    local kana_only = not util.contains_kanji(lemma)
    local is_kanji_suru = false

    if kana_only then
        if type == "suru" then
            -- nothing to do here for kana-only suru lemma
        end
    else
        if type == "suru" then
            is_kanji_suru = true
            if util.umatch(lemma, "する$") then
                lemma = util.usub(lemma, 1, -3)
                kana = util.usub(kana, 1, -3)
            elseif util.umatch(lemma, "ずる$") then
                lemma = util.usub(lemma, 1, -3)
                kana = util.usub(kana, 1, -3)
            else
                if kana == "" then
                    kana = lemma
                end
            end
        else
            if kana == "" then
                type = util.extract_type_from_template()
                if type == nil then
                    type = "1"
                end
                kana = lemma
            end
        end
    end

    if type == "1" then
        local final_kana = util.usub(kana, -1)
        return export.generate_godan_table(lemma, kana, romaji, final_kana)
    elseif type == "suru" then
        return export.generate_suru_table(lemma, kana, romaji, kana_only, is_kanji_suru)
    elseif type == "ichidan" then
    	return export.generate_ichidan_table(lemma, kana, romaji, kana_only)
    else
        error("지원되지 않는 동사 유형입니다: " .. type)
    end
end

function export.generate_godan_table(lemma, kana, romaji, final_kana)
    local endings = data.get_conjugation_endings("godan", final_kana)
    if not endings then
        error("5단 동사 '" .. final_kana .. "'에 대한 활용 어미를 찾을 수 없습니다.")
    end

    local stem_kana = util.extract_stem(kana)
    local kana_only = not util.contains_kanji(lemma)

    local rows = {
        util.format_row('미연형(<span lang="ja" class="Jpan">未然形</span>)', lemma, stem_kana, endings.mi, false, kana_only),
        util.format_row('연용형(<span lang="ja" class="Jpan">連用形</span>)', lemma, stem_kana, endings.yo, false, kana_only),
        util.format_row('종지형(<span lang="ja" class="Jpan">終止形</span>)', lemma, stem_kana, endings.shu, false, kana_only),
        util.format_row('연체형(<span lang="ja" class="Jpan">連体形</span>)', lemma, stem_kana, endings.ren, false, kana_only),
        util.format_row('가정형(<span lang="ja" class="Jpan">仮定形</span>)', lemma, stem_kana, endings.ka, false, kana_only),
        util.format_row('명령형(<span lang="ja" class="Jpan">命令形</span>)', lemma, stem_kana, endings.me, false, kana_only)
    }

    local core_expressions = {
        util.format_row('수동형', lemma, stem_kana, endings.pass, false, kana_only),
        util.format_row('사역형', lemma, stem_kana, endings.caus, false, kana_only),
        util.format_row('가능형', lemma, stem_kana, endings.pot, false, kana_only),
        util.format_row('의지 · 권유형', lemma, stem_kana, endings.vol, false, kana_only),
        util.format_row('부정형', lemma, stem_kana, endings.neg, false, kana_only),
        util.format_row('지속 부정형', lemma, stem_kana, endings.cont_neg, false, kana_only),
        util.format_row('경어체', lemma, stem_kana, endings.polite, false, kana_only),
        util.format_row('과거형', lemma, stem_kana, endings.past, false, kana_only),
        util.format_row('접속형(て형)', lemma, stem_kana, endings.te, false, kana_only),
        util.format_row('가정형', lemma, stem_kana, endings.conditional, false, kana_only)
    }

    return util.generate_base_table_html(lemma, util.concat(rows, "\n"), util.concat(core_expressions, "\n"), kana_only, false, "godan")
end

function export.generate_suru_table(lemma, kana, romaji, kana_only, is_kanji_suru)
    local stem_kana
    if kana_only then
        stem_kana = kana
    elseif is_kanji_suru then
        stem_kana = kana
    else
        stem_kana = util.usub(kana, 1, -3)
    end

    local suru_type = util.determine_suru_type(stem_kana, lemma)

    local endings = data.get_conjugation_endings("suru", suru_type)
    if not endings then
        error("する 동사 '" .. suru_type .. "'에 대한 활용 어미를 찾을 수 없습니다.")
    end

    local display_lemma
    if suru_type == "zuru" then
        display_lemma = lemma .. "ずる"
    else
        display_lemma = lemma .. "する"
    end

    local rows = {
        util.format_row('미연형(<span lang="ja" class="Jpan">未然形</span>)', lemma, stem_kana, endings.mi, true, kana_only, suru_type),
        util.format_row('연용형(<span lang="ja" class="Jpan">連用形</span>)', lemma, stem_kana, endings.yo, true, kana_only, suru_type),
        util.format_row('종지형(<span lang="ja" class="Jpan">終止形</span>)', lemma, stem_kana, endings.shu, true, kana_only, suru_type),
        util.format_row('연체형(<span lang="ja" class="Jpan">連体形</span>)', lemma, stem_kana, endings.ren, true, kana_only, suru_type),
        util.format_row('가정형(<span lang="ja" class="Jpan">仮定形</span>)', lemma, stem_kana, endings.ka, true, kana_only, suru_type),
        util.format_row('명령형(<span lang="ja" class="Jpan">命令形</span>)', lemma, stem_kana, endings.me, true, kana_only, suru_type)
    }

    local core_expressions = {
        util.format_row('수동형', lemma, stem_kana, endings.pass, true, kana_only, suru_type),
        util.format_row('사역형', lemma, stem_kana, endings.caus, true, kana_only, suru_type),
        util.format_row('가능형', lemma, stem_kana, endings.pot, true, kana_only, suru_type),
        util.format_row('의지 · 권유형', lemma, stem_kana, endings.vol, true, kana_only, suru_type),
        util.format_row('부정형', lemma, stem_kana, endings.neg, true, kana_only, suru_type),
        util.format_row('지속 부정형', lemma, stem_kana, endings.cont_neg, true, kana_only, suru_type),
        util.format_row('경어체', lemma, stem_kana, endings.polite, true, kana_only, suru_type),
        util.format_row('과거형', lemma, stem_kana, endings.past, true, kana_only, suru_type),
        util.format_row('접속형(て형)', lemma, stem_kana, endings.te, true, kana_only, suru_type),
        util.format_row('가정형', lemma, stem_kana, endings.conditional, true, kana_only, suru_type)
    }

    return util.generate_base_table_html(display_lemma, util.concat(rows, "\n"), util.concat(core_expressions, "\n"), kana_only, true, "suru")
end

function export.generate_ichidan_table(lemma, kana, romaji, kana_only)
    local endings = data.get_conjugation_endings("ichidan")
    if not endings then
        error("1단 동사에 대한 활용 어미를 찾을 수 없습니다.")
    end
    
    local stem_kana = util.usub(kana, 1, -2)
    
    local rows = {
        util.format_row('미연형(<span lang="ja" class="Jpan">未然形</span>)', lemma, stem_kana, endings.mi .. "" , false, kana_only),
        util.format_row('연용형(<span lang="ja" class="Jpan">連用形</span>)', lemma, stem_kana, endings.yo .. "" , false, kana_only),
        util.format_row('종지형(<span lang="ja" class="Jpan">終止形</span>)', lemma, stem_kana, endings.shu, false, kana_only),
        util.format_row('연체형(<span lang="ja" class="Jpan">連体形</span>)', lemma, stem_kana, endings.ren, false, kana_only),
        util.format_row('가정형(<span lang="ja" class="Jpan">仮定形</span>)', lemma, stem_kana, endings.ka, false, kana_only),
        util.format_row('명령형(<span lang="ja" class="Jpan">命令形</span>)', lemma, stem_kana, endings.me, false, kana_only)
    }
    
    local core_expressions = {
        util.format_row('수동형', lemma, stem_kana, endings.pass, false, kana_only),
        util.format_row('사역형', lemma, stem_kana, endings.caus, false, kana_only),
        util.format_row('가능형', lemma, stem_kana, endings.pot, false, kana_only),
        util.format_row('의지 · 권유형', lemma, stem_kana, endings.vol, false, kana_only),
        util.format_row('부정형', lemma, stem_kana, endings.neg, false, kana_only),
        util.format_row('지속 부정형', lemma, stem_kana, endings.cont_neg, false, kana_only),
        util.format_row('경어체', lemma, stem_kana, endings.polite, false, kana_only),
        util.format_row('과거형', lemma, stem_kana, endings.past, false, kana_only),
        util.format_row('접속형(て형)', lemma, stem_kana, endings.te, false, kana_only),
        util.format_row('가정형', lemma, stem_kana, endings.conditional, false, kana_only)
    }
    
    return util.generate_base_table_html(lemma, util.concat(rows, "\n"), util.concat(core_expressions, "\n"), kana_only, false, "ichidan")
end

return export