Capil ka isi

Modul:autocat

Matan Wiktionary

Dokumentasi untuk modul ini dapat dibuat di Modul:autocat/doc

local p = {}

local U = require("Modul:utilitas")
local Lang = require("Modul:bahasa")

-- Category definitions
local categoryTree = {
    -- Bawaan
    ["Simbul"]                        = { base = true, global = true },
    ["Pamaliharaan laman"]            = { base = true, global = true },
    ["Rima"]		        		  = { base = true, global = true },
    ["Léma"]				          = { base = true, global = true },
    ["Nonléma"]             		  = { base = true, global = true },
    ["Ragam basa"]                    = { base = true, global = true },
    ["Istilah manurut étimologi"]     = { base = true, global = true },
    ["Istilah homonim"]               = { base = true, global = true },
    ["Istilah undas"]                 = { base = true, global = true },

    -- Lema turunannya
    ["Interjeksi"]               = { parents = { "Léma" }, global = true },
    ["Kata gawi"]                = { parents = { "Léma" }, global = true },
    ["Nama diri"]                = { parents = { "Kata banda" }, global = true },
    ["Kata banda"]               = { parents = { "Léma" }, global = true },
    ["Kata panjalas"]            = { parents = { "Léma" }, global = true },
    ["Kata bilangan"]            = { parents = { "Léma" }, global = true },
    ["Kata ganti"]               = { parents = { "Léma" }, global = true },
    ["Kata panyambung"]          = { parents = { "Léma" }, global = true },
    ["Kata sipat"]               = { parents = { "Léma" }, global = true },
    ["Sirkumposisi"]             = { parents = { "Léma" }, global = true },
    ["Postposisi"]               = { parents = { "Léma" }, global = true },
    ["Preposisi"]                = { parents = { "Léma" }, global = true },
    ["Kata sandang"]             = { parents = { "Léma" }, global = true },
    ["Kata tugas"]               = { parents = { "Léma" }, global = true },
    ["Paribasa"]                 = { parents = { "Léma" }, global = true },
    ["Morfém"]                   = { parents = { "Léma" }, global = true },
    ["Istilah rangkaian kata"]   = { parents = { "Léma" }, global = true },

    -- Morfem
    ["Awalan"]                   = { parents = { "Morfém" }, global = true },
    ["Akhiran"]                  = { parents = { "Morfém" }, global = true },

    -- Sublema
    ["Bantuk kata gawi"]         = { parents = { "Subléma", "Kata gawi" }, global = true },
    ["Bantuk nama diri"]         = { parents = { "Subléma", "Namo diri" }, global = true },
    ["Bantuk kata banda"]        = { parents = { "Subléma", "Kata banda" }, global = true },
    ["Bantuk kata panjalas"]     = { parents = { "Subléma", "Kata panjalas" }, global = true },
    ["Bantuk kata bilangan"]     = { parents = { "Subléma", "Kata bilangan" }, global = true },
    ["Bantuk kata ganti"]        = { parents = { "Subléma", "Kata ganti" }, global = true },
    ["Bantuk kata sipat"]        = { parents = { "Subléma", "Kata sipat" }, global = true },
    ["Bantuk kata sandang"]      = { parents = { "Subléma", "Kata sandang" }, global = true },
    ["Partisip"]                 = { parents = { "Bantuk kata gawi" }, global = true },

    -- Pamaliharaan laman
    ["Istilah lawan paalunan IPA"]        = { parents = { "Pamaliharaan laman" }, global = true },
    ["Istilah lawan tautan audio"]        = { parents = { "Pamaliharaan laman" }, global = true },
    ["Istilah lawan papadah"]             = { parents = { "Pamaliharaan laman" }, global = true },
    ["Istilah lawan cuntuh kalimat"]      = { parents = { "Pamaliharaan laman" }, global = true },
    ["Istilah lawan ragam bantuk hurup"]  = { parents = { "Pamaliharaan laman" }, global = true },
    ["Istilah lawan bantuk hurup Latin"]  = { parents = { "Pamaliharaan laman" }, global = true },
    ["Istilah lawan parmintaan makna"]    = { parents = { "Pamaliharaan laman" }, global = true },
}

