Loncat ke isi

Modul:autocat

Deri Wikikamus

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

local p = {}

local U = require("Modul:utilities")
local Lang = require("Modul:lang")

-- Category definitions
local categoryTree = {
    -- Bawaan
    ["Perihal"]                       = { base = true, topical = true },
	["Lambang"]                       = { base = true, global = true },
    ["Pengopènan halaman"]            = { base = true, global = true },
    ["Pengujungan"]                   = { base = true, global = true },
    ["Pentol kata"]                   = { base = true, global = true },
    ["Anakpentol kata"]               = { base = true, global = true },
    ["Ragem basa"]                    = { base = true, global = true },
    ["Setilah ngikut asal-muasalnya"] = { base = true, global = true },
    ["Setilah gacoan"]                = { base = true, global = true },

    -- Pentol kata turunannya
    ["Gegeroan"]                 = { parents = { "Pentol kata" }, global = true },
    ["Kata kereja"]              = { parents = { "Pentol kata" }, global = true },
    ["Kata nama"]                = { parents = { "Kata peada" }, global = true },
    ["Kata peada"]               = { parents = { "Pentol kata" }, global = true },
    ["Kata penerang"]            = { parents = { "Pentol kata" }, global = true },
    ["Kata pengangka"]           = { parents = { "Pentol kata" }, global = true },
    ["Kata pengganti"]           = { parents = { "Pentol kata" }, global = true },
    ["Kata penjuntrung"]         = { parents = { "Pentol kata" }, global = true },
    ["Kata penyipat"]            = { parents = { "Pentol kata" }, global = true },
    ["Pendengkèkan"]             = { parents = { "Pentol kata" }, global = true },
    ["Pengahiran"]               = { parents = { "Pentol kata" }, global = true },
    ["Pengawalan"]               = { parents = { "Pentol kata" }, global = true },
    ["Penimpalan"]               = { parents = { "Pentol kata" }, global = true },
    ["Petilan"]                  = { parents = { "Pentol kata" }, global = true },
    ["Pasian"]                   = { parents = { "Pentol kata" }, global = true },
    ["Setilah rèndèngan kata"]   = { parents = { "Pentol kata" }, global = true },
    
    -- Setilah rèndèngan kata
    ["Gabungan kata"]            = { parents = { "Setilah rèndèngan kata" }, global = true },
    ["Peribasa kata"]            = { parents = { "Setilah rèndèngan kata" }, global = true },
    
    -- Pasian
    ["Depanan"]                  = { parents = { "Pasian" }, global = true },
    ["Kintilan"]                 = { parents = { "Pasian" }, global = true },
    
    -- Lambang
    ["Hurup"]                    = { parents = { "Lambang" }, global = true },

    -- Anakpentol kata
    ["Kata kereja punya jogrokan"]   = { parents = { "Anakpentol kata", "Kata kereja" }, global = true },
    ["Kata nama punya jogrokan"]     = { parents = { "Anakpentol kata", "Kata nama" }, global = true },
    ["Kata peada punya jogrokan"]    = { parents = { "Anakpentol kata", "Kata peada" }, global = true },
    ["Kata penerang punya jogrokan"] = { parents = { "Anakpentol kata", "Kata penerang" }, global = true },
    ["Kata pengangka punya jogrokan"]= { parents = { "Anakpentol kata", "Kata pengangka" }, global = true },
    ["Kata pengganti punya jogrokan"]= { parents = { "Anakpentol kata", "Kata pengganti" }, global = true },
    ["Kata penyipat punya jogrokan"] = { parents = { "Anakpentol kata", "Kata penyipat" }, global = true },
    ["Penimpalan punya jogrokan"]    = { parents = { "Anakpentol kata", "Penimpalan" }, global = true },
    ["Dumanan"]                      = { parents = { "Kata kereja punya jogrokan" }, global = true },

    -- Pengopènan halaman
    ["Setilah dengen pelapalan HPA"]         = { parents = { "Pengopènan halaman" }, global = true },
    ["Setilah dengen sènggètan bebunyian"]   = { parents = { "Pengopènan halaman" }, global = true },
    ["Setilah dengen tukilan"]               = { parents = { "Pengopènan halaman" }, global = true },
    ["Setilah dengen tulad ujar"]            = { parents = { "Pengopènan halaman" }, global = true },
    ["Setilah dengen ragem hurup laènan"]    = { parents = { "Pengopènan halaman" }, global = true },
    ["Setilah dengen penglatènan"]           = { parents = { "Pengopènan halaman" }, global = true },

	-- Perihal
	["Perihal nama"] = { parents = { "Perihal"}, topical = true },
		["Perihal gutekan"] = { parents = { "Perihal nama"}, topical = true },
			["Perihal negara"] = { parents = { "Perihal gutekan"}, topical = true },
			["Perihal daèrah ujud bumi èn budaya"] = { parents = { "Perihal gutekan"}, topical = true },
				["Perihal benua"] = { parents = { "Perihal daèrah ujud bumi èn budaya"}, topical = true }
}

-- Etymology category types
-- If value = true → base type
-- If value = "<parent>" → subtype, parent = that base type
local etymTypes = {
    otherlang = {
        ["Pinjeman"]       = true,
        ["Pinjeman bodong"]= "Pinjeman",
        ["Pinjeman comotan"]= "Pinjeman",
        ["Pinjeman plek"]= "Pinjeman",
        ["Turunan"]        = true,
        ["Terusan"]        = true,
    },
    samelang  = {
        ["Ambrekan"] = true,
        ["Takopan"]  = true,
    },
}

-- Unified global category insertion
local globalCats = function(cat)
    return { U.cat(cat .. " ngikut basanya") }
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("Ni bangsaan bakal %s deri %s dalem %s.", lcFirst(etyType), srcLangName, langNameNocap)
    elseif isSamelang then
        return string.format("Ni bangsaan bakal %s dalem %s.", lcFirst(usePart), langNameNocap)
    elseif usePart == "Pengujungan" then
        return string.format("Ni bangsaan bakal pengujungan dalem %s.", langNameNocap)
    elseif rhyme and not syll then
        return string.format("Ni bangsaan bakal pengujungan -%s dalem %s.", rhyme, langNameNocap)
    elseif rhyme and syll then
        return string.format("Ni bangsaan bakal pengujungan -%s dengen %s ucap dalem %s.", rhyme, syll, langNameNocap)
    else
        return string.format("Ni bangsaan bakal %s dalem %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("^Pengujungan/([^/]+)/(%d+) ucap$")
    if not rhyme then rhyme = usePart:match("^Pengujungan/([^/]+)$") 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, "Setilah ngikut asal-muasalnya"))
        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 == "Pengujungan" then
    elseif rhyme and not syll then
        table.insert(parents, U.langcat(langCode, "Pengujungan"))
    elseif rhyme and syll then
        table.insert(parents, U.langcat(langCode, "Pengujungan/" .. 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.topical then
            table.insert(parents, U.cat(usePart))
        end
        if def.global then
            table.insert(parents, U.cat(usePart .. " ngikut basanya"))
        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 .. " deri " .. srcLangName .. " ngikut basanya"))
    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