มอดูล:category tree/poscatboiler/data/ศัพท์แบ่งตามประเภทไวยากรณ์

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



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


labels["ศัพท์แบ่งตามประเภทไวยากรณ์"] = {
	description = "{{{langname}}} terms categorized by their grammatical category.",
	umbrella_parents = "มูลฐาน",
	parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["terms by grammatical category"] = labels["ศัพท์แบ่งตามประเภทไวยากรณ์"]

------- GENDER -------

for _, pos in ipairs { "คำนาม", "คำวิสามานยนาม", "คำสรรพนาม", "ปัจจัย" } do
	labels[pos .. "แบ่งตามเพศ"] = {
		description = "{{{langname}}} " .. pos .. " organized by the gender they belong to.",
		breadcrumb = "แบ่งตามเพศ",
		parents = {{name = pos, sort = "เพศ"}},
	}

	labels[pos .. " with irregular gender"] = {
		description = "{{{langname}}} " .. pos .. " whose ending is not typical for " .. pos .. " of their gender.",
		breadcrumb = "with irregular gender",
		parents = {{name = "irregular " .. pos, sort = "irregular gender"}},
	}
	
	labels[pos .. "ที่มีหลายเพศ"] = {
		description = "{{{langname}}} " .. pos .. " that belong to more than one gender.",
		breadcrumb = "มีหลายเพศ",
		parents = {{name = pos .. "แบ่งตามเพศ", sort = "หลายเพศ"}},
	}

	labels[pos .. "เพศรวม"] = {
		description = "{{{langname}}} " .. pos .. " of [[Appendix:Glossary#common gender|common gender]], i.e. belonging to a gender category that combines the function of [[Appendix:Glossary#masculine|masculine]] and [[Appendix:Glossary#feminine|feminine]] and is opposed to the [[Appendix:Glossary#neuter|neuter]] gender.",
		breadcrumb = "เพศรวม",
		parents = {pos .. "แบ่งตามเพศ"},
	}

	labels[pos .. "เพศหญิง"] = {
		description = "{{{langname}}} " .. pos .. " of [[Appendix:Glossary#feminine|feminine]] gender, i.e. belonging to a gender category that contains (among other things) female beings.",
		breadcrumb = "เพศหญิง",
		parents = {pos .. "แบ่งตามเพศ"},
	}

	labels[pos .. "เพศชาย"] = {
		description = "{{{langname}}} " .. pos .. " of [[Appendix:Glossary#masculine|masculine]] gender, i.e. belonging to a gender category that contains (among other things) male beings.",
		breadcrumb = "เพศชาย",
		parents = {pos .. "แบ่งตามเพศ"},
	}

	labels[pos .. "ที่เพศขึ้นอยู่กับความหมาย"] = {
		description = "{{{langname}}} " .. pos .. " that may be either [[Appendix:Glossary#masculine|masculine]] or [[Appendix:Glossary#feminine|feminine]] depending on whether they refer to male or female beings.",
		breadcrumb = "เพศขึ้นอยู่กับความหมาย",
		parents = {pos .. "แบ่งตามเพศ"},
	}

	labels[pos .. "เพศกลาง"] = {
		description = "{{{langname}}} " .. pos .. " of [[Appendix:Glossary#neuter|neuter]] gender, i.e. belonging to a gender category that does not usually contain male or female beings.",
		breadcrumb = "เพศกลาง",
		parents = {pos .. "แบ่งตามเพศ"},
	}
end


------- NOUN CLASSES -------

labels["คำนามแบ่งตามคลาส"] = {
	description = "{{{langname}}} nouns organized by the class they belong to.",
	breadcrumb = "แบ่งตามคลาส",
	parents = {{name = "คำนาม", sort = "คลาส"}},
}


------- ANIMACY -------


for _, pos in ipairs({"คำนาม", "ปัจจัย", "คำกริยา"}) do
	labels[pos .. "มีชีวิต"] = {
		description = "{{{langname}}} " .. pos .. " that refer to humans or animals.",
		breadcrumb = "มีชีวิต",
		parents = {pos},
	}
	
	labels[pos .. "ไม่มีชีวิต"] = {
		description = "{{{langname}}} " .. pos .. " that refer to inanimate objects (not humans or animals).",
		breadcrumb = "ไม่มีชีวิต",
		parents = {pos},
	}
	
	labels[pos .. "ที่มีหลายชีวิตภาพ"] = {
		description = "{{{langname}}} " .. pos .. " that belong to more than one animacy.",
		breadcrumb = "มีหลายชีวิตภาพ",
		parents = {{name = pos, sort = "หลายชีวิตภาพ"}},
	}
end	

for _, pos in ipairs({"คำนาม", "ปัจจัย"}) do
	-- This category should be used particularly in languages that have
	-- grammatical distinctions related to animals, such as Ukrainian.
	labels[pos .. "สัตว์"] = {
		description = "{{{langname}}} " .. pos .. " that refer to animals.",
		breadcrumb = "สัตว์",
		parents = {pos .. "มีชีวิต"},
	}
	
	-- This category should be used particularly in languages that have
	-- grammatical distinctions related to men, such as Polish.
	labels["nonvirile " .. pos] = {
		description = "{{{langname}}} plural " .. pos .. " that refer to a group without male humans.",
		breadcrumb = "nonvirile",
		parents = {pos, "พหูพจน์เท่านั้น"},
	}
	
	labels[pos .. "บุคคล"] = {
		description = "{{{langname}}} " .. pos .. " that refer to humans.",
		breadcrumb = "บุคคล",
		parents = {pos .. "มีชีวิต"},
	}
	
	-- This category should be used particularly in languages that have
	-- grammatical distinctions related to men, such as Polish.
	labels["virile " .. pos] = {
		description = "{{{langname}}} plural " .. pos .. " that refer to a group with at least one male human.",
		breadcrumb = "virile",
		parents = {pos, "พหูพจน์เท่านั้น"},
	}
end

------- INFLECTED PARTS OF SPEECH -------

-- Add "POS by inflection type", "irregular POS" and "POS by tone"
-- categories for (potentially) inflected parts of speech.

local inflected_poses = {
	"คำคุณศัพท์",
	"คำกริยาวิเศษณ์",
	"คำบ่งชี้",
	"คำนาม",
	"เลข",
	"พาร์ทิซิเพิล",
	"คำสรรพนาม",
	"คำวิสามานยนาม",
	"ปัจจัย",
	"คำกริยา",
}

for _, pos in ipairs(inflected_poses) do
	labels[pos .. "แบ่งตามชนิดการผันรูป"] = {
		description = "{{{langname}}} " .. pos .. " organized by the type of inflection they follow.",
		breadcrumb = "แบ่งตามชนิดการผันรูป",
		parents = {{name = pos, sort = "การผันรูป"}},
	}

	labels["irregular " .. pos] = {
		description = "{{{langname}}} " .. pos .. " that follow non-standard patterns of inflection.",
		breadcrumb = "irregular",
		parents = {pos .. "แบ่งตามชนิดการผันรูป"},
	}

	labels["defective " .. pos] = {
		description = "{{{langname}}} " .. pos .. " that lack one or more forms in their inflections.",
		breadcrumb = "defective",
		parents = {pos, "irregular " .. pos},
	}

	labels["suppletive " .. pos] = {
		description = "{{{langname}}} " .. pos .. " that have inflected forms from different roots.",
		breadcrumb = "suppletive",
		parents = {"irregular " .. pos},
	}
	
	if pos ~= "คำกริยา" and pos ~= "คำกริยาวิเศษณ์" then
		labels[pos .. "ผันรูปไม่ได้"] = {
			description = "{{{langname}}} " .. pos .. " that do not display additional grammatical relations by means of declension.",
			breadcrumb = "ผันรูปไม่ได้",
			parents = {pos .. "แบ่งตามชนิดการผันรูป"},
		}

		labels[pos .. "ที่มีการผันรูปหลายแบบ"] = {
			description = "{{{langname}}} " .. pos .. " that follow more than one type of inflection.",
			breadcrumb = "มีการผันรูปหลายแบบ",
			parents = {{name = pos .. "แบ่งตามชนิดการผันรูป", sort = "การผันรูปหลายแบบ"}},
		}
		
		labels[pos .. "ที่มีหลายพหูพจน์"] = {
			description = "{{{langname}}} " .. pos .. " that have more than one possible plural (sometimes with distinct meanings).",
			breadcrumb = "มีหลายพหูพจน์",
			parents = {{name = pos .. "แบ่งตามชนิดการผันรูป", sort = "พหูพจน์"}},
		}
	end

	labels[pos .. " by tone"] = {
		description = "{{{langname}}} " .. pos .. " organized by the tone they follow.",
		breadcrumb = "by tone",
		parents = {{name = pos .. "แบ่งตามชนิดการผันรูป", sort = "tone"}},
	}
	
	labels[pos .. " by vowel harmony"] = {
		description = "{{{langname}}} " .. pos .. " organized by the vowel harmony they follow.",
		breadcrumb = "by vowel harmony",
		parents = {{name = pos .. "แบ่งตามชนิดการผันรูป", sort = "vowel harmony"}},
	}
end

-- FIXME: Only used currently for Arabic; probably should be removed as a general category.
labels["irregular elative adjectives"] = {
	description = "{{{langname}}} elative adjectives that follow non-standard patterns of inflection.",
	parents = {"คำคุณศัพท์แบ่งตามชนิดการผันรูป"},
}

for _, pos in ipairs { "คำนาม", "คำวิสามานยนาม", "คำสรรพนาม" } do
	labels[pos .. " with unattested plurals"] = {
		description = "{{{langname}}} " .. pos .. " with unattested plurals.",
		breadcrumb = "with unattested plurals",
		parents = {{name = pos, sort = "unattested plurals"}},
	}
	labels[pos .. "ชี้เฉพาะ"] = {
		description = "{{{langname}}} " .. pos .. " that are inherently definite and have definite concord.",
		breadcrumb = "ชี้เฉพาะ",
		parents = {pos .. "แบ่งตามชนิดการผันรูป"},
	}
end


------- GERMANIC VERB CLASSES -------

-- FIXME: Not clear this belongs among the general categories.

labels["คำกริยาแข็ง"] = {
	description = "{{{langname}}} verbs that present different stem vowels in their typically regular conjugated forms.",
	breadcrumb = "แข็ง",
	parents = {"คำกริยาแบ่งตามชนิดการผันรูป"},
}
labels["strong verbs"] = labels["คำกริยาแข็ง"]

labels["คำกริยาอ่อน"] = {
	description = "{{{langname}}} verbs that display dental suffixes in their past tense conjugated forms.",
	breadcrumb = "อ่อน",
	parents = {"คำกริยาแบ่งตามชนิดการผันรูป"},
}
labels["weak verbs"] = labels["คำกริยาอ่อน"]

labels["preterite-present verbs"] = {
	description = "{{{langname}}} verbs that inflect in the present tense like the past tense of strong verbs.",
	breadcrumb = "preterite-present",
	parents = {"คำกริยาแบ่งตามชนิดการผันรูป"},
}

labels["คำกริยาแข็งคลาส 1"] = {
	description = "Verbs where the [[ablaut]] vowel was followed by ''-y-'' in Proto-Indo-European.",
	breadcrumb = "คลาส 1",
	parents = {{name = "คำกริยาแข็ง", sort = "1"}},
}
labels["class 1 strong verbs"] = labels["คำกริยาแข็งคลาส 1"]

labels["คำกริยาอ่อนคลาส 1"] = {
	description = "Weak verbs of the first class.",
	breadcrumb = "คลาส 1",
	parents = {{name = "คำกริยาอ่อน", sort = "1"}},
}
labels["class 1 weak verbs"] = labels["คำกริยาอ่อนคลาส 1"]

labels["คำกริยาแข็งคลาส 2"] = {
	description = "Verbs where the [[ablaut]] vowel was followed by ''-w-'' in Proto-Indo-European.",
	breadcrumb = "คลาส 2",
	parents = {{name = "คำกริยาแข็ง", sort = "2"}},
}
labels["class 2 strong verbs"] = labels["คำกริยาแข็งคลาส 2"]

labels["คำกริยาแข็งคลาส 2a"] = {
	description = "Verbs where the [[ablaut]] vowel was *eu in Proto-Germanic.",
	breadcrumb = "คลาส 2a",
	parents = {{name = "คำกริยาแข็งคลาส 2", sort = "1"}},
}
labels["class 2a strong verbs"] = labels["คำกริยาแข็งคลาส 2a"]

labels["คำกริยาแข็งคลาส 2b"] = {
	description = "Verbs where the [[ablaut]] vowel was *ū in Proto-Germanic.",
	breadcrumb = "คลาส 2b",
	parents = {{name = "คำกริยาแข็งคลาส 2", sort = "2"}},
}
labels["class 2b strong verbs"] = labels["คำกริยาแข็งคลาส 2b"]

labels["คำกริยาอ่อนคลาส 2"] = {
	description = "Weak verbs of the second class.",
	breadcrumb = "คลาส 2",
	parents = {{name = "คำกริยาอ่อน", sort = "2"}},
}
labels["class 2 weak verbs"] = labels["คำกริยาอ่อนคลาส 2"]

labels["คำกริยาอ่อนคลาส 3"] = {
	description = "Weak verbs of the third class.",
	breadcrumb = "คลาส 3",
	parents = {{name = "คำกริยาอ่อน", sort = "3"}},
}
labels["class 3 weak verbs"] = labels["คำกริยาอ่อนคลาส 3"]

labels["คำกริยาแข็งคลาส 3"] = {
	description = "Verbs where the [[ablaut]] vowel was followed by a [[consonant cluster]] in Proto-Indo-European.",
	breadcrumb = "คลาส 3",
	parents = {{name = "คำกริยาแข็ง", sort = "3"}},
}
labels["class 3 strong verbs"] = labels["คำกริยาแข็งคลาส 3"]

labels["คำกริยาแข็งคลาส 3a"] = {
	description = "Verbs where the [[consonant cluster]] begins with a nasal consonant.",
	breadcrumb = "คลาส 3a",
	parents = {{name = "คำกริยาแข็งคลาส 3", sort = "1"}},
}
labels["class 3a strong verbs"] = labels["คำกริยาแข็งคลาส 3a"]

labels["คำกริยาแข็งคลาส 3b"] = {
	description = "Verbs where the [[consonant cluster]] begins with a lateral consonant or velar fricative.",
	breadcrumb = "คลาส 3b",
	parents = {{name = "คำกริยาแข็งคลาส 3", sort = "2"}},
}
labels["class 3b strong verbs"] = labels["คำกริยาแข็งคลาส 3b"]

labels["คำกริยาแข็งคลาส 3c"] = {
	description = "Verbs where the [[consonant cluster]] begins with a rhotic consonant.",
	breadcrumb = "คลาส 3c",
	parents = {{name = "คำกริยาแข็งคลาส 3", sort = "3"}},
}
labels["class 3c strong verbs"] = labels["คำกริยาแข็งคลาส 3c"]

labels["คำกริยาแข็งคลาส 4"] = {
	description = "Verbs where the [[ablaut]] vowel was followed by a [[sonorant]] (''m'', ''n'', ''l'', ''r'') but no other consonant in Proto-Indo-European.",
	breadcrumb = "คลาส 4",
	parents = {{name = "คำกริยาแข็ง", sort = "4"}},
}
labels["class 4 strong verbs"] = labels["คำกริยาแข็งคลาส 4"]

labels["คำกริยาอ่อนคลาส 4"] = {
	description = "Weak verbs of the fourth class.",
	breadcrumb = "คลาส 4",
	parents = {{name = "คำกริยาอ่อน", sort = "4"}},
}
labels["class 4 weak verbs"] = labels["คำกริยาอ่อนคลาส 4"]

labels["คำกริยาแข็งคลาส 5"] = {
	description = "Verbs where the [[ablaut]] vowel was followed by [[consonant]] other than a [[sonorant]] in Proto-Indo-European.",
	breadcrumb = "คลาส 5",
	parents = {{name = "คำกริยาแข็ง", sort = "5"}},
}
labels["class 5 strong verbs"] = labels["คำกริยาแข็งคลาส 5"]

labels["คำกริยาแข็งคลาส 6"] = {
	description = "The Proto-Indo-European origin of this class is not securely known. It contains verbs with the stem vowel ''-a-'', except those where it is followed by a sonorant and another consonant (this combination was considered a diphthong in PIE and therefore belonged to class 7).",
	breadcrumb = "คลาส 6",
	parents = {{name = "คำกริยาแข็ง", sort = "6"}},
}
labels["class 6 strong verbs"] = labels["คำกริยาแข็งคลาส 6"]

labels["คำกริยาแข็งคลาส 7"] = {
	description = "Verbs that retained their reduplication in the past tense in Proto-Germanic.",
	breadcrumb = "คลาส 7",
	parents = {{name = "คำกริยาแข็ง", sort = "7"}},
}
labels["class 7 strong verbs"] = labels["คำกริยาแข็งคลาส 7"]

labels["คำกริยาแข็งคลาส 7a"] = {
	description = "Class 7 strong verbs where the root vowel was ''*ai'' in Proto-Germanic, analogous to class 1.",
	breadcrumb = "คลาส 7a",
	parents = {{name = "คำกริยาแข็งคลาส 7", sort = "a"}},
}
labels["class 7a strong verbs"] = labels["คำกริยาแข็งคลาส 7a"]

labels["คำกริยาแข็งคลาส 7b"] = {
	description = "Class 7 strong verbs where the root vowel was ''*au'' in Proto-Germanic, analogous to class 2.",
	breadcrumb = "คลาส 7b",
	parents = {{name = "คำกริยาแข็งคลาส 7", sort = "b"}},
}
labels["class 7b strong verbs"] = labels["คำกริยาแข็งคลาส 7b"]

labels["คำกริยาแข็งคลาส 7c"] = {
	description = "Class 7 strong verbs where the root vowel was ''*a'' followed by a [[consonant cluster]] in Proto-Germanic, analogous to class 3.",
	breadcrumb = "คลาส 7c",
	parents = {{name = "คำกริยาแข็งคลาส 7", sort = "c"}},
}
labels["class 7c strong verbs"] = labels["คำกริยาแข็งคลาส 7c"]

labels["คำกริยาแข็งคลาส 7d"] = {
	description = "Class 7 strong verbs where the root vowel was ''*ē'' in Proto-Germanic.",
	breadcrumb = "คลาส 7d",
	parents = {{name = "คำกริยาแข็งคลาส 7", sort = "d"}},
}
labels["class 7d strong verbs"] = labels["คำกริยาแข็งคลาส 7d"]

labels["คำกริยาแข็งคลาส 7e"] = {
	description = "Class 7 strong verbs where the root vowel was ''*ō'' in Proto-Germanic.",
	breadcrumb = "คลาส 7e",
	parents = {{name = "คำกริยาแข็งคลาส 7", sort = "e"}},
}
labels["class 7e strong verbs"] = labels["คำกริยาแข็งคลาส 7e"]


local labels2 = {}

-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
	labels2[key] = data
	if not data.umbrella_parents then
		data.umbrella_parents = "หมวดหมู่ย่อยของศัพท์แบ่งตามประเภทไวยากรณ์แบ่งตามภาษา"
	end
end



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


raw_categories["หมวดหมู่ย่อยของศัพท์แบ่งตามประเภทไวยากรณ์แบ่งตามภาษา"] = {
	description = "Umbrella categories covering topics related to grammatical categories, such as gender, animacy and noun and verb classes.",
	additional = "{{{umbrella_meta_msg}}}",
	parents = {
		"หมวดหมู่ใหญ่รวมหัวข้อ",
		{name = "ศัพท์แบ่งตามประเภทไวยากรณ์", is_label = true, sort = " "},
	},
}



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


table.insert(handlers, function(data)
	local class = data.label:match("^คำนามคลาส ([0-9a-z]+)$")
	if class then
		local classnum, suffix = class:match("^([0-9]+)([a-z]*)$")
		return {
			description =
				"{{{langname}}} nouns that belong to class " .. class .. ".",
			breadcrumb = class,
			umbrella = false,
			parents = {{
				name = "คำนามแบ่งตามคลาส",
				sort = classnum and ("#%02d"):format(classnum) .. suffix or class,
			}},
		}
	end
end)

table.insert(handlers, function(data)
	local pos, tone = data.label:match("^(.+) with tone ([^ ]+)$")
	if pos then
		return {
			description = "{{{langname}}} " .. pos .. " with tone " .. tone .. ".",
			breadcrumb = tone,
			-- FIXME, should there be an umbrella category e.g. 'Adjectives with tone H by language'?
			umbrella = false,
			parents = {{
				name = pos .. " by tone",
				sort = "" .. tone:len() .. tone,
			}},
		}
	end
end)

table.insert(handlers, function(data)
	local vh, pos = data.label:match("^(.+)-harmonic ([^ ]+)$")
	if pos then
		return {
			description = "{{{langname}}} " .. pos .. " with vowel harmony in " .. vh .. ".",
			breadcrumb = vh,
			umbrella = false,
			parents = {{
				name = pos .. " by vowel harmony",
				sort = "" .. vh:len() .. vh,
			}},
		}
	end
end)

table.insert(handlers, function(data)
	local pos, classifier = data.label:match("^(คำนาม)ที่ใช้คำลักษณนาม (.+)$")
	if pos then
		local linktext
		if data.lang then
			if data.lang:getCode() == "zh" then
				linktext = require("Module:zh/link").link(nil, true, { classifier, tr = "-" }, classifier)
			else
				linktext = require("Module:links").full_link({ term = classifier, lang = data.lang }, "term")
			end
		else
			linktext = classifier
		end
		return {
			description = "{{{langname}}} " .. pos .. " using " .. linktext .. " as their classifier.",
			breadcrumb = classifier,
			umbrella = false,
			parents = {{
				name = pos .. "แบ่งตามคำลักษณนาม",
				sort = data.lang and data.lang:getCode() == "zh" and require("Module:Hani-sortkey").makeSortKey(classifier) or classifier,
			}},
		}
	end
end)


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