-- Etymology category types
-- If value = true → base type
-- If value = "<parent>" → subtype, parent = that base type
local etymTypes = {
    otherlang = {
        ["Pinjaman"]       = true,
        ["Pinjaman palsu"] = "Pinjaman",
        ["Katurunan"]      = true,
        ["Warisan"]        = true,
    },
    samelang  = {
        ["Gabungan"] = true,
        ["Paduan"]   = true,
    },
}

-- Unified global category insertion
local globalCats = function(cat)
    return { U.cat(cat .. " manurut basa") }
end

-- Helper: lowercase first letter only
local function lcFirst(str)
    if not str or str == "" then return str end
    return mw.ustring.lower(mw.ustring.sub(str, 1, 1)) .. mw.ustring.sub(str, 2)
end

-- Unified description generation
local function makeDescription(usePart, langNameNocap, rhyme, syll, etyType, srcLangName, isSamelang)
    if etyType and srcLangName then
        return string.format("Tumbung ngini baisi %s matan %s dalam %s.", lcFirst(etyType), srcLangName, langNameNocap)
    elseif isSamelang then
        return string.format("Tumbung ngini baisi %s dalam %s.", lcFirst(usePart), langNameNocap)
    elseif usePart == "Rima" then
        return string.format("Tumbung ngini baisi rima dalam %s.", langNameNocap)
    elseif rhyme and not syll then
        return string.format("Tumbung ngini baisi rima -%s dalam %s.", rhyme, langNameNocap)
    elseif rhyme and syll then
        return string.format("Tumbung ngini baisi rima -%s lawan %s suku kata dalam %s.", rhyme, syll, langNameNocap)
    else
        return string.format("Tumbung ngini baisi %s dalam %s.", lcFirst(usePart), langNameNocap)
    end
end

function p.main(frame)
    local title = mw.title.getCurrentTitle().text
    local langCode, usePart = title:match("^([^:]+):(.+)$")
    if not langCode or not usePart then return "" end

    local langName = Lang.getLangName{ args = { langCode } }
    local langNameNocap = lcFirst(langName)
    if not langName then return U.errorcat("basa") end

    local output, parents = {}, {}

    -- detect rhyme and syllable
    local rhyme, syll = usePart:match("^Rima/([^/]+)/(%d+) ucap$")
    if not rhyme then rhyme = usePart:match("^Rima/([^/]+)$") end

    -- detect cross-language
    local etyType, srcLangName = usePart:match("^(.+) deri (.+)$")
    if etyType and not etymTypes.otherlang[etyType] then
        etyType, srcLangName = nil, nil
    end

    -- etymology parents
    if etymTypes.otherlang[usePart] or etymTypes.samelang[usePart] then
        local etyParent = etymTypes.otherlang[usePart] or etymTypes.samelang[usePart]
        if etyParent == true then
            -- base type
            table.insert(parents, U.langcat(langCode, "Istilah manurut étimologi"))
        else
            -- subtype
            table.insert(parents, U.langcat(langCode, etyParent))
        end
        for _, cat in ipairs(globalCats(usePart)) do
            table.insert(parents, cat)
        end
    end

    -- Rhymecats hierarchy
    if usePart == "Rima" then
    elseif rhyme and not syll then
        table.insert(parents, U.langcat(langCode, "Rima"))
    elseif rhyme and syll then
        table.insert(parents, U.langcat(langCode, "Rima/" .. rhyme))
    end

    -- tree-defined parents
    local def = categoryTree[usePart]
    if def then
        if def.parents then
            for _, parent in ipairs(def.parents) do
                table.insert(parents, U.langcat(langCode, parent))
            end
        end
        if def.global then
            table.insert(parents, U.cat(usePart .. " manurut basa"))
        end
    end

    -- base language category
    if def and def.base then
        table.insert(parents, U.cat(langName))
    end

    -- cross-language parents
    if etyType and srcLangName then
        table.insert(parents, U.langcat(langCode, etyType))
        table.insert(parents, U.cat(etyType .. " matan " .. srcLangName .. " manurut basa"))
    end

    -- stack parents below description
    table.insert(output, makeDescription(usePart, langNameNocap, rhyme, syll, etyType, srcLangName, etymTypes.samelang[usePart]))
    if #parents > 0 then
        table.insert(output, table.concat(parents, "\n"))
    end

    return table.concat(output, "\n")
end

return p