Module:lb-headword

From Wiktionary, the free dictionary
Jump to navigation Jump to search
This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

local export = {}
local pos_functions = {}

local legal_gender = {
	["m"] = true,
	["m-s"] = true,
	["m-p"] = true,
	["f"] = true,
	["f-s"] = true,
	["f-p"] = true,
	["n"] = true,
	["n-s"] = true,
	["n-p"] = true,
	["?"] = true,
	["?-s"] = true,
	["?-p"] = true,
	["p"] = true,
}

local gender_names = {
	["?"] = "unknown gender",
	["?-s"] = "unknown gender",
	["?-p"] = "unknown gender",
	["p"] = "unknown gender",
}

local plural_genders = {
	["m-p"] = true,
	["f-p"] = true,
	["n-p"] = true,
	["?-p"] = true,
	["p"] = true,
}

local lang = require("Module:languages").getByCode("lb")

-- 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 head = args["head"]; if head == "" then head = nil end
	
	local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
	
	local data = {lang = lang, pos_category = poscat, categories = {}, heads = {args["head"]}, genders = {}, inflections = {}}
	
	if pos_functions[poscat] then
		pos_functions[poscat](class, args, data)
	end
	
	return
		require("Module:headword").full_headword(data)
end

pos_functions.adjectives = function(class, args, data)
	params = {
		[1] = {list = "m",
			default = mw.ustring.match(PAGENAME, "ee$") ~= nil
					and PAGENAME .. "ën" 
				or PAGENAME .. "en"},
		[2] = {list = "n",
			default = mw.ustring.match(PAGENAME, "[dt]$") ~= nil
					and PAGENAME
				or mw.ustring.gsub(PAGENAME,
					"([^AaIiEeOoUuÄäËëÉé])([aiou])([bcdfghjklmnpqrstvwxz])$",
					"%1%2%2%3") .. "t"},
		["f"] = {list = true},
		["comp"] = {list = true},
		["sup"] = {list = true,
			default = mw.ustring.match(PAGENAME, "[sxz]$") ~= nil
					and mw.ustring.gsub(PAGENAME,
					"([^AaIiEeOoUuÄäËëÉé])([aiou])([sxz])$",
					"%1%2%2%3") .. "ten"
				or mw.ustring.gsub(PAGENAME,
					"([^AaIiEeOoUuÄäËëÉé])([aiou])([bcdfghjklmnpqrstvwxz]?)$",
					"%1%2%2%3") .. "sten"
			},
		["comp-irreg-only"] = {type = "boolean"},
		["head"] = {},
		["pred-only"] = {type = "boolean"},
	}
	local args = require("Module:parameters").process(args, params)
	data.heads = {args.head}
	
	if args["pred-only"] then
		table.insert(data.inflections, {label = 'predicate-only'})
		table.insert(data.categories, 'Luxembourgish predicate only adjectives')
	else
		for i, form in ipairs(args[1]) do
			args[1][i] = {term = form}
		end
		args[1].label = "masculine"
		table.insert(data.inflections, args[1])
		
		if #args.f > 0 then
			for i, form in ipairs(args["f"]) do
				args["f"][i] = {term = form}
			end
			args["f"].label = "feminine"
			table.insert(data.inflections, args["f"])
		end
		
		for i, form in ipairs(args[2]) do
			args[2][i] = {term = form}
		end
		args[2].label = "neuter"
		table.insert(data.inflections, args[2])
	end
	
	if args["comp"][1] == '-' then
		table.insert(data.inflections, {label = 'not comparable'})
		table.insert(data.categories, 'Luxembourgish uncomparable adjectives')
	else
		if #args["comp"] > 0 then
			for i, form in ipairs(args["comp"]) do
				args["comp"][i] = {term = form}
			end
			if not args["comp-irreg-only"] then
				table.insert(args["comp"], 1, "[[méi]] " .. PAGENAME)
			end
		else
			args["comp"] = {"[[méi]] " .. PAGENAME}
		end
		args["comp"].label = "[[Appendix:Glossary#comparative|comparative]]"
		table.insert(data.inflections, args["comp"])
		
		for i, form in ipairs(args["sup"]) do
			args["sup"][i] = {term = 'am [[' .. form .. ']]'}
		end
		args["sup"].label = "[[Appendix:Glossary#superlative|superlative]]"
		table.insert(data.inflections, args["sup"])
	end
end

