본문으로 이동

모듈:ja-verbconj/util

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

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

local export = {}

export.ulen = mw.ustring.len
export.usub = mw.ustring.sub
export.umatch = mw.ustring.match
export.ugmatch = mw.ustring.gmatch
export.toNFC = mw.ustring.toNFC
export.toNFD = mw.ustring.toNFD
export.concat = table.concat

local tr_module = require("Module:Hrkt-translit")
local range_module = require("Module:ja/data/range")
local m_str_utils = require("Module:string utilities")

function export.clean_kana_input(text)
    return m_str_utils.gsub(text, "[ '%-.]+", "")
end

function export.kana_to_romaji(kana)
    local processable_kana = mw.ustring.gsub(kana, "%.", " ")
    local romaji_with_space = tr_module.tr(processable_kana, "ja")

    return mw.ustring.gsub(romaji_with_space, " ", "")
end

function export.extract_stem(kana)
    return export.usub(kana, 1, -2)
end

function export.contains_kanji(word)
    return export.umatch(word, "[" .. range_module.kanji .. "]") ~= nil
end

function export.determine_suru_type(stem, lemma)
    local page_title = mw.title.getCurrentTitle().text
    if page_title:find("ずる") then
        return "zuru"
    end
    local last_char = export.usub(stem, -1)
    if last_char == "っ" then
        return "suru-tsu"
    else
        return "general"
    end
end

function export.extract_kana_from_template()
    local content = mw.title.getCurrentTitle():getContent()
    if content then
        for template in export.ugmatch(content, "{{ja%-verb|(.-)}}") do
            local params = mw.text.split(template, "|")
            for i, param in ipairs(params) do
                if not param:find("=") then
                    return mw.text.trim(param)
                end
            end
        end
    end
    return ""
end

function export.extract_type_from_template()
    local content = mw.title.getCurrentTitle():getContent()
    if content then
        for template in export.ugmatch(content, "{{ja%-verb|(.-)}}") do
            for param in mw.text.gsplit(template, "|") do
                local type = export.umatch(param, "type=(%w+)")
                if type then
                    return type
                end
            end
        end
    end
    return nil
end

