Module:la-adj/table

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 export = {}

local m_table = require("Module:table")

local function convert(data, conv)
	local col = {}
	local row = {}
	local marked = {}
	local slots = {}
	local function add(i,j)
		local col = col[i][j]
		local row = row[i][j]
		if col==0 or row==0 then
			return ""
		end
		local entry = data.finish_show_form(data, slots[i][j])
		if col==1 then
			if row==1 then
				return '\n| ' .. entry
			else
				return '\n| rowspan=' .. row .. ' | ' .. entry
			end
		else
			if row==1 then
				return '\n| colspan=' .. col .. ' | ' .. entry
			else
				return '\n| colspan=' .. col .. ' rowspan=' .. row .. ' | ' .. entry
			end
		end
	end
	
	for i=1,#conv do
		col[i] = {}
		row[i] = {}
		marked[i] = {}
		slots[i] = {}
		for j=1,#conv[i] do
			col[i][j] = 1
			row[i][j] = 1
			marked[i][j] = false
			slots[i][j] = {conv[i][j]}
		end
	end

	-- Return true if the contents of the two slots are equal in every
	-- way. This means the forms are the same, the footnote text is the
	-- same, and the accelerator lemmas are the same. We need to compare
	-- the accelerator lemmas because in some cases different slots have
	-- different lemmas (e.g. when noneut=1 is set, the masculine slots
	-- will have the masculine lemma but the feminine slots will have the
	-- feminine lemma).
	local function slots_equal(slot1, slot2)
		return m_table.deepEquals(data.forms[slot1], data.forms[slot2]) and
			m_table.deepEquals(data.notetext[slot1], data.notetext[slot2]) and
			(data.accel[slot1] and data.accel[slot1].lemma or nil) ==
			(data.accel[slot2] and data.accel[slot2].lemma or nil)
	end

	--merge identical cells within a row
	for i=1,#conv do for j=1,#conv[i] do
		if col[i][j] ~= 0 then
			for k=j+1,#conv[i] do
				local slotij = conv[i][j]
				local slotik = conv[i][k]
				if not slots_equal(slotij, slotik) then
					break
				end
				col[i][j] = col[i][j] + 1
				col[i][k] = 0
				row[i][k] = 0
				for _, slot in ipairs(slots[i][k]) do
					table.insert(slots[i][j], slot)
				end
				slots[i][k] = nil
			end
		end
	end end
	
	--final
	for i=1,#conv do
		for j=1,#conv[i] do
			conv[i][j] = add(i,j)
		end
		conv[i] = table.concat(conv[i])
	end
	return conv
end

