Pergi ke kandungan

Modul:category tree/affixes and compounds

Daripada Wikikamus

Submodul data ini mentakrifkan sebahagian daripada struktur kategori Wikikamus.

Untuk pengenalan kepada sistem poscatboiler dan penerangan tentang cara menambah atau mengubah suai kategori, lihat Modul:category tree/data/doc.

local labels = {}
local raw_categories = {}
local handlers = {}



-----------------------------------------------------------------------------
--                                                                         --
--                                  LABELS                                 --
--                                                                         --
-----------------------------------------------------------------------------


labels["Kata majmuk aliteratif"] = {
	description = "Frasa nama bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang beraliteratif.",
	parents = {"Kata majmuk", "Frasa aliteratif"},
}

labels["Kata majmuk antonim"] = {
	description = "kata majmuk bahasa {{{langname}}} yang sebahagiannya merupakan antonim kepada yang lain.",
	parents = {"Kata majmuk dvandva", sort = "antonim"},
}

labels["Kata majmuk bahuvrihi"] = {
	description = "kata majmuk bahasa {{{langname}}} yang bahagian pertamanya (A) mengubah bahagian keduanya (B), dan maknanya mengikuti corak [[metonim]]: “<seseorang> yang mempunyai B yang merupakan A.”",
	parents = {"Kata majmuk", "Kata majmuk eksosentrik"},
}

-- Add "compound POS" categories for various parts of speech.

local compound_poses = {
	"Kata sifat",
	"Adverba",
	"Kata hubung",
	"Kata penunjuk",
	"Kata seru",
	"Kata nama",
	"Kata bilangan",
	"Kata partikal",
	"Kata dudi",
	"Awalan",
	"Kata depan",
	"Kata ganti nama",
	"Kata nama khas nouns",
	"Akhiran",
	"Kata kerja",
}

for _, pos in ipairs(compound_poses) do
	labels[pos .. " majmuk"] = {
		description = pos .. "bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar.",
		parents = {{name = "Kata majmuk", sort = " "}, pos},
	}
end

labels["Kata majmuk penentu"] = {
	description = "kata majmuk penentu bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar.",
	parents = {"Kata majmuk", "penentu"},
}

labels["Kata majmuk"] = {
	description = "Istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar.",
	umbrella_parents = "Subkategori perkataan mengikut etimologi mengikut bahasa",
	parents = {"Perkataan mengikut etimologi"},
}

labels["Kata majmuk dvandva"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang boleh bersambungan dengan penambahan huruf 'dan'.",
	parents = {"Kata majmuk"},
}

labels["Kata majmuk endosentrik"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar, satu daripadanya ialah [[w:kata inti|kata inti]] kepada kata majmuk tersebut.",
	parents = {"Kata majmuk"},
}

labels["Kata majmuk endosentrik nama-nama"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar, satu daripadanya ialah [[w:kata inti|kata inti]] kepada kata majmuk tersebut.",
	breadcrumb = "nama-nama",
	parents = {"Kata majmuk endosentrik", "Kata majmuk"},
}

labels["Kata majmuk endosentrik kerja-nama"] = {
	description = "kata majmuk bahasa {{{langname}}} yang kata dasar pertamanya ialah kata kerja, yang kedua pula merupakan kata namaan dan kata inti kepada kata majmuk tersebut.",
	breadcrumb = "kerja-nama",
	parents = {"Kata majmuk endosentrik", "Kata majmuk kerja-nama"},
}

labels["Kata majmuk eksosentrik"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar, tiada daripadanya merupakan [[w:kata inti|kata inti]] kepada kata majmuk tersebut.",
	parents = {"Kata majmuk"},
}

labels["Kata majmuk eksosentrik kerja-nama"] = {
	description = "kata majmuk bahasa {{{langname}}} yang kata pertamanya ialah kata kerja transitif, kata keduanya merupakan kata nama yang berfungsi sebagai objek langsungnya, dan rerujuk merupakan orang atau benda yang melakukan tindakan tersebut.",
	breadcrumb = "kerja-nama",
	parents = {"Kata majmuk eksosentrik", "Kata majmuk kerja-nama"},
}

labels["Kata majmuk karmadharaya"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang kata dasar utamanya menentukan akhiran kasus itu.",
	parents = {"Kata majmuk tatpurusa"},
}

