Module:rad-stem/templates

Underlies:


local export = {}
local getArgs = require('Module:Arguments').getArgs

local m_stem = require("Module:rad-stem")
local m_links = require("Module:links")
local m_languages = require("Module:languages")
local m_ipa = require("Module:rad-IPA")

local C = "bcdðfghħjĵkķlmnņpqrsștvwxzþ°"

local format_table = {}

function add(code)
	table.insert(format_table, code)
end

function tr()
	table.insert(format_table, "<tr>")	
end

function tr_()
	table.insert(format_table, "</tr>")	
end

function _tr()
	table.insert(format_table, "</tr>")	
	table.insert(format_table, "<tr>")	
end
	
function th(data, rowspan, colspan)
	data = data or ""
	local to_add = "<th"
	if rowspan and rowspan~=1 then to_add = to_add .. " rowspan=" .. rowspan end
	if colspan and colspan~=1 then to_add = to_add .. " colspan=" .. colspan end
	to_add = to_add .. ">" .. data .. "</th>"
	add(to_add)
end

function td(data, rowspan, colspan)
	data = data or ""
	local to_add = "<td"
	if rowspan and rowspan~=1 then to_add = to_add .. " rowspan=" .. rowspan end
	if colspan and colspan~=1 then to_add = to_add .. " colspan=" .. colspan end
	to_add = to_add .. ">" .. data .. "</td>"
	add(to_add)
end

function get_stems(args)
	local shifted = {"noun", "_"}
	
	local i = 1
	while args[i] do
		shifted[i+2] = args[i]
		i = i + 1
	end
	
	return m_stem.getNounStem(shifted)
end

function break_adj(adj)
	local temp = adj

	temp = mw.ustring.gsub(temp, "([" .. C .. "])([" .. C .. "])íș$", "%1%2ieș")
	temp = mw.ustring.gsub(temp, "([jșxķ])íș$", "%1ieș")
	temp = mw.ustring.gsub(temp, "(°)", "")
	temp = mw.ustring.gsub(temp, "(íș)$", "jeș")
	temp = mw.ustring.gsub(temp, "(úș)$", "uoș")
	temp = mw.ustring.gsub(temp, "(ýș)$", "yeș")
	temp = mw.ustring.gsub(temp, "(oș)$", "uș")
	
	temp = mw.ustring.gsub(temp, "([" .. C .. "])([" .. C .. "])íș ", "%1%2ieș ")
	temp = mw.ustring.gsub(temp, "([jșxķ])íș ", "%1ieș ")
	temp = mw.ustring.gsub(temp, "(°)", "")
	temp = mw.ustring.gsub(temp, "íș ", "jeș ")
	temp = mw.ustring.gsub(temp, "úș ", "uoș ")
	temp = mw.ustring.gsub(temp, "ýș ", "yeș ")
	temp = mw.ustring.gsub(temp, "oș ", "uș ")

	return temp
end

function rad_link(word)
	return "<span style=\"white-space: nowrap\">" .. m_links.full_link{term = word, language = m_languages.get_by_code("rad")} .. "</span>"
end

function rad_IPA(word)
	local IPA = m_ipa.generate{
		word,
		"format",
		"nolarge"
	}
	return "<span style=\"color:dimgrey; white-space: nowrap\">" .. IPA .. "</span>" 
end

function rad_link_IPA(word, post, noipa, pre)
	if pre == "" then pre = nil end
	if post == "" then post = nil end
	if noipa == nil then noipa = false end
	local post_space = " "
	local pre_space = " "
	if post then
		if mw.ustring.sub(post, 1, 1) == "-" then
			post_space = ""
		end
	else
		post_space = ""
	end
	if pre then
		if mw.ustring.sub(pre, -1) == "-" then
			pre_space = ""
		end
	else
		pre_space = ""
	end
	
	if type(word) == "string" then
		if noipa then
			local temp = rad_link(word)
			if post then temp = temp .. post_space .. rad_link(post) end
			if pre then temp = rad_link(pre) .. pre_space .. temp end
			return temp
		else
			local temp = rad_link(word)
			local ipa_temp = word
			if post then
				temp = temp .. post_space .. rad_link(post)
				ipa_temp = ipa_temp .. post_space .. post
			end
			if pre then
				temp = rad_link(pre) .. pre_space .. temp
				ipa_temp = pre .. pre_space .. ipa_temp
			end
			return temp .. "<br>" .. rad_IPA(ipa_temp)
		end
	elseif type(word) == "table" then
		local links = {}
		local IPAs = {}
		for _, i in ipairs(word) do
			local new_link = rad_link(i['word'])
			if post then new_link = new_link .. post_space .. rad_link(post) end
			if pre then new_link = rad_link(post) .. pre_space .. new_link end
			if i['note'] then new_link = new_link .. " <small>(" .. i['note'] .. ")</small>" end
			table.insert(links, new_link)
			if not noipa then
				local ipa_temp = i['word']
				if post then
					ipa_temp = ipa_temp .. post_space .. post
				end
				if pre then
					ipa_temp = pre .. pre_space .. ipa_temp
				end
				table.insert(IPAs, rad_IPA(ipa_temp))
			end
		end
		if noipa then
			return table.concat(links, ", ")
		else
			return table.concat(links, ", ") .. "<br>" .. table.concat(IPAs, " ")
		end
	else error("Incompatible input type for rad_link_IPA")
	end
end

function export.compare(frame)
	local args = getArgs(frame)
	local lemma = args['entry'] or mw.title.getCurrentTitle().text
	local pos = args[2]
	local stem = args[1]
	local disable_ipa = args['noipa'] or false
	
	if args[1] and args[2] ~= "adj" and args[2] ~= "adv" then error("Second parameter must be adj or adv") end
	
	-- process alts --
	if args['alt'] then
		if stem == nil then error("You cannot have alternative forms of a nil stem") end
		local stem_temp = {
			[1] = {word = args[1]},
			[2] = {word = args['alt'], note = args['alt_note']}
		}
		local counter = 2
		while args['alt' .. counter] do
			stem_temp[counter + 1] = {word = args['alt' .. counter], note = args['alt' .. counter .. '_note']}
			counter = counter + 1
		end
		stem = stem_temp
	end
	
	local function get_forms(ending, pre)
		if stem == nil then
			return rad_link_IPA(lemma, nil, disable_ipa, pre)
		elseif type(stem) == "string" then
			return rad_link_IPA(stem .. ending, nil, disable_ipa)
		elseif type(stem) == "table" then
			for i, j in ipairs(stem) do
				stem[i]['word'] = j.word .. ending
			end
			return rad_link_IPA(stem, nil, disable_ipa)
		end
	end
	
	add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" style=\"text-align: center\">")
		tr()
			th("Comparative forms of ''" .. lemma .. "''&nbsp;",1,2)
		_tr()
			th("degree")
			th("form")
		_tr()
			th("positive")
			td(rad_link(lemma) .. "<br>" .. rad_IPA(lemma))
		_tr()
			th("comparative")
			if pos == "adj" or args[1] == nil then
				td(get_forms("uobș", "hevúb"))
			elseif pos == "adv" then
				td(get_forms("úb"))
			end
		_tr()
			th("superlative")
			if pos == "adj" or args[1] == nil then
				td(get_forms("úvaș", "hevúva"))
			elseif pos == "adv" then
				td(get_forms("úva"))
			end
		_tr()
			th("excessive")
			if pos == "adj" or args[1] == nil then
				td(get_forms("úvaiș", "hevúvai"))
			elseif pos == "adv" then
				td(get_forms("úvai"))
			end
		tr_()
	add("</table>")
	
	return table.concat(format_table, string.char(10))
	
end

function export.decline(frame)
	local args = getArgs(frame)
	local stem_gen = get_stems(args)
	local stems = {
		nom = args['nom'] or stem_gen.nom,
		voc = args['voc'] or stem_gen.voc,
		acc = args['acc'] or stem_gen.acc,
		dat = args['dat'] or stem_gen.dat,
		gen = args['gen'] or stem_gen.gen,
		ins = args['ins'] or stem_gen.ins,
		nompl = args['nompl'] or stem_gen.nompl,
		genpl = args['genpl'] or stem_gen.genpl,
		genpl_short = args['genpl_short'] or stem_gen.genpl_short,
		anim = args['anim'] or stem_gen.anim,
		['type'] = stem_gen['type'],
		}
	
	local gender = args['gender'] or args['g'] or "in"
	local definite = args['definite'] ~= nil or args['def'] ~= nil or false
	
	local adj = args['adj']
	local adj_broken = ""
	local adj_broken_e = ""
	
	if adj then
		if not mw.ustring.match(adj, "(ș)$") then error("All adjectives must end in -ș") end
		if definite and not (mw.ustring.match(mw.ustring.lower(adj), "^( ?[ui] )") or mw.ustring.match(mw.ustring.lower(adj), "^( ?a [iíỉuúủ])") or mw.ustring.match(mw.ustring.lower(adj), "^( ?a [" .. C .. "])") or mw.ustring.match(adj, "^( ?ag )") or mw.ustring.match(mw.ustring.lower(adj), "( [ui] )") or mw.ustring.match(mw.ustring.lower(adj), "( a [iíỉuúủ])") or mw.ustring.match(mw.ustring.lower(adj), "( a [" .. C .. "])") or mw.ustring.match(adj, "( ag )")) then
			if gender == "in" then
				if mw.ustring.match(mw.ustring.lower(adj), "^([" .. C .. "])") then
					adj = "a " .. adj
				else
					adj = "ag " .. adj
				end
			elseif gender == "an" then
				if mw.ustring.match(mw.ustring.lower(adj), "^([uúủ])") then
					adj = "a " .. adj
				else
					adj = "u " .. adj
				end
			end
		end
		adj_broken = args['adjbreak'] or break_adj(adj) 
		
		adj_broken_e = mw.ustring.gsub(adj_broken, "uș ", "ûș ")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "aûș ", "auș ")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "aùș ", "aûș ")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "ș ", "șe ")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "uș$", "ûș")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "aûș$", "auș")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "aùș$", "aûș")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "ș$", "șe")
		
		adj = mw.ustring.gsub(adj, "(°)", "")
		adj = " " .. adj
		adj_broken = " " .. adj_broken
		adj_broken_e = " " .. adj_broken_e
	else
		adj_broken = nil
		adj_broken_e = nil
	end
	local post = args['post']
	local disable_ipa = args['noipa'] or false
	
	format_table = {}
	
	local decl_type = {
		["C"] = "heavy",
		["CH"] = "spirant",
		["VH"] = "spirant",
		["V"] = "light",
		["G"] = "semi-light"
	}
	
	local type_name = decl_type[stems['type']]
	
	local table_type = args['type'] or args['t'] or "sgpl"
	
	local oblique_pl = {['genpl'] = true, ['datpl'] = true, ['accpl'] = true, ['inspl'] = true, ['gendu'] = true, ['datdu'] = true, ['accdu'] = true, ['insdu'] = true,}
	
	local pl = {['nompl'] = true, ['genpl'] = true, ['datpl'] = true, ['accpl'] = true, ['inspl'] = true, ['nomdu'] = true, ['gendu'] = true, ['datdu'] = true, ['accdu'] = true, ['insdu'] = true,}
	
	-- generate forms --
	
	local function get_forms(case, base, adj_base, adj_ending, nolink)
		local article = ""
		if adj_base then
			--adjust definite article --
			-- detect vocative
			if case == "voc" or case == "vocdu" or case == "vocpl" then
				adj_base = mw.ustring.gsub(adj_base, "^( ?)ag? ", "%1")
				adj_base = mw.ustring.gsub(adj_base, " ag? ", " ")
				adj_base = mw.ustring.gsub(adj_base, "^( ?)[iu] ", "%1")
				adj_base = mw.ustring.gsub(adj_base, " [iu] ", " ")
			-- detect inanimate --
			elseif mw.ustring.match(mw.ustring.lower(adj_base), "^( ?a [" .. C .. "])") or mw.ustring.match(adj_base, "^( ?ag )") or mw.ustring.match(mw.ustring.lower(adj_base), "( a [" .. C .. "])") or mw.ustring.match(adj_base, "( ag )") then
				definite = true
				if oblique_pl[case] then
					adj_base = mw.ustring.gsub(adj_base, "^( ?)ag ([iíỉIÍỈ])", "%1a' %2")
					adj_base = mw.ustring.gsub(adj_base, "^( ?)ag? ", "%1ai ")
					adj_base = mw.ustring.gsub(adj_base, " ag ([iíỉIÍỈ])", " a' %1")
					adj_base = mw.ustring.gsub(adj_base, " ag? ", " ai ")
				elseif case == "genpl_short" or case == "gendu_short" then
					adj_base = mw.ustring.gsub(adj_base, "^( ?)ag? ", "%1ais ")
					adj_base = mw.ustring.gsub(adj_base, " ag? ", " ais ")
				elseif case == "gen_short" then
					adj_base = mw.ustring.gsub(adj_base, "^( ?)ag? ", "%1as ")
					adj_base = mw.ustring.gsub(adj_base, " ag? ", " as ")
					case = "gen"
				end
			-- detect animate --	
			elseif mw.ustring.match(mw.ustring.lower(adj_base), "^( ?[ui] )") or mw.ustring.match(mw.ustring.lower(adj_base), "^( ?a [iíỉuúủ])") or mw.ustring.match(mw.ustring.lower(adj_base), "( [ui] )") or mw.ustring.match(mw.ustring.lower(adj_base), "( a [iíỉuúủ])") then
				definite = true
				if pl[case] then
					adj_base = mw.ustring.gsub(adj_base, "^( ?)[au] ([iíỉIÍỈ])", "%1a %2")
					adj_base = mw.ustring.gsub(adj_base, "^( ?)[au] ", "%1i ")
					adj_base = mw.ustring.gsub(adj_base, " [au] ([iíỉIÍỈ])", " a %1")
					adj_base = mw.ustring.gsub(adj_base, " [au] ", " i ")
				elseif case == "genpl_short" or case == "gendu_short" then
					adj_base = mw.ustring.gsub(adj_base, "^( ?)[aiu] ", "%1is ")
					adj_base = mw.ustring.gsub(adj_base, " [aiu] ", " is ")
				elseif case == "gen_short" then
					adj_base = mw.ustring.gsub(adj_base, "^( ?)[aiu] ", "%1us ")
					adj_base = mw.ustring.gsub(adj_base, " [aiu] ", " us ")
					case = "gen"
				end
			end
			
			-- append --
			if adj_ending then adj_base = mw.ustring.gsub(adj_base, "ș ", "ș" .. adj_ending .. " ") end
			base = base .. adj_base
			if adj_ending then base = base .. adj_ending end
		elseif definite then -- if not adjective but definite
			local c_initial = mw.ustring.match(mw.ustring.lower(base), "^([" .. C .. "])")
			local i_initial = mw.ustring.match(mw.ustring.lower(base), "^([iíỉ])")
			local u_initial = mw.ustring.match(mw.ustring.lower(base), "^([uúủ])")
			if case == "voc" or case == "vocdu" or case == "vocpl" then
				article = ""
			elseif gender == "in" then
				if oblique_pl[case] then
					if i_initial then
						article = "a'"
					else
						article = "ai"
					end
				elseif case == "gen_short" then
					article = "as"
					case = "gen"
				elseif case == "genpl_short" or case == "gendu_short" then
					article = "ais"
				else
					if c_initial then
						article = "a"
					else
						article = "ag"
					end
				end
			else -- animate definite article
				if pl[case] then
					if i_initial then
						article = "a"
					else
						article = "i"
					end
				elseif case == "gen_short" then
					article = "us"
					case = "gen"
				elseif case == "genpl_short" or case == "gendu_short" then
					article = "is"
				else
					if u_initial then
						article = "a"
					else
						article = "u"
					end
				end
			end
			if nolink then
				article = article .. " "
			end
		end
		if case == "vocdu" then case = "nomdu" end
		if case == "vocpl" then case = "nompl" end
		if post then base = base .. post end
		if args['alt' .. case] then
			local list = {
				[1] = {['word'] = base},
				[2] = {['word'] = args['alt' .. case], ['note'] = args['alt' .. case .. '_note']}
			}
			if adj_base then
				list[2]['word'] = list[2]['word'] .. adj_base
				if adj_ending then list[2]['word'] = list[2]['word'] .. adj_ending end
			end
			if post then list[2]['word'] = list[2]['word'] .. post end
			local counter = 2
			while args['alt' .. case .. counter] do
				local temp = args['alt' .. case .. counter]
				if adj_base then
					temp = temp .. adj_base
					if adj_ending then temp = temp .. adj_ending end
				end
				if post then temp = temp .. post end
				list[counter + 1] = {['word'] = temp, ['note'] = args['alt' .. case .. counter .. "_note"]}
				counter = counter + 1	
			end
			if nolink then
				return article .. list[1].word
			else
				if disable_ipa then return rad_link_IPA(list, nil, true, article) else return rad_link_IPA(list, nil, false, article) end
			end
		else
			if nolink then
				return article .. base
			else
				if disable_ipa then return rad_link_IPA(base, nil, true, article) else return rad_link_IPA(base, nil, false, article) end
			end
		end
	end
	
	local nom = ""
	local nom_cite = ""
	if table_type == "adj" then	
		nom = get_forms("nom", stems.nompl, adj_broken_e)
		nom_cite = get_forms("nom", stems.nompl, adj_broken_e, "", true)
	else
		nom = get_forms("nom", stems.nom, adj_broken_e)
		nom_cite = get_forms("nom", stems.nom, adj_broken_e, "", true)
	end
	local voc = get_forms("voc", stems.voc, adj_broken_e)
	local gen = ""
	local gen_short = ""
	local dat = ""
	local acc = ""
	local ins = ""
	
	if gender == "an" then
		gen = get_forms("gen", stems.gen, adj, "esk")
		gen_short = get_forms("gen_short", stems.gen, adj, "esk")
		dat = get_forms("dat", stems.dat, adj, "en")
		acc = get_forms("acc", stems.acc, adj, "est")
		ins = get_forms("ins", stems.ins, adj, "evúr")
	else
		gen = get_forms("gen", stems.gen, adj_broken, "k")
		gen_short = get_forms("gen_short", stems.gen, adj_broken, "k")
		dat = get_forms("dat", stems.dat, adj, "a")
		acc = get_forms("acc", stems.acc, adj_broken, "t")
		ins = get_forms("ins", stems.ins, adj, "úr")
	end	
	
	local nompl = get_forms("nompl", stems.nompl, adj_broken_e)
	local nompl_cite = get_forms("nompl", stems.nompl, adj_broken_e, "", true)
	local vocpl = get_forms("vocpl", stems.nompl, adj_broken_e)
	local genpl = get_forms("genpl", stems.genpl .. "ris", adj, "eris")
	local genpl_short = get_forms("genpl_short", stems.genpl_short, adj, "es")
	local datpl = get_forms("datpl", stems.genpl .. "rín", adj, "erín")
	local accpl = get_forms("accpl", stems.genpl .. "rid", adj, "erid")
	local inspl = get_forms("inspl", stems.genpl .. "ríe", adj, "eríe")
	
	local nomdu = get_forms("nomdu", stems.dat .. "te", adj_broken_e)
	local nomdu_cite = get_forms("nomdu", stems.dat .. "te", adj_broken_e, "", true)
	local vocdu = get_forms("vocdu", stems.dat .. "te", adj_broken_e)
	local gendu = get_forms("gendu", stems.dat .. "tis", adj, "eris")
	local gendu_short = get_forms("gendu_short", stems.dat .. "ts", adj, "es")
	local datdu = get_forms("datdu", stems.dat .. "tín", adj, "erín")
	local accdu = get_forms("accdu", stems.dat .. "tid", adj, "erid")
	local insdu = get_forms("insdu", stems.dat .. "tíe", adj, "eríe")
	
	--adjectives only
	local inan = ""
	local anim = ""
	local anim_gen = ""
	local anim_dat = ""
	local anim_acc = ""
	local anim_ins = ""
	
	if table_type == "adj" then
		inan = get_forms("inan", stems.anim, adj_broken_e)
		anim = get_forms("anim", stems.anim .. "e", adj_broken_e)
		anim_gen = get_forms("anim_gen", stems.anim .. "esk", adj, "esk")
		anim_dat = get_forms("anim_dat", stems.anim .. "en", adj, "en")
		anim_acc = get_forms("anim_acc", stems.anim .. "est", adj, "est")
		anim_ins = get_forms("anim_ins", stems.anim .. "evúr", adj, "evúr")
		add("<table width=100% class=\"blacklinks wikitable inflection table\" style=\"text-align: center\">")
			tr()
				th("Attributive forms", 1, 3)
				th("Emphatic combined forms with the definite article", 1, 6)
			_tr()
				th("inanimate", 2, 1)
				th("animate", 1, 2)
				th("+ " .. rad_link("a"), 2)
				th("+ " .. rad_link("a'"), 2)
				th("+ " .. rad_link("ag"), 2)
				th("+ " .. rad_link("ai"), 2)
				th("+ " .. rad_link("i"), 2)
				th("+ " .. rad_link("u"), 2)
			_tr()
				th("definite")
				th("indefinite")
			_tr()
				td(inan, 1, 2)
				td(anim)
				td(get_forms("anim", stems.anim .. "a", adj_broken_e))
				td(get_forms("anim", stems.anim .. "a'", adj_broken_e))
				td(get_forms("anim", stems.anim .. "ag", adj_broken_e))
				td(get_forms("anim", stems.anim .. "ai", adj_broken_e))
				td(get_forms("anim", stems.anim .. "i", adj_broken_e))
				td(get_forms("anim", stems.anim .. "u", adj_broken_e))
			tr_()
		add("</table>")
	end

	add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" style=\"text-align: center\">")
		if table_type == "sgpl" or table_type == "adj" then
			if table_type == "adj" then
				th("Substantive declension of <i>" .. nom_cite .. "</i> &nbsp;", 1, 5)
			else
				th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 4)
			end
			
			tr()
				if table_type == "adj" then
					th("", 2, 2)
					th("singular", 1, 2)
					th("plural", 2, 1)
				_tr()
					th("inanimate")
					th("animate")
				else
					th("", 1, 2)
					th("singular")
					th("plural")
				end
			_tr()
				th("nominative", 1, 2)
				if table_type == "adj" then
					td(nompl, 2, 3)
				elseif nom == nompl then
					td(nompl, 2, 2)
				elseif nom == voc then
					td(nom, 2)
					td(nompl, 2)
				else
					td(nom)
					if nompl == vocpl then td(nompl, 2) else td(nompl) end
				end
			_tr()
				th("vocative", 1, 2)
				if nom ~= nompl and nom ~= voc and table_type ~= "adj" then if voc == vocpl and nompl ~= vocpl then td(voc, 1, 2) else td(voc) end end
				if nompl ~= vocpl and voc ~= vocpl then td(vocpl) end
			_tr()
				th("genitive", 2, 1)
				th("proper")
				if definite then
					td(gen)
				else
					td(gen, 2, 1)
				end
				if table_type == "adj" then td(anim_gen, 2, 1) end
				td(genpl)
			_tr()
				th("constructive")
				if definite then
					td(gen_short)
				end
				td(genpl_short)
			_tr()
				th("dative", 1, 2)
				td(dat)
				if table_type == "adj" then td(anim_dat) end
				td(datpl)
			_tr()
				th("accusative", 1, 2)
				td(acc)
				if table_type == "adj" then td(anim_acc) end
				td(accpl)
			_tr()
				th("instrumental", 1, 2)
				td(ins)
				if table_type == "adj" then td(anim_ins) end
				td(inspl)
			tr_()
		elseif table_type == "sg" then
			if definite then
				th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 3)
				tr()
					th("", 1, 2)
					th("singular")
				_tr()
					th("nominative", 1, 2)
					if nom == voc then td(nom, 2) else td(nom) end
				_tr()
					th("vocative", 1, 2)
					if nom ~= voc then td(voc) end
				_tr()
					th("genitive", 2, 1)
					th("proper")
					td(gen)
				_tr()
					th("constructive")
					td(gen_short)
				_tr()
					th("dative", 1, 2)
					td(dat)
				_tr()
					th("accusative", 1, 2)
					td(acc)
				_tr()
					th("instrumental", 1, 2)
					td(ins)
				tr_()
			else
				th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 2)
				tr()
					th("")
					th("singular")
				_tr()
					th("nominative")
					if nom == voc then td(nom, 2) else td(nom) end
				_tr()
					th("vocative")
					if nom ~= voc then td(voc) end
				_tr()
					th("genitive")
					td(gen)
				_tr()
					th("dative")
					td(dat)
				_tr()
					th("accusative")
					td(acc)
				_tr()
					th("instrumental")
					td(ins)
				tr_()
			end
		elseif table_type == "pl" then
			th("Declension of <i>" .. nompl_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 3)
			tr()
				th("", 1, 2)
				th("plural")
			_tr()
				th("nominative", 1, 2)
				if nompl == vocpl then td(nompl, 2) else td(nompl) end
			_tr()
				th("vocative", 1, 2)
				if nompl ~= vocpl then td(vocpl) end
			_tr()
				th("genitive", 2, 1)
				th("proper")
				td(genpl)
			_tr()
				th("constructive")
				td(genpl_short)
			_tr()
				th("dative", 1, 2)
				td(datpl)
			_tr()
				th("accusative", 1, 2)
				td(accpl)
			_tr()
				th("instrumental", 1, 2)
				td(inspl)
			tr_()
		elseif table_type == "du" then
			th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 5)
			tr()
				th("", 2, 2)
				th("singular", 2, 1)
				th("plural", 1, 2)
			_tr()
				th("binary")
				th("true")
			_tr()
				th("nominative", 1, 2)
				if nom == voc then td(nom, 2) else td(nom) end
				if nomdu == vocdu then td(nomdu, 2) else td(nomdu) end
				if nompl == vocpl then td(nompl, 2) else td(nompl) end
			_tr()
				th("vocative", 1, 2)
				if nom ~= voc then td(voc) end
				if nomdu ~= vocdu then td(vocdu) end
				if nompl ~= vocpl then td(vocpl) end
			_tr()
				th("genitive", 2, 1)
				th("proper")
				td(gen, 2, 1)
				td(gendu)
				td(genpl)
			_tr()
				th("constructive")
				td(gendu_short)
				td(genpl_short)
			_tr()
				th("dative", 1, 2)
				td(dat)
				td(datdu)
				td(datpl)
			_tr()
				th("accusative", 1, 2)
				td(acc)
				td(accdu)
				td(accpl)
			_tr()
				th("instrumental", 1, 2)
				td(ins)
				td(insdu)
				td(inspl)
			tr_()
		elseif table_type == "dupl" then
			th("Declension of <i>" .. nomdu_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 3)
			tr()
				th("", 1, 2)
				th("binary plural")
			_tr()
				th("nominative", 1, 2)
				if nomdu == vocdu then td(nomdu, 2) else td(nomdu) end
			_tr()
				th("vocative", 1, 2)
				if nomdu ~= vocdu then td(vocdu) end
			_tr()
				th("genitive", 2, 1)
				th("proper")
				td(gendu)
			_tr()
				th("constructive")
				td(gendu_short)
			_tr()
				th("dative", 1, 2)
				td(datdu)
			_tr()
				th("accusative", 1, 2)
				td(accdu)
			_tr()
				th("instrumental", 1, 2)
				td(insdu)
			tr_()
		end
	add("</table>")
	
	if args['notags'] ~= "true" or args['notags'] == nil then
		if table_type ~= "adj" then
			add("[[Category:" .. m_languages.get_by_code("rad").name .. " " .. type_name .. " stems]]")
		end
		if table_type == "sg" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " singularia tantum]]")
		elseif table_type == "pl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia tantum]]")
		elseif table_type == "du" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria]]")
		elseif table_type == "dupl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria]]" .. "[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria tantum]]")
		end
		if definite then add("[[Category:Radestrian definite terms]]") end
	end
	
	return table.concat(format_table, string.char(10))
end

function export.conjugate(frame)
	local args = getArgs(frame)
	local table_type = args["t"] or args["type"] or "tr"
	local disable_ipa = args['noipa'] or false
	local irregular = args["irr"] or args["irregular"] or false
	local checked = args["check"]
	if args[3] == nil then -- sense preset conjugation
		local root = args[1]
		checked = true
		if args[2] == "ru" then -- -rut verbs
			args[1] = root .. "rut"
			args[2] = root .. "ruv"
			args[3] = root .. "ru"
			args[4] = root .. "rui"
			args[5] = root .. "ru"
			args[6] = root .. "rur"
			args[7] = root .. "rur"
			args['r'] = root .. "rûr"
			args['imp'] = root .. "roà"
			args['depers'] = root .. "rû"
			args['rpst'] = root .. "rujr"
			args['altprespart'] = root .. "ri"
			args['altprespart_note'] = "archaic"
			args['altpspart'] = root .. "rú"
			args['altpspart_note'] = "archaic"
		elseif args[2] == "a" then -- -at verbs
			table_type = "intr"
			args[1] = root .. "at"
			args[2] = root .. "av"
			args[3] = root .. "a"
			args[4] = root .. "ai"
			args[5] = root .. "a"
			args['altprespart'] = root .. "ami"
			args['altprespart_note'] = "archaic"
			args['altpspart'] = args['altpspart'] or (root .. "mú")
			args['altpspart_note'] = "archaic"
		elseif args[2] == "y" then -- -yt verbs
			args[1] = root .. "yt"
			args[2] = root .. "yv"
			args[3] = root .. "y"
			args[4] = root .. "ý"
			args[5] = root .. "j"
			args[6] = root .. "yr"
			args[7] = root .. "ýr"
			args['epst'] = root .. "ý"
			args['rpst'] = root .. "ýr"
		else error("Invalid preset")
		end
	end
	local pp = m_stem.getVerbStem(args)
		-- mw.logObject(pp)
	format_table = {}
	
	if (table_type == "tr" or table_type == "pass") and args[6] == nil then error("Passive conjugation tables require arguments 6 (infinitive) and 7 (present participle stem). Please provide these parameters or set to t=intr") end

	-- generate alt forms
	for p, base in pairs(pp) do
		if args["alt" .. p] then
			local list = {
				[1] = {['word'] = base},
				[2] = {['word'] = args['alt' .. p], ['note'] = args['alt' .. p .. '_note']}
			}
			local counter = 2
			while args["alt" .. p .. counter] do
				list[counter + 1] = {['word'] = args['alt' .. p .. counter], ['note'] = args['alt' .. p .. counter .. '_note']}
				counter = counter + 1
			end
			pp[p] = list
		end
	end
	
	local function get_forms(stem, ending, regex1, regex2, regex3, regex4, regex5, regex6)
		local temp = {}
		local post = ""
		local noipa = disable_ipa or false
		if type(regex2) == "boolean" then
			if regex1 == nil then
				post = nil
			else
				post = regex1
			end
			noipa = regex2
			regex1 = nil
			regex2 = nil
		else
			post = nil
		end
		ending = ending or ""
		regex1 = regex1 or ""
		regex2 = regex2 or ""
		regex3 = regex3 or ""
		regex4 = regex4 or ""
		regex5 = regex5 or ""
		regex6 = regex6 or ""
		if type(stem) == "table" then
			for i, form in ipairs(stem) do
				temp[i] = {['word'] = mw.ustring.gsub(form['word'] .. ending, regex1, regex2), ['note'] = form['note']}
				temp[i]['word'] = mw.ustring.gsub(temp[i]['word'], regex3, regex4)
				temp[i]['word'] = mw.ustring.gsub(temp[i]['word'], regex5, regex6)
			end
			local new_temp = {}
			new_temp[1] = temp[1]
			for index = 2, #temp do
				for check = 1, (index - 1) do
					local to_add = true
					if temp[index]["word"] == temp[check]["word"] then to_add = false end
					if to_add then table.insert(new_temp, temp[index]) end
				end
			end
			temp = new_temp
		elseif type(stem) == "string" then
			temp = mw.ustring.gsub(stem .. ending, regex1, regex2)
			temp = mw.ustring.gsub(temp, regex3, regex4)
			temp = mw.ustring.gsub(temp, regex5, regex6)
		end
		return rad_link_IPA(temp, post, noipa)
	end
	
	if checked then
		local form_3s = get_forms(pp['3s'])
		local form_2s = get_forms(pp.depers or pp['2s'], "", "nv$", "nu")
		if table_type ~= "tr" and table_type ~= "intr" and table_type ~= "pass" and table_type ~= "impers" then error("Invalid table type") end
		add("<small>")
		if table_type == "impers" then -- impersonal table
			local cite = ""
			if (type(pp.inf) == "table") then cite = pp['inf'][1]['word'] else cite = pp.inf end
			add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" width=70% style=\"text-align: center\">")
				tr()
					th("Conjugation of ''" .. cite .. "'' (impersonal) &nbsp;", 1, 5)
				_tr()
					th("nonfinite forms", 1, 5)
				_tr()
					th("infinitive", 1, 3)
					td(get_forms(pp.inf), 1, 2)
				_tr()
					th("connegative", 1, 3)
					td(get_forms(pp.inf,"a","([^a])uta$","%1ûta"), 1, 2)
				_tr()
					th("supine", 1, 3)
					td(get_forms(pp.inf,"úr", "([^a])utúr$","%1ûtúr"), 1, 2)
				_tr()
					th("adverbial participle", 2, 2)
					th("present")
					td(get_forms(pp.prespart,"vú"), 1, 2)
				_tr()
					th("past")
					td(get_forms(pp.pspart,"l"), 1, 2)
				_tr()
					th("finite forms", 3, 3)
					th("singular", 1, 2)
				_tr()
					th("third")
					th("depersonal")
				_tr()
					th("∅")
					th("''" .. rad_link("gjeș") .. " …''")
				_tr()
					th("simple", 6, 1)
					th("indicative", 2, 1)
					th("non-past")
					if form_3s == form_2s then
						td(form_3s, 1, 2)
					else
						td(form_3s)
						td(form_2s)
					end
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"ș"))
						td(get_forms(pp.epst))
					else
						td(get_forms(pp.pst,"eș"))
						td(get_forms(pp.pst,"e"))
					end
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.a,"ș"))
					td(get_forms(pp.a))
				_tr()
					th("past")
					td(get_forms(pp.pst,"aiș", "aaiș$", "áeș", "áaiș$", "ảeș"))
					td(get_forms(pp.pst,"ai", "aai$", "áe", "áai$", "ảe"))
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp['2s'],"úș"))
					td(get_forms(pp['2s'],"ú"))
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"veș"))
						td(get_forms(pp.epst,"ve"))
					else
						td(get_forms(pp.pst,"eveș"))
						td(get_forms(pp.pst,"eve"))
					end
				_tr()
					th("habitual",6,1)
					th("indicative",2,1)
					th("non-past")
					td(get_forms(pp.r,"iș"))
					td(get_forms(pp.r,"i"))
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"riș"))
						td(get_forms(pp.epst,"ri"))
					else
						td(get_forms(pp.pst,"eriș"))
						td(get_forms(pp.pst,"eri"))
					end
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.a,"riș"))
					td(get_forms(pp.a,"ri"))
				_tr()
					th("past")
					td(get_forms(pp.pst,"airiș", "aairiș$", "áeriș", "áairiș$", "ảeriș"))
					td(get_forms(pp.pst,"airi", "aairi$", "áeri", "áairi$", "ảeri"))
				_tr()
					th("optative",2,1)
					th("non-past")

					td(get_forms(pp['2s'],"úriș"))
					td(get_forms(pp['2s'],"úri"))
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"veriș"))
						td(get_forms(pp.epst,"veri"))
					else
						td(get_forms(pp.pst,"everiș"))
						td(get_forms(pp.pst,"everi"))
					end
				tr_()
			add("</table>")
			add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" width=70% style=\"text-align: center\">")
				tr()
					th("Compound forms of ''" .. cite .. "'' (impersonal) &nbsp;", 1, 5)
				_tr()
					th("", 3, 3)
					th("singular", 1, 2)
				_tr()
					th("third")
					th("depersonal")
				_tr()
					th("∅")
					th("''" .. rad_link("gjeș") .. " …''")
				_tr()
					th("continuous",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.prespart,"vú","vat",true),1,2)
				_tr()
					th("indicative",2,1)
					th("non-past")
					td(get_forms(pp.prespart,"vú","vaș",true))
					td(get_forms(pp.prespart,"vú",_,true))
				_tr()
					th("past")
					td(get_forms(pp.prespart,"vú","hâleș",true))
					td(get_forms(pp.prespart,"vú","hâle",true))
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.prespart,"vú","vagaș",true))
					td(get_forms(pp.prespart,"vú","vaga",true))
				_tr()
					th("past")
					td(get_forms(pp.prespart,"vú","hâlaiș",true))
					td(get_forms(pp.prespart,"vú","hâlai",true))
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp.prespart,"vú","vagúș",true))
					td(get_forms(pp.prespart,"vú","vagú",true))
				_tr()
					th("past")
					td(get_forms(pp.prespart,"vú","hâleveș",true))
					td(get_forms(pp.prespart,"vú","hâleve",true))
				_tr()
					th("perfective",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.pspart,"l","-at",true),1,2)
				_tr()
					th("indicative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"l","-aș",true))
					td(get_forms(pp.pspart,"l", _,true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"l","-âleș",true))
					td(get_forms(pp.pspart,"l","-âle",true))
				_tr()
					th("subjunctive",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"l","-agaș",true))
					td(get_forms(pp.pspart,"l","-aga",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"l","-âlaiș",true))
					td(get_forms(pp.pspart,"l","-âlai",true))
				_tr()
					th("optative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"l","-agúș",true))
					td(get_forms(pp.pspart,"l","-agú",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"l","-âleveș",true))
					td(get_forms(pp.pspart,"l","-âleve",true))
				_tr()
					th("Negative compound forms of ''" .. cite .. "'' (impersonal)",1,5)
				_tr()
					th("continuous",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.prespart,"vú","hjeat",true),1,2)
				_tr()
					th("indicative",2,1)
					th("non-past")
					td(get_forms(pp.prespart,"vú","hjeaș",true))
					td(get_forms(pp.prespart,"vú","hje",true))
				_tr()
					th("past")
					td(get_forms(pp.prespart,"vú","húeș",true))
					td(get_forms(pp.prespart,"vú","húe",true))
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.prespart,"vú","hjeàș",true))
					td(get_forms(pp.prespart,"vú","hjeà",true))
				_tr()
					th("past")
					td(get_forms(pp.prespart,"vú","húaiș",true))
					td(get_forms(pp.prespart,"vú","húai",true))
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp.prespart,"vú","hjeúș",true))
					td(get_forms(pp.prespart,"vú","hjeú",true))
				_tr()
					th("past")
					td(get_forms(pp.prespart,"vú","húeveș",true))
					td(get_forms(pp.prespart,"vú","húeve",true))
				_tr()
					th("perfective",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.pspart,"l","hjeat",true),1,2)
				_tr()
					th("indicative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"l","hjeaș",true))
					td(get_forms(pp.pspart,"l", "hje",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"l","-úeș",true))
					td(get_forms(pp.pspart,"l","-úe",true))
				_tr()
					th("subjunctive",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"l","hjeàș",true))
					td(get_forms(pp.pspart,"l","hjeà",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"l","-úaiș",true))
					td(get_forms(pp.pspart,"l","-úai",true))
				_tr()
					th("optative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"l","hjeúș",true))
					td(get_forms(pp.pspart,"l","hjeú",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"l","-úeveș",true))
					td(get_forms(pp.pspart,"l","-úeve",true))
				tr_()
			add("</table>")
		end
		
		if table_type == "intr" or table_type == "tr" then -- active table
			local cite = ""
			if (type(pp.inf) == "table") then cite = pp['inf'][1]['word'] else cite = pp.inf end
			add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" width=100% style=\"text-align: center\">")
				tr()
					th("Conjugation of ''" .. cite .. "'' (active voice) &nbsp;", 1, 14)
				_tr()
					th("nonfinite forms", 1, 14)
				_tr()
					th("infinitive", 1, 3)
					td(get_forms(pp.inf), 1, 11)
				_tr()
					th("connegative", 1, 3)
					if cite == "vat" or cite == "hjeat" then
						th("copular verbs do not have connegatives", 1, 11)
					else
						td(get_forms(pp.inf,"a","([^a])uta$","%1ûta"), 1, 11)
					end
				_tr()
					th("supine", 1, 3)
					td(get_forms(pp.inf,"úr", "([^a])utúr$","%1ûtúr"), 1, 11)
				_tr()
					th("participle", 4, 1)
					th("present", 2, 1)
					th("adjectival")
					td(get_forms(pp.prespart,"ș"), 1, 11)
				_tr()
					th("adverbial")
					td(get_forms(pp.prespart,"vú"), 1, 11)
				_tr()
					th("past", 2, 1)
					th("adjectival")
					td(get_forms(pp.pspart,"ș"), 1, 11)
				_tr()
					th("adverbial")
					td(get_forms(pp.pspart,"l"), 1, 11)
				_tr()
					th("verbal noun", 1, 3)
					td(get_forms(pp.vnoun), 1, 11)
				_tr()
					th("finite forms", 4, 3)
					th("singular", 1, 5)
					th("plural", 1, 5)
					th("humble")
				_tr()
					th("first", 2, 1)
					th("second", 1, 2)
					th("third", 2, 1)
					th("depersonal", 2, 1)
					th("first", 1, 2)
					th("second", 2, 1)
					th("third", 2, 1)
					th("depersonal", 2, 1)
					th("second", 2, 1)
				_tr()
					th("informal")
					th("formal")
					th("inclusive")
					th("exclusive")
				_tr()
					th("''" .. rad_link("ú") .. "''")
					th("''" .. rad_link("re") .. "''")
					th("''" .. rad_link("lește") .. "''")
					th("''" .. rad_link("vâs") .. ", " .. rad_link("vara") .. "''")
					th("''" .. rad_link("gjei") .. ", " .. rad_link("gjen") .. ", " .. rad_link("gjeș") .. " …''")
					th("''" .. rad_link("dzun") .. ", " .. rad_link("sted") .. "''")
					th("''" .. rad_link("dzate") .. "''")
					th("''" .. rad_link("sjáște") .. "''")
					th("''" .. rad_link("vír") .. ", " .. rad_link("vara") .. "''")
					th("''" .. rad_link("gjes") .. ", " .. rad_link("gjete") .. ", " .. rad_link("gje") .. ", " .. rad_link("gjen") .. " …''")
					th("''" .. rad_link("sja") .. ", " .. rad_link("lai") .. "''")
				_tr()
					th("simple", 7, 1)
					th("imperative", 1, 2)
					th()
					local form_imp = ""
					if pp.imp then form_imp = get_forms(pp.imp) else form_imp = nil end
					local form_a = get_forms(pp.a)
					if form_imp and form_a ~= form_imp then
						td(form_imp)
					elseif pp.vstem then
						td(get_forms(pp.a, "", "va$", "ja"))
					else
						td(form_a, 2, 1)
					end
					td(get_forms(pp['2s'],"úș"))
					th("", 1, 2)
					td(get_forms(pp.pl or pp['2s'],"uoș"))
					th()
					td(get_forms(pp['2s'],"ovú", "([au])ovú$", "%1òvú"))
					th("", 1, 2)
					td(get_forms(pp.pl or pp['2s'],"úr"))
				_tr()
					th("indicative", 2, 1)
					th("non-past")
					td(get_forms(pp['1s']))
					if (form_imp and form_a ~= form_imp) or pp.vstem then td(form_a) end
					if form_3s == form_2s then
						td(form_3s, 1, 3)
					else
						td(form_3s, 1, 2)
						td(form_2s)
					end
					local temp_height = 1
					if get_forms(pp.pl or pp['2s'],"ú") == get_forms(pp.pst,"ú","[uú]ú$","ủ") then temp_height = 2 end
					td(get_forms(pp.pl or pp['2s'],"uos"), temp_height)
					td(get_forms(pp.pl or pp['2s'],"uote"), temp_height)
					td(get_forms(pp.pl or pp['2s'],"ú"), temp_height, 3)
					td(get_forms(pp.pl or pp['2s'],"ún"), temp_height)
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"e"))
						td(get_forms(pp.epst,"n"))
						td(get_forms(pp.epst,"ș"),1,2)
						td(get_forms(pp.epst))
					else
						td(get_forms(pp.pst,"ei"))
						td(get_forms(pp.pst,"en"))
						td(get_forms(pp.pst,"eș"),1,2)
						td(get_forms(pp.pst,"e"))
					end
					if get_forms(pp.pl or pp['2s'],"ú") ~= get_forms(pp.pst,"ú","[uú]ú$","ủ") then
						td(get_forms(pp.pst,"uos","[uú]uos$","ủos"))
						td(get_forms(pp.pst,"uote","[uú]uote$","ủote"))
						td(get_forms(pp.pst,"ú","[uú]ú$","ủ"),1,3)
						td(get_forms(pp.pst,"ún","[uú]ún$","ủn"))
					end
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					local aidentical = false
					if pp.vstem then
						local aiheight = 1
						if get_forms(pp['2s'],"ai","avai$","áe") == get_forms(pp.pst,"ai", "aai$", "áe", "áai$", "ảe") then
							aiheight = 2
							aidentical = true
						end
						td(get_forms(pp['2s'],"ai","avai$","áe", "áai$", "ảe"),aiheight)
						td(get_forms(pp['2s'],"á","avá$","áva"))
					else
						local aiheight = 1
						if get_forms(pp['2s'],"ai","âai$","oai") == get_forms(pp.pst,"ai", "aai$", "áe", "áai$", "ảe") then
							aiheight = 2
							aidentical = true
						end
						td(get_forms(pp['2s'],"ai","âai$","oai","aai","áe", "áai$", "ảe"),aiheight)
						td(get_forms(pp['2s'],"á","âá$","oá","[aá]á","ả"))
					end
					td(get_forms(pp.a,"ș"),1,2)
					td(get_forms(pp.a))
					temp_height = 1
					if pp.a == pp.apst then temp_height = 2 end
					td(get_forms(pp.a,"vuos"), temp_height)
					td(get_forms(pp.a,"vuote"), temp_height)
					td(get_forms(pp.a,"vú"), temp_height, 3)
					td(get_forms(pp.a,"vún"), temp_height)
				_tr()
					th("past")
					if not aidentical then td(get_forms(pp.pst,"ai", "aai$", "áe", "áai$", "ảe")) end
					td(get_forms(pp.pst,"ain", "aain$", "áen", "áain$", "ảen"))
					td(get_forms(pp.pst,"aiș", "aaiș$", "áeș", "áaiș$", "ảeș"),1,2)
					td(get_forms(pp.pst,"ai", "aai$", "áe", "áai$", "ảe"))
					if pp.a ~= pp.apst then
						td(get_forms(pp.apst,"vuos"))
						td(get_forms(pp.apst,"vuote"))
						td(get_forms(pp.apst,"vú"),1,3)
						td(get_forms(pp.apst,"vún"))
					end
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp['2s'],"úe"))
					td(get_forms(pp['2s'],"ova", "([au])ova$", "%1òva"))
					td(get_forms(pp['2s'],"úș"),1,2)
					td(get_forms(pp['2s'],"ú"))
					td(get_forms(pp['2s'],"ovuos", "([au])ovuos$", "%1òvuos"))
					td(get_forms(pp['2s'],"ovuote", "([au])ovuote$", "%1òvuote"))
					td(get_forms(pp['2s'],"ovú", "([au])ovú$", "%1òvú"),1,3)
					td(get_forms(pp['2s'],"ovún", "([au])ovún$", "%1òvún"))
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"vei"))
						td(get_forms(pp.epst,"ven"))
						td(get_forms(pp.epst,"veș"),1,2)
						td(get_forms(pp.epst,"ve"))
						td(get_forms(pp.epst,"vuos"))
						td(get_forms(pp.epst,"vuote"))
						td(get_forms(pp.epst,"vú"),1,3)
						td(get_forms(pp.epst,"vún"))
					else
						td(get_forms(pp.pst,"evei"))
						td(get_forms(pp.pst,"even"))
						td(get_forms(pp.pst,"eveș"),1,2)
						td(get_forms(pp.pst,"eve"))
						td(get_forms(pp.pst,"evuos"))
						td(get_forms(pp.pst,"evuote"))
						td(get_forms(pp.pst,"evú"),1,3)
						td(get_forms(pp.pst,"evún"))
					end
				_tr()
					th("habitual",6,1)
					th("indicative",2,1)
					th("non-past")
					td(get_forms(pp.r,"iè"))
					td(get_forms(pp.r,"in"))
					td(get_forms(pp.r,"iș"),1,2)
					td(get_forms(pp.r,"i"))
					temp_height = 1
					if get_forms(pp.pl or pp['2s'],"ú") == get_forms(pp.pst,"ú","[uú]ú$","ủ") then temp_height = 2 end
					td(get_forms(pp.pl or pp['2s'],"úris"), temp_height)
					td(get_forms(pp.pl or pp['2s'],"úrite"), temp_height)
					td(get_forms(pp.pl or pp['2s'],"úri"), temp_height, 3)
					td(get_forms(pp.pl or pp['2s'],"úrin"), temp_height)
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"riè"))
						td(get_forms(pp.epst,"rin"))
						td(get_forms(pp.epst,"riș"),1,2)
						td(get_forms(pp.epst,"ri"))
					else
						td(get_forms(pp.pst,"eriè"))
						td(get_forms(pp.pst,"erin"))
						td(get_forms(pp.pst,"eriș"),1,2)
						td(get_forms(pp.pst,"eri"))
					end
					if get_forms(pp.pl or pp['2s'],"ú") ~= get_forms(pp.pst,"ú","[uú]ú$","ủ") then
						td(get_forms(pp.pst,"úris","[uú]úris$","ủris"))
						td(get_forms(pp.pst,"úrite","[uú]úrite$","ủrite"))
						td(get_forms(pp.pst,"úri","[uú]úri$","ủri"),1,3)
						td(get_forms(pp.pst,"úrin","[uú]úrin$","ủrin"))
					end
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.a,"riè"))
					td(get_forms(pp.a,"rin"))
					td(get_forms(pp.a,"riș"),1,2)
					td(get_forms(pp.a,"ri"))
					temp_height = 1
					if pp.a == pp.apst then temp_height = 2 end
					td(get_forms(pp.a,"vúris"), temp_height)
					td(get_forms(pp.a,"vúrite"), temp_height)
					td(get_forms(pp.a,"vúri"), temp_height, 3)
					td(get_forms(pp.a,"vúrin"), temp_height)
				_tr()
					th("past")
					td(get_forms(pp.pst,"airiè", "aairiè$", "áeriè", "áairiè$", "ảeriè"))
					td(get_forms(pp.pst,"airin", "aairin$", "áerin", "aairin$", "áerin"))
					td(get_forms(pp.pst,"airiș", "aairiș$", "áeriș", "aairiș$", "áeriș"),1,2)
					td(get_forms(pp.pst,"airi", "aairi$", "áeri", "aairi$", "áeri"))
					if pp.a ~= pp.apst then
						td(get_forms(pp.apst,"vúris"))
						td(get_forms(pp.apst,"vúrite"))
						td(get_forms(pp.apst,"vúri"),1,3)
						td(get_forms(pp.apst,"vúrin"))
					end
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp['2s'],"úriè"))
					td(get_forms(pp['2s'],"úrin"))
					td(get_forms(pp['2s'],"úriș"),1,2)
					td(get_forms(pp['2s'],"úri"))
					td(get_forms(pp['2s'],"ovúris", "([au])ovúris$", "%1òvúris"))
					td(get_forms(pp['2s'],"ovúrite", "([au])ovúrite$", "%1òvúrite"))
					td(get_forms(pp['2s'],"ovúri", "([au])ovúri$", "%1òvúri"),1,3)
					td(get_forms(pp['2s'],"ovúrin", "([au])ovúrin$", "%1òvúrin"))
				_tr()
					th("past")
					if pp.epst then
						td(get_forms(pp.epst,"veriè"))
						td(get_forms(pp.epst,"verin"))
						td(get_forms(pp.epst,"veriș"),1,2)
						td(get_forms(pp.epst,"veri"))
						td(get_forms(pp.epst,"vúris"))
						td(get_forms(pp.epst,"vúrite"))
						td(get_forms(pp.epst,"vúri"),1,3)
						td(get_forms(pp.epst,"vúrin"))
					else
						td(get_forms(pp.pst,"everiè"))
						td(get_forms(pp.pst,"everin"))
						td(get_forms(pp.pst,"everiș"),1,2)
						td(get_forms(pp.pst,"everi"))
						td(get_forms(pp.pst,"evúris"))
						td(get_forms(pp.pst,"evúrite"))
						td(get_forms(pp.pst,"evúri"),1,3)
						td(get_forms(pp.pst,"evúrin"))
					end
				tr_()
			add("</table>")
			if pp.inf ~= "hjeat" then
				add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" width=100% style=\"text-align: center\">")
					tr()
						th("Compound forms of ''" .. cite .. "'' (active voice) &nbsp;", 1, 14)
					_tr()
						th("", 4, 3)
						th("singular", 1, 5)
						th("plural", 1, 5)
						th("humble")
					_tr()
						th("first", 2, 1)
						th("second", 1, 2)
						th("third", 2, 1)
						th("depersonal", 2, 1)
						th("first", 1, 2)
						th("second", 2, 1)
						th("third", 2, 1)
						th("depersonal", 2, 1)
						th("second", 2, 1)
					_tr()
						th("informal")
						th("formal")
						th("inclusive")
						th("exclusive")
					_tr()
						th("''" .. rad_link("ú") .. "''")
						th("''" .. rad_link("re") .. "''")
						th("''" .. rad_link("lește") .. "''")
						th("''" .. rad_link("vâs") .. ", " .. rad_link("vara") .. "''")
						th("''" .. rad_link("gjei") .. ", " .. rad_link("gjen") .. ", " .. rad_link("gjeș") .. " …''")
						th("''" .. rad_link("dzun") .. ", " .. rad_link("sted") .. "''")
						th("''" .. rad_link("dzate") .. "''")
						th("''" .. rad_link("sjáște") .. "''")
						th("''" .. rad_link("vír") .. ", " .. rad_link("vara") .. "''")
						th("''" .. rad_link("gjes") .. ", " .. rad_link("gjete") .. ", " .. rad_link("gje") .. ", " .. rad_link("gjen") .. " …''")
						th("''" .. rad_link("sja") .. ", " .. rad_link("lai") .. "''")
					_tr()
						th("continuous",7,1)
						th("infinitive",1,2)
						td(get_forms(pp.prespart,"vú","vat",true),1,12)
					_tr()
						th("indicative",2,1)
						th("non-past")
						td(get_forms(pp.prespart,"vú","vage",true))
						td(get_forms(pp.prespart,"vú","vaga",true))
						td(get_forms(pp.prespart,"vú","vaș",true),1,2)
						td(get_forms(pp.prespart,"vú",_,true))
						td(get_forms(pp.prespart,"vú","vaguos",true))
						td(get_forms(pp.prespart,"vú","vaguote",true))
						td(get_forms(pp.prespart,"vú","vagú",true),1,2)
						td(get_forms(pp.prespart,"vú",_,true))
						td(get_forms(pp.prespart,"vú","vagún",true))
					_tr()
						th("past")
						td(get_forms(pp.prespart,"vú","hâlei",true))
						td(get_forms(pp.prespart,"vú","hâlen",true))
						td(get_forms(pp.prespart,"vú","hâleș",true),1,2)
						td(get_forms(pp.prespart,"vú","hâle",true))
						td(get_forms(pp.prespart,"vú","hâluos",true))
						td(get_forms(pp.prespart,"vú","hâluote",true))
						td(get_forms(pp.prespart,"vú","hâlú",true),1,3)
						td(get_forms(pp.prespart,"vú","hâlún",true))
					_tr()
						th("subjunctive",2,1)
						th("non-past")
						td(get_forms(pp.prespart,"vú","vagai",true))
						td(get_forms(pp.prespart,"vú","vagá",true))
						td(get_forms(pp.prespart,"vú","vagaș",true),1,2)
						td(get_forms(pp.prespart,"vú","vaga",true))
						td(get_forms(pp.prespart,"vú","vagavuos",true))
						td(get_forms(pp.prespart,"vú","vagavuote",true))
						td(get_forms(pp.prespart,"vú","vagavú",true),1,3)
						td(get_forms(pp.prespart,"vú","vagavún",true))
					_tr()
						th("past")
						td(get_forms(pp.prespart,"vú","hâlai",true))
						td(get_forms(pp.prespart,"vú","hâlain",true))
						td(get_forms(pp.prespart,"vú","hâlaiș",true),1,2)
						td(get_forms(pp.prespart,"vú","hâlai",true))
						td(get_forms(pp.prespart,"vú","hâlavuos",true))
						td(get_forms(pp.prespart,"vú","hâlavuote",true))
						td(get_forms(pp.prespart,"vú","hâlavú",true),1,3)
						td(get_forms(pp.prespart,"vú","hâlavún",true))
					_tr()
						th("optative",2,1)
						th("non-past")
						td(get_forms(pp.prespart,"vú","vagúe",true))
						td(get_forms(pp.prespart,"vú","vagova",true))
						td(get_forms(pp.prespart,"vú","vagúș",true),1,2)
						td(get_forms(pp.prespart,"vú","vagú",true))
						td(get_forms(pp.prespart,"vú","vagovuos",true))
						td(get_forms(pp.prespart,"vú","vagovuote",true))
						td(get_forms(pp.prespart,"vú","vagovú",true),1,3)
						td(get_forms(pp.prespart,"vú","vagovún",true))
					_tr()
						th("past")
						td(get_forms(pp.prespart,"vú","hâlevei",true))
						td(get_forms(pp.prespart,"vú","hâleven",true))
						td(get_forms(pp.prespart,"vú","hâleveș",true),1,2)
						td(get_forms(pp.prespart,"vú","hâleve",true))
						td(get_forms(pp.prespart,"vú","hâlevuos",true))
						td(get_forms(pp.prespart,"vú","hâlevuote",true))
						td(get_forms(pp.prespart,"vú","hâlevú",true),1,3)
						td(get_forms(pp.prespart,"vú","hâlevún",true))
					_tr()
						th("perfective",7,1)
						th("infinitive",1,2)
						td(get_forms(pp.pspart,"l","-at",true),1,12)
					_tr()
						th("indicative",2,1)
						th("perfect")
						td(get_forms(pp.pspart,"l","-age",true))
						td(get_forms(pp.pspart,"l","-aga",true))
						td(get_forms(pp.pspart,"l","-aș",true),1,2)
						td(get_forms(pp.pspart,"l", _,true))
						td(get_forms(pp.pspart,"l","-aguos",true))
						td(get_forms(pp.pspart,"l","-aguote",true))
						td(get_forms(pp.pspart,"l","-agú",true),1,2)
						td(get_forms(pp.pspart,"l", _,true))
						td(get_forms(pp.pspart,"l","-agún",true))
					_tr()
						th("pluperfect")
						td(get_forms(pp.pspart,"l","-âlei",true))
						td(get_forms(pp.pspart,"l","-âlen",true))
						td(get_forms(pp.pspart,"l","-âleș",true),1,2)
						td(get_forms(pp.pspart,"l","-âle",true))
						td(get_forms(pp.pspart,"l","-âluos",true))
						td(get_forms(pp.pspart,"l","-âluote",true))
						td(get_forms(pp.pspart,"l","-âlú",true),1,3)
						td(get_forms(pp.pspart,"l","-âlún",true))
					_tr()
						th("subjunctive",2,1)
						th("perfect")
						td(get_forms(pp.pspart,"l","-agai",true))
						td(get_forms(pp.pspart,"l","-agá",true))
						td(get_forms(pp.pspart,"l","-agaș",true),1,2)
						td(get_forms(pp.pspart,"l","-aga",true))
						td(get_forms(pp.pspart,"l","-agavuos",true))
						td(get_forms(pp.pspart,"l","-agavuote",true))
						td(get_forms(pp.pspart,"l","-agavú",true),1,3)
						td(get_forms(pp.pspart,"l","-agavún",true))
					_tr()
						th("pluperfect")
						td(get_forms(pp.pspart,"l","-âlai",true))
						td(get_forms(pp.pspart,"l","-âlain",true))
						td(get_forms(pp.pspart,"l","-âlaiș",true),1,2)
						td(get_forms(pp.pspart,"l","-âlai",true))
						td(get_forms(pp.pspart,"l","-âlavuos",true))
						td(get_forms(pp.pspart,"l","-âlavuote",true))
						td(get_forms(pp.pspart,"l","-âlavú",true),1,3)
						td(get_forms(pp.pspart,"l","-âlavún",true))
					_tr()
						th("optative",2,1)
						th("perfect")
						td(get_forms(pp.pspart,"l","-agúe",true))
						td(get_forms(pp.pspart,"l","-agova",true))
						td(get_forms(pp.pspart,"l","-agúș",true),1,2)
						td(get_forms(pp.pspart,"l","-agú",true))
						td(get_forms(pp.pspart,"l","-agovuos",true))
						td(get_forms(pp.pspart,"l","-agovuote",true))
						td(get_forms(pp.pspart,"l","-agovú",true),1,3)
						td(get_forms(pp.pspart,"l","-agovún",true))
					_tr()
						th("pluperfect")
						td(get_forms(pp.pspart,"l","-âlevei",true))
						td(get_forms(pp.pspart,"l","-âleven",true))
						td(get_forms(pp.pspart,"l","-âleveș",true),1,2)
						td(get_forms(pp.pspart,"l","-âleve",true))
						td(get_forms(pp.pspart,"l","-âlevuos",true))
						td(get_forms(pp.pspart,"l","-âlevuote",true))
						td(get_forms(pp.pspart,"l","-âlevú",true),1,3)
						td(get_forms(pp.pspart,"l","-âlevún",true))
					_tr()
						th("Negative compound forms of ''" .. cite .. "'' (active voice)",1,14)
					_tr()
						th("continuous",7,1)
						th("infinitive",1,2)
						td(get_forms(pp.prespart,"vú","hjeat",true),1,12)
					_tr()
						th("indicative",2,1)
						th("non-past")
						td(get_forms(pp.prespart,"vú","hjei",true))
						td(get_forms(pp.prespart,"vú","hjeà",true))
						td(get_forms(pp.prespart,"vú","hjeaș",true),1,2)
						td(get_forms(pp.prespart,"vú","hje",true))
						td(get_forms(pp.prespart,"vú","hjeuos",true))
						td(get_forms(pp.prespart,"vú","hjeuote",true))
						td(get_forms(pp.prespart,"vú","hjeú",true),1,3)
						td(get_forms(pp.prespart,"vú","hjeún",true))
					_tr()
						th("past")
						td(get_forms(pp.prespart,"vú","húei",true))
						td(get_forms(pp.prespart,"vú","húen",true))
						td(get_forms(pp.prespart,"vú","húeș",true),1,2)
						td(get_forms(pp.prespart,"vú","húe",true))
						td(get_forms(pp.prespart,"vú","hủos",true))
						td(get_forms(pp.prespart,"vú","hủote",true))
						td(get_forms(pp.prespart,"vú","hủ",true),1,3)
						td(get_forms(pp.prespart,"vú","hủn",true))
					_tr()
						th("subjunctive",2,1)
						th("non-past")
						td(get_forms(pp.prespart,"vú","hjeai",true))
						td(get_forms(pp.prespart,"vú","hjeá",true))
						td(get_forms(pp.prespart,"vú","hjeàș",true),1,2)
						td(get_forms(pp.prespart,"vú","hjeà",true))
						td(get_forms(pp.prespart,"vú","hjeàvuos",true))
						td(get_forms(pp.prespart,"vú","hjeàvuote",true))
						td(get_forms(pp.prespart,"vú","hjeàvú",true),1,3)
						td(get_forms(pp.prespart,"vú","hjeàvún",true))
					_tr()
						th("past")
						td(get_forms(pp.prespart,"vú","húai",true))
						td(get_forms(pp.prespart,"vú","húain",true))
						td(get_forms(pp.prespart,"vú","húaiș",true),1,2)
						td(get_forms(pp.prespart,"vú","húai",true))
						td(get_forms(pp.prespart,"vú","húavuos",true))
						td(get_forms(pp.prespart,"vú","húavuote",true))
						td(get_forms(pp.prespart,"vú","húavú",true),1,3)
						td(get_forms(pp.prespart,"vú","húavún",true))
					_tr()
						th("optative",2,1)
						th("non-past")
						td(get_forms(pp.prespart,"vú","hjeúe",true))
						td(get_forms(pp.prespart,"vú","hjeova",true))
						td(get_forms(pp.prespart,"vú","hjeúș",true),1,2)
						td(get_forms(pp.prespart,"vú","hjeú",true))
						td(get_forms(pp.prespart,"vú","hjeovuos",true))
						td(get_forms(pp.prespart,"vú","hjeovuote",true))
						td(get_forms(pp.prespart,"vú","hjeovú",true),1,3)
						td(get_forms(pp.prespart,"vú","hjeovún",true))
					_tr()
						th("past")
						td(get_forms(pp.prespart,"vú","húevei",true))
						td(get_forms(pp.prespart,"vú","húeven",true))
						td(get_forms(pp.prespart,"vú","húeveș",true),1,2)
						td(get_forms(pp.prespart,"vú","húeve",true))
						td(get_forms(pp.prespart,"vú","húevuos",true))
						td(get_forms(pp.prespart,"vú","húevuote",true))
						td(get_forms(pp.prespart,"vú","húevú",true),1,3)
						td(get_forms(pp.prespart,"vú","húevún",true))
					_tr()
						th("perfective",7,1)
						th("infinitive",1,2)
						td(get_forms(pp.pspart,"l","hjeat",true),1,12)
					_tr()
						th("indicative",2,1)
						th("perfect")
						td(get_forms(pp.pspart,"l","hjei",true))
						td(get_forms(pp.pspart,"l","hjeà",true))
						td(get_forms(pp.pspart,"l","hjeaș",true),1,2)
						td(get_forms(pp.pspart,"l", "hje",true))
						td(get_forms(pp.pspart,"l","hjeuos",true))
						td(get_forms(pp.pspart,"l","hjeuote",true))
						td(get_forms(pp.pspart,"l","hjeú",true),1,3)
						td(get_forms(pp.pspart,"l","hjeún",true))
					_tr()
						th("pluperfect")
						td(get_forms(pp.pspart,"l","-úei",true))
						td(get_forms(pp.pspart,"l","-úen",true))
						td(get_forms(pp.pspart,"l","-úeș",true),1,2)
						td(get_forms(pp.pspart,"l","-úe",true))
						td(get_forms(pp.pspart,"l","-ủos",true))
						td(get_forms(pp.pspart,"l","-ủote",true))
						td(get_forms(pp.pspart,"l","-ủ",true),1,3)
						td(get_forms(pp.pspart,"l","-ủn",true))
					_tr()
						th("subjunctive",2,1)
						th("perfect")
						td(get_forms(pp.pspart,"l","hjeai",true))
						td(get_forms(pp.pspart,"l","hjeá",true))
						td(get_forms(pp.pspart,"l","hjeàș",true),1,2)
						td(get_forms(pp.pspart,"l","hjeà",true))
						td(get_forms(pp.pspart,"l","hjeàvuos",true))
						td(get_forms(pp.pspart,"l","hjeàvuote",true))
						td(get_forms(pp.pspart,"l","hjeàvú",true),1,3)
						td(get_forms(pp.pspart,"l","hjeàvún",true))
					_tr()
						th("pluperfect")
						td(get_forms(pp.pspart,"l","-úai",true))
						td(get_forms(pp.pspart,"l","-úain",true))
						td(get_forms(pp.pspart,"l","-úaiș",true),1,2)
						td(get_forms(pp.pspart,"l","-úai",true))
						td(get_forms(pp.pspart,"l","-úavuos",true))
						td(get_forms(pp.pspart,"l","-úavuote",true))
						td(get_forms(pp.pspart,"l","-úavú",true),1,3)
						td(get_forms(pp.pspart,"l","-úavún",true))
					_tr()
						th("optative",2,1)
						th("perfect")
						td(get_forms(pp.pspart,"l","hjeúe",true))
						td(get_forms(pp.pspart,"l","hjeova",true))
						td(get_forms(pp.pspart,"l","hjeúș",true),1,2)
						td(get_forms(pp.pspart,"l","hjeú",true))
						td(get_forms(pp.pspart,"l","hjeovuos",true))
						td(get_forms(pp.pspart,"l","hjeovuote",true))
						td(get_forms(pp.pspart,"l","hjeovú",true),1,3)
						td(get_forms(pp.pspart,"l","hjeovún",true))
					_tr()
						th("pluperfect")
						td(get_forms(pp.pspart,"l","-úevei",true))
						td(get_forms(pp.pspart,"l","-úeven",true))
						td(get_forms(pp.pspart,"l","-úeveș",true),1,2)
						td(get_forms(pp.pspart,"l","-úeve",true))
						td(get_forms(pp.pspart,"l","-úevuos",true))
						td(get_forms(pp.pspart,"l","-úevuote",true))
						td(get_forms(pp.pspart,"l","-úevú",true),1,3)
						td(get_forms(pp.pspart,"l","-úevún",true))
					tr_()
				add("</table>")
			end
		end
	
		if table_type == "tr" or table_type == "pass" then
			local cite = ""
			if (type(pp.passinf) == "table") then cite = pp['passinf'][1]['word'] else cite = pp.passinf end
			add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" width=100% style=\"text-align: center\">")
				tr()
					th("Conjugation of ''" .. cite .. "uot'' (passive voice) &nbsp;", 1, 14)
				_tr()
					th("nonfinite forms", 1, 14)
				_tr()
					th("infinitive", 1, 3)
					td(get_forms(pp.passinf,"uot"), 1, 11)
				_tr()
					th("connegative", 1, 3)
					td(get_forms(pp.passinf,"uota"), 1, 11)
				_tr()
					th("supine", 1, 3)
					td(get_forms(pp.passinf,"uotúr"), 1, 11)
				_tr()
					th("participle", 4, 1)
					th("present", 2, 1)
					th("adjectival")
					td(get_forms(pp.passprespart,"uviș"), 1, 11)
				_tr()
					th("adverbial")
					td(get_forms(pp.passprespart,"uvivú"), 1, 11)
				_tr()
					th("past", 2, 1)
					th("adjectival")
					local pspart_broken = {}
					if type(pp.pspart) == "table" then
						local i_counter = 1
						while pp.pspart[i_counter] do
							pspart_broken[i_counter] = {}
							pspart_broken[i_counter]['word'] = pp.pspart[i_counter]['word']
							pspart_broken[i_counter]['note'] = pp.pspart[i_counter]['note']
							i_counter = i_counter + 1
						end
						for i,form in ipairs(pspart_broken) do
							pspart_broken[i]['word'] = mw.ustring.gsub(form['word'], "ú$", "uo")
							pspart_broken[i]['word'] = mw.ustring.gsub(form['word'], "ủ$", "ủo")
						end
					elseif type(pp.pspart) == "string" then
						pspart_broken = pp.pspart
						pspart_broken = mw.ustring.gsub(pspart_broken, "ú$", "uo")
						pspart_broken = mw.ustring.gsub(pspart_broken, "ủ$", "ủo")
					else
						error()
					end
					td(get_forms(pspart_broken,"kș"), 1, 11)
				_tr()
					th("adverbial")
					td(get_forms(pp.pspart,"k"), 1, 11)
				_tr()
					th("verbal noun", 1, 3)
					td(get_forms(pp.passinf,"uvaș"), 1, 11)
				_tr()
					th("finite forms", 4, 3)
					th("singular", 1, 5)
					th("plural", 1, 5)
					th("humble")
				_tr()
					th("first", 2, 1)
					th("second", 1, 2)
					th("third", 2, 1)
					th("depersonal", 2, 1)
					th("first", 1, 2)
					th("second", 2, 1)
					th("third", 2, 1)
					th("depersonal", 2, 1)
					th("second", 2, 1)
				_tr()
					th("informal")
					th("formal")
					th("inclusive")
					th("exclusive")
				_tr()
					th("''" .. rad_link("ú") .. "''")
					th("''" .. rad_link("re") .. "''")
					th("''" .. rad_link("lește") .. "''")
					th("''" .. rad_link("vâs") .. ", " .. rad_link("vara") .. "''")
					th("''" .. rad_link("gjei") .. ", " .. rad_link("gjen") .. ", " .. rad_link("gjeș") .. " …''")
					th("''" .. rad_link("dzun") .. ", " .. rad_link("sted") .. "''")
					th("''" .. rad_link("dzate") .. "''")
					th("''" .. rad_link("sjáște") .. "''")
					th("''" .. rad_link("vír") .. ", " .. rad_link("vara") .. "''")
					th("''" .. rad_link("gjes") .. ", " .. rad_link("gjete") .. ", " .. rad_link("gje") .. ", " .. rad_link("gjen") .. " …''")
					th("''" .. rad_link("sja") .. ", " .. rad_link("lai") .. "''")
				_tr()
					th("simple", 7, 1)
					th("imperative", 1, 2)
					th()
					td(get_forms(pp.r,"úa"))
					td(get_forms(pp.r,"uvúș"))
					th("", 1, 2)
					td(get_forms(pp.r,"uvuoș"))
					th()
					td(get_forms(pp.r,"uvovú"))
					th("", 1, 2)
					td(get_forms(pp.r,"uvúr"))
				_tr()
					th("indicative", 2, 1)
					th("non-past")
					td(get_forms(pp.r,"úe"))
					td(get_forms(pp.r,"uva"))
					td(get_forms(pp.r,"úș"), 1, 2)
					td(get_forms(pp.r,"ú"))
					local temp_height = 1
					if pp.r == pp.rpst then temp_height = 2 end
					td(get_forms(pp.r,"uvuos"), temp_height)
					td(get_forms(pp.r,"uvuote"), temp_height)
					td(get_forms(pp.r,"uvú"), temp_height, 3)
					td(get_forms(pp.r,"uvún"), temp_height)
				_tr()
					th("past")
					td(get_forms(pp.rpst,"uvei"))
					td(get_forms(pp.rpst,"uven"))
					td(get_forms(pp.rpst,"uveș"),1,2)
					td(get_forms(pp.rpst,"uve"))
					if pp.r ~= pp.rpst then
						td(get_forms(pp.rpst,"uvuos"))
						td(get_forms(pp.rpst,"uvuote"))
						td(get_forms(pp.rpst,"uvú"),1,3)
						td(get_forms(pp.rpst,"uvún"))
					end
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					temp_height = 1
					if pp.r == pp.rpst then temp_height = 2 end
					td(get_forms(pp.r,"uvai"),temp_height)
					td(get_forms(pp.r,"uvá"))
					td(get_forms(pp.r,"uvaș"),1,2)
					td(get_forms(pp.r,"uva"))
					td(get_forms(pp.r,"uvavuos"), temp_height)
					td(get_forms(pp.r,"uvavuote"), temp_height)
					td(get_forms(pp.r,"uvavú"), temp_height, 3)
					td(get_forms(pp.r,"uvavún"), temp_height)
				_tr()
					th("past")
					if pp.r ~= pp.rpst then td(get_forms(pp.rpst,"uvai")) end
					td(get_forms(pp.rpst,"uvain"))
					td(get_forms(pp.rpst,"uvaiș"),1,2)
					td(get_forms(pp.rpst,"uvai"))
					if pp.r ~= pp.rpst then
						td(get_forms(pp.rpst,"uvavuos"))
						td(get_forms(pp.rpst,"uvavuote"))
						td(get_forms(pp.rpst,"uvavú"),1,3)
						td(get_forms(pp.rpst,"uvavún"))
					end
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp.r,"uvúe"))
					td(get_forms(pp.r,"uvova"))
					td(get_forms(pp.r,"uvúș"),1,2)
					td(get_forms(pp.r,"uvú"))
					td(get_forms(pp.r,"uvovuos"))
					td(get_forms(pp.r,"uvovuote"))
					td(get_forms(pp.r,"uvovú"),1,3)
					td(get_forms(pp.r,"uvovún"))
				_tr()
					th("past")
					td(get_forms(pp.rpst,"uvevei"))
					td(get_forms(pp.rpst,"uveven"))
					td(get_forms(pp.rpst,"uveveș"),1,2)
					td(get_forms(pp.rpst,"uveve"))
					td(get_forms(pp.rpst,"uvevuos"))
					td(get_forms(pp.rpst,"uvevuote"))
					td(get_forms(pp.rpst,"uvevú"),1,3)
					td(get_forms(pp.rpst,"uvevún"))
				_tr()
					th("habitual",6,1)
					th("indicative",2,1)
					th("non-past")
					td(get_forms(pp.r,"úriè"))
					td(get_forms(pp.r,"úrin"))
					td(get_forms(pp.r,"úriș"),1,2)
					td(get_forms(pp.r,"úri"))
					temp_height = 1
					if pp.r == pp.rpst then temp_height = 2 end
					td(get_forms(pp.r,"uvúris"), temp_height)
					td(get_forms(pp.r,"uvúrite"), temp_height)
					td(get_forms(pp.r,"uvúri"), temp_height, 3)
					td(get_forms(pp.r,"uvúrin"), temp_height)
				_tr()
					th("past")
					td(get_forms(pp.rpst,"uveriè"))
					td(get_forms(pp.rpst,"uverin"))
					td(get_forms(pp.rpst,"uveriș"),1,2)
					td(get_forms(pp.rpst,"uveri"))
					if pp.r ~= pp.rpst then
						td(get_forms(pp.rpst,"uvúris"))
						td(get_forms(pp.rpst,"uvúrite"))
						td(get_forms(pp.rpst,"uvúri"),1,3)
						td(get_forms(pp.rpst,"uvúrin"))
					end
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.r,"uvariè"))
					td(get_forms(pp.r,"uvarin"))
					td(get_forms(pp.r,"uvariș"),1,2)
					td(get_forms(pp.r,"uvari"))
					temp_height = 1
					if pp.r == pp.rpst then temp_height = 2 end
					td(get_forms(pp.r,"uvavúris"), temp_height)
					td(get_forms(pp.r,"uvavúrite"), temp_height)
					td(get_forms(pp.r,"uvavúri"), temp_height, 3)
					td(get_forms(pp.r,"uvavúrin"), temp_height)
				_tr()
					th("past")
					td(get_forms(pp.rpst,"uvairiè"))
					td(get_forms(pp.rpst,"uvairin"))
					td(get_forms(pp.rpst,"uvairiș"),1,2)
					td(get_forms(pp.rpst,"uvairi"))
					if pp.r ~= pp.rpst then
						td(get_forms(pp.rpst,"uvavúris"))
						td(get_forms(pp.rpst,"uvavúrite"))
						td(get_forms(pp.rpst,"uvavúri"),1,3)
						td(get_forms(pp.rpst,"uvavúrin"))
					end
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp.r,"uvúriè"))
					td(get_forms(pp.r,"uvúrin"))
					td(get_forms(pp.r,"uvúriș"),1,2)
					td(get_forms(pp.r,"uvúri"))
					td(get_forms(pp.r,"uvovúris"))
					td(get_forms(pp.r,"uvovúrite"))
					td(get_forms(pp.r,"uvovúri"),1,3)
					td(get_forms(pp.r,"uvovúrin"))
				_tr()
					th("past")
					td(get_forms(pp.rpst,"uveveriè"))
					td(get_forms(pp.rpst,"uveverin"))
					td(get_forms(pp.rpst,"uveveriș"),1,2)
					td(get_forms(pp.rpst,"uveveri"))
					td(get_forms(pp.rpst,"uvevúris"))
					td(get_forms(pp.rpst,"uvevúrite"))
					td(get_forms(pp.rpst,"uvevúri"),1,3)
					td(get_forms(pp.rpst,"uvevúrin"))
				tr_()
			add("</table>")
			add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" width=100% style=\"text-align: center\">")
				tr()
					th("Compound forms of ''" .. cite .. "uot'' (passive voice) &nbsp;", 1, 14)
				_tr()
					th("", 4, 3)
					th("singular", 1, 5)
					th("plural", 1, 5)
					th("humble")
				_tr()
					th("first", 2, 1)
					th("second", 1, 2)
					th("third", 2, 1)
					th("depersonal", 2, 1)
					th("first", 1, 2)
					th("second", 2, 1)
					th("third", 2, 1)
					th("depersonal", 2, 1)
					th("second", 2, 1)
				_tr()
					th("informal")
					th("formal")
					th("inclusive")
					th("exclusive")
				_tr()
					th("''" .. rad_link("ú") .. "''")
					th("''" .. rad_link("re") .. "''")
					th("''" .. rad_link("lește") .. "''")
					th("''" .. rad_link("vâs") .. ", " .. rad_link("vara") .. "''")
					th("''" .. rad_link("gjei") .. ", " .. rad_link("gjen") .. ", " .. rad_link("gjeș") .. " …''")
					th("''" .. rad_link("dzun") .. ", " .. rad_link("sted") .. "''")
					th("''" .. rad_link("dzate") .. "''")
					th("''" .. rad_link("sjáște") .. "''")
					th("''" .. rad_link("vír") .. ", " .. rad_link("vara") .. "''")
					th("''" .. rad_link("gjes") .. ", " .. rad_link("gjete") .. ", " .. rad_link("gje") .. ", " .. rad_link("gjen") .. " …''")
					th("''" .. rad_link("sja") .. ", " .. rad_link("lai") .. "''")
				_tr()
					th("continuous",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.passprespart,"uvivú","vat",true),1,12)
				_tr()
					th("indicative",2,1)
					th("non-past")
					td(get_forms(pp.passprespart,"uvivú","vage",true))
					td(get_forms(pp.passprespart,"uvivú","vaga",true))
					td(get_forms(pp.passprespart,"uvivú","vaș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú",_,true))
					td(get_forms(pp.passprespart,"uvivú","vaguos",true))
					td(get_forms(pp.passprespart,"uvivú","vaguote",true))
					td(get_forms(pp.passprespart,"uvivú","vagú",true),1,2)
					td(get_forms(pp.passprespart,"uvivú",_,true))
					td(get_forms(pp.passprespart,"uvivú","vagún",true))
				_tr()
					th("past")
					td(get_forms(pp.passprespart,"uvivú","hâlei",true))
					td(get_forms(pp.passprespart,"uvivú","hâlen",true))
					td(get_forms(pp.passprespart,"uvivú","hâleș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","hâle",true))
					td(get_forms(pp.passprespart,"uvivú","hâluos",true))
					td(get_forms(pp.passprespart,"uvivú","hâluote",true))
					td(get_forms(pp.passprespart,"uvivú","hâlú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","hâlún",true))
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.passprespart,"uvivú","vagai",true))
					td(get_forms(pp.passprespart,"uvivú","vagá",true))
					td(get_forms(pp.passprespart,"uvivú","vagaș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","vaga",true))
					td(get_forms(pp.passprespart,"uvivú","vagavuos",true))
					td(get_forms(pp.passprespart,"uvivú","vagavuote",true))
					td(get_forms(pp.passprespart,"uvivú","vagavú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","vagavún",true))
				_tr()
					th("past")
					td(get_forms(pp.passprespart,"uvivú","hâlai",true))
					td(get_forms(pp.passprespart,"uvivú","hâlain",true))
					td(get_forms(pp.passprespart,"uvivú","hâlaiș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","hâlai",true))
					td(get_forms(pp.passprespart,"uvivú","hâlavuos",true))
					td(get_forms(pp.passprespart,"uvivú","hâlavuote",true))
					td(get_forms(pp.passprespart,"uvivú","hâlavú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","hâlavún",true))
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp.passprespart,"uvivú","vagúe",true))
					td(get_forms(pp.passprespart,"uvivú","vagova",true))
					td(get_forms(pp.passprespart,"uvivú","vagúș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","vagú",true))
					td(get_forms(pp.passprespart,"uvivú","vagovuos",true))
					td(get_forms(pp.passprespart,"uvivú","vagovuote",true))
					td(get_forms(pp.passprespart,"uvivú","vagovú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","vagovún",true))
				_tr()
					th("past")
					td(get_forms(pp.passprespart,"uvivú","hâlevei",true))
					td(get_forms(pp.passprespart,"uvivú","hâleven",true))
					td(get_forms(pp.passprespart,"uvivú","hâleveș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","hâleve",true))
					td(get_forms(pp.passprespart,"uvivú","hâlevuos",true))
					td(get_forms(pp.passprespart,"uvivú","hâlevuote",true))
					td(get_forms(pp.passprespart,"uvivú","hâlevú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","hâlevún",true))
				_tr()
					th("perfective",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.pspart,"k","-at",true),1,12)
				_tr()
					th("indicative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"k","-age",true))
					td(get_forms(pp.pspart,"k","-aga",true))
					td(get_forms(pp.pspart,"k","-aș",true),1,2)
					td(get_forms(pp.pspart,"k", _,true))
					td(get_forms(pp.pspart,"k","-aguos",true))
					td(get_forms(pp.pspart,"k","-aguote",true))
					td(get_forms(pp.pspart,"k","-agú",true),1,2)
					td(get_forms(pp.pspart,"k", _,true))
					td(get_forms(pp.pspart,"k","-agún",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"k","-âlei",true))
					td(get_forms(pp.pspart,"k","-âlen",true))
					td(get_forms(pp.pspart,"k","-âleș",true),1,2)
					td(get_forms(pp.pspart,"k","-âle",true))
					td(get_forms(pp.pspart,"k","-âluos",true))
					td(get_forms(pp.pspart,"k","-âluote",true))
					td(get_forms(pp.pspart,"k","-âlú",true),1,3)
					td(get_forms(pp.pspart,"k","-âlún",true))
				_tr()
					th("subjunctive",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"k","-agai",true))
					td(get_forms(pp.pspart,"k","-agá",true))
					td(get_forms(pp.pspart,"k","-agaș",true),1,2)
					td(get_forms(pp.pspart,"k","-aga",true))
					td(get_forms(pp.pspart,"k","-agavuos",true))
					td(get_forms(pp.pspart,"k","-agavuote",true))
					td(get_forms(pp.pspart,"k","-agavú",true),1,3)
					td(get_forms(pp.pspart,"k","-agavún",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"k","-âlai",true))
					td(get_forms(pp.pspart,"k","-âlain",true))
					td(get_forms(pp.pspart,"k","-âlaiș",true),1,2)
					td(get_forms(pp.pspart,"k","-âlai",true))
					td(get_forms(pp.pspart,"k","-âlavuos",true))
					td(get_forms(pp.pspart,"k","-âlavuote",true))
					td(get_forms(pp.pspart,"k","-âlavú",true),1,3)
					td(get_forms(pp.pspart,"k","-âlavún",true))
				_tr()
					th("optative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"k","-agúe",true))
					td(get_forms(pp.pspart,"k","-agova",true))
					td(get_forms(pp.pspart,"k","-agúș",true),1,2)
					td(get_forms(pp.pspart,"k","-agú",true))
					td(get_forms(pp.pspart,"k","-agovuos",true))
					td(get_forms(pp.pspart,"k","-agovuote",true))
					td(get_forms(pp.pspart,"k","-agovú",true),1,3)
					td(get_forms(pp.pspart,"k","-agovún",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"k","-âlevei",true))
					td(get_forms(pp.pspart,"k","-âleven",true))
					td(get_forms(pp.pspart,"k","-âleveș",true),1,2)
					td(get_forms(pp.pspart,"k","-âleve",true))
					td(get_forms(pp.pspart,"k","-âlevuos",true))
					td(get_forms(pp.pspart,"k","-âlevuote",true))
					td(get_forms(pp.pspart,"k","-âlevú",true),1,3)
					td(get_forms(pp.pspart,"k","-âlevún",true))
				_tr()
					th("Negative compound forms of ''" .. cite .. "ruot'' (passive voice)",1,14)
				_tr()
					th("continuous",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.passprespart,"uvivú","hjeat",true),1,12)
				_tr()
					th("indicative",2,1)
					th("non-past")
					td(get_forms(pp.passprespart,"uvivú","hjei",true))
					td(get_forms(pp.passprespart,"uvivú","hjeà",true))
					td(get_forms(pp.passprespart,"uvivú","hjeaș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","hje",true))
					td(get_forms(pp.passprespart,"uvivú","hjeuos",true))
					td(get_forms(pp.passprespart,"uvivú","hjeuote",true))
					td(get_forms(pp.passprespart,"uvivú","hjeú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","hjeún",true))
				_tr()
					th("past")
					td(get_forms(pp.passprespart,"uvivú","húei",true))
					td(get_forms(pp.passprespart,"uvivú","húen",true))
					td(get_forms(pp.passprespart,"uvivú","húeș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","húe",true))
					td(get_forms(pp.passprespart,"uvivú","hủos",true))
					td(get_forms(pp.passprespart,"uvivú","hủote",true))
					td(get_forms(pp.passprespart,"uvivú","hủ",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","hủn",true))
				_tr()
					th("subjunctive",2,1)
					th("non-past")
					td(get_forms(pp.passprespart,"uvivú","hjeai",true))
					td(get_forms(pp.passprespart,"uvivú","hjeá",true))
					td(get_forms(pp.passprespart,"uvivú","hjeàș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","hjeà",true))
					td(get_forms(pp.passprespart,"uvivú","hjeàvuos",true))
					td(get_forms(pp.passprespart,"uvivú","hjeàvuote",true))
					td(get_forms(pp.passprespart,"uvivú","hjeàvú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","hjeàvún",true))
				_tr()
					th("past")
					td(get_forms(pp.passprespart,"uvivú","húai",true))
					td(get_forms(pp.passprespart,"uvivú","húain",true))
					td(get_forms(pp.passprespart,"uvivú","húaiș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","húai",true))
					td(get_forms(pp.passprespart,"uvivú","húavuos",true))
					td(get_forms(pp.passprespart,"uvivú","húavuote",true))
					td(get_forms(pp.passprespart,"uvivú","húavú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","húavún",true))
				_tr()
					th("optative",2,1)
					th("non-past")
					td(get_forms(pp.passprespart,"uvivú","hjeúe",true))
					td(get_forms(pp.passprespart,"uvivú","hjeova",true))
					td(get_forms(pp.passprespart,"uvivú","hjeúș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","hjeú",true))
					td(get_forms(pp.passprespart,"uvivú","hjeovuos",true))
					td(get_forms(pp.passprespart,"uvivú","hjeovuote",true))
					td(get_forms(pp.passprespart,"uvivú","hjeovú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","hjeovún",true))
				_tr()
					th("past")
					td(get_forms(pp.passprespart,"uvivú","húevei",true))
					td(get_forms(pp.passprespart,"uvivú","húeven",true))
					td(get_forms(pp.passprespart,"uvivú","húeveș",true),1,2)
					td(get_forms(pp.passprespart,"uvivú","húeve",true))
					td(get_forms(pp.passprespart,"uvivú","húevuos",true))
					td(get_forms(pp.passprespart,"uvivú","húevuote",true))
					td(get_forms(pp.passprespart,"uvivú","húevú",true),1,3)
					td(get_forms(pp.passprespart,"uvivú","húevún",true))
				_tr()
					th("perfective",7,1)
					th("infinitive",1,2)
					td(get_forms(pp.pspart,"k","hjeat",true),1,12)
				_tr()
					th("indicative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"k","hjei",true))
					td(get_forms(pp.pspart,"k","hjeà",true))
					td(get_forms(pp.pspart,"k","hjeaș",true),1,2)
					td(get_forms(pp.pspart,"k", "hje",true))
					td(get_forms(pp.pspart,"k","hjeuos",true))
					td(get_forms(pp.pspart,"k","hjeuote",true))
					td(get_forms(pp.pspart,"k","hjeú",true),1,3)
					td(get_forms(pp.pspart,"k","hjeún",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"k","-úei",true))
					td(get_forms(pp.pspart,"k","-úen",true))
					td(get_forms(pp.pspart,"k","-úeș",true),1,2)
					td(get_forms(pp.pspart,"k","-úe",true))
					td(get_forms(pp.pspart,"k","-ủos",true))
					td(get_forms(pp.pspart,"k","-ủote",true))
					td(get_forms(pp.pspart,"k","-ủ",true),1,3)
					td(get_forms(pp.pspart,"k","-ủn",true))
				_tr()
					th("subjunctive",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"k","hjeai",true))
					td(get_forms(pp.pspart,"k","hjeá",true))
					td(get_forms(pp.pspart,"k","hjeàș",true),1,2)
					td(get_forms(pp.pspart,"k","hjeà",true))
					td(get_forms(pp.pspart,"k","hjeàvuos",true))
					td(get_forms(pp.pspart,"k","hjeàvuote",true))
					td(get_forms(pp.pspart,"k","hjeàvú",true),1,3)
					td(get_forms(pp.pspart,"k","hjeàvún",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"k","-úai",true))
					td(get_forms(pp.pspart,"k","-úain",true))
					td(get_forms(pp.pspart,"k","-úaiș",true),1,2)
					td(get_forms(pp.pspart,"k","-úai",true))
					td(get_forms(pp.pspart,"k","-úavuos",true))
					td(get_forms(pp.pspart,"k","-úavuote",true))
					td(get_forms(pp.pspart,"k","-úavú",true),1,3)
					td(get_forms(pp.pspart,"k","-úavún",true))
				_tr()
					th("optative",2,1)
					th("perfect")
					td(get_forms(pp.pspart,"k","hjeúe",true))
					td(get_forms(pp.pspart,"k","hjeova",true))
					td(get_forms(pp.pspart,"k","hjeúș",true),1,2)
					td(get_forms(pp.pspart,"k","hjeú",true))
					td(get_forms(pp.pspart,"k","hjeovuos",true))
					td(get_forms(pp.pspart,"k","hjeovuote",true))
					td(get_forms(pp.pspart,"k","hjeovú",true),1,3)
					td(get_forms(pp.pspart,"k","hjeovún",true))
				_tr()
					th("pluperfect")
					td(get_forms(pp.pspart,"k","-úevei",true))
					td(get_forms(pp.pspart,"k","-úeven",true))
					td(get_forms(pp.pspart,"k","-úeveș",true),1,2)
					td(get_forms(pp.pspart,"k","-úeve",true))
					td(get_forms(pp.pspart,"k","-úevuos",true))
					td(get_forms(pp.pspart,"k","-úevuote",true))
					td(get_forms(pp.pspart,"k","-úevú",true),1,3)
					td(get_forms(pp.pspart,"k","-úevún",true))
				tr_()
			add("</table>")
		end
		add("</small>")
		if irregular then add("[[Category:Radestrian irregular verbs]]") end
		
		return table.concat(format_table, string.char(10))
		
	else
		
		local endings = {
			    ['1s'] = "",
			    ['2s'] = "úș",
			    ['3s'] = "",
			    ['a'] = "ș",
			    ['apst'] = "vú",
			    ['depers'] = "",
			    ['epst'] = "ṣ",
			    ['imp'] = "",
			    ['inf'] = "",
			    ['passinf'] = "uot",
			    ['passprespart'] = "uvivú",
			    ['pl'] = "ú",
			    ['prespart'] = "vú",
			    ['pspart'] = "l/-k",
			    ['pst'] = "-",
			    ['r'] = "úș",
			    ['rpst'] = "uveș",
			    ['vnoun'] = "",
		}
		
		local review = {}
		
		for i, j in pairs(pp) do
			local nonforms = {["vstem"] = true, ["t"] = true, ["pre"] = true}
			if not ((table_type == "intr" or table_type == "impers") and i == "rpst") and not nonforms[i] and not ((i == "apst" or i == "rpst" or i == "pl" or i == "vnoun" or i == "1s") and table_type == "impers") then
				if type(j) == "string" then
					table.insert(review, "* <code>" .. string.upper(i) .. "</code>: '''" .. j .. "'''" .. endings[i])
				elseif type(j) == "table" then
					for k, l in ipairs(j) do
						local temp = "* <code>" .. string.upper(i) .. "[" .. k .. "]</code>: '''" .. l.word .. "'''" .. endings[i]
						if l.note then temp = temp .. " (" .. l.note .. ")" end
						table.insert(review, temp)
					end
				end
			end
		end
		
		if pp.pl == nil and table_type ~= "impers" then
			if type(pp['2s']) == "table" then
				for i,j in ipairs(pp['2s']) do
					local temp = "* <code>PL[" .. i .. "]</code>: '''" .. j['word'] .. "'''" ..  endings['pl'] .. " (<code>2S[" .. i .. "]</code>" .. endings['pl'] .. ")"
					if j['note'] then temp = temp .. " (" .. j['note'] .. ")" end
					table.insert(review, temp)	
				end
			elseif type(pp['2s']) == "string" then
				table.insert(review, "* <code>PL</code>: '''" .. pp['2s'] .. "'''" .. endings['pl'] .. " (<code>2S</code>" .. endings['pl'] .. ")")
			end
		end
		if pp.depers == nil then
			if type(pp['2s']) == "table" then
				for i,j in ipairs(pp['2s']) do
					local temp = "* <code>DEPERS[" .. i .. "]</code>: '''" .. mw.ustring.gsub(j['word'], "nv$", "nu") .. "''' (<code>2S[" .. i .. "]</code>)"
					if j['note'] then temp = temp .. " (" .. j['note'] .. ")" end
					table.insert(review, temp)	
				end
			elseif type(pp['2s']) == "string" then
				table.insert(review, "* <code>DEPERS</code>: '''" .. mw.ustring.gsub(pp['2s'], "nv$", "nu") .. "''' (<code>2S</code>)")
			end
		end
		if pp.imp == nil and table_type ~= "impers" then
			if type(pp.a) == "table" then
				if pp.vstem then
					for i,j in ipairs(pp.a) do
						local temp = "* <code>IMP[" .. i .. "]</code>: '''" .. mw.ustring.gsub(j['word'], "va$", "ja") .. "'''"
						if j['note'] then temp = temp .. " (" .. j['note'] .. ")" end
						table.insert(review, temp)
					end
				else
					for i,j in ipairs(pp.a) do
						local temp = "* <code>IMP[" .. i .. "]</code> = '''" .. j['word'] .. "''' (<code>A[" .. i .. "]</code>)"
						if j['note'] then temp = temp .. " (" .. j['note'] .. ")" end
						table.insert(review, temp)
					end
				end
			elseif type(pp.a) == "string" then
				if pp.vstem then
					table.insert(review, "* <code>IMP</code>: '''" .. mw.ustring.gsub(pp.a, "va$", "ja") .. "'''")
				else
					table.insert(review, "* <code>IMP</code>: '''" .. pp.a .. "''' (<code>A</code>)")
				end
			end
		end
		if pp.epst == nil then
			if type(pp.pst) == "table" then
				for i,j in ipairs(pp.pst) do
					local temp = "* <code>EPST[" .. i .. "]</code>: '''" .. j['word'] .. "e'''" .. endings['epst']
					if j['note'] then temp = temp .. " (" .. j['note'] .. ")" end
					table.insert(review, temp)	
				end
			elseif type(pp.pst) == "string" then
				table.insert(review, "* <code>EPST</code>: '''" .. pp.pst .. "e'''" .. endings['epst'])
			end
		end
		table.sort(review, function(a,b) return a < b end)
		return "<div class=\"noprint maintenance-box maintenance-box-red\" style=\"background:#FFE7DD; width:90%; margin: 0.75em auto; border:1px dashed #884444; padding: 0.25em;\"><table><tr><td rowspan=\"2\">[[File:Nuvola_apps_important_yellow.svg|48px]]</td><th style=\"text-align: left;\">Please review the following stems</th></tr><tr><td>" .. string.char(10) .. table.concat(review, string.char(10)) .. string.char(10) .. "If all is okay, add <code>|check=1</code> to generate the tables.</td></tr></table></div>[[Category:Unchecked Radestrian conjugation tables]]"
	end
end

function export.enclisis(frame)
	local m_government = require('Module:government')
	local args = getArgs(frame)
	local prep = args['base'] or args['entry'] or mw.title.getCurrentTitle().text
	local cite = args['entry'] or mw.title.getCurrentTitle().text
	local is_para = {entry = true, nocap = true}
	local gen = false
	local gen_prons = {
		{"vesk", "rask", "vâsk", "vask", "dzmes", "dzatus", "sjás", "vjes", "vais", "dzisk", "dzjes"},
		{"bjásk", "bisk", "kú", "okú", "byesk", "busk"},
		{"bjais", "bjes", "tes", "otes", "baus", "bøs"},
		{"vaosk", "utú"}
	}
	local dat = false
	local dat_prons = {
		{"ven", "ran", "vân", "van", "dzmen", "dzatun", "sján", "vjen", "vain", "dzin", "dzjen"},
		{"bjá", "bin", "ka", "oka", "bá", "bun"},
		{"bjain", "bjen", "ten", "oten", "baun", "bøn"},
		{"vá", "uva"}
	}
	local acc = false
	local acc_prons = {
		{"vest", "rast", "vâst", "vast", "dzmed", "dzatud", "sjád", "vjed", "vaid", "dzist", "dzjed"},
		{"bjást", "bist", "kad", "okad", "byest", "bust"},
		{"bjaid", "bjed", "ted", "oted", "baud", "bød"},
		{"vaost", "utad"}
	}
	local ins = false
	local ins_prons = {
		{"vebúr", "rábúr", "vâbúr", "vabúr", "dzmeríe", "dzatoríe", "sjáríe", "víríe", "vairíe", "dzibúr", "dzíríe"},
		{"bjábúr", "bibúr", "kaor", "okúr", "býbúr", "butúr"},
		{"bjairíe", "bjeríe", "teríe", "oteríe", "bauríe", "børíe"},
		{"vaobúr", "ubúr"}
	}
	
	local function governs(case)
		return m_government.generate({case})
	end
	
	if args[1] == nil then error("There are no cases specified") end
	
	local counter = 1
	while args[counter] do
		if args[counter] == "gen" then gen = true
		elseif args[counter] == "dat" then dat = true
		elseif args[counter] == "acc" then acc = true
		elseif args[counter] == "ins" then ins = true
		end
		counter = counter + 1
	end
	
	local regex_list = {}
	
	for i, _ in pairs(args) do
		if is_para[i] ~= true then table.insert(regex_list, i) end
	end
	
	table.sort(regex_list, function(a, b) return string.reverse(a) > string.reverse(b) end)
	
	local function process(pronoun)
		pronoun = pronoun .. prep
		for _, regex in ipairs(regex_list) do
			if mw.ustring.match(pronoun, regex .. prep .. "$") and not (mw.ustring.match(regex, "^u") and mw.ustring.match(pronoun, "a" .. regex .. prep .. "$")) then
				pronoun = mw.ustring.gsub(pronoun, regex .. prep .. "$", args[regex])
				break
			end
		end
		return pronoun
	end
	
	if not args['nocap'] then add("* The enclitic form is used in combination with weak pronominal complements:") end
	add("<small>")
	add("<table class=\"blacklinks mw-collapsible mw-collapsed wikitable inflection table\" style=\"text-align: center\" width=100%>")
	
	tr()
		th("Combined pronominal forms of ''" .. cite .. "''&nbsp;", 1, 12)
	_tr()
		th("case", 5)
		th("personal", 1, 11)
	_tr()
		th("<small>SG</small>", 1, 4)
		th("<small>PL</small>", 1, 5)
		th("<small>REFL</small>", 3)
		th("<small>RECP</small>", 3)
	_tr()
		th("<small>1</small>", 2)
		th("<small>2</small>", 2)
		th("<small>3</small>", 1, 2)
		th("<small>1</small>", 1, 2)
		th("<small>2</small>", 2)
		th("<small>3</small>", 1, 2)
	_tr()
		th("<small>ANIM</small>")
		th("<small>INAN</small>")
		th("<small>INCL</small>")
		th("<small>EXCL</small>")
		th("<small>ANIM</small>")
		th("<small>INAN</small>")
	_tr()
		th("<small>" .. rad_link("ú") .. "</small>")
		th("<small>" .. rad_link("re") .. "</small>")
		th("<small>" .. rad_link("vâs") .. "</small>")
		th("<small>" .. rad_link("vara") .. "</small>")
		th("<small>" .. rad_link("dzun") .. "</small>")
		th("<small>" .. rad_link("dzate") .. "</small>")
		th("<small>" .. rad_link("sjáște") .. "</small>")
		th("<small>" .. rad_link("vír") .. "</small>")
		th("<small>" .. rad_link("vara") .. "</small>")
		th("<small>" .. rad_link("dzist") .. "</small>")
		th("<small>" .. rad_link("dzjed") .. "</small>")
	local function list_pers(case, name, set)
		if case then
			_tr()
			th(governs(name))
			for _, j in ipairs(set[1]) do td(rad_link_IPA(process(j))) end
		end
	end
	list_pers(gen, "gen", gen_prons)
	list_pers(dat, "dat", dat_prons)
	list_pers(acc, "acc", acc_prons)
	list_pers(ins, "ins", ins_prons)
	
	-- non-personal pronouns
	_tr()
		th("case", 4)
		th("number", 4)
		th("interrogative-<br>existential", 1, 2)
		th("demonstrative", 1, 2)
		th("quantifier", 1, 6)
	_tr()
		th("<small>ANIM</small>", 2)
		th("<small>INAN</small>", 2)
		th("<small>PROX</small>", 2)
		th("<small>DIST</small>", 2)
		th("indefinite", 1, 2)
		th("general indefinite", 1, 2)
		th("collective", 1, 2)
	_tr()
		th("<small>ANIM</small>")
		th("<small>INAN</small>")
		th("<small>ANIM</small>")
		th("<small>INAN</small>")
		th("<small>ANIM</small>")
		th("<small>INAN</small>")
	_tr()
		th("<small>" .. rad_link("bjaș") .. "</small>")
		th("<small>" .. rad_link("bjar") .. "</small>")
		th("<small>" .. rad_link("kjes") .. "</small>")
		th("<small>" .. rad_link("okjes") .. "</small>")
		th("<small>" .. rad_link("baus") .. "</small>")
		th("<small>" .. rad_link("bvar") .. "</small>")
		th("<small>" .. rad_link("bjaș-á") .. "</small>")
		th("<small>" .. rad_link("bjar-á") .. "</small>")
		th("<small>" .. rad_link("vaus") .. "</small>")
		th("<small>" .. rad_link("var") .. "</small>")
	local function list_nonpers(case, name, set)
		if case then
			_tr()
				th(governs(name), 2)
				th("<small>SG</small>")
				for _, j in ipairs(set[2]) do
					td(rad_link_IPA(process(j)))
				end
				local q_anim, q_inan = process(set[2][1]), process(set[2][2])
				if mw.ustring.match(q_anim, "[" .. C .. "]$") then td(rad_link_IPA(q_anim .. "-á")) else td(rad_link_IPA(q_anim .. "-vá")) end
				if mw.ustring.match(q_inan, "[" .. C .. "]$") then td(rad_link_IPA(q_inan .. "-á")) else td(rad_link_IPA(q_inan .. "-vá")) end
				for _, j in ipairs(set[4]) do td(rad_link_IPA(process(j))) end
			_tr()
				th("<small>PL</small>")
				for _, j in ipairs(set[3]) do td(rad_link_IPA(process(j))) end
				q_anim, q_inan = process(set[3][1]), process(set[3][2])
				if mw.ustring.match(q_anim, "[" .. C .. "]$") then td(rad_link_IPA(q_anim .. "-á")) else td(rad_link_IPA(q_anim .. "-vá")) end
				if mw.ustring.match(q_inan, "[" .. C .. "]$") then td(rad_link_IPA(q_inan .. "-á")) else td(rad_link_IPA(q_inan .. "-vá")) end
				th("", 1, 2)
		end
	end
	list_nonpers(gen, "gen", gen_prons)
	list_nonpers(dat, "dat", dat_prons)
	list_nonpers(acc, "acc", acc_prons)
	list_nonpers(ins, "ins", ins_prons)
		
	tr_()

	add("</table>")
	add("</small>")
	
	return table.concat(format_table, string.char(10))
end

return export

--[[
Debug console test string:
=p.show(mw.getCurrentFrame():newChild{title="whatever",args={"hv", "o~u^u", "þ"}})
=p.conjugate(mw.getCurrentFrame():newChild{title="whatever",args={"deat","de",["pl"]="di","diș","deti","dev",["t"]="tr",["altnonfin"]="hellu",["altnonfin_note"]="uwu",["altnonfin2"]="hella",["altnonfin2_note"]="owo",["pre"]="fjø", "der", "detr"}})
]]--