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