Modul:category tree/poscatboiler/data/affixes and compounds

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/poscatboiler/data/doc.


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



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


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

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

labels["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", "majmuk eksosentrik"},
}

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

local compound_poses = {
	"kata adjektif",
	"kata adverba",
	"kata penghubung",
	"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["majmuk " .. pos] = {
		description = "" .. pos .. "bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar.",
		parents = {{name = "kata majmuk", sort = " "}, pos},
	}
end

labels["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 kata mengikut etimologi mengikut bahasa",
	parents = {"kata mengikut etimologi"},
}

labels["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["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["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 = {"majmuk endosentrik", "kata majmuk"},
}

labels["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 = {"majmuk endosentrik", "majmuk kerja-nama"},
}

labels["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["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 = {"majmuk eksosentrik ", "majmuk kerja-nama "},
}

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

labels["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 = {"majmuk dvandva "},
}

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

labels["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 = {"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 = {"majmuk endosentrik "},
}

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

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

labels["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 = {"majmuk kerja-objek"},
}

labels["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["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 = {"istilah berdasarkan 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["majmuk vyadhikarana"] = {
	description = "istilah bahasa {{{langname}}} yang terdiri daripada dua atau lebih kata dasar yang apabila kata dasar bukan utama menentukan akhiran kasus.",
	parents = {"majmuk tatpurusa"},
}

for _, fixtype in ipairs({"circumfix", "infix", "interfix", "prefix", "suffix",}) do
	labels["istilah oleh " .. fixtype] = {
		description = "istilah bahasa {{{langname}}} yang dikategori berdasarkan " .. fixtype .. "nya.",
		umbrella_parents = "Istilah berdasarkan subkategori etimologi mengikut bahasa",
		parents = {{name = "istilah berdasarkan etimologi", sort = fixtype}, 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 = "Istilah berdasarkan subkategori etimologi mengikut bahasa", sort = " "},
	},
}


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

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

table.insert(handlers, function(data)
	local labelpref, pos, affixtype, term_and_id = data.label:match("^(([a-z -]+) ([a-z]+fix)ed with )(.+)$")
	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 = {
			["prefix"]		= "bermula dengan awalan",
			["suffix"]		= "berhujung dengan akhiran",
			["circumfix"]	= "dikurung dengan apitan",
			["infix"]		= "dipisah dengan sisipan",
			["interfix"]	= "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 = {
			["prefix"] = "{{tl|af|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} or {{tl|affix|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} (or the more specific and less-preferred equivalents {{tl|pre}} or {{tl|prefix}}), where {BASE_EXPL}",
			["suffix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} (or the more specific and less-preferred equivalents {{tl|suf}} or {{tl|suffix}}), where {BASE_EXPL}",
			["circumfix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, where {BASE_EXPL}",
			["infix"] = "{{tl|infix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, where {BASE_EXPL}",
			["interfix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}|{BASE2}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}|{BASE2}{POS}}}, where {BASE_BASE2_EXPL}",
		}

		local params = {
			["alt"] = {},
			["sc"] = {},
			["sort"] = {},
			["tr"] = {},
			["ts"] = {},
		}
		local args = require("Module:parameters").process(data.args, params, nil, "category tree/poscatboiler/data/terms by etymology")
		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 == "terms" then
				table.insert(parents, {name = labelpref .. term, sort = id, args = args})
			else
				table.insert(parents, {name = "terms " .. affixtype .. "ed with " .. 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 ~= "terms" then
			table.insert(parents, {name = "terms " .. affixtype .. "ed with " .. term, sort = pos, args = args})
		end
		table.insert(parents, {name = "terms by " .. 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 = "Terms are placed in this category using " .. (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 == "terms" and "" or ("|pos=%s"):format(pos)))
				:gsub("{BASE}", "<var>base</var>")
				:gsub("{BASE2}", "<var>base2</var>")
				:gsub("{BASE_EXPL}", "<code><var>base</var></code> is the base lemma from which this term is derived")
				:gsub("{BASE_BASE2_EXPL}", "<code><var>base</var></code> and <code><var>base2</var></code> are the " ..
					"base lemmas from which this term is derived")
			) .. "."
			if additional then
				additional = additional .. "\n\n" .. what_categorizes_msg
			else
				additional = what_categorizes_msg
			end
		end

		return {
			description = "{{{langname}}} " .. pos .. " " .. 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 == "terms" and m_script_utilities.tag_text(display_alt or display_term, data.lang, sc, "term") .. id_text or pos,
			displaytitle = "{{{langname}}} " .. labelpref .. m_script_utilities.tag_text(term, data.lang, sc, "term") .. id_text,
			parents = parents,
			umbrella = false,
		}, true -- true = args handled
	end
end)


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