Module:de-common

local export = {}

--[=[

Authorship:

]=]

local rmatch = mw.ustring.match

local vowels = "aeiouyäöüAEIOUYÄÖÜ" local capletters = "A-ZÄÖÜ" export.CAP = "[" .. capletters .. "]" export.V = "[" .. vowels .. "]" export.NV = "[^" .. vowels .. "]"

export.articles = { ["m"] = { ind_nom = "ein", def_nom = "der", ind_gen = "eines", def_gen = "des", ind_dat = "einem", def_dat = "dem", ind_acc = "einen", def_acc = "den", ind_abl = "einen", def_abl = "den", ind_voc = "einen", def_voc = "den", },	["f"] = { ind_nom = "eine", def_nom = "die", ind_gen = "einer", def_gen = "der", ind_dat = "einer", def_dat = "der", ind_acc = "eine", def_acc = "die", ind_abl = "eine", def_abl = "die", ind_voc = "eine", def_voc = "die", },	["n"] = { ind_nom = "ein", def_nom = "das", ind_gen = "eines", def_gen = "des", ind_dat = "einem", def_dat = "dem", ind_acc = "ein", def_acc = "das", ind_abl = "ein", def_abl = "das", ind_voc = "ein", def_voc = "das", },	["p"] = { ind_nom = "(keine)", def_nom = "die", ind_gen = "(keiner)", def_gen = "der", ind_dat = "(keinen)", def_dat = "den", ind_acc = "(keine)", def_acc = "die", ind_abl = "?", def_abl = "?", ind_voc = "?", def_voc = "?", }, }

local umlaut = { ["a"] = "ä", ["A"] = "Ä", ["o"] = "ö", ["O"] = "Ö", ["u"] = "ü", ["U"] = "Ü", }

function export.apply_umlaut(term, origterm) local stem, after = term:match("^(.*[^e])(e[lmnr]?)$") if stem then -- Nagel -> Nägel, Garten -> Gärten return export.apply_umlaut(stem, term) .. after end -- Haus -> Häuschen local before_v, v, after_v = rmatch(term, "^(.*)([Aa])([Uu]" .. export.NV .. "-)$")	if not before_v then -- Haar -> Härchen before_v, v, after_v = rmatch(term, "^(.*)([Aa])[Aa](" .. export.NV .. "-)$")	end if not before_v then -- Boot -> Bötchen before_v, v, after_v = rmatch(term, "^(.*)([Oo])[Oo](" .. export.NV .. "-)$")	end if not before_v then -- regular umlaut before_v, v, after_v = rmatch(term, "^(.*)([AaOouU])(" .. export.NV .. "-)$")	end if before_v then return before_v .. umlaut[v] .. after_v end error("Can't umlaut " .. (origterm or term) .. " because the last vowel isn't a, o, u or au") end

function export.fetch_footnotes(separated_group, parse_err) local footnotes for j = 2, #separated_group - 1, 2 do		if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end

function export.fetch_specs(iut, segments, separator, spectype, allow_blank, parse_err) local separated_groups = iut.split_alternating_runs_and_strip_spaces(segments, separator) if allow_blank and #separated_groups == 1 and #separated_groups[1] == 1 and separated_groups[1][1] == "" then return nil end local specs = {} for _, separated_group in ipairs(separated_groups) do		local form = separated_group[1] if form == "" then parse_err("Blank form not allowed here, but saw '" .. table.concat(segments) .. "'") end local new_spec = {form = form, footnotes = export.fetch_footnotes(separated_group, parse_err)} for _, existing_spec in ipairs(specs) do			if existing_spec.form == new_spec.form then parse_err("Duplicate " .. spectype .. " spec '" .. table.concat(separated_group) .. "'") end end table.insert(specs, new_spec) end return specs end

return export