labels["Kata majmuk dvandva itaretara"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang kata dasarnya boleh bersambungan dengan penambahan perkataan 'dan'.",
	breadcrumb = "itaretara",
	parents = {"Kata majmuk dvandva"},
}

labels["Kata majmuk berima"] = {
	description = "Frasa nama bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang berima.",
	parents = {"Kata majmuk", "Frasa berima"},
}

labels["Kata majmuk dvandva samahara"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang kata dasar tersebut boleh bersambungan dengan penambahan perkataan 'dan'.",
	breadcrumb = "samahara",
	parents = {"Kata majmuk dvandva"},
}

labels["shitgibbons"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada kata [[ekspletif]] bersuku kata tunggal yang diikuti dengan [[troki]] bersuku kata dua yang berfungsi sebagai [[penominal]] atau [[pengamat]].",
	parents = {"Kata majmuk endosentrik"},
}

labels["Kata majmuk sinonim"] = {
	description = "kata majmuk bahasa {{{langname}}} yang sebahagiannya bersinonim dengan yang lain.",
	parents = {"Kata majmuk dvandva", sort = "sinonim"},
}

labels["Kata majmuk tatpurusa"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar",
	parents = {"Kata majmuk"},
}

labels["Kata majmuk kerja-nama"] = {
	description = "kata majmuk bahasa {{{langname}}} yang bahagian pertamanya merupakan kata kerja transitif, bahagian keduanya merupakan kata nama yang berfungsi sebagai objek langsungnya, dan rerujuk terlibat merupakan orang atau benda yang melakukan tindakan tersebut, atau merupakan adjektif yang menghurai orang atau benda tersebut.",
	parents = {"Kata majmuk kerja-objek"},
}

labels["Kata majmuk kerja-objek"] = {
	description = "kata majmuk bahasa {{{langname}}} yang bahagian pertamanya merupakan kata kerja transitif, dan bahagian keduanya merupakan istilah (selalunya tetapi bukan setiap kali merupakan kata nama) yang berfungsi sebagai objeknya (yang selalunya secara langsung), dan rerujuk terlibat merupakan orang atau benda yang melakukan tindakan tersebut, atau merupakan kata adjektif yang menghurai orang atau benda tersebut.",
	additional = "Contoh dalam bahasa Inggeris ialah {{m|en|pickpocket|lit=seseorang yang mencuri dompet}} dan {{m|en|catch-all|lit=sesuatu yang dapat semua benda}}.",
	parents = {"Kata majmuk"},
}

labels["Kata majmuk kerja-kerja"] = {
	description = "kata majmuk bahasa {{{langname}}} yang terdiri daripada dua atau lebih banyak kata kerja dalam bentuk iringan, selalunya merupakan pasangan sinonim atau antonim, dan rerujuk tersebut merujuk kata itu ke hasil perlakuan tindakan tersebut.",
	parents = {"Kata majmuk"},
}

labels["terbitan vrddhi"] = {
	description = "istilah bahasa {{{langname}}} yang diterbit dari kata akar bahasa Indo-Eropah Purba melalui proses terbitan [[w:vṛddhi|vṛddhi]].",
	parents = {"Perkataan mengikut etimologi"},
}

labels["gerundif vrddhi"] = {
	description = "[[gerundif]] bahasa {{{langname}}} yang diterbit dari kata akar bahasa Indo-Eropah Purba melalui proses penerbitan [[w:vṛddhi|vṛddhi]].",
	parents = {"terbitan vrddhi"},
}

labels["Kata majmuk vyadhikarana"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang apabila kata dasar bukan utama menentukan akhiran kasus.",
	parents = {"Kata majmuk tatpurusa"},
}

for _, fixtype in ipairs({"apitan", "sisipan", "jalinan", "awalan", "akhiran",}) do
	labels["Perkataan mengikut " .. fixtype] = {
		description = "Perkataan bahasa {{{langname}}} yang dikategori berdasarkan " .. fixtype .. ".",
		umbrella_parents = "Subkategori perkataan mengikut etimologi mengikut bahasa",
		parents = {{name = "Perkataan mengikut etimologi", sort = fixtype}},
	}
end


-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
	-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
	if not data.umbrella_parents then
		data.umbrella_parents = "Jenis kata majmuk mengikut bahasa"
	end
end



-----------------------------------------------------------------------------
--                                                                         --
--                              RAW CATEGORIES                             --
--                                                                         --
-----------------------------------------------------------------------------


