Module:Lb-headword

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 = { ["m"] = "masculine", ["m-s"] = "masculine", ["m-p"] = "masculine", ["f"] = "feminine", ["f-s"] = "feminine", ["f-p"] = "feminine", ["n"] = "neuter", ["n-s"] = "neuter", ["n-p"] = "neuter", ["?"] = "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"] = {default = PAGENAME}, ["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 = "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 = "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"] = {default = PAGENAME}, ["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) table.insert(data.categories, "Luxembourgish " .. gender_names[g] .. " nouns") 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 = 'plural only'}) table.insert(data.categories, 'Luxembourgish pluralia tantum') elseif args[2][1] == '-' then table.insert(data.inflections, {label = '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"] = {default = PAGENAME}, ["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