Module:got-verb

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 m_utilities = require("Module:utilities")
local m_links = require("Module:links")
local m_translit = require("Module:Goth-translit")

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

local export = {}


local function postprocess(args, data)
	for key, form in pairs(data.forms) do
		-- Do not show passive forms for verbs that don't have them
		if args["nopasv"] and key:find("pasv") then
			form = nil
		end
		
		data.forms[key] = form
	end
	
	-- Check if the lemma form matches the page name
	if data.forms["inf"] and (lang:makeEntryName(m_translit.tr_reverse(data.forms["inf"][1]))) ~= mw.title.getCurrentTitle().text then
		table.insert(data.categories, lang:getCanonicalName() .. " entries with inflection not matching pagename")
	end
end


local function make_Latn(args, names)
	for _, name in ipairs(names) do
		if args[name] then
			if type(args[name]) == "table" then
				for i, _ in ipairs(args[name]) do
					args[name][i] = m_translit.tr(args[name][i])
				end
			else
				args[name] = m_translit.tr(args[name])
			end
		end
	end
end


-- Inflection functions

export["st"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		[2] = {required = true, default = "{{{2}}}"},
		[3] = {required = true, default = "{{{3}}}"},
		[4] = {required = true, default = "{{{4}}}"},
		["imp2sg"] = {},
		["past2sg"] = {},
		
		["class"] = {},
		["irr"] = {type = "boolean"},
		["j"] = {},
		["nopasv"] = {type = "boolean"},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1, 2, 3, 4, "imp2sg", "past2sg"})
	
	if args["j"] and not (args["j"] == "ji" or args["j"] == "ei") then
		error("Invalid value for parameter j=, must be \"ji\", \"ei\" or empty.")
	end
	
	local data = {
		forms = {},
		info = (args["class"] and "class " .. args["class"] .. " " or "") .. "strong" .. (args["j"] and ", j-present" or "") .. (args["irr"] and ", irregular" or ""),
		categories = {lang:getCanonicalName() .. " " .. (args["class"] and "class " .. args["class"] .. " " or "") .. "strong " .. (args["j"] and "j-present " or "") .. "verbs"}
		}
	
	if args["irr"] then
		table.insert(data.categories, lang:getCanonicalName() .. " irregular verbs")
	end
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args[1] .. (args["j"] and "j" or "") .. "a"}
	data.forms["pres_indc_2sg"] = {args[1] .. (args["j"] or "i") .. "s"}
	data.forms["pres_indc_3sg"] = {args[1] .. (args["j"] or "i") .. "þ"}
	data.forms["pres_indc_1du"] = {args[1] .. (args["j"] and "j" or "") .. "ōs"}
	data.forms["pres_indc_2du"] = {args[1] .. (args["j"] and "j" or "") .. "ats"}
	data.forms["pres_indc_1pl"] = {args[1] .. (args["j"] and "j" or "") .. "am"}
	data.forms["pres_indc_2pl"] = {args[1] .. (args["j"] or "i") .. "þ"}
	data.forms["pres_indc_3pl"] = {args[1] .. (args["j"] and "j" or "") .. "and"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args[1] .. (args["j"] and "j" or "") .. "au"}
	data.forms["pres_subj_2sg"] = {args[1] .. (args["j"] and "j" or "") .. "ais"}
	data.forms["pres_subj_3sg"] = {args[1] .. (args["j"] and "j" or "") .. "ai"}
	data.forms["pres_subj_1du"] = {args[1] .. (args["j"] and "j" or "") .. "aiwa"}
	data.forms["pres_subj_2du"] = {args[1] .. (args["j"] and "j" or "") .. "aits"}
	data.forms["pres_subj_1pl"] = {args[1] .. (args["j"] and "j" or "") .. "aima"}
	data.forms["pres_subj_2pl"] = {args[1] .. (args["j"] and "j" or "") .. "aiþ"}
	data.forms["pres_subj_3pl"] = {args[1] .. (args["j"] and "j" or "") .. "aina"}
	
	-- Imperative
	data.forms["impr_2sg"] = {args["imp2sg"] or args[1] .. (args["j"] and "ei" or "")}
	data.forms["impr_3sg"] = {args[1] .. (args["j"] and "j" or "") .. "adau"}
	data.forms["impr_2du"] = {args[1] .. (args["j"] and "j" or "") .. "ats"}
	data.forms["impr_2pl"] = {args[1] .. (args["j"] or "i") .. "þ"}
	data.forms["impr_3pl"] = {args[1] .. (args["j"] and "j" or "") .. "andau"}
	
	-- Passive indicative
	data.forms["pasv_indc_1sg"] = {args[1] .. (args["j"] and "j" or "") .. "ada"}
	data.forms["pasv_indc_2sg"] = {args[1] .. (args["j"] and "j" or "") .. "aza"}
	data.forms["pasv_indc_3sg"] = {args[1] .. (args["j"] and "j" or "") .. "ada"}
	data.forms["pasv_indc_1pl"] = {args[1] .. (args["j"] and "j" or "") .. "anda"}
	data.forms["pasv_indc_2pl"] = {args[1] .. (args["j"] and "j" or "") .. "anda"}
	data.forms["pasv_indc_3pl"] = {args[1] .. (args["j"] and "j" or "") .. "anda"}
	
	-- Passive subjunctive
	data.forms["pasv_subj_1sg"] = {args[1] .. (args["j"] and "j" or "") .. "aidau"}
	data.forms["pasv_subj_2sg"] = {args[1] .. (args["j"] and "j" or "") .. "aizau"}
	data.forms["pasv_subj_3sg"] = {args[1] .. (args["j"] and "j" or "") .. "aidau"}
	data.forms["pasv_subj_1pl"] = {args[1] .. (args["j"] and "j" or "") .. "aindau"}
	data.forms["pasv_subj_2pl"] = {args[1] .. (args["j"] and "j" or "") .. "aindau"}
	data.forms["pasv_subj_3pl"] = {args[1] .. (args["j"] and "j" or "") .. "aindau"}
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {args[2]}
	data.forms["past_indc_2sg"] = {args["past2sg"] or args[2] .. "t"}
	data.forms["past_indc_3sg"] = {args[2]}
	data.forms["past_indc_1du"] = {args[3] .. "u"}
	data.forms["past_indc_2du"] = {args[3] .. "uts"}
	data.forms["past_indc_1pl"] = {args[3] .. "um"}
	data.forms["past_indc_2pl"] = {args[3] .. "uþ"}
	data.forms["past_indc_3pl"] = {args[3] .. "un"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {args[3] .. "jau"}
	data.forms["past_subj_2sg"] = {args[3] .. "eis"}
	data.forms["past_subj_3sg"] = {args[3] .. "i"}
	data.forms["past_subj_1du"] = {args[3] .. "eiwa"}
	data.forms["past_subj_2du"] = {args[3] .. "eits"}
	data.forms["past_subj_1pl"] = {args[3] .. "eima"}
	data.forms["past_subj_2pl"] = {args[3] .. "eiþ"}
	data.forms["past_subj_3pl"] = {args[3] .. "eina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {args[1] .. (args["j"] and "j" or "") .. "an"}
	data.forms["pres_ptcp"] = {args[1] .. (args["j"] and "j" or "") .. "ands"}
	data.forms["past_ptcp"] = {args[4] .. "ans"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["wk1"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		[2] = {},
		
		["j"] = {required = true, default = "ji"},
		["nopasv"] = {type = "boolean"},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1, 2})
	
	if not (args["j"] == "ji" or args["j"] == "ei") then
		error("Invalid value for parameter j=, must be \"ji\" or \"ei\".")
	end
	
	local data = {forms = {}, info = "class 1 weak", categories = {lang:getCanonicalName() .. " class 1 weak verbs"}}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args[1] .. "ja"}
	data.forms["pres_indc_2sg"] = {args[1] .. args["j"] .. "s"}
	data.forms["pres_indc_3sg"] = {args[1] .. args["j"] .. "þ"}
	data.forms["pres_indc_1du"] = {args[1] .. "jōs"}
	data.forms["pres_indc_2du"] = {args[1] .. "jats"}
	data.forms["pres_indc_1pl"] = {args[1] .. "jam"}
	data.forms["pres_indc_2pl"] = {args[1] .. args["j"] .. "þ"}
	data.forms["pres_indc_3pl"] = {args[1] .. "jand"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args[1] .. "jau"}
	data.forms["pres_subj_2sg"] = {args[1] .. "jais"}
	data.forms["pres_subj_3sg"] = {args[1] .. "jai"}
	data.forms["pres_subj_1du"] = {args[1] .. "jaiwa"}
	data.forms["pres_subj_2du"] = {args[1] .. "jaits"}
	data.forms["pres_subj_1pl"] = {args[1] .. "jaima"}
	data.forms["pres_subj_2pl"] = {args[1] .. "jaiþ"}
	data.forms["pres_subj_3pl"] = {args[1] .. "jaina"}
	
	-- Imperative
	data.forms["impr_2sg"] = {(args[2] or args[1]) .. "ei"}
	data.forms["impr_3sg"] = {args[1] .. "jadau"}
	data.forms["impr_2du"] = {args[1] .. "jats"}
	data.forms["impr_2pl"] = {args[1] .. args["j"] .. "þ"}
	data.forms["impr_3pl"] = {args[1] .. "jandau"}
	
	-- Passive indicative
	data.forms["pasv_indc_1sg"] = {args[1] .. "jada"}
	data.forms["pasv_indc_2sg"] = {args[1] .. "jaza"}
	data.forms["pasv_indc_3sg"] = {args[1] .. "jada"}
	data.forms["pasv_indc_1pl"] = {args[1] .. "janda"}
	data.forms["pasv_indc_2pl"] = {args[1] .. "janda"}
	data.forms["pasv_indc_3pl"] = {args[1] .. "janda"}
	
	-- Passive subjunctive
	data.forms["pasv_subj_1sg"] = {args[1] .. "jaidau"}
	data.forms["pasv_subj_2sg"] = {args[1] .. "jaizau"}
	data.forms["pasv_subj_3sg"] = {args[1] .. "jaidau"}
	data.forms["pasv_subj_1pl"] = {args[1] .. "jaindau"}
	data.forms["pasv_subj_2pl"] = {args[1] .. "jaindau"}
	data.forms["pasv_subj_3pl"] = {args[1] .. "jaindau"}
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {(args[2] or args[1]) .. "ida"}
	data.forms["past_indc_2sg"] = {(args[2] or args[1]) .. "idēs"}
	data.forms["past_indc_3sg"] = {(args[2] or args[1]) .. "ida"}
	data.forms["past_indc_1du"] = {(args[2] or args[1]) .. "idēdu"}
	data.forms["past_indc_2du"] = {(args[2] or args[1]) .. "idēduts"}
	data.forms["past_indc_1pl"] = {(args[2] or args[1]) .. "idēdum"}
	data.forms["past_indc_2pl"] = {(args[2] or args[1]) .. "idēduþ"}
	data.forms["past_indc_3pl"] = {(args[2] or args[1]) .. "idēdun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {(args[2] or args[1]) .. "idēdjau"}
	data.forms["past_subj_2sg"] = {(args[2] or args[1]) .. "idēdeis"}
	data.forms["past_subj_3sg"] = {(args[2] or args[1]) .. "idēdi"}
	data.forms["past_subj_1du"] = {(args[2] or args[1]) .. "idēdeiwa"}
	data.forms["past_subj_2du"] = {(args[2] or args[1]) .. "idēdeits"}
	data.forms["past_subj_1pl"] = {(args[2] or args[1]) .. "idēdeima"}
	data.forms["past_subj_2pl"] = {(args[2] or args[1]) .. "idēdeiþ"}
	data.forms["past_subj_3pl"] = {(args[2] or args[1]) .. "idēdeina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {args[1] .. "jan"}
	data.forms["pres_ptcp"] = {args[1] .. "jands"}
	data.forms["past_ptcp"] = {(args[2] or args[1]) .. "iþs"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["wk1ir"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		[2] = {required = true, default = "{{{2}}}"},
		
		["j"] = {required = true, default = "ji"},
		["nopasv"] = {type = "boolean"},
        ["pastpart"] = {}
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1, 2})
	
	if not (args["j"] == "ji" or args["j"] == "ei") then
		error("Invalid value for parameter j=, must be \"ji\" or \"ei\".")
	end
	
	local data = {forms = {}, info = "class 1 weak irregular", categories = {lang:getCanonicalName() .. " class 1 weak irregular verbs"}}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args[1] .. "ja"}
	data.forms["pres_indc_2sg"] = {args[1] .. args["j"] .. "s"}
	data.forms["pres_indc_3sg"] = {args[1] .. args["j"] .. "þ"}
	data.forms["pres_indc_1du"] = {args[1] .. "jōs"}
	data.forms["pres_indc_2du"] = {args[1] .. "jats"}
	data.forms["pres_indc_1pl"] = {args[1] .. "jam"}
	data.forms["pres_indc_2pl"] = {args[1] .. args["j"] .. "þ"}
	data.forms["pres_indc_3pl"] = {args[1] .. "jand"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args[1] .. "jau"}
	data.forms["pres_subj_2sg"] = {args[1] .. "jais"}
	data.forms["pres_subj_3sg"] = {args[1] .. "jai"}
	data.forms["pres_subj_1du"] = {args[1] .. "jaiwa"}
	data.forms["pres_subj_2du"] = {args[1] .. "jaits"}
	data.forms["pres_subj_1pl"] = {args[1] .. "jaima"}
	data.forms["pres_subj_2pl"] = {args[1] .. "jaiþ"}
	data.forms["pres_subj_3pl"] = {args[1] .. "jaina"}
	
	-- Imperative
	data.forms["impr_2sg"] = {args[1] .. "ei"}
	data.forms["impr_3sg"] = {args[1] .. "jadau"}
	data.forms["impr_2du"] = {args[1] .. "jats"}
	data.forms["impr_2pl"] = {args[1] .. args["j"] .. "þ"}
	data.forms["impr_3pl"] = {args[1] .. "jandau"}
	
	-- Passive indicative
	data.forms["pasv_indc_1sg"] = {args[1] .. "jada"}
	data.forms["pasv_indc_2sg"] = {args[1] .. "jaza"}
	data.forms["pasv_indc_3sg"] = {args[1] .. "jada"}
	data.forms["pasv_indc_1pl"] = {args[1] .. "janda"}
	data.forms["pasv_indc_2pl"] = {args[1] .. "janda"}
	data.forms["pasv_indc_3pl"] = {args[1] .. "janda"}
	
	-- Passive subjunctive
	data.forms["pasv_subj_1sg"] = {args[1] .. "jaidau"}
	data.forms["pasv_subj_2sg"] = {args[1] .. "jaizau"}
	data.forms["pasv_subj_3sg"] = {args[1] .. "jaidau"}
	data.forms["pasv_subj_1pl"] = {args[1] .. "jaindau"}
	data.forms["pasv_subj_2pl"] = {args[1] .. "jaindau"}
	data.forms["pasv_subj_3pl"] = {args[1] .. "jaindau"}
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {args[2] .. "a"}
	data.forms["past_indc_2sg"] = {args[2] .. "ēs"}
	data.forms["past_indc_3sg"] = {args[2] .. "a"}
	data.forms["past_indc_1du"] = {args[2] .. "ēdu"}
	data.forms["past_indc_2du"] = {args[2] .. "ēduts"}
	data.forms["past_indc_1pl"] = {args[2] .. "ēdum"}
	data.forms["past_indc_2pl"] = {args[2] .. "ēduþ"}
	data.forms["past_indc_3pl"] = {args[2] .. "ēdun"}	
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {args[2] .. "ēdjau"}
	data.forms["past_subj_2sg"] = {args[2] .. "ēdeis"}
	data.forms["past_subj_3sg"] = {args[2] .. "ēdi"}
	data.forms["past_subj_1du"] = {args[2] .. "ēdeiwa"}
	data.forms["past_subj_2du"] = {args[2] .. "ēdeits"}
	data.forms["past_subj_1pl"] = {args[2] .. "ēdeima"}
	data.forms["past_subj_2pl"] = {args[2] .. "ēdeiþ"}
	data.forms["past_subj_3pl"] = {args[2] .. "ēdeina"}
	-- Non-finite forms
	data.forms["inf"]       = {args[1] .. "jan"}
	data.forms["pres_ptcp"] = {args[1] .. "jands"}
	data.forms["past_ptcp"] = {args["pastpart"] or args[2] .. "s"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["wk2"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["nopasv"] = {type = "boolean"},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1})
	
	local data = {forms = {}, info = "class 2 weak", categories = {lang:getCanonicalName() .. " class 2 weak verbs"}}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args[1] .. "ō"}
	data.forms["pres_indc_2sg"] = {args[1] .. "ōs"}
	data.forms["pres_indc_3sg"] = {args[1] .. "ōþ"}
	data.forms["pres_indc_1du"] = {args[1] .. "ōs"}
	data.forms["pres_indc_2du"] = {args[1] .. "ōts"}
	data.forms["pres_indc_1pl"] = {args[1] .. "ōm"}
	data.forms["pres_indc_2pl"] = {args[1] .. "ōþ"}
	data.forms["pres_indc_3pl"] = {args[1] .. "ōnd"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args[1] .. "ō"}
	data.forms["pres_subj_2sg"] = {args[1] .. "ōs"}
	data.forms["pres_subj_3sg"] = {args[1] .. "ō"}
	data.forms["pres_subj_1du"] = {args[1] .. "ōwa"}
	data.forms["pres_subj_2du"] = {args[1] .. "ōts"}
	data.forms["pres_subj_1pl"] = {args[1] .. "ōma"}
	data.forms["pres_subj_2pl"] = {args[1] .. "ōþ"}
	data.forms["pres_subj_3pl"] = {args[1] .. "ōna"}
	
	-- Imperative
	data.forms["impr_2sg"] = {args[1] .. "ō"}
	data.forms["impr_3sg"] = {args[1] .. "ōdau"}
	data.forms["impr_2du"] = {args[1] .. "ōts"}
	data.forms["impr_2pl"] = {args[1] .. "ōþ"}
	data.forms["impr_3pl"] = {args[1] .. "ōndau"}
	
	-- Passive indicative
	data.forms["pasv_indc_1sg"] = {args[1] .. "ōda"}
	data.forms["pasv_indc_2sg"] = {args[1] .. "ōza"}
	data.forms["pasv_indc_3sg"] = {args[1] .. "ōda"}
	data.forms["pasv_indc_1pl"] = {args[1] .. "ōnda"}
	data.forms["pasv_indc_2pl"] = {args[1] .. "ōnda"}
	data.forms["pasv_indc_3pl"] = {args[1] .. "ōnda"}
	
	-- Passive subjunctive
	data.forms["pasv_subj_1sg"] = {args[1] .. "ōdau"}
	data.forms["pasv_subj_2sg"] = {args[1] .. "ōzau"}
	data.forms["pasv_subj_3sg"] = {args[1] .. "ōdau"}
	data.forms["pasv_subj_1pl"] = {args[1] .. "ōndau"}
	data.forms["pasv_subj_2pl"] = {args[1] .. "ōndau"}
	data.forms["pasv_subj_3pl"] = {args[1] .. "ōndau"}
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {args[1] .. "ōda"}
	data.forms["past_indc_2sg"] = {args[1] .. "ōdēs"}
	data.forms["past_indc_3sg"] = {args[1] .. "ōda"}
	data.forms["past_indc_1du"] = {args[1] .. "ōdēdu"}
	data.forms["past_indc_2du"] = {args[1] .. "ōdēduts"}
	data.forms["past_indc_1pl"] = {args[1] .. "ōdēdum"}
	data.forms["past_indc_2pl"] = {args[1] .. "ōdēduþ"}
	data.forms["past_indc_3pl"] = {args[1] .. "ōdēdun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {args[1] .. "ōdēdjau"}
	data.forms["past_subj_2sg"] = {args[1] .. "ōdēdeis"}
	data.forms["past_subj_3sg"] = {args[1] .. "ōdēdi"}
	data.forms["past_subj_1du"] = {args[1] .. "ōdēdeiwa"}
	data.forms["past_subj_2du"] = {args[1] .. "ōdēdeits"}
	data.forms["past_subj_1pl"] = {args[1] .. "ōdēdeima"}
	data.forms["past_subj_2pl"] = {args[1] .. "ōdēdeiþ"}
	data.forms["past_subj_3pl"] = {args[1] .. "ōdēdeina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {args[1] .. "ōn"}
	data.forms["pres_ptcp"] = {args[1] .. "ōnds"}
	data.forms["past_ptcp"] = {args[1] .. "ōþs"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["wk3"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["nopasv"] = {type = "boolean"},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1})
	
	local data = {forms = {}, info = "class 3 weak", categories = {lang:getCanonicalName() .. " class 3 weak verbs"}}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args[1] .. "a"}
	data.forms["pres_indc_2sg"] = {args[1] .. "ais"}
	data.forms["pres_indc_3sg"] = {args[1] .. "aiþ"}
	data.forms["pres_indc_1du"] = {args[1] .. "ōs"}
	data.forms["pres_indc_2du"] = {args[1] .. "āts"}
	data.forms["pres_indc_1pl"] = {args[1] .. "ām"}
	data.forms["pres_indc_2pl"] = {args[1] .. "aiþ"}
	data.forms["pres_indc_3pl"] = {args[1] .. "ānd"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args[1] .. "au"}
	data.forms["pres_subj_2sg"] = {args[1] .. "ais"}
	data.forms["pres_subj_3sg"] = {args[1] .. "ai"}
	data.forms["pres_subj_1du"] = {args[1] .. "aiwa"}
	data.forms["pres_subj_2du"] = {args[1] .. "aits"}
	data.forms["pres_subj_1pl"] = {args[1] .. "aima"}
	data.forms["pres_subj_2pl"] = {args[1] .. "aiþ"}
	data.forms["pres_subj_3pl"] = {args[1] .. "aina"}
	
	-- Imperative
	data.forms["impr_2sg"] = {args[1] .. "ai"}
	data.forms["impr_3sg"] = {args[1] .. "ādau"}
	data.forms["impr_2du"] = {args[1] .. "āts"}
	data.forms["impr_2pl"] = {args[1] .. "aiþ"}
	data.forms["impr_3pl"] = {args[1] .. "āndau"}
	
	-- Passive indicative
	data.forms["pasv_indc_1sg"] = {args[1] .. "āda"}
	data.forms["pasv_indc_2sg"] = {args[1] .. "āza"}
	data.forms["pasv_indc_3sg"] = {args[1] .. "āda"}
	data.forms["pasv_indc_1pl"] = {args[1] .. "ānda"}
	data.forms["pasv_indc_2pl"] = {args[1] .. "ānda"}
	data.forms["pasv_indc_3pl"] = {args[1] .. "ānda"}
	
	-- Passive subjunctive
	data.forms["pasv_subj_1sg"] = {args[1] .. "aidau"}
	data.forms["pasv_subj_2sg"] = {args[1] .. "aizau"}
	data.forms["pasv_subj_3sg"] = {args[1] .. "aidau"}
	data.forms["pasv_subj_1pl"] = {args[1] .. "aindau"}
	data.forms["pasv_subj_2pl"] = {args[1] .. "aindau"}
	data.forms["pasv_subj_3pl"] = {args[1] .. "aindau"}
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {args[1] .. "aida"}
	data.forms["past_indc_2sg"] = {args[1] .. "aidēs"}
	data.forms["past_indc_3sg"] = {args[1] .. "aida"}
	data.forms["past_indc_1du"] = {args[1] .. "aidēdu"}
	data.forms["past_indc_2du"] = {args[1] .. "aidēduts"}
	data.forms["past_indc_1pl"] = {args[1] .. "aidēdum"}
	data.forms["past_indc_2pl"] = {args[1] .. "aidēduþ"}
	data.forms["past_indc_3pl"] = {args[1] .. "aidēdun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {args[1] .. "aidēdjau"}
	data.forms["past_subj_2sg"] = {args[1] .. "aidēdeis"}
	data.forms["past_subj_3sg"] = {args[1] .. "aidēdi"}
	data.forms["past_subj_1du"] = {args[1] .. "aidēdeiwa"}
	data.forms["past_subj_2du"] = {args[1] .. "aidēdeits"}
	data.forms["past_subj_1pl"] = {args[1] .. "aidēdeima"}
	data.forms["past_subj_2pl"] = {args[1] .. "aidēdeiþ"}
	data.forms["past_subj_3pl"] = {args[1] .. "aidēdeina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {args[1] .. "ān"}
	data.forms["pres_ptcp"] = {args[1] .. "ānds"}
	data.forms["past_ptcp"] = {args[1] .. "aiþs"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["wk4"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["nopasv"] = {type = "boolean"},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1})
	
	local data = {forms = {}, info = "class 4 weak", categories = {lang:getCanonicalName() .. " class 4 weak verbs"}}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args[1] .. "na"}
	data.forms["pres_indc_2sg"] = {args[1] .. "nis"}
	data.forms["pres_indc_3sg"] = {args[1] .. "niþ"}
	data.forms["pres_indc_1du"] = {args[1] .. "nōs"}
	data.forms["pres_indc_2du"] = {args[1] .. "nats"}
	data.forms["pres_indc_1pl"] = {args[1] .. "nam"}
	data.forms["pres_indc_2pl"] = {args[1] .. "niþ"}
	data.forms["pres_indc_3pl"] = {args[1] .. "nand"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args[1] .. "nau"}
	data.forms["pres_subj_2sg"] = {args[1] .. "nais"}
	data.forms["pres_subj_3sg"] = {args[1] .. "nai"}
	data.forms["pres_subj_1du"] = {args[1] .. "naiwa"}
	data.forms["pres_subj_2du"] = {args[1] .. "naits"}
	data.forms["pres_subj_1pl"] = {args[1] .. "naima"}
	data.forms["pres_subj_2pl"] = {args[1] .. "naiþ"}
	data.forms["pres_subj_3pl"] = {args[1] .. "naina"}
	
	-- Imperative
	data.forms["impr_2sg"] = {args[1] .. "n"}
	data.forms["impr_3sg"] = {args[1] .. "nadau"}
	data.forms["impr_2du"] = {args[1] .. "nats"}
	data.forms["impr_2pl"] = {args[1] .. "niþ"}
	data.forms["impr_3pl"] = {args[1] .. "nandau"}
	
	-- Passive indicative
	-- No forms
	
	-- Passive subjunctive
	-- No forms
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {args[1] .. "nōda"}
	data.forms["past_indc_2sg"] = {args[1] .. "nōdēs"}
	data.forms["past_indc_3sg"] = {args[1] .. "nōda"}
	data.forms["past_indc_1du"] = {args[1] .. "nōdēdu"}
	data.forms["past_indc_2du"] = {args[1] .. "nōdēduts"}
	data.forms["past_indc_1pl"] = {args[1] .. "nōdēdum"}
	data.forms["past_indc_2pl"] = {args[1] .. "nōdēduþ"}
	data.forms["past_indc_3pl"] = {args[1] .. "nōdēdun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {args[1] .. "nōdēdjau"}
	data.forms["past_subj_2sg"] = {args[1] .. "nōdēdeis"}
	data.forms["past_subj_3sg"] = {args[1] .. "nōdēdi"}
	data.forms["past_subj_1du"] = {args[1] .. "nōdēdeiwa"}
	data.forms["past_subj_2du"] = {args[1] .. "nōdēdeits"}
	data.forms["past_subj_1pl"] = {args[1] .. "nōdēdeima"}
	data.forms["past_subj_2pl"] = {args[1] .. "nōdēdeiþ"}
	data.forms["past_subj_3pl"] = {args[1] .. "nōdēdeina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {args[1] .. "nan"}
	data.forms["pres_ptcp"] = {args[1] .. "nands"}
	data.forms["past_ptcp"] = nil
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["pp"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		[2] = {required = true, default = "{{{2}}}"},
		[3] = {required = true, default = "{{{3}}}"},
		["pres2sg"] = {},
		["imp2sg"] = {},
		["pastpart"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1, 2, 3, "pres2sg", "imp2sg", "pastpart"})
	
	local data = {forms = {}, info = "preterite-present", categories = {lang:getCanonicalName() .. " preterite-present verbs"}}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args[2]}
	data.forms["pres_indc_2sg"] = {args["pres2sg"] or args[2] .. "t"}
	data.forms["pres_indc_3sg"] = {args[2]}
	data.forms["pres_indc_1du"] = {args[1] .. "u"}
	data.forms["pres_indc_2du"] = {args[1] .. "uts"}
	data.forms["pres_indc_1pl"] = {args[1] .. "um"}
	data.forms["pres_indc_2pl"] = {args[1] .. "uþ"}
	data.forms["pres_indc_3pl"] = {args[1] .. "un"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args[1] .. "jau"}
	data.forms["pres_subj_2sg"] = {args[1] .. "eis"}
	data.forms["pres_subj_3sg"] = {args[1] .. "i"}
	data.forms["pres_subj_1du"] = {args[1] .. "eiwa"}
	data.forms["pres_subj_2du"] = {args[1] .. "eits"}
	data.forms["pres_subj_1pl"] = {args[1] .. "eima"}
	data.forms["pres_subj_2pl"] = {args[1] .. "eiþ"}
	data.forms["pres_subj_3pl"] = {args[1] .. "eina"}
	
	-- Imperative
	-- No forms (except at ōgan)
	data.forms["impr_2sg"] = {args["imp2sg"] or nil}
	
	-- Passive indicative
	-- No forms
	
	-- Passive subjunctive
	-- No forms
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {args[3] .. "a"}
	data.forms["past_indc_2sg"] = {args[3] .. "ēs"}
	data.forms["past_indc_3sg"] = {args[3] .. "a"}
	data.forms["past_indc_1du"] = {args[3] .. "ēdu"}
	data.forms["past_indc_2du"] = {args[3] .. "ēduts"}
	data.forms["past_indc_1pl"] = {args[3] .. "ēdum"}
	data.forms["past_indc_2pl"] = {args[3] .. "ēduþ"}
	data.forms["past_indc_3pl"] = {args[3] .. "ēdun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {args[3] .. "ēdjau"}
	data.forms["past_subj_2sg"] = {args[3] .. "ēdeis"}
	data.forms["past_subj_3sg"] = {args[3] .. "ēdi"}
	data.forms["past_subj_1du"] = {args[3] .. "ēdeiwa"}
	data.forms["past_subj_2du"] = {args[3] .. "ēdeits"}
	data.forms["past_subj_1pl"] = {args[3] .. "ēdeima"}
	data.forms["past_subj_2pl"] = {args[3] .. "ēdeiþ"}
	data.forms["past_subj_3pl"] = {args[3] .. "ēdeina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {args[1] .. "an"}
	data.forms["pres_ptcp"] = {args[1] .. "ands"}
	data.forms["past_ptcp"] = {args["pastpart"] or args[3] .. "s"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


-- Irregular verbs


export["ufkunnan"] = function(frame)
	local params = {
		["pres2sg"] = {},
		["imp2sg"] = {},
		["pastpart"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {1, 2, 3, "pres2sg", "imp2sg", "pastpart"})
	
	local data = {forms = {}, info = "irregular, mixed class 3 weak and preterite-present", 	categories = {lang:getCanonicalName() .. " class 3 weak verbs", lang:getCanonicalName() .. " irregular verbs", lang:getCanonicalName() .. " preterite-present verbs"}
		}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {"ufkunna"}
	data.forms["pres_indc_2sg"] = {"ufkunnais"}
	data.forms["pres_indc_3sg"] = {"ufkunnaiþ"}
	data.forms["pres_indc_1du"] = {"ufkunnōs"}
	data.forms["pres_indc_2du"] = {"ufkunnāts"}
	data.forms["pres_indc_1pl"] = {"ufkunnaim"}
	data.forms["pres_indc_2pl"] = {"ufkunnaiþ"}
	data.forms["pres_indc_3pl"] = {"ufkunnānd"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {"ufkunnau"}
	data.forms["pres_subj_2sg"] = {"ufkunnais"}
	data.forms["pres_subj_3sg"] = {"ufkunnai"}
	data.forms["pres_subj_1du"] = {"ufkunnaiwa"}
	data.forms["pres_subj_2du"] = {"ufkunnaits"}
	data.forms["pres_subj_1pl"] = {"ufkunnaima"}
	data.forms["pres_subj_2pl"] = {"ufkunnaiþ"}
	data.forms["pres_subj_3pl"] = {"ufkunnaina"}
	
	-- Imperative
	data.forms["impr_2sg"] = {"ufkunnai"}
	data.forms["impr_3sg"] = {"ufkunnādau"}
	data.forms["impr_2du"] = {"ufkunnāts"}
	data.forms["impr_2pl"] = {"ufkunnaiþ"}
	data.forms["impr_3pl"] = {"ufkunnāndau"}
	
	-- Passive indicative
	data.forms["pasv_indc_1sg"] = {"ufkunnāda"}
	data.forms["pasv_indc_2sg"] = {"ufkunnāza"}
	data.forms["pasv_indc_3sg"] = {"ufkunnāda"}
	data.forms["pasv_indc_1pl"] = {"ufkunnānda"}
	data.forms["pasv_indc_2pl"] = {"ufkunnānda"}
	data.forms["pasv_indc_3pl"] = {"ufkunnānda"}
	
	-- Passive subjunctive
	data.forms["pasv_subj_1sg"] = {"ufkunnaidau"}
	data.forms["pasv_subj_2sg"] = {"ufkunnaizau"}
	data.forms["pasv_subj_3sg"] = {"ufkunnaidau"}
	data.forms["pasv_subj_1pl"] = {"ufkunnaindau"}
	data.forms["pasv_subj_2pl"] = {"ufkunnaindau"}
	data.forms["pasv_subj_3pl"] = {"ufkunnaindau"}
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {"ufkunþa", "ufkunnaida"}
	data.forms["past_indc_2sg"] = {"ufkunþēs"}
	data.forms["past_indc_3sg"] = {"ufkunþa", "ufkunnaida"}
	data.forms["past_indc_1du"] = {"ufkunþēdu"}
	data.forms["past_indc_2du"] = {"ufkunþēduts"}
	data.forms["past_indc_1pl"] = {"ufkunþēdum"}
	data.forms["past_indc_2pl"] = {"ufkunþēduþ"}
	data.forms["past_indc_3pl"] = {"ufkunþēdun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {"ufkunþēdjau"}
	data.forms["past_subj_2sg"] = {"ufkunþēdeis"}
	data.forms["past_subj_3sg"] = {"ufkunþēdi"}
	data.forms["past_subj_1du"] = {"ufkunþēdeiwa"}
	data.forms["past_subj_2du"] = {"ufkunþēdeits"}
	data.forms["past_subj_1pl"] = {"ufkunþēdeima"}
	data.forms["past_subj_2pl"] = {"ufkunþēdeiþ"}
	data.forms["past_subj_3pl"] = {"ufkunþēdeina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {"ufkunnān"}
	data.forms["pres_ptcp"] = {"ufkunnānds"}
	data.forms["past_ptcp"] = {"ufkunnaiþs"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["wiljan"] = function(frame)
	local params = {
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {
		forms = {}, info = "weak, irregular, no present indicative forms",
		categories = {lang:getCanonicalName() .. " weak verbs", lang:getCanonicalName() .. " irregular verbs", lang:getCanonicalName() .. " defective verbs"}
		}
	
	-- Present indicative
	-- No forms
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {"wiljau"}
	data.forms["pres_subj_2sg"] = {"wileis"}
	data.forms["pres_subj_3sg"] = {"wili"}
	data.forms["pres_subj_1du"] = {"wileiwa"}
	data.forms["pres_subj_2du"] = {"wileits"}
	data.forms["pres_subj_1pl"] = {"wileima"}
	data.forms["pres_subj_2pl"] = {"wileiþ"}
	data.forms["pres_subj_3pl"] = {"wileina"}
	
	-- Imperative
	-- No forms
	
	-- Passive indicative
	-- No forms
	
	-- Passive subjunctive
	-- No forms
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {"wilda"}
	data.forms["past_indc_2sg"] = {"wildēs"}
	data.forms["past_indc_3sg"] = {"wilda"}
	data.forms["past_indc_1du"] = {"wildēdu"}
	data.forms["past_indc_2du"] = {"wildēduts"}
	data.forms["past_indc_1pl"] = {"wildēdum"}
	data.forms["past_indc_2pl"] = {"wildēduþ"}
	data.forms["past_indc_3pl"] = {"wildēdun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {"wildēdjau"}
	data.forms["past_subj_2sg"] = {"wildēdeis"}
	data.forms["past_subj_3sg"] = {"wildēdi"}
	data.forms["past_subj_1du"] = {"wildēdeiwa"}
	data.forms["past_subj_2du"] = {"wildēdeits"}
	data.forms["past_subj_1pl"] = {"wildēdeima"}
	data.forms["past_subj_2pl"] = {"wildēdeiþ"}
	data.forms["past_subj_3pl"] = {"wildēdeina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {"wiljan"}
	data.forms["pres_ptcp"] = {"wiljands"}
	data.forms["past_ptcp"] = nil
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["wisan"] = function(frame)
	local params = {
		["prefix"] = {default = ""},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	make_Latn(args, {"prefix"})
	
	local data = {
		forms = {}, info = "class 5 strong, irregular, [[Appendix:Glossary#suppletive|suppletive]]",
		categories = {lang:getCanonicalName() .. " class 5 strong verbs", lang:getCanonicalName() .. " irregular verbs", lang:getCanonicalName() .. " suppletive verbs"}
		}
	
	-- Present indicative
	data.forms["pres_indc_1sg"] = {args["prefix"] .. "im"}
	data.forms["pres_indc_2sg"] = {args["prefix"] .. "is"}
	data.forms["pres_indc_3sg"] = {args["prefix"] .. "ist"}
	data.forms["pres_indc_1du"] = {args["prefix"] .. "siju"}
	data.forms["pres_indc_2du"] = {args["prefix"] .. "sijuts"}
	data.forms["pres_indc_1pl"] = {args["prefix"] .. "sijum"}
	data.forms["pres_indc_2pl"] = {args["prefix"] .. "sijuþ"}
	data.forms["pres_indc_3pl"] = {args["prefix"] .. "sind"}
	
	-- Present subjunctive
	data.forms["pres_subj_1sg"] = {args["prefix"] .. "sijau"}
	data.forms["pres_subj_2sg"] = {args["prefix"] .. "sijais"}
	data.forms["pres_subj_3sg"] = {args["prefix"] .. "sijai"}
	data.forms["pres_subj_1du"] = {args["prefix"] .. "sijaiwa"}
	data.forms["pres_subj_2du"] = {args["prefix"] .. "sijaits"}
	data.forms["pres_subj_1pl"] = {args["prefix"] .. "sijaima"}
	data.forms["pres_subj_2pl"] = {args["prefix"] .. "sijaiþ"}
	data.forms["pres_subj_3pl"] = {args["prefix"] .. "sijaina"}
	
	-- Imperative
	-- No forms
	
	-- Passive indicative
	-- No forms
	
	-- Passive subjunctive
	-- No forms
	
	-- Past indicative
	data.forms["past_indc_1sg"] = {args["prefix"] .. "was"}
	data.forms["past_indc_2sg"] = {args["prefix"] .. "wast"}
	data.forms["past_indc_3sg"] = {args["prefix"] .. "was"}
	data.forms["past_indc_1du"] = {args["prefix"] .. "wēsu"}
	data.forms["past_indc_2du"] = {args["prefix"] .. "wēsuts"}
	data.forms["past_indc_1pl"] = {args["prefix"] .. "wēsum"}
	data.forms["past_indc_2pl"] = {args["prefix"] .. "wēsuþ"}
	data.forms["past_indc_3pl"] = {args["prefix"] .. "wēsun"}
	
	-- Past subjunctive
	data.forms["past_subj_1sg"] = {args["prefix"] .. "wēsjau"}
	data.forms["past_subj_2sg"] = {args["prefix"] .. "wēseis"}
	data.forms["past_subj_3sg"] = {args["prefix"] .. "wēsi"}
	data.forms["past_subj_1du"] = {args["prefix"] .. "wēseiwa"}
	data.forms["past_subj_2du"] = {args["prefix"] .. "wēseits"}
	data.forms["past_subj_1pl"] = {args["prefix"] .. "wēseima"}
	data.forms["past_subj_2pl"] = {args["prefix"] .. "wēseiþ"}
	data.forms["past_subj_3pl"] = {args["prefix"] .. "wēseina"}
	
	-- Non-finite forms
	data.forms["inf"]       = {args["prefix"] .. "wisan"}
	data.forms["pres_ptcp"] = {args["prefix"] .. "wisands"}
	data.forms["past_ptcp"] = {args["prefix"] .. "wisans"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end

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

	local data = {
		forms = {}, info = "class 3 strong",
		categories = {lang:getCanonicalName() .. " class 3 strong verbs"}
		}
	
    -- Present indicative
    data.forms["pres_indc_1sg"] = {"brigga"}
    data.forms["pres_indc_2sg"] = {"briggis"}
    data.forms["pres_indc_3sg"] = {"briggiþ"}
    data.forms["pres_indc_1du"] = {"briggōs"}
    data.forms["pres_indc_2du"] = {"briggats"}
    data.forms["pres_indc_1pl"] = {"briggam"}
    data.forms["pres_indc_2pl"] = {"briggiþ"}
    data.forms["pres_indc_3pl"] = {"briggand"}

    -- Present subjunctive
    data.forms["pres_subj_1sg"] = {"briggau"}
    data.forms["pres_subj_2sg"] = {"briggais"}
    data.forms["pres_subj_3sg"] = {"briggai"}
    data.forms["pres_subj_1du"] = {"briggaiwa"}
    data.forms["pres_subj_2du"] = {"briggaits"}
    data.forms["pres_subj_1pl"] = {"briggaima"}
    data.forms["pres_subj_2pl"] = {"briggaiþ"}
    data.forms["pres_subj_3pl"] = {"briggaina"}

    -- Imperative
    data.forms["impr_2sg"] = {"brigg"}
    data.forms["impr_3sg"] = {"briggadau"}
    data.forms["impr_2du"] = {"briggats"}
    data.forms["impr_2pl"] = {"briggiþ"}
    data.forms["impr_3pl"] = {"briggandau"}

    -- Passive indicative
    data.forms["pasv_indc_1sg"] = {"briggada"}
    data.forms["pasv_indc_2sg"] = {"briggaza"}
    data.forms["pasv_indc_3sg"] = {"briggada"}
    data.forms["pasv_indc_1pl"] = {"brigganda"}
    data.forms["pasv_indc_2pl"] = {"brigganda"}
    data.forms["pasv_indc_3pl"] = {"brigganda"}

    -- Passive subjunctive
    data.forms["pasv_subj_1sg"] = {"briggadau"}
    data.forms["pasv_subj_2sg"] = {"briggazau"}
    data.forms["pasv_subj_3sg"] = {"briggadau"}
    data.forms["pasv_subj_1pl"] = {"briggandau"}
    data.forms["pasv_subj_2pl"] = {"briggandau"}
    data.forms["pasv_subj_3pl"] = {"briggandau"}

    -- Past indicative
    data.forms["past_indc_1sg"] = {"brāhta"}
    data.forms["past_indc_2sg"] = {"brāhtēs"}
    data.forms["past_indc_3sg"] = {"brāhta"}
    data.forms["past_indc_1du"] = {"brāhtēdu"}
    data.forms["past_indc_2du"] = {"brāhtēduts"}
    data.forms["past_indc_1pl"] = {"brāhtēdum"}
    data.forms["past_indc_2pl"] = {"brāhtēduþ"}
    data.forms["past_indc_3pl"] = {"brāhtēdun"}

    -- Past subjunctive
    data.forms["past_subj_1sg"] = {"brāhtēdjau"}
    data.forms["past_subj_2sg"] = {"brāhtēdeis"}
    data.forms["past_subj_3sg"] = {"brāhtēdi"}
    data.forms["past_subj_1du"] = {"brāhtēdeiwa"}
    data.forms["past_subj_2du"] = {"brāhtēdeits"}
    data.forms["past_subj_1pl"] = {"brāhtēdeima"}
    data.forms["past_subj_2pl"] = {"brāhtēdeiþ"}
    data.forms["past_subj_3pl"] = {"brāhtēdeina"}

    -- Non-finite forms
    data.forms["inf"]       = {"briggan"}
    data.forms["pres_ptcp"] = {"briggands"}
    data.forms["past_ptcp"] = {"brāhts"}
    
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end

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

	local data = {
		forms = {}, info = "irregular, mixed strong and class 3 weak",
		categories = {lang:getCanonicalName() .. " irregular verbs"}
		}
	
    -- Present indicative
    data.forms["pres_indc_1sg"] = {args["prefix"] .. "baua"}
    data.forms["pres_indc_2sg"] = {args["prefix"] .. "bauis"}
    data.forms["pres_indc_3sg"] = {args["prefix"] .. "bauiþ"}
    data.forms["pres_indc_1du"] = {args["prefix"] .. "bauōs"}
    data.forms["pres_indc_2du"] = {args["prefix"] .. "bauats"}
    data.forms["pres_indc_1pl"] = {args["prefix"] .. "bauam"}
    data.forms["pres_indc_2pl"] = {args["prefix"] .. "bauiþ"}
    data.forms["pres_indc_3pl"] = {args["prefix"] .. "bauand"}

    -- Present subjunctive
    data.forms["pres_subj_1sg"] = {args["prefix"] .. "bauau"}
    data.forms["pres_subj_2sg"] = {args["prefix"] .. "bauais"}
    data.forms["pres_subj_3sg"] = {args["prefix"] .. "bauai"}
    data.forms["pres_subj_1du"] = {args["prefix"] .. "bauaiwa"}
    data.forms["pres_subj_2du"] = {args["prefix"] .. "bauaits"}
    data.forms["pres_subj_1pl"] = {args["prefix"] .. "bauaima"}
    data.forms["pres_subj_2pl"] = {args["prefix"] .. "bauaiþ"}
    data.forms["pres_subj_3pl"] = {args["prefix"] .. "bauaina"}

    -- Imperative
    data.forms["impr_2sg"] = {args["prefix"] .. "bau"}
    data.forms["impr_3sg"] = {args["prefix"] .. "bauadau"}
    data.forms["impr_2du"] = {args["prefix"] .. "bauats"}
    data.forms["impr_2pl"] = {args["prefix"] .. "bauiþ"}
    data.forms["impr_3pl"] = {args["prefix"] .. "bauandau"}

    -- Passive indicative
    data.forms["pasv_indc_1sg"] = {args["prefix"] .. "bauada"}
    data.forms["pasv_indc_2sg"] = {args["prefix"] .. "bauaza"}
    data.forms["pasv_indc_3sg"] = {args["prefix"] .. "bauada"}
    data.forms["pasv_indc_1pl"] = {args["prefix"] .. "bauanda"}
    data.forms["pasv_indc_2pl"] = {args["prefix"] .. "bauanda"}
    data.forms["pasv_indc_3pl"] = {args["prefix"] .. "bauanda"}

    -- Passive subjunctive
    data.forms["pasv_subj_1sg"] = {args["prefix"] .. "bauaidau"}
    data.forms["pasv_subj_2sg"] = {args["prefix"] .. "bauaizau"}
    data.forms["pasv_subj_3sg"] = {args["prefix"] .. "bauaidau"}
    data.forms["pasv_subj_1pl"] = {args["prefix"] .. "bauaindau"}
    data.forms["pasv_subj_2pl"] = {args["prefix"] .. "bauaindau"}
    data.forms["pasv_subj_3pl"] = {args["prefix"] .. "bauaindau"}

    -- Past indicative
    data.forms["past_indc_1sg"] = {args["prefix"] .. "bauaida"}
    data.forms["past_indc_2sg"] = {args["prefix"] .. "bauaidēs"}
    data.forms["past_indc_3sg"] = {args["prefix"] .. "bauaida"}
    data.forms["past_indc_1du"] = {args["prefix"] .. "bauaidēdu"}
    data.forms["past_indc_2du"] = {args["prefix"] .. "bauaidēduts"}
    data.forms["past_indc_1pl"] = {args["prefix"] .. "bauaidēdum"}
    data.forms["past_indc_2pl"] = {args["prefix"] .. "bauaidēduþ"}
    data.forms["past_indc_3pl"] = {args["prefix"] .. "bauaidēdun"}

    -- Past subjunctive
    data.forms["past_subj_1sg"] = {args["prefix"] .. "bauaidēdjau"}
    data.forms["past_subj_2sg"] = {args["prefix"] .. "bauaidēdeis"}
    data.forms["past_subj_3sg"] = {args["prefix"] .. "bauaidēdi"}
    data.forms["past_subj_1du"] = {args["prefix"] .. "bauaidēdeiwa"}
    data.forms["past_subj_2du"] = {args["prefix"] .. "bauaidēdeits"}
    data.forms["past_subj_1pl"] = {args["prefix"] .. "bauaidēdeima"}
    data.forms["past_subj_2pl"] = {args["prefix"] .. "bauaidēdeiþ"}
    data.forms["past_subj_3pl"] = {args["prefix"] .. "bauaidēdeina"}

    -- Non-finite forms
    data.forms["inf"]       = {args["prefix"] .. "bauan"}
    data.forms["pres_ptcp"] = {args["prefix"] .. "bauands"}
    data.forms["past_ptcp"] = {args["prefix"] .. "bauaiþs"}
    
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end

-- Make the table
function make_table(data)
	local function repl(param)
		if param == "info" then
			return mw.getContentLanguage():ucfirst(data.info or "")
		end
		
		local form = data.forms[param]
		
		if not form or #form == 0 then
			return "—"
		end
		
		local ret_Goth = {}
		local ret_Latn = {}
		
		for key, subform in ipairs(form) do
			table.insert(ret_Latn, m_links.full_link({lang = lang, term = subform, tr = "-"}))
			table.insert(ret_Goth, m_links.full_link({lang = lang, term = m_translit.tr_reverse(subform), tr = "-"}))
		end
		
		return table.concat(ret_Goth, ", ") .. "<br/>" ..  table.concat(ret_Latn, ", ")
	end
	
	local names = {
		["indc"] = "indicative",
		["subj"] = "subjunctive",
		["impr"] = "imperative",
		
		["pres"] = "present",
		["pasv"] = "present passive",
		["past"] = "past",
		
		["1sg"] = "1st singular",
		["2sg"] = "2nd singular",
		["3sg"] = "3rd singular",
		["1du"] = "1st dual",
		["2du"] = "2nd dual",
		["1pl"] = "1st plural",
		["2pl"] = "2nd plural",
		["3pl"] = "3rd plural",
	}
	
	local pns = {"1sg", "2sg", "3sg", "1du", "2du", "1pl", "2pl", "3pl"}
	local impr_pns = {"2sg", "3sg", "2du", "2pl", "3pl"}
	local moods = {"indc", "subj"}
	local tenses = {"pres", "past", "pasv"}
	
	local wikicode = {}
	
	table.insert(wikicode, "{| class=\"wikitable inflection-table vsSwitcher\" style=\"border-style: double; border-width: 3px;\" cellspacing=\"1\" data-toggle-category=\"conjugation\"")
	table.insert(wikicode, "|-")
	table.insert(wikicode, "! class=\"vsToggleElement\" style=\"background: #CCC; min-width: " .. (8 + #tenses * 12) .. "em; text-align: left;\" colspan=\"" .. (#tenses + 1) .. "\" | {{{info}}}")
	
	table.insert(wikicode, "|- class=\"vsHide\"")
	table.insert(wikicode, "! " .. mw.getContentLanguage():ucfirst("infinitive"))
	table.insert(wikicode, "| colspan=\"" .. (#tenses) .. "\" | {{{inf}}}")
	
	for _, mood in ipairs(moods) do
		table.insert(wikicode, "|- class=\"vsHide\"")
		table.insert(wikicode, "! style=\"min-width: 8em;\" | " .. mw.getContentLanguage():ucfirst(names[mood]))
		
		for _, tense in ipairs(tenses) do
			table.insert(wikicode, "! style=\"min-width: 12em;\" | " .. mw.getContentLanguage():ucfirst(names[tense]))
		end
		
		for _, pn in ipairs(pns) do
			table.insert(wikicode, "|- class=\"vsHide\"")
			table.insert(wikicode, "! " .. mw.getContentLanguage():ucfirst(names[pn]))
			
			for _, tense in ipairs(tenses) do
				table.insert(wikicode, "| {{{" .. tense .. "_" .. mood .. "_" .. pn .. "}}}")
			end
		end
	end
	
	table.insert(wikicode, "|- class=\"vsHide\"")
	table.insert(wikicode, "! " .. mw.getContentLanguage():ucfirst(names["impr"]))
	table.insert(wikicode, "!")
	table.insert(wikicode, "! colspan=\"" .. (#tenses) .. "\" rowspan=\"" .. (#impr_pns + 1) .. "\"|")
	
	for _, pn in ipairs(impr_pns) do
		table.insert(wikicode, "|- class=\"vsHide\"")
		table.insert(wikicode, "! " .. mw.getContentLanguage():ucfirst(names[pn]))
		table.insert(wikicode, "| {{{impr_" .. pn .. "}}}")
	end
	
	table.insert(wikicode, "|- class=\"vsHide\"")
	table.insert(wikicode, "|")
	table.insert(wikicode, "! " .. mw.getContentLanguage():ucfirst("present"))
	table.insert(wikicode, "! " .. mw.getContentLanguage():ucfirst("past"))
	table.insert(wikicode, "! rowspan=\"2\" |")
	table.insert(wikicode, "|- class=\"vsHide\"")
	table.insert(wikicode, "! " .. mw.getContentLanguage():ucfirst("participles"))
	table.insert(wikicode, "| {{{pres_ptcp}}}")
	table.insert(wikicode, "| {{{past_ptcp}}}")
	
	table.insert(wikicode, "|}")
	
	wikicode = table.concat(wikicode, "\n")
	
	return mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", repl)
end

return export