raw_categories["Jenis kata majmuk mengikut bahasa"] = {
	description = "Kategori payung yang melangkaui topik berkenaan jenis kata majmuk.",
	additional = "{{{umbrella_meta_msg}}}",
	parents = {
		"Metakategori payung",
		{name = "Kata majmuk", is_label = true, sort = " "},
		{name = "Subkategori perkataan mengikut etimologi mengikut bahasa", sort = " "},
	},
}


-----------------------------------------------------------------------------
--                                                                         --
--                                 HANDLERS                                --
--                                                                         --
-----------------------------------------------------------------------------

-----------------------------------------------------------------------------
------------------------------ Affix handlers -------------------------------
-----------------------------------------------------------------------------

table.insert(handlers, function(data)
	-- First try the old pattern for backwards compatibility
	local labelpref, pos, affixtype, term_and_id = data.label:match("^(([a-z -]+) dengan ([a-z]+an) )(.+)$")
	
	-- If that didn't work, try the "bahasa [language]" pattern
	if not affixtype then
		-- Pattern: "Perkataan dengan [affixtype] [term] bahasa [language]"
		labelpref, affixtype, term_and_id = data.label:match("^(Perkataan dengan ([a-z]+an) )(.+)$")
		if affixtype and term_and_id then
			-- Remove " bahasa [language]" from the end of term_and_id
			term_and_id = term_and_id:match("^(.+) bahasa [^%s]+$") or term_and_id
			pos = "Perkataan" -- Default to "terms" since there's no specific POS
		end
	end
	
	if affixtype then
		local term, id = term_and_id:match("^(.+) %(([^()]+)%)$")
		term = term or term_and_id

		-- Convert term/alt into affixes if needed
		local desc = {
			["awalan"]		= "bermula dengan awalan",
			["akhiran"]		= "berhujung dengan akhiran",
			["apitan"]	= "dikurung dengan apitan",
			["sisipan"]		= "dipisah dengan sisipan",
			["jalinan"]	= "terhubung dengan jalinan",
			-- Transfixes not supported currently.
			-- ["transfix"]	= "patterned with the transfix",
		}
		if not desc[affixtype] then
			return nil
		end

		-- Here, {LANG} is replaced with the actual language, {TERM_AND_ID} with the actual term (or with 'TERM<id:ID>'
		-- if there is an ID), {BASE} with '<var>base</var>', {BASE2} with '<var>base2</var>', {BASE_EXPL} with an
		-- explanation of what "base" means, {BASE_BASE2_EXPL} with an explanation of what "base" and "base2" mean, and
		-- {POS} with '|pos=POS' if there is a `pos` other than "terms", otherwise a blank string.
		local what_categorizes = {
			["awalan"] = "{{tl|af|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} atau {{tl|affix|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} (atau padanan yang lebih spesifik dan kurang digalakkan {{tl|pre}} atau {{tl|prefix}}), dengan {BASE_EXPL}",
			["akhiran"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} atau {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} (atau padanan yang lebih spesifik dan kurang digalakkan {{tl|suf}} atau {{tl|suffix}}), dengan {BASE_EXPL}",
			["apitan"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} atau {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, dengan {BASE_EXPL}",
			["sisipan"] = "{{tl|infix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, dengan {BASE_EXPL}",
			["jalinan"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}|{BASE2}}} atau {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}|{BASE2}{POS}}}, dengan {BASE_BASE2_EXPL}",
		}

		local args = require("Module:parameters").process(data.args, {
			["alt"] = true,
			["sc"] = true,
			["sort"] = true,
			["tr"] = true,
			["ts"] = true,
		})
		local sc = data.sc or args.sc and require("Module:scripts").getByCode(args.sc, "sc") or nil
		local m_affix = require("Module:affix")
		-- Call make_affix to add display hyphens if they're not already present.
		local _, display_term, lookup_term = m_affix.make_affix(term, data.lang, sc, affixtype, nil, true)
		local _, display_alt = m_affix.make_affix(args.alt, data.lang, sc, affixtype)
		local _, display_tr = m_affix.make_affix(args.tr, data.lang, require("Module:scripts").getByCode("Latn"), affixtype)
		local _, display_ts = m_affix.make_affix(args.ts, data.lang, require("Module:scripts").getByCode("Latn"), affixtype)
		local m_script_utilities = require("Module:script utilities")
		local id_text = id and " (" .. id .. ")" or ""

		-- Compute parents.
		local parents = {}
		if id then
			if pos == "words" then
				-- don't allow formerly-named categories with "words"
				return nil
			end
			if pos == "Perkataan" then
				table.insert(parents, {name = labelpref .. term, sort = id, args = args})
			else
				table.insert(parents, {name = "Perkataan dengan " .. affixtype .. term_and_id, sort = id .. ", " .. pos, args = args})
				table.insert(parents, {name = labelpref .. term, sort = id, args = args})
			end
		elseif pos == "words" then
			-- don't allow formerly-named categories with "words"
			return nil
		elseif pos ~= "Perkataan" then
			table.insert(parents, {name = "Perkataan dengan " .. affixtype .. term, sort = pos, args = args})
		end
		table.insert(parents, {name = "Perkataan mengikut " .. affixtype, sort = (data.lang:makeSortKey((data.lang:makeEntryName(args.sort or term))))})

		-- If other affixes are mapped to this one, show them.
		local additional

		if data.lang then
			local langcode = data.lang:getCode()
			if m_affix.langs_with_lang_specific_data[langcode] then
				local langdata = mw.loadData(m_affix.affix_lang_data_module_prefix .. langcode)
				local variants = {}
				if langdata.affix_mappings then
					for variant, canonical in pairs(langdata.affix_mappings) do
						-- Above, we converted the stripped link term as we received it to the lookup form, so we
						-- can look up the variants that are mapped to this term. Once we find them, map them to
						-- display form.
						local is_variant = false
						if type(canonical) == "table" then
							for _, canonical_v in pairs(canonical) do
								if canonical_v == lookup_term then
									is_variant = true
									break
								end
							end
						else
							is_variant = canonical == lookup_term
						end
						if is_variant then
							local _, display_variant = m_affix.make_affix(variant, data.lang, sc, affixtype)
							table.insert(variants, "{{m|" .. langcode .. "|" .. display_variant .. "}}")
						end
					end
					if #variants > 0 then
						table.sort(variants)
						additional = ("This category also includes terms %sed with %s."):format(affixtype,
							require("Module:table").serialCommaJoin(variants))
					end
				end
			end
		end

		if data.lang then
			local what_categorizes_msg = what_categorizes[affixtype]
			if not what_categorizes_msg then
				error(("Internal error: No what_categorizes value for affixtype '%s' for label '%s', lang '%s'"):
					format(affixtype, data.label, data.lang:getCode()))
			end
			what_categorizes_msg = "Perkataan yang diletakkan di bawah kategori ini menggunakan " .. (what_categorizes_msg
				:gsub("{LANG}", data.lang:getCode())
				:gsub("{TERM_AND_ID}", require("Module:string utilities").replacement_escape(
					id and ("%s<id:%s>"):format(term, id) or term))
				:gsub("{POS}", require("Module:string utilities").replacement_escape(
					pos == "Perkataan" and "" or ("|pos=%s"):format(pos)))
				:gsub("{BASE}", "<var>base</var>")
				:gsub("{BASE2}", "<var>base2</var>")
				:gsub("{BASE_EXPL}", "<code><var>base</var></code> merupakan bentuk dasar lema yang menerbitkan perkataan ini")
				:gsub("{BASE_BASE2_EXPL}", "<code><var>base</var></code> dan <code><var>base2</var></code> merupakan " ..
					"bentuk dasar lema yang menerbitkan perkataan ini")
			) .. "."
			if additional then
				additional = additional .. "\n\n" .. what_categorizes_msg
			else
				additional = what_categorizes_msg
			end
		end

		return {
			description = pos .. " bahasa {{{langname}}} " .. desc[affixtype] .. " " .. require("Module:links").full_link({
				lang = data.lang, term = display_term, alt = display_alt, sc = sc, id = id, tr = display_tr, ts = display_ts}, "term") .. ".",
			additional = additional,
			breadcrumb = pos == "Perkataan" and m_script_utilities.tag_text(display_alt or display_term, data.lang, sc, "term") .. id_text or pos,
			displaytitle = labelpref .. m_script_utilities.tag_text(term, data.lang, sc, "term") .. id_text .. " bahasa {{{langname}}}",
			parents = parents,
			umbrella = false,
		}, true -- true = args handled
	end
end)


return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}