Module:hrx-verb

local m_utilities = require("Module:utilities") local m_links = require("Module:links")

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

local export = {}

local function detect_stem(stem) if mw.ustring.find(stem, "v$") or mw.ustring.find(stem, "w$") then return '1Ab' elseif mw.ustring.find(stem, "d$") or mw.ustring.find(stem, "t$") then return '1At' elseif mw.ustring.find(stem, "eer$") or mw.ustring.find(stem, "ier$") then return '1C' elseif mw.ustring.find(stem, "l$") or mw.ustring.find(stem, 'r$') or mw.ustring.find(stem, 'n$') then return '1B' else return '1A' end end

local function mutate_stem(stem) if mw.ustring.find(stem, "d$") then return (mw.ustring.gsub(stem, "d$", "")) elseif mw.ustring.find(stem, "v$") then return (mw.ustring.gsub(stem, "v$", "b")) elseif mw.ustring.find(stem, "w$") then return (mw.ustring.gsub(stem, "w$", "bb")) elseif mw.ustring.find(stem, "l$") or mw.ustring.find(stem, "r$") or mw.ustring.find(stem, "n$") then if mw.ustring.find(stem, "[bcdfghjkmnpqrstvwz]l$") then return (mw.ustring.gsub(stem, "l$", "el")) elseif mw.ustring.find(stem, "[bcdfghjklmnpqstvwz]r$") then return (mw.ustring.gsub(stem, "r$", "er")) elseif mw.ustring.find(stem, "[bcdfghjklmpqrstvwz]n$") then return (mw.ustring.gsub(stem, "n$", "en")) end return stem else return stem end end

local function past_participle(stem) if detect_stem(stem) == '1C' then return stem .. 'd'	elseif detect_stem(stem) == '1B' or detect_stem(stem) == '1Ab' then return 'ge' .. mutate_stem(stem) .. 'd' 	elseif detect_stem(stem) == '1At' then return 'ge' .. stem else return 'ge' .. stem .. 'd'	end end

local function postprocess(args, data) if args["prefix"] then table.insert(data.categories, lang:getCanonicalName .. " separable verbs") data.info = data.info .. ", separable" -- Add the separable part to all the verb forms for key, _ in pairs(data.forms) do			if key:find("_indc$") or key:find("_cond$") or key:find("_impr$") or key:find("_sub$") then -- For main-clause finite forms, add the separable part after the form, separated by a space for i, subform in ipairs(data.forms[key]) do data.forms[key][i] = data.forms[key][i] .. " " .. args["prefix"] .. (args["pref-n"] and "n" or "") end elseif key == "inf" then for i, subform in ipairs(data.forms[key]) do data.forms[key][i] = args["prefix"] .. (args["pref-inf-n"] and "n" or "") .. data.forms[key][i] end elseif key ~= "aux" then -- For all other forms, add the separable part before the form, with no space for i, subform in ipairs(data.forms[key]) do data.forms[key][i] = args["prefix"] .. subform end end end end -- Check if the lemma form matches the page name if data.forms["inf"] and (lang:makeEntryName(data.forms["inf"][1])) ~= mw.title.getCurrentTitle.text then table.insert(data.categories, lang:getCanonicalName .. " entries with inflection not matching pagename") end if args["only3s"] or args["only3sp"] then for key, _ in pairs(data.forms) do			 if key:find("^1") or key:find("^2") or (args["only3s"] and key:find("^3pl")) then data.forms[key] = nil end end end end

local function inf(args) if args["inf-n"] == true then return 'n'		else return 'e'		end end

local function at_conj(args, stem) if mw.ustring.find(stem, "t$") then return mutate_stem(args["alt"] or stem) else return mutate_stem(args["alt"] or stem) .. "d" end end

local function at_imp(args, stem) if mw.ustring.find(stem, "d$") then return stem else return mutate_stem(args["alt"] or stem) end end

-- Inflection functions

