Modul:autocat
Tampaian
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