pos_functions.nouns = function(class, args, data)
	params = {
		[1] = {list = 'g', default = '?'},
		[2] = {list = 'pl'},
		["dim"] = {list = true},
		["head"] = {},
		["m"] = {list = true},
		["f"] = {list = true},
	}
	if data.pos_category == 'nouns' then
		params[2].default = mw.ustring.match(PAGENAME, "ee$") ~= nil
					and PAGENAME .. "ën" 
				or PAGENAME .. "en"
	end
	local args = require("Module:parameters").process(args, params)
	data.heads = {args.head}
	
	local plur_tant = false
	
	for _, g in ipairs(args[1]) do
		if legal_gender[g] then
			table.insert(data.genders, g)
			if gender_names[g] then
				table.insert(data.categories, "Luxembourgish " .. gender_names[g] .. " nouns")
			end
		else
			error("Gender “" .. g .. "” is not an valid Luxembourgish gender.")
		end
		
		if plural_genders[g] then
			plur_tant = true
		end
	end
	
	if plur_tant then
		table.insert(data.inflections, {label = '[[Appendix:Glossary#plural only|plural only]]'})
	elseif args[2][1] == '-' then
		table.insert(data.inflections, {label = '[[Appendix:Glossary#uncountable|uncountable]]'})
		table.insert(data.categories, 'Luxembourgish uncountable nouns')
	elseif #args[2] > 0 then
		for i, form in ipairs(args[2]) do
			args[2][i] = {term = form}
		end
		args[2].label = "plural"
		table.insert(data.inflections, args[2])
		
		if #args[2] > 1 then
			table.insert(data.categories, 'Luxembourgish nouns with multiple plurals')
		end
	end
	
	if #args["dim"] > 0 then
		for i, form in ipairs(args["dim"]) do
			args["dim"][i] = {term = form}
		end
		args["dim"].label = "diminutive"
		table.insert(data.inflections, args["dim"])
	end
	
	if #args.f > 0 then
		args.f.label = "feminine"
		table.insert(data.inflections, args.f)
	end
	
	if #args.m > 0 then
		args.m.label = "masculine"
		table.insert(data.inflections, args.m)
	end
end

pos_functions["proper nouns"] = pos_functions.nouns

local function make_verb_forms(prefix)
	if prefix == nil then prefix = "" end
	
	if mw.ustring.match(prefix, "n$") then
		prefix = mw.ustring.gsub(
			prefix,
			"(.*)([^n])(n+)$",
			"%1%2"
			) .. "n*"
	end
	
	local stem = mw.ustring.gsub(PAGENAME, "^(" .. prefix .. ")(.*)([eë]n)$", "%2")
	local dent_suff = mw.ustring.match(stem, "([td]+)$")

	local conjugated = ""
	if dent_suff then
		conjugated = mw.ustring.gsub(stem, "([td]+)$", mw.ustring.rep("t", #dent_suff))
	else
		local lengthened = mw.ustring.gsub(stem,
			"([^AaIiEeOoUuÄäËëÉé])([aiou])([bcdfghjklmnpqrstvwz])$",
			"%1%2%2%3")
		conjugated = mw.ustring.match(lengthened, "(w)$") and mw.ustring.sub(lengthened, 1, -2) .. "ft" or lengthened .. "t"
	end
	
	return conjugated, (mw.ustring.match(conjugated, "^[ei]") and "gë" or "ge") .. conjugated
end

pos_functions.verbs = function(class, args, data)
	third, pp = make_verb_forms(args.sep)
	
	params = {
		[1] = {list = '3s pres', default = third},
		[2] = {list = 'pp', default = pp},
		[3] = {default = 'hunn'},
		["pret"] = {list = true},
		["subj"] = {list = true},
		["head"] = {},
		["sep"] = {default = ""},
	}
	
	local args = require("Module:parameters").process(args, params)
	data.heads = {args.head}
	
	local denasalized_prefix = mw.ustring.gsub(
		args.sep,
		"(.*)([^n])(n+)$",
		"%1%2"
		)
	
	for i, form in ipairs(args[1]) do
		args[1][i] = {
			term = form .. (#args.sep > 0 and " " .. args.sep or ""),
			}
	end
	args[1].label = 'third-person singular present'
	table.insert(data.inflections, args[1])
	
	if #args.pret > 0 then
		for i, form in ipairs(args.pret) do
			args.pret[i] = {
				term = form .. (#args.sep > 0 and " " .. args.sep or ""),
				}
		end
		args.pret.label = 'preterite'
		table.insert(data.inflections, args.pret)
	end
	
	for i, form in ipairs(args[2]) do
		args[2][i] = {
			term = (mw.ustring.match(form, "^[^dhntzaäeéëioöuü]") and denasalized_prefix or args.sep) .. form,
			}
	end
	args[2].label = 'past participle'
	table.insert(data.inflections, args[2])
	
	if #args.subj > 0 then
		for i, form in ipairs(args.subj) do
			args.subj[i] = {
				term = form .. (#args.sep > 0 and " " .. args.sep or ""),
				}
		end
		args.subj.label = 'past subjunctive'
		table.insert(data.inflections, args.subj)
	end
	
	if args[3] == 'hunn' then
		args[3] = {'hunn'}
		table.insert(data.categories, 'Luxembourgish verbs using hunn as auxiliary')
	elseif args[3] == 'sinn' then
		args[3] = {'sinn'}
		table.insert(data.categories, 'Luxembourgish verbs using sinn as auxiliary')
	elseif args[3] == 'both' then
		args[3] = {'hunn', 'sinn'}
		table.insert(data.categories, 'Luxembourgish verbs using hunn and sinn as auxiliary')
	else
		error("Verb auxiliary “" .. args[3] .. "” is not an valid Luxembourgish auxiliary (“hunn”, “sinn”, or “both”).")
	end
	args[3].label = "auxiliary verb"
	table.insert(data.inflections, args[3])
end

return export