function export.format_row(label, lemma, stem_kana, ending, is_suru, kana_only, suru_type)
    local ending_parts = mw.text.split(ending, "<br>")

    local kana_full_list = {}
    local romaji_full_list = {}
    local lemma_combined_list = {}

    for _, part in ipairs(ending_parts) do
        local full_kana_raw = stem_kana .. part
        local full_kana_clean = export.clean_kana_input(full_kana_raw)
        local part_romaji = export.kana_to_romaji(full_kana_raw)
        local part_lemma = is_suru and (lemma .. part) or (export.usub(lemma, 1, -2) .. part)
        local part_kana_for_annotation = full_kana_clean

        if label:match("명령형") then
            if is_suru then
                if suru_type == "suru-tsu" then
                    if part == "せよ" then part_lemma = part_lemma .. "<sup>1</sup>"; part_kana_for_annotation = part_kana_for_annotation .. "<sup>1</sup>"; part_romaji = part_romaji .. "<sup>1</sup>"; end
                    if part == "しろ" then part_lemma = part_lemma .. "<sup>2</sup>"; part_kana_for_annotation = part_kana_for_annotation .. "<sup>2</sup>"; part_romaji = part_romaji .. "<sup>2</sup>"; end
                elseif suru_type == "zuru" then
                    if part == "ぜよ" then part_lemma = part_lemma .. "<sup>1</sup>"; part_kana_for_annotation = part_kana_for_annotation .. "<sup>1</sup>"; part_romaji = part_romaji .. "<sup>1</sup>"; end
                    if part == "じろ" then part_lemma = part_lemma .. "<sup>2</sup>"; part_kana_for_annotation = part_kana_for_annotation .. "<sup>2</sup>"; part_romaji = part_romaji .. "<sup>2</sup>"; end
                elseif suru_type == "general" then
                    if part == "せよ" then part_lemma = part_lemma .. "<sup>1</sup>"; part_kana_for_annotation = part_kana_for_annotation .. "<sup>1</sup>"; part_romaji = part_romaji .. "<sup>1</sup>"; end
                    if part == "しろ" then part_lemma = part_lemma .. "<sup>2</sup>"; part_kana_for_annotation = part_kana_for_annotation .. "<sup>2</sup>"; part_romaji = part_romaji .. "<sup>2</sup>"; end
                end
            else
                if part == "よ" then
                    part_lemma = part_lemma .. "<sup>1</sup>"
                    part_kana_for_annotation = part_kana_for_annotation .. "<sup>1</sup>"
                    part_romaji = part_romaji .. "<sup>1</sup>"
                elseif part == "ろ" then
                    part_lemma = part_lemma .. "<sup>2</sup>"
                    part_kana_for_annotation = part_kana_for_annotation .. "<sup>2</sup>"
                    part_romaji = part_romaji .. "<sup>2</sup>"
                end
            end
        elseif label:match("가능형") and not is_suru then
            if part == "れる" then
                part_lemma = part_lemma .. "<sup>3</sup>"
                part_kana_for_annotation = part_kana_for_annotation .. "<sup>3</sup>"
                part_romaji = part_romaji .. "<sup>3</sup>"
            end
        end

        table.insert(kana_full_list, part_kana_for_annotation)
        table.insert(romaji_full_list, part_romaji)
        table.insert(lemma_combined_list, part_lemma)

    end

    local kana_combined = export.concat(kana_full_list, "<br>")
    local romaji_combined = export.concat(romaji_full_list, "<br>")
    local lemma_combined_str = export.concat(lemma_combined_list, "<br>")

    local row_content
    if kana_only then
        row_content = string.format(
            [=[<th style="width: 25%%;">%s</th><td style="width: 37.5%%;"><span class="Jpan" lang="ja-Jpan">%s</span></td><td style="width: 37.5%%;"><i><span class="Latn" lang="ja-Latn">%s</span></i></td>]=],
            label, kana_combined, romaji_combined
        )
    else
        row_content = string.format(
            [=[<th style="width: 25%%;">%s</th><td style="width: 25%%;"><span class="Jpan" lang="ja-Jpan">%s</span></td><td style="width: 25%%;"><span class="Jpan" lang="ja-Jpan"">%s</span></td><td style="width: 25%%;"><i><span class="Latn" lang="ja-Latn">%s</span></i></td>]=],
            label, lemma_combined_str, kana_combined, romaji_combined
        )
    end
    return "<tr>" .. row_content .. "</tr>"
end

function export.generate_base_table_html(display_lemma, rows_html, core_expressions_html, kana_only, is_suru_verb_type, verb_type_string)
    local table_header_cells
    if kana_only then
        table_header_cells = '<th colspan="3">어간 형태</th>'
    else
        table_header_cells = '<th colspan="4">어간 형태</th>'
    end
    local core_header_cells = table_header_cells:gsub("어간 형태", "핵심 표현")
    
    local table_template_suffix = ""
    if is_suru_verb_type then
    	table_template_suffix = '<p>&sup1; <small>문어체</small> &sup2; <small>구어체</small></p>'
    elseif verb_type_string == "ichidan" then
    	table_template_suffix = '<p>&sup1; <small>문어체</small> &sup2; <small>구어체</small> &sup3; <small>구어체 가능형</small></p>'
    end

    local table_template = [=[<div class="NavFrame" style="border:0px;"><div class="NavHead" align="left" style="font-weight:bold; border:1px solid darkgrey; margin-left:-1px; background-color: var(--nav-head-background, #EAECF0); color: var(--nav-head-text-color, #000000);"><span class="Jpan" lang="ja-Jpan" style="font-size:120%%;">"%s"</span>의 동사 활용 ([[부록:일본어 동사|부록:일본어 동사]])</div><div class="NavContent" style="font-size:105%%;"><table class="wikitable" style="margin-top: 0; text-align: center; width: 100%%; color: var(--table-text-color, #000000); background: var(--table-background-color, #FFFFFF);" rules="all"><tr>%s</tr>%s<tr>%s</tr>%s</table>%s</div></div>]=]

    return string.format(table_template, display_lemma, table_header_cells, rows_html, core_header_cells, core_expressions_html, table_template_suffix)
end

return export