function export.regular(frame) local params = { [1] = {required = true, default = ""}, [2] = {required = true, default = ""}, ["alt"] = {}, ["ptcp"] = {}, ["prefix"] = {}, ["inf-n"] = {type = "boolean"}, ["only3s"] = {type = "boolean"}, ["only3sp"] = {type = "boolean"}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local stem = args[1] local stem_final = mutate_stem(args["alt"] or stem) local data = {forms = {}, info = "regular", categories = {}}

data.forms["inf"] = {stem .. inf(args)} data.forms["ptcp"] = {args["ptcp"] or past_participle(stem)} data.forms["aux"] = {args[2]} data.forms["1sg_pres_indc"] = {stem .. inf(args)} data.forms["2sg_pres_indc"] = {stem_final .. "st"} data.forms["3sg_pres_indc"] = {at_conj(args, stem)} data.forms["1pl_pres_indc"] = {stem .. inf(args)} data.forms["2pl_pres_indc"] = {at_conj(args, stem)} data.forms["3pl_pres_indc"] = {stem .. inf(args)} data.forms["2sg_impr"] = {at_imp(args, stem)} data.forms["2pl_impr"] = {at_conj(args, stem)} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular(frame) local params = { [1] = {required = true, default = ""}, [2] = {required = true, default = ""}, ["alt"] = {required = true}, ["ptcp"] = {required = true}, ["prefix"] = {}, ["inf-n"] = {type = "boolean"}, ["only3s"] = {type = "boolean"}, ["only3sp"] = {type = "boolean"}, }	local args = require("Module:parameters").process(frame:getParent.args, params) local stem = args[1] local stem_final = mutate_stem(args["alt"] or stem) local data = {forms = {}, info = "irregular", categories = {lang:getCanonicalName .. " irregular verbs"}} data.forms["inf"] = {stem .. inf(args)} data.forms["ptcp"] = {args['ptcp'] or past_participle(stem)} data.forms["aux"] = {args[2]} data.forms["1sg_pres_indc"] = {stem .. inf(args)} data.forms["2sg_pres_indc"] = {stem_final .. 'st'} data.forms["3sg_pres_indc"] = {stem_final .. 'd'} data.forms["1pl_pres_indc"] = {stem .. inf(args)} data.forms["2pl_pres_indc"] = {stem_final .. 'd'} data.forms["3pl_pres_indc"] = {stem .. inf(args)} data.forms["2sg_impr"] = {stem_final .. 'd'} data.forms["2pl_impr"] = {stem_final .. 'd'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_full(frame) local params = { [1] = {required = true, default = ""}, [2] = {required = true, default = ""}, [3] = {default = ""}, [4] = {default = ""}, ["past"] = {}, ["cond"] = {}, ["ptcp"] = {required, true}, ["prefix"] = {}, ["inf-n"] = {type = "boolean"}, ["only3s"] = {type = "boolean"}, ["only3sp"] = {type = "boolean"}, }	local args = require("Module:parameters").process(frame:getParent.args, params) local stem = args[1] local stem_final = mutate_stem(stem) local stem_past = args["past"] or args[3] local stem_past_dev = mutate_stem(stem_past) local stem_cond = args["cond"] or args[4] local stem_cond_dev = mutate_stem(stem_cond) local data = {forms = {}, info = "irregular with past tense and conditional mood", categories = {lang:getCanonicalName .. " verbs with past tense", lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " irregular verbs"}} data.past = true data.forms["inf"] = {stem .. inf(args)} data.forms["ptcp"] = {args["ptcp"] or past_participle(stem)} data.forms["aux"] = {args[2]} data.forms["1sg_pres_indc"] = {stem .. inf(args)} data.forms["2sg_pres_indc"] = {stem_final .. 'st'} data.forms["3sg_pres_indc"] = {stem_final .. 'd'} data.forms["1pl_pres_indc"] = {stem .. inf(args)} data.forms["2pl_pres_indc"] = {stem_final .. 'd'} data.forms["3pl_pres_indc"] = {stem .. inf(args)} data.forms["2sg_impr"] = {stem_final} data.forms["2pl_impr"] = {stem_final .. 'd'} data.forms["1sg_past_indc"] = {stem_past_dev .. 'd'} data.forms["2sg_past_indc"] = {stem_past_dev .. 'st'} data.forms["3sg_past_indc"] = {stem_past_dev .. 'd'} data.forms["1pl_past_indc"] = {stem_past .. 'de'} data.forms["2pl_past_indc"] = {stem_past_dev .. 'd'} data.forms["3pl_past_indc"] = {stem_past .. 'de'} data.forms["1sg_cond"] = {stem_cond_dev .. 'd'} data.forms["2sg_cond"] = {stem_cond_dev .. 'st'} data.forms["3sg_cond"] = {stem_cond_dev .. 'd'} data.forms["1pl_cond"] = {stem_cond .. 'de'} data.forms["2pl_cond"] = {stem_cond_dev .. 'd'} data.forms["3pl_cond"] = {stem_cond .. 'de'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_sin(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular with past tense, conditional and subjunctive mood", categories = {lang:getCanonicalName .. " verbs with past tense", lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " verbs with subjunctive mood", lang:getCanonicalName .. " irregular verbs", lang:getCanonicalName .. " auxiliary verbs"}} data.past_sin = true data.forms["inf"] = {'sin'} data.forms["ptcp"] = {'gewees', 'geweest', 'geween'} data.forms["aux"] = {'sin'} data.forms["1sg_pres_indc"] = {'sin'} data.forms["2sg_pres_indc"] = {'bist'} data.forms["3sg_pres_indc"] = {'is'} data.forms["1pl_pres_indc"] = {'sin'} data.forms["2pl_pres_indc"] = {'seid'} data.forms["3pl_pres_indc"] = {'sin'}

data.forms["2sg_impr"] = {"sei"} data.forms["2pl_impr"] = {"seid"} data.forms["1sg_past_indc"] = {'waar'} data.forms["2sg_past_indc"] = {'waarst'} data.forms["3sg_past_indc"] = {'waar'} data.forms["1pl_past_indc"] = {'waare'} data.forms["2pl_past_indc"] = {'waard'} data.forms["3pl_past_indc"] = {'waare'} data.forms["1sg_cond"] = {'wäär'} data.forms["2sg_cond"] = {'wäärst'} data.forms["3sg_cond"] = {'wäär'} data.forms["1pl_cond"] = {'wääre'} data.forms["2pl_cond"] = {'wäärd'} data.forms["3pl_cond"] = {'wääre'}

data.forms["1sg_sub"] = {'sei'} data.forms["2sg_sub"] = {'seist'} data.forms["3sg_sub"] = {'sei'} data.forms["1pl_sub"] = {'seie'} data.forms["2pl_sub"] = {'seid'} data.forms["3pl_sub"] = {'seie'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_hon(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular with past tense and conditional mood", categories = {lang:getCanonicalName .. " verbs with past tense", lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " irregular verbs", lang:getCanonicalName .. " auxiliary verbs"}} data.past_hon = true data.forms["inf"] = {'hon'} data.forms["ptcp"] = {'gehad'} data.forms["aux"] = {'hon'} data.forms["1sg_pres_indc"] = {'hon'} data.forms["2sg_pres_indc"] = {'host'} data.forms["3sg_pres_indc"] = {'hod'} data.forms["1pl_pres_indc"] = {'hon'} data.forms["2pl_pres_indc"] = {'hod'} data.forms["3pl_pres_indc"] = {'hon'} data.forms["1sg_past_indc"] = {'had'} data.forms["2sg_past_indc"] = {'hast'} data.forms["3sg_past_indc"] = {'had'} data.forms["1pl_past_indc"] = {'hade'} data.forms["2pl_past_indc"] = {'had'} data.forms["3pl_past_indc"] = {'hade'} data.forms["1sg_cond"] = {'häd'} data.forms["2sg_cond"] = {'häst'} data.forms["3sg_cond"] = {'häd'} data.forms["1pl_cond"] = {'häde'} data.forms["2pl_cond"] = {'häd'} data.forms["3pl_cond"] = {'häd'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_solle(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular with past tense and conditional mood", categories = {lang:getCanonicalName .. " verbs with past tense", lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " irregular verbs", lang:getCanonicalName .. " auxiliary verbs"}} data.past_solle = true data.forms["inf"] = {'solle'} data.forms["ptcp"] = {'gesolld'} data.forms["aux"] = {'solle'} data.forms["1sg_pres_indc"] = {'soll'} data.forms["2sg_pres_indc"] = {'sollst'} data.forms["3sg_pres_indc"] = {'soll'} data.forms["1pl_pres_indc"] = {'solle'} data.forms["2pl_pres_indc"] = {'solld'} data.forms["3pl_pres_indc"] = {'solle'} data.forms["1sg_past_indc"] = {'solld'} data.forms["2sg_past_indc"] = {'solldst'} data.forms["3sg_past_indc"] = {'solld'} data.forms["1pl_past_indc"] = {'sollde'} data.forms["2pl_past_indc"] = {'solld'} data.forms["3pl_past_indc"] = {'sollde'} data.forms["1sg_sub"] = {'selld'} data.forms["2sg_sub"] = {'selldst'} data.forms["3sg_sub"] = {'selld'} data.forms["1pl_sub"] = {'sellde'} data.forms["2pl_sub"] = {'selld'} data.forms["3pl_sub"] = {'selle'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_misse(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular with past tense and conditional mood", categories = {lang:getCanonicalName .. " verbs with past tense", lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " irregular verbs", lang:getCanonicalName .. " auxiliary verbs"}} data.past_hon = true data.forms["inf"] = {'misse'} data.forms["ptcp"] = {'gemusst', 'misse'} data.forms["aux"] = {'misse'} data.forms["1sg_pres_indc"] = {'muss'} data.forms["2sg_pres_indc"] = {'musst'} data.forms["3sg_pres_indc"] = {'muss'} data.forms["1pl_pres_indc"] = {'misse'} data.forms["2pl_pres_indc"] = {'missd'} data.forms["3pl_pres_indc"] = {'misse'} data.forms["1sg_past_indc"] = {'musst'} data.forms["2sg_past_indc"] = {'musst'} data.forms["3sg_past_indc"] = {'musst'} data.forms["1pl_past_indc"] = {'musste'} data.forms["2pl_past_indc"] = {'musst'} data.forms["3pl_past_indc"] = {'musste'} data.forms["1sg_cond"] = {'misst'} data.forms["2sg_cond"] = {'misst'} data.forms["3sg_cond"] = {'misst'} data.forms["1pl_cond"] = {'misste'} data.forms["2pl_cond"] = {'misst'} data.forms["3pl_cond"] = {'misste'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_dun(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular with conditional mood", categories = {lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " irregular verbs", lang:getCanonicalName .. " auxiliary verbs"}} data.past_dun = true data.forms["inf"] = {'dun'} data.forms["ptcp"] = {'gedun'} data.forms["aux"] = {'hon'} data.forms["1sg_pres_indc"] = {'dun'} data.forms["2sg_pres_indc"] = {'dust'} data.forms["3sg_pres_indc"] = {'dud'} data.forms["1pl_pres_indc"] = {'dun'} data.forms["2pl_pres_indc"] = {'dud'} data.forms["3pl_pres_indc"] = {'dun'}

data.forms["2sg_impr"] = {"du"} data.forms["2pl_impr"] = {"dud"} data.forms["1sg_cond"] = {'däd'} data.forms["2sg_cond"] = {'däst'} data.forms["3sg_cond"] = {'däd'} data.forms["1pl_cond"] = {'däde'} data.forms["2pl_cond"] = {'däd'} data.forms["3pl_cond"] = {'däde'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_wolle(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular with past tense and conditional mood", categories = {lang:getCanonicalName .. " verbs with past tense", lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " irregular verbs", lang:getCanonicalName .. " auxiliary verbs"}} data.past_hon = true data.forms["inf"] = {'wolle'} data.forms["ptcp"] = {'gewolld'} data.forms["aux"] = {'wolle'} data.forms["1sg_pres_indc"] = {'will'} data.forms["2sg_pres_indc"] = {'willst'} data.forms["3sg_pres_indc"] = {'will'} data.forms["1pl_pres_indc"] = {'wolle'} data.forms["2pl_pres_indc"] = {'wolld'} data.forms["3pl_pres_indc"] = {'wolle'} data.forms["1sg_past_indc"] = {'wolld'} data.forms["2sg_past_indc"] = {'wollst'} data.forms["3sg_past_indc"] = {'wolld'} data.forms["1pl_past_indc"] = {'wollde'} data.forms["2pl_past_indc"] = {'wolld'} data.forms["3pl_past_indc"] = {'wollde'} data.forms["1sg_cond"] = {'wolld'} data.forms["2sg_cond"] = {'wollst'} data.forms["3sg_cond"] = {'wolld'} data.forms["1pl_cond"] = {'wollde'} data.forms["2pl_cond"] = {'wolld'} data.forms["3pl_cond"] = {'wollde'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_mechde(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular", categories = {lang:getCanonicalName .. " irregular verbs", lang:getCanonicalName .. " auxiliary verbs"}} data.past_mechde = true data.forms["1sg_cond"] = {'mechde'} data.forms["2sg_cond"] = {'mechst', 'mechdest'} data.forms["3sg_cond"] = {'mechd'} data.forms["1pl_cond"] = {'mechde'} data.forms["2pl_cond"] = {'mechd'} data.forms["3pl_cond"] = {'mechde'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

function export.irregular_wisse(frame) local params = { ["prefix"] = {}, }	local args = require("Module:parameters").process(frame:getParent.args, params)

local data = {forms = {}, info = "irregular with past tense and conditional mood", categories = {lang:getCanonicalName .. " verbs with past tense", lang:getCanonicalName .. " verbs with conditional mood", lang:getCanonicalName .. " irregular verbs"}} data.past_hon = true data.forms["inf"] = {'wisse'} data.forms["ptcp"] = {'gewusst'} data.forms["aux"] = {'wisse'} data.forms["1sg_pres_indc"] = {'wees'} data.forms["2sg_pres_indc"] = {'weest'} data.forms["3sg_pres_indc"] = {'wees'} data.forms["1pl_pres_indc"] = {'wisse'} data.forms["2pl_pres_indc"] = {'wissd'} data.forms["3pl_pres_indc"] = {'wisse'} data.forms["1sg_past_indc"] = {'wusst'} data.forms["2sg_past_indc"] = {'wusst'} data.forms["3sg_past_indc"] = {'wusst'} data.forms["1pl_past_indc"] = {'wusste'} data.forms["2pl_past_indc"] = {'wusst'} data.forms["3pl_past_indc"] = {'wusste'} data.forms["1sg_cond"] = {'wisst'} data.forms["2sg_cond"] = {'wisst'} data.forms["3sg_cond"] = {'wisst'} data.forms["1pl_cond"] = {'wisste'} data.forms["2pl_cond"] = {'wisst'} data.forms["3pl_cond"] = {'wisste'} postprocess(args, data) return make_table(data) .. m_utilities.format_categories(data.categories, lang) end

local names = { ["inf"] = "infinitive", ["ptcp"] = "participle", ["aux"] = "auxiliary", ["pres_indc"] = "present indicative", ["past_indc"] = "past indicative", ["cond"] = "conditional", ["impr"] = "imperative", ["sub"] = "subjunctive", ["1sg"] = "ich", ["2sg"] = "du", ["3sg"] = "er/sie/es", ["1pl"] = "meer", ["2pl"] = "deer", ["3pl"] = "sie", }

-- Make the table function make_table(data) local function repl(param) if param == "info" then return mw.getContentLanguage:ucfirst(data.info or "") end local forms = data.forms[param] if not forms then return "&mdash;" end local ret = {} for _, form in ipairs(forms) do			table.insert(ret, m_links.full_link({lang = lang, term = form})) end return table.concat(ret, ", ") end local rows = {"1sg", "2sg", "3sg", "1pl", "2pl", "3pl"} local columns = {"pres_indc", "impr"} if data.past then columns = {"pres_indc", "past_indc", "cond", "impr"} end if data.past_sin then columns = {"pres_indc", "past_indc", "cond", "sub", "impr"} end if data.past_hon then columns = {"pres_indc", "past_indc", "cond"} end if data.past_mechde then columns = {"cond"} end if data.past_dun then columns = {"pres_indc", "cond", "impr"} end if data.past_solle then columns = {"pres_indc", "past_indc", "sub"} end local wikicode = {} table.insert(wikicode, "{| class=\"inflection-table vsSwitcher\" data-toggle-category=\"inflection\" style=\"background: #F9F9F9; border: 1px solid #aaa;\"") table.insert(wikicode, "|- style=\"background: #ccc; text-align: left;\"") table.insert(wikicode, "! class=\"vsToggleElement\" style=\"min-width: 33em;\" colspan=\"" .. tostring(#columns + 1) .. "\" | ") table.insert(wikicode, "|- class=\"vsHide\"") table.insert(wikicode, "! style=\"background: #e2e4c0; min-width: 9em;\" | infinitive") table.insert(wikicode, "| colspan=\"" .. tostring(#columns) .. "\" | ") table.insert(wikicode, "|- class=\"vsHide\"") table.insert(wikicode, "! style=\"background: #e2e4c0;\" | participle") table.insert(wikicode, "| colspan=\"" .. tostring(#columns) .. "\" | ") table.insert(wikicode, "|- class=\"vsHide\"") table.insert(wikicode, "! style=\"background: #e2e4c0;\" | auxiliary") table.insert(wikicode, "| colspan=\"" .. tostring(#columns) .. "\" | ") table.insert(wikicode, "|- class=\"vsHide\" style=\"background: #e2e4c0;\"") table.insert(wikicode, "!") for _, col in ipairs(columns) do table.insert(wikicode, "! " .. names[col]) end for _, row in ipairs(rows) do		table.insert(wikicode, "|- class=\"vsHide\"") table.insert(wikicode, "! style=\"background:#DEDEDE\" | " .. names[row]) for _, col in ipairs(columns) do			table.insert(wikicode, "| style=\"min-width: 12em;\" | ") end end table.insert(wikicode, "|- class=\"vsHide\"") table.insert(wikicode, "| colspan=\"" .. tostring(#columns + 1) .. "\"| The use of the present participle is uncommon, but can be made with the suffix -end.") table.insert(wikicode, "|}") wikicode = table.concat(wikicode, "\n") return mw.ustring.gsub(wikicode, "", repl) end

return export