Module:uk-headword

Definition from Wiktionary, the free dictionary
Jump to: navigation, search
The following documentation is located at Module:uk-headword/documentation. [edit]
See also: subpages of this module.

This module is used for all Ukrainian headword-line templates. It provides a basic functionality common to all of them, but some of the templates have specific additional functionality to show genders or inflected forms.

Accented headword[edit]

All Ukrainian headword-line templates use the first parameter to provide the headword, with accented vowels where present. For example:

{{uk-noun|соба́ка|m-an}}

The parameter supports all the special features that the head= parameter on {{head}} does. So you can also use this parameter to link to individual words of a multi-word term. These words can be linked with accents still in place; the module will remove them from the page name before creating a link, just like {{l}} does. If you need to specify accents in multiple alternative ways, use head2=, head3= and so on.

All Ukrainian words that have more than one syllable are expected to have accents specified. The module will check the parameter for the presence of accents, and categorize the entry in Category:Ukrainian terms needing accents if none are found. Some words like prepositions really have no inherent accent of their own. For such words, give - as the first parameter. This tells the module that you are sure that the word should not have accents, so that it will not check for them. If you don't know where to place the accents, you can leave the parameter empty, or just write the page name without accents.


local m_common = require("Module:uk-common")
 
local export = {}
 
local lang = require("Module:languages").getByCode("uk")
 
local pos_functions = {}
 
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	local args = frame:getParent().args
	PAGENAME = mw.title.getCurrentTitle().text
 
	local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
 
	local genders = {}
	local inflections = {}
	local categories = {"Ukrainian " .. poscat}
 
	-- Get the head parameters
	-- First get the 1st parameter. The remainder is named head2=, head3= etc.
	local heads = {}
	local head = args[1]; if head == "" then head = nil end
	local i = 2
 
	while head do
		if m_common.needs_accents(head) then
			table.insert(categories, "Ukrainian terms needing accents")
		end
 
		table.insert(heads, head)
		head = args["head" .. i]; if head == "" then head = nil end
		i = i + 1
	end
 
	if #heads == 0 then
		table.insert(categories, "Ukrainian terms needing accents")
	end
 
	-- Get transliteration
	local tr = args["tr"]; if tr == "" then tr = nil end
 
	if pos_functions[poscat] then
		pos_functions[poscat](args, genders, inflections, categories)
	end
 
	return require("Module:headword").full_headword(lang, nil, heads, tr, genders, inflections, categories, nil)
end
 
pos_functions["proper nouns"] = function(args, genders, inflections, categories)
	pos_functions["nouns"](args, genders, inflections, categories, true)
end
 
-- Display additional inflection information for a noun
pos_functions["nouns"] = function(args, genders, inflections, categories, no_plural)
	-- Iterate over all gn parameters (g2, g3 and so on) until one is empty
	local g = args[2]; if g == "" then g = nil end
	local i = 2
 
	while g do
		table.insert(genders, g)
		g = args["g" .. i]; if g == "" then g = nil end
		i = i + 1
	end
 
	if #genders == 0 then
		table.insert(genders, "?")
	elseif #genders > 1 then
		table.insert(categories, "Ukrainian nouns with multiple genders")
	end
 
	-- Get the genitive parameters
	-- First get the 3rd parameter. The remainder is named gen2=, gen3= etc.
	local genitives = {}
	local form = args[3]; if form == "" then form = nil end
	local i = 2
 
	while form do
		table.insert(genitives, form)
		form = args["gen" .. i]; if form == "" then form = nil end
		i = i + 1
	end
 
	-- Get the plural parameters
	-- First get the 4th parameter. The remainder is named pl2=, pl3= etc.
	local plurals = {}
	local form = args[4]; if form == "" then form = nil end
	local i = 2
 
	while form do
		table.insert(plurals, form)
		form = args["pl" .. i]; if form == "" then form = nil end
		i = i + 1
	end
 
	local mode = plurals[1]
 
	-- Get the feminine parameters
	-- First get the f= parameter. The remainder is named f2=, f3= etc.
	local feminines = {}
	local form = args["f"]; if form == "" then form = nil end
	local i = 2
 
	while form do
		table.insert(feminines, form)
		form = args["f" .. i]; if form == "" then form = nil end
		i = i + 1
	end
 
	-- Get the masculine parameters
	-- First get the m= parameter. The remainder is named m2=, m3= etc.
	local masculines = {}
	local form = args["m"]; if form == "" then form = nil end
	local i = 2
 
	while form do
		table.insert(masculines, form)
		form = args["m" .. i]; if form == "" then form = nil end
		i = i + 1
	end
 
	-- Process the genders
	local singular_genders = {
		["m-?"] = true,
		["m-an"] = true,
		["m-in"] = true,
 
		["f"] = true,
		["f-?"] = true,
		["f-an"] = true,
		["f-in"] = true,
 
		["n"] = true,
		["n-an"] = true,
		["n-in"] = true}
 
	local plural_genders = {
		["m-?-p"] = true,
		["m-an-p"] = true,
		["m-in-p"] = true,
 
		["f-?-p"] = true,
		["f-an-p"] = true,
		["f-in-p"] = true,
 
		["n-p"] = true,
		["n-an-p"] = true,
		["n-in-p"] = true}
 
	for i, g in ipairs(genders) do
		if g == "m" then
			g = "m-?"
		elseif g == "m-p" then
			g = "m-?-p"
		elseif g == "f" and mode ~= "-" and not no_plural then
			g = "f-?"
		elseif g == "f-p" then
			g = "f-?-p"
		end
 
		if not singular_genders[g] and not plural_genders[g] then
			g = "?"
		end
 
		genders[i] = g
 
		-- Categorize by gender
		if g:sub(1,1) == "m" then
			table.insert(categories, "Ukrainian masculine nouns")
		elseif g:sub(1,1) == "f" then
			table.insert(categories, "Ukrainian feminine nouns")
		elseif g:sub(1,1) == "n" then
			table.insert(categories, "Ukrainian neuter nouns")
		end
 
		-- Categorize by animacy
		if g:sub(3,4) == "an" then
			table.insert(categories, "Ukrainian animate nouns")
		elseif g:sub(3,4) == "in" then
			table.insert(categories, "Ukrainian inanimate nouns")
		end
 
		-- Categorize by number
		if plural_genders[g] then
			table.insert(categories, "Ukrainian pluralia tantum")
		end
	end
 
	-- Add the genitive forms
	if #genitives > 0 then
		local gen_parts = {label = "genitive"}
 
		for i, form in ipairs(genitives) do
			table.insert(gen_parts, form)
 
			if m_common.needs_accents(form) then
				table.insert(categories, "Ukrainian nouns needing accents")
			end
		end
 
		table.insert(inflections, gen_parts)
	else
		table.insert(inflections, "<small><sup>???</sup> please provide the genitive!</small>")
		table.insert(categories, "Ukrainian nouns needing inflection")
	end
 
	-- Add the plural forms
	-- If the noun is a plurale tantum, then ignore the 4th parameter altogether
	if no_plural then
		-- do nothing
	elseif plural_genders[genders[1]] then
		table.insert(inflections, {label = "[[Appendix:Glossary#plurale tantum|plurale tantum]]"})
	else
		if not mode then
			table.insert(inflections, "<small><sup>???</sup> please provide the nominative plural!</small>")
			table.insert(categories, "Ukrainian nouns needing inflection")
		elseif mode == "-" then
			table.insert(inflections, {label = "[[Appendix:Glossary#uncountable|uncountable]]"})
			table.insert(categories, "Ukrainian uncountable nouns")
		else
			local pl_parts = {label = "nominative plural"}
 
			for i, form in ipairs(plurals) do
				table.insert(pl_parts, form)
 
				if m_common.needs_accents(form) then
					table.insert(categories, "Ukrainian nouns needing accents")
				end
			end
 
			table.insert(inflections, pl_parts)
		end
	end
 
	-- Add the feminine forms
	if #feminines > 0 then
		local f_parts = {label = "feminine"}
 
		for i, form in ipairs(feminines) do
			table.insert(f_parts, form)
 
			if m_common.needs_accents(form) then
				table.insert(categories, "Ukrainian nouns needing accents")
			end
		end
 
		table.insert(inflections, f_parts)
	end
 
	-- Add the masculine forms
	if #masculines > 0 then
		local m_parts = {label = "masculine"}
 
		for i, form in ipairs(masculines) do
			table.insert(m_parts, form)
 
			if m_common.needs_accents(form) then
				table.insert(categories, "Ukrainian nouns needing accents")
			end
		end
 
		table.insert(inflections, m_parts)
	end
end
 
-- Display additional inflection information for a verb
pos_functions["verbs"] = function(args, genders, inflections, categories)
	-- Aspect
	local aspect = args[2]; if aspect == "" then aspect = nil end
 
	if aspect == "impf" then
		table.insert(genders, "impf")
		table.insert(categories, "Ukrainian imperfective verbs")
	elseif aspect == "pf" then
		table.insert(genders, "pf")
		table.insert(categories, "Ukrainian perfective verbs")
	elseif aspect == "both" then
		table.insert(genders, "impf")
		table.insert(genders, "pf")
		table.insert(categories, "Ukrainian imperfective verbs")
		table.insert(categories, "Ukrainian perfective verbs")
	else
		table.insert(genders, "?")
		table.insert(categories, "Ukrainian verbs needing aspect")
	end
 
	-- Get the imperfective parameters
	-- First get the impf= parameter. The remainder is named impf2=, impf3= etc.
	local imperfectives = {}
	local form = args["impf"]; if form == "" then form = nil end
	local i = 2
 
	while form do
		table.insert(imperfectives, form)
		form = args["impf" .. i]; if form == "" then form = nil end
		i = i + 1
	end
 
	-- Get the perfective parameters
	-- First get the pf= parameter. The remainder is named pf2=, pf3= etc.
	local perfectives = {}
	local form = args["pf"]; if form == "" then form = nil end
	local i = 2
 
	while form do
		table.insert(perfectives, form)
		form = args["pf" .. i]; if form == "" then form = nil end
		i = i + 1
	end
 
	-- Add the imperfective forms
	if #imperfectives > 0 then
		local impf_parts = {label = "imperfective"}
 
		for i, form in ipairs(imperfectives) do
			table.insert(impf_parts, form)
 
			if m_common.needs_accents(form) then
				table.insert(categories, "Ukrainian verbs needing accents")
			end
		end
 
		table.insert(inflections, impf_parts)
	end
 
	-- Add the perfective forms
	if #perfectives > 0 then
		local pf_parts = {label = "perfective"}
 
		for i, form in ipairs(perfectives) do
			table.insert(pf_parts, form)
 
			if m_common.needs_accents(form) then
				table.insert(categories, "Ukrainian verbs needing accents")
			end
		end
 
		table.insert(inflections, pf_parts)
	end
end
 
return export