Module:category tree/poscatboiler/data/terms by grammatical category

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

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

labels["terms by grammatical category"] = { description = " terms categorized by their grammatical category.", umbrella_parents = "Fundamental", parents = , }

--- GENDER ---

for _, pos in ipairs { "nouns", "pronouns", "proper nouns", "suffixes" } do labels[pos .. " by gender"] = { description = " " .. pos .. " organized by the gender they belong to.", breadcrumb = "by gender", parents = , }

labels[pos .. " with irregular gender"] = { description = " " .. pos .. " whose ending is not typical for " .. pos .. " of their gender.", breadcrumb = "with irregular gender", parents = , }	labels[pos .. " with multiple genders"] = { description = " " .. pos .. " that belong to more than one gender.", breadcrumb = "with multiple genders", parents = , }

labels["common-gender " .. pos] = { description = " " .. pos .. " of, i.e. belonging to a gender category that combines the function of and  and is opposed to the  gender.", breadcrumb = "common-gender", parents = {pos .. " by gender"}, }

labels["feminine " .. pos] = { description = " " .. pos .. " of gender, i.e. belonging to a gender category that contains (among other things) female beings.", breadcrumb = "feminine", parents = {pos .. " by gender"}, }

labels["masculine " .. pos] = { description = " " .. pos .. " of gender, i.e. belonging to a gender category that contains (among other things) male beings.", breadcrumb = "masculine", parents = {pos .. " by gender"}, }

labels["masculine and feminine " .. pos .. " by sense"] = { description = " " .. pos .. " that may be either or  depending on whether they refer to male or female beings.", breadcrumb = "masculine and feminine by sense", parents = {pos .. " by gender"}, }

labels["neuter " .. pos] = { description = " " .. pos .. " of gender, i.e. belonging to a gender category that does not usually contain male or female beings.", breadcrumb = "neuter", parents = {pos .. " by gender"}, }

labels["gender-neutral " .. pos] = { description = " " .. pos .. " that are applicable to all people, independent of gender.", breadcrumb = "gender-neutral", parents = {pos .. " by gender", "gender-neutral terms"}, } end

for _, pos in ipairs({"adjectives", "suffixes"}) do labels["epicene " .. pos] = { description = " " .. pos .. " whose form is the same for both and, in languages whose " .. pos .. " normally distinguish gender.", breadcrumb = "epicene", parents = {pos .. " by inflection type"}, } end

--- NOUN CLASSES ---

labels["nouns by class"] = { description = " nouns organized by the class they belong to.", breadcrumb = "by class", parents = , }

labels["alienable nouns"] = { description = " nouns that are alienably possessed.", breadcrumb = "alienable", parents = {"nouns"}, }

labels["inalienable nouns"] = { description = " nouns that are inalienably possessed.", breadcrumb = "inalienable", parents = {"nouns"}, }

--- ANIMACY ---

for _, pos in ipairs({"nouns", "suffixes", "verbs"}) do labels["animate " .. pos] = { description = " " .. pos .. " that refer to humans or animals.", breadcrumb = "animate", parents = {pos}, }	labels["inanimate " .. pos] = { description = " " .. pos .. " that refer to inanimate objects (not humans or animals).", breadcrumb = "inanimate", parents = {pos}, }	labels[pos .. " with multiple animacies"] = { description = " " .. pos .. " that belong to more than one animacy.", breadcrumb = "with multiple animacies", parents = , } end

for _, pos in ipairs({"nouns", "suffixes"}) do	-- This category should be used particularly in languages that have -- grammatical distinctions related to animals, such as Ukrainian. labels["animal " .. pos] = { description = " " .. pos .. " that refer to animals.", breadcrumb = "animal", parents = {"animate " .. pos}, }	-- This category should be used particularly in languages that have -- grammatical distinctions related to men, such as Polish. labels["nonvirile " .. pos] = { description = " plural " .. pos .. " that refer to a group without male humans.", breadcrumb = "nonvirile", parents = {pos, "pluralia tantum"}, }	labels["personal " .. pos] = { description = " " .. pos .. " that refer to humans.", breadcrumb = "personal", parents = {"animate " .. pos}, }	-- This category should be used particularly in languages that have -- grammatical distinctions related to men, such as Polish. labels["virile " .. pos] = { description = " plural " .. pos .. " that refer to a group with at least one male human.", breadcrumb = "virile", parents = {pos, "pluralia tantum"}, } 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 = { "adjectives", "adverbs", "determiners", "nouns", "numerals", "participles", "pronouns", "proper nouns", "suffixes", "verbs", }

for _, pos in ipairs(inflected_poses) do labels[pos .. " by inflection type"] = { description = " " .. pos .. " organized by the type of inflection they follow.", breadcrumb = "by inflection type", parents = , }

labels["irregular " .. pos] = { description = " " .. pos .. " that follow non-standard patterns of inflection.", breadcrumb = "irregular", parents = {pos .. " by inflection type"}, }

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

labels["suppletive " .. pos] = { description = " " .. pos .. " that have inflected forms from different roots.", breadcrumb = "suppletive", umbrella_parents = "Suppletion subcategories by language", parents = {"irregular " .. pos}, }	if pos ~= "verbs" and pos ~= "adverbs" then labels["indeclinable " .. pos] = { description = " " .. pos .. " that do not display additional grammatical relations by means of declension.", breadcrumb = "indeclinable", parents = {pos .. " by inflection type"}, }

labels[pos .. " with multiple declensions"] = { description = " " .. pos .. " that follow more than one type of inflection.", breadcrumb = "with multiple declensions", parents = , }		labels[pos .. " with multiple plurals"] = { description = " " .. pos .. " that have more than one possible plural (sometimes with distinct meanings).", breadcrumb = "with multiple plurals", parents = , }	end

labels[pos .. " by tone"] = { description = " " .. pos .. " organized by the tone they follow.", breadcrumb = "by tone", parents = , }	labels[pos .. " by vowel harmony"] = { description = " " .. pos .. " organized by the vowel harmony they follow.", breadcrumb = "by vowel harmony", parents = , } end

-- FIXME: Only used currently for Arabic; probably should be removed as a general category. labels["irregular elative adjectives"] = { description = " elative adjectives that follow non-standard patterns of inflection.", parents = {"adjectives by inflection type"}, }

for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do labels[pos .. " with unattested plurals"] = { description = " " .. pos .. " with unattested plurals.", breadcrumb = "with unattested plurals", parents = , }	labels["definite " .. pos] = { description = " " .. pos .. " that are inherently definite and have definite concord.", breadcrumb = "definite", parents = {pos .. " by inflection type"}, } end

--- GERMANIC VERB CLASSES ---

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

labels["strong verbs"] = { description = " verbs that present different stem vowels in their typically regular conjugated forms.", breadcrumb = "strong", parents = {"verbs by inflection type"}, }

labels["weak verbs"] = { description = " verbs that display dental suffixes in their past tense conjugated forms.", breadcrumb = "weak", parents = {"verbs by inflection type"}, }

labels["preterite-present verbs"] = { description = " verbs that inflect in the present tense like the past tense of strong verbs.", breadcrumb = "preterite-present", parents = {"verbs by inflection type"}, }

labels["class 1 strong verbs"] = { description = "Verbs where the ablaut vowel was followed by -y- in Proto-Indo-European.", breadcrumb = "class 1", parents = , }

labels["class 1 weak verbs"] = { description = "Weak verbs of the first class.", breadcrumb = "class 1", parents = , }

labels["class 2 strong verbs"] = { description = "Verbs where the ablaut vowel was followed by -w- in Proto-Indo-European.", breadcrumb = "class 2", parents = , }

labels["class 2a strong verbs"] = { description = "Verbs where the ablaut vowel was *eu in Proto-Germanic.", breadcrumb = "class 2a", parents = , }

labels["class 2b strong verbs"] = { description = "Verbs where the ablaut vowel was *ū in Proto-Germanic.", breadcrumb = "class 2b", parents = , }

labels["class 2 weak verbs"] = { description = "Weak verbs of the second class.", breadcrumb = "class 2", parents = , }

labels["class 3 weak verbs"] = { description = "Weak verbs of the third class.", breadcrumb = "class 3", parents = , }

labels["class 3 strong verbs"] = { description = "Verbs where the ablaut vowel was followed by a consonant cluster in Proto-Indo-European.", breadcrumb = "class 3", parents = , }

labels["class 3a strong verbs"] = { description = "Verbs where the consonant cluster begins with a nasal consonant.", breadcrumb = "class 3a", parents = , }

labels["class 3b strong verbs"] = { description = "Verbs where the consonant cluster begins with a lateral consonant or velar fricative.", breadcrumb = "class 3b", parents = , }

labels["class 3c strong verbs"] = { description = "Verbs where the consonant cluster begins with a rhotic consonant.", breadcrumb = "class 3c", parents = , }

labels["class 4 strong verbs"] = { description = "Verbs where the ablaut vowel was followed by a sonorant (m, n, l, r) but no other consonant in Proto-Indo-European.", breadcrumb = "class 4", parents = , }

labels["class 4 weak verbs"] = { description = "Weak verbs of the fourth class.", breadcrumb = "class 4", parents = , }

labels["class 5 strong verbs"] = { description = "Verbs where the ablaut vowel was followed by consonant other than a sonorant in Proto-Indo-European.", breadcrumb = "class 5", parents = , }

labels["class 6 strong verbs"] = { 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 = "class 6", parents = , }

labels["class 7 strong verbs"] = { description = "Verbs that retained their reduplication in the past tense in Proto-Germanic.", breadcrumb = "class 7", parents = , }

labels["class 7a strong verbs"] = { description = "Class 7 strong verbs where the root vowel was *ai in Proto-Germanic, analogous to class 1.", breadcrumb = "class 7a", parents = , }

labels["class 7b strong verbs"] = { description = "Class 7 strong verbs where the root vowel was *au in Proto-Germanic, analogous to class 2.", breadcrumb = "class 7b", parents = , }

labels["class 7c strong verbs"] = { description = "Class 7 strong verbs where the root vowel was *a followed by a consonant cluster in Proto-Germanic, analogous to class 3.", breadcrumb = "class 7c", parents = , }

labels["class 7d strong verbs"] = { description = "Class 7 strong verbs where the root vowel was *ē in Proto-Germanic.", breadcrumb = "class 7d", parents = , }

labels["class 7e strong verbs"] = { description = "Class 7 strong verbs where the root vowel was *ō in Proto-Germanic.", breadcrumb = "class 7e", parents = , }

--- TUPIAN LEMMA CLASSES ---

-- FIXME: Present in Old Tupi, Nheengatu, Guaraní and some other Tupian languages; not clear if this belongs among the general categories.

labels["pluriform adjectives"] = { description = " adjectives that have a relational prefix added to their stem.", breadcrumb = "pluriform", parents = {"adjectives by inflection type"}, }

labels["pluriform nouns"] = { description = " nouns that have a relational prefix added to their stem.", breadcrumb = "pluriform", parents = {"nouns by inflection type"}, }

labels["pluriform postpositions"] = { description = " postpositions that have a relational prefix added to their stem.", breadcrumb = "pluriform", parents = {"postpositions by inflection type"}, }

labels["pluriform verbs"] = { description = " verbs that have a relational prefix added to their stem.", breadcrumb = "pluriform", parents = {"verbs by inflection type"}, }

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 = "Terms by grammatical category subcategories by language" end end

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

raw_categories["Terms by grammatical category subcategories by language"] = { description = "Umbrella categories covering topics related to grammatical categories, such as gender, animacy and noun and verb classes.", additional = "", parents = { "Umbrella metacategories", {name = "terms by grammatical category", is_label = true, sort = " "}, }, }

raw_categories["Suppletion subcategories by language"] = { description = "Umbrella categories covering suppletive terms in specific part-of-speech categories.", additional = "", parents = { "Umbrella metacategories", "Terms by grammatical category subcategories by language", }, }

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

table.insert(handlers, function(data)	local class = data.label:match("^class ([0-9a-z]+) nouns$")	if class then		local classnum, suffix = class:match("^([0-9]+)([a-z]*)$")		return {			description =				" nouns that belong to class " .. class .. ".",			breadcrumb = class,			umbrella = false,			parents = ,		}	end end)

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

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

table.insert(handlers, function(data)	local pos, classifier = data.label:match("^(nouns) classified by (.+)$")	if pos then		local linktext		if data.lang then			-- Chinese classifiers may take the form TRAD/SIMP. This will cause problems if passed directly to Module:links,			-- but the module can accept links of the form TRAD//SIMP and display them correctly.			if data.lang:getCode == "zh" then				classifier = classifier:gsub("/", "//")			end			linktext = require("Module:links").full_link({ term = classifier, lang = data.lang }, "term")		else			linktext = classifier		end		return {			description = " " .. pos .. " using " .. linktext .. " as their classifier.",			breadcrumb = classifier,			umbrella = false,			parents = ,		}	end end)

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