local function make_table_mfn_pl(data, noneut)
	local conv = {
		{"nom_pl_m"},
		{"gen_pl_m"},
		{"dat_pl_m"},
		{"acc_pl_m"},
		{"abl_pl_m"},
		{"voc_pl_m"},
		{"loc_pl_m"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! ' .. (noneut and 'masc./fem.' or 'masc./fem./neut.')
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_mfn_sg(data, noneut)
	local conv = {
		{"nom_sg_m"},
		{"gen_sg_m"},
		{"dat_sg_m"},
		{"acc_sg_m"},
		{"abl_sg_m"},
		{"voc_sg_m"},
		{"loc_sg_m"},
	}
	conv = convert(data, conv)
	
	local output = data.title .. '\n\n'output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" | singular'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! ' .. (noneut and 'masc./fem.' or 'masc./fem./neut.')
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_n_pl(data)
	local conv = {
		{"nom_pl_n"},
		{"gen_pl_n"},
		{"dat_pl_n"},
		{"acc_pl_n"},
		{"abl_pl_n"},
		{"voc_pl_n"},
		{"loc_pl_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! ' .. 'neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_n_sg(data)
	local conv = {
		{"nom_sg_n"},
		{"gen_sg_n"},
		{"dat_sg_n"},
		{"acc_sg_n"},
		{"abl_sg_n"},
		{"voc_sg_n"},
		{"loc_sg_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" | singular'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! ' .. 'neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_mf_and_n_pl(data)
	local conv = {
		{"nom_pl_m", "nom_pl_n"},
		{"gen_pl_m", "gen_pl_n"},
		{"dat_pl_m", "dat_pl_n"},
		{"acc_pl_m", "acc_pl_n"},
		{"abl_pl_m", "abl_pl_n"},
		{"voc_pl_m", "voc_pl_n"},
		{"loc_pl_m", "loc_pl_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="2" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masc./fem.'
	output = output .. '\n! neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_mf_and_n_sg(data)
	local conv = {
		{"nom_sg_m", "nom_sg_n"},
		{"gen_sg_m", "gen_sg_n"},
		{"dat_sg_m", "dat_sg_n"},
		{"acc_sg_m", "acc_sg_n"},
		{"abl_sg_m", "abl_sg_n"},
		{"voc_sg_m", "voc_sg_n"},
		{"loc_sg_m", "loc_sg_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="2" | singular'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masc./fem.'
	output = output .. '\n! neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_m_and_f_pl(data)
	local conv = {
		{"nom_pl_m", "nom_pl_f"},
		{"gen_pl_m", "gen_pl_f"},
		{"dat_pl_m", "dat_pl_f"},
		{"acc_pl_m", "acc_pl_f"},
		{"abl_pl_m", "abl_pl_f"},
		{"voc_pl_m", "voc_pl_f"},
		{"loc_pl_m", "loc_pl_f"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="2" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_m_and_f_sg(data)
	local conv = {
		{"nom_sg_m", "nom_sg_f"},
		{"gen_sg_m", "gen_sg_f"},
		{"dat_sg_m", "dat_sg_f"},
		{"acc_sg_m", "acc_sg_f"},
		{"abl_sg_m", "abl_sg_f"},
		{"voc_sg_m", "voc_sg_f"},
		{"loc_sg_m", "loc_sg_f"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="2" | singular'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_m_and_f_and_n_pl(data)
	local conv = {
		{"nom_pl_m", "nom_pl_f", "nom_pl_n"},
		{"gen_pl_m", "gen_pl_f", "gen_pl_n"},
		{"dat_pl_m", "dat_pl_f", "dat_pl_n"},
		{"acc_pl_m", "acc_pl_f", "acc_pl_n"},
		{"abl_pl_m", "abl_pl_f", "abl_pl_n"},
		{"voc_pl_m", "voc_pl_f", "voc_pl_n"},
		{"loc_pl_m", "loc_pl_f", "loc_pl_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="3" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n! neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_m_and_f_and_n_sg(data)
	local conv = {
		{"nom_sg_m", "nom_sg_f", "nom_sg_n"},
		{"gen_sg_m", "gen_sg_f", "gen_sg_n"},
		{"dat_sg_m", "dat_sg_f", "dat_sg_n"},
		{"acc_sg_m", "acc_sg_f", "acc_sg_n"},
		{"abl_sg_m", "abl_sg_f", "abl_sg_n"},
		{"voc_sg_m", "voc_sg_f", "voc_sg_n"},
		{"loc_sg_m", "loc_sg_f", "loc_sg_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="3" | singular'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n! neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_mfn(data, noneut)
	local conv = {
		{"nom_sg_m"},
		{"gen_sg_m"},
		{"dat_sg_m"},
		{"acc_sg_m"},
		{"abl_sg_m"},
		{"voc_sg_m"},
		{"loc_sg_m"},
		{"----"}, -- prevents merge rows from merging cells at the bottom of sg with cells at the top of pl
		{"nom_pl_m"},
		{"gen_pl_m"},
		{"dat_pl_m"},
		{"acc_pl_m"},
		{"abl_pl_m"},
		{"voc_pl_m"},
		{"loc_pl_m"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" | singular'
	output = output .. '\n|class="separator" rowspan="999"|'
	output = output .. '\n!class="outer" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! ' .. (noneut and 'masc./fem.' or 'masc./fem./neut.')
	output = output .. '\n! ' .. (noneut and 'masc./fem.' or 'masc./fem./neut.')
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. conv[9]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. conv[10]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. conv[11]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. conv[12]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	output = output .. conv[13]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
		output = output .. conv[14]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
		output = output .. conv[15]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_n(data)
	local conv = {
		{"nom_sg_n"},
		{"gen_sg_n"},
		{"dat_sg_n"},
		{"acc_sg_n"},
		{"abl_sg_n"},
		{"voc_sg_n"},
		{"loc_sg_n"},
		{"----"}, -- prevents merge rows from merging cells at the bottom of sg with cells at the top of pl
		{"nom_pl_n"},
		{"gen_pl_n"},
		{"dat_pl_n"},
		{"acc_pl_n"},
		{"abl_pl_n"},
		{"voc_pl_n"},
		{"loc_pl_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" | singular'
	output = output .. '\n|class="separator" rowspan="999"|'
	output = output .. '\n!class="outer" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! ' .. 'neuter'
	output = output .. '\n! ' .. 'neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. conv[9]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. conv[10]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. conv[11]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. conv[12]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	output = output .. conv[13]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
		output = output .. conv[14]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
		output = output .. conv[15]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_mf_and_n(data)
	local conv = {
		{"nom_sg_m", "nom_sg_n"},
		{"gen_sg_m", "gen_sg_n"},
		{"dat_sg_m", "dat_sg_n"},
		{"acc_sg_m", "acc_sg_n"},
		{"abl_sg_m", "abl_sg_n"},
		{"voc_sg_m", "voc_sg_n"},
		{"loc_sg_m", "loc_sg_n"},
		{"----", "----"},  -- prevents merge rows from merging cells at the bottom of sg with cells at the top of pl
		{"nom_pl_m", "nom_pl_n"},
		{"gen_pl_m", "gen_pl_n"},
		{"dat_pl_m", "dat_pl_n"},
		{"acc_pl_m", "acc_pl_n"},
		{"abl_pl_m", "abl_pl_n"},
		{"voc_pl_m", "voc_pl_n"},
		{"loc_pl_m", "loc_pl_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="2" | singular'
	output = output .. '\n|class="separator" rowspan="999"|'
	output = output .. '\n!class="outer" colspan="2" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masc./fem.'
	output = output .. '\n! neuter'
	output = output .. '\n! masc./fem.'
	output = output .. '\n! neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. conv[9]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. conv[10]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. conv[11]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. conv[12]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	output = output .. conv[13]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
		output = output .. conv[14]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
		output = output .. conv[15]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_m_and_f(data)
	local conv = {
		{"nom_sg_m", "nom_sg_f"},
		{"gen_sg_m", "gen_sg_f"},
		{"dat_sg_m", "dat_sg_f"},
		{"acc_sg_m", "acc_sg_f"},
		{"abl_sg_m", "abl_sg_f"},
		{"voc_sg_m", "voc_sg_f"},
		{"loc_sg_m", "loc_sg_f"},
		{"----", "----"},  -- prevents merge rows from merging cells at the bottom of sg with cells at the top of pl
		{"nom_pl_m", "nom_pl_f"},
		{"gen_pl_m", "gen_pl_f"},
		{"dat_pl_m", "dat_pl_f"},
		{"acc_pl_m", "acc_pl_f"},
		{"abl_pl_m", "abl_pl_f"},
		{"voc_pl_m", "voc_pl_f"},
		{"loc_pl_m", "loc_pl_f"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="2" | singular'
	output = output .. '\n|class="separator" rowspan="999"|'
	output = output .. '\n!class="outer" colspan="2" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. conv[9]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. conv[10]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. conv[11]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. conv[12]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	output = output .. conv[13]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
		output = output .. conv[14]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
		output = output .. conv[15]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end

	return output
end

local function make_table_m_and_f_and_n(data)	
	local conv = {
		{"nom_sg_m", "nom_sg_f", "nom_sg_n"},
		{"gen_sg_m", "gen_sg_f", "gen_sg_n"},
		{"dat_sg_m", "dat_sg_f", "dat_sg_n"},
		{"acc_sg_m", "acc_sg_f", "acc_sg_n"},
		{"abl_sg_m", "abl_sg_f", "abl_sg_n"},
		{"voc_sg_m", "voc_sg_f", "voc_sg_n"},
		{"loc_sg_m", "loc_sg_f", "loc_sg_n"},
		{"----", "----", "----"},  -- prevents merge rows from merging cells at the bottom of sg with cells at the top of pl
		{"nom_pl_m", "nom_pl_f", "nom_pl_n"},
		{"gen_pl_m", "gen_pl_f", "gen_pl_n"},
		{"dat_pl_m", "dat_pl_f", "dat_pl_n"},
		{"acc_pl_m", "acc_pl_f", "acc_pl_n"},
		{"abl_pl_m", "abl_pl_f", "abl_pl_n"},
		{"voc_pl_m", "voc_pl_f", "voc_pl_n"},
		{"loc_pl_m", "loc_pl_f", "loc_pl_n"},
	}
	conv = convert(data, conv)
	
	local output = data.title
	output = output .. '\n\n'
	output = output .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = '-', palette = 'cyan' } }
	output = output .. '\n!class="outer" | '
	output = output .. '\n!class="outer" colspan="3" | singular'
	output = output .. '\n|class="separator" rowspan="999"|'
	output = output .. '\n!class="outer" colspan="3" | plural'
	output = output .. '\n|-'
	output = output .. '\n! '
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n! neuter'
	output = output .. '\n! masculine'
	output = output .. '\n! feminine'
	output = output .. '\n! neuter'
	output = output .. '\n|-'
	output = output .. '\n! [[nominative case|nominative]]'
	output = output .. conv[1]
	output = output .. conv[9]
	output = output .. '\n|-'
	output = output .. '\n! [[genitive case|genitive]]'
	output = output .. conv[2]
	output = output .. conv[10]
	output = output .. '\n|-'
	output = output .. '\n! [[dative case|dative]]'
	output = output .. conv[3]
	output = output .. conv[11]
	output = output .. '\n|-'
	output = output .. '\n! [[accusative case|accusative]]'
	output = output .. conv[4]
	output = output .. conv[12]
	output = output .. '\n|-'
	output = output .. '\n! [[ablative case|ablative]]'
	output = output .. conv[5]
	output = output .. conv[13]
	if data.voc then
		output = output .. '\n|-'
		output = output .. '\n! [[vocative case|vocative]]'
		output = output .. conv[6]
		output = output .. conv[14]
	end
	if data.loc then
		output = output .. '\n|-'
		output = output .. '\n! [[locative case|locative]]'
		output = output .. conv[7]
		output = output .. conv[15]
	end
	output = output .. '\n' .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' }
	if data.footnotes and data.footnotes ~= '' then
		output = output .. '\n' .. data.footnotes
	end
	
	return output
end

function export.make_table(data, noneut, nomf)
	local output
	if not data.forms.nom_sg_n and not data.forms.nom_pl_n then
		if data.forms.nom_sg_f or data.forms.nom_pl_f then
			if data.num == "pl" then output = make_table_m_and_f_pl(data)
			elseif data.num == "sg" then output = make_table_m_and_f_sg(data)
			else output = make_table_m_and_f(data) end
		else
			if data.num == "pl" then output = make_table_mfn_pl(data, noneut)
			elseif data.num == "sg" then output = make_table_mfn_sg(data, noneut)
			else output = make_table_mfn(data, noneut) end
		end
	elseif nomf then
		if data.num == "pl" then output = make_table_n_pl(data)
		elseif data.num == "sg" then output = make_table_n_sg(data)
		else output = make_table_n(data, noneut) end
	elseif not data.forms.nom_sg_f and not data.forms.nom_pl_f then
		if data.num == "pl" then output = make_table_mf_and_n_pl(data)
		elseif data.num == "sg" then output = make_table_mf_and_n_sg(data)
		else output = make_table_mf_and_n(data) end
	else
		if data.num == "pl" then output = make_table_m_and_f_and_n_pl(data)
		elseif data.num == "sg" then output = make_table_m_and_f_and_n_sg(data)
		else output = make_table_m_and_f_and_n(data) end
	end
	return output
end

return export

-- For Vim, so we get 4-space tabs
-- vim: set ts=4 sw=4 noet: