Module:ta-conj

Hello, you have come here looking for the meaning of the word Module:ta-conj. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:ta-conj, but we will also tell you about its etymology, its characteristics and you will know how to say Module:ta-conj in singular and plural. Everything you need to know about the word Module:ta-conj you have here. The definition of the word Module:ta-conj will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:ta-conj, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

This module serves as the backend for Template:ta-conj-auto. It is also used in Module:ta-decl.


local export = {}
local m_translit = require("Module:ta-translit")

local gsub = mw.ustring.gsub
local sub = mw.ustring.sub
local match = mw.ustring.match
local len = mw.ustring.len

local consonants = {
	='k' , ='ṅ' , ='c' , ='ñ' , ='ṭ' , ='ṇ' , ='t' ,
	='n' , ='p', ='m' , ='y' , ='r' , ='l' , ='v' ,
	='ḻ' , ='ḷ' , ='ṟ' , ='ṉ' , ='ś' , ='j' , ='ṣ' , 
	='s' , ='h' , ='f' , ='z' , ='x' ,
	='ḥ' ,
}

local stops = {
	='k' , ='c' , ='ṭ' , ='t' ,
	='p', ='ṟ'
}

local matras = {
	= 'ā' , ='i' , ='ī' , ='u' , ='ū' ,  ='e' ,
	='ē' , ='ai' , ='o' , ='ō' , ='au'  ,
	='',	--halant, supresses the inherent vowel "a"
	-- no diacritic
	 = 'a'
}

local front_vowels = {
	='i' , ='ī' , ='u' , ='e' ,
	='ē' , ='ai' 
}

local back_vowels = {
	-- or implicit 'a' ending! --
	= 'ā' , ='u' , ='ū' ,
	='o' , ='ō' , ='au'  ,
}

local nonconsonants = {
	='’a' , ='’ā' , ='’i' , ='’ī' , ='’u' , ='’ū' , 
	='’e' , ='’ē' , ='’ai' , ='’o' , ='’ō' , ='’au' 
}

local nasals = {
	='ṅ' , ='ñ' ,  ='ṇ' , ='n' ,
	='m' , ='ṉ' ,
}

local laterals = {
	='ḷ' , ='l' 
}

local vowel_conv = {
	='', ='ா' , ='ி' , ='ீ' , ='ு' , ='ூ' , 
    ='ெ' , ='ே' , ='ை' , ='ொ' , ='ோ' , ='ௌ' , 
}


local irregular_infinitives = {
	 = "விற்க",
	 = "நிற்க",
	 = "கற்க",
	 = "கிற்க",
	 = "கேட்க",
	 = "வர",
	 = "தர",
	 = "போக",
	 = "சாக",
	 = "தோற்க",
}

-- this is meant to be an all purpose sandhi handler
function export.agglutinate(stem, suffix, args)
    delete_final_u = (args and args.delete_final_u) or false
    delete_final_a = (args and args.delete_final_a) or false
    assimilate_lateral_to_stop = (args and args.assimilate_lateral_to_stop) or false
    do_not_duplicate_laterals = (args and args.do_not_duplicate_laterals) or false
    do_not_duplicate_nasals = (args and args.do_not_duplicate_nasals) or false
    do_not_adjust_nasals = (args and args.do_not_adjust_nasals) or false
    
    -- conv matras
    local vowelic_suffix = false
    if nonconsonants then
    	vowelic_suffix = true
    	suffix = vowel_conv .. sub(suffix, 2)
    end
    
    -- simple cases without sandhi
    if sub(stem, -1) == '்' and vowelic_suffix then
    	-- consonant meets vowel boundary
    	if (nasals and not do_not_duplicate_nasals) or (laterals and not do_not_duplicate_laterals) then
    		return stem .. sub(stem, -2, -2) .. suffix
    	end
    	return sub(stem, 1, -2) .. suffix
    elseif sub(stem, -1) ~= '்' and consonants then
    	-- vowel meets consonant boundary 
    	if sub(suffix, 1, 1) == 'ந' and sub(suffix, 2, 2) ~= '்' then
    		return stem .. 'ன' .. sub(suffix, 2) -- edge case since ந is never intervowelic
    	end
    	return stem .. suffix
    end
    
    -- vowel meets vowel cases with deletion
    if sub(stem, -1) == 'ு' and delete_final_u then
    	return sub(stem, 1, -2) .. suffix
    elseif consonants and delete_final_a then
    	return stem .. suffix
    end
    
    -- vowel meets vowel cases include vowel for euphony
    if sub(stem, -1) ~= '்' then
    	if front_vowels then
    		return stem .. 'ய' .. suffix
    	elseif back_vowels or consonants then
    		return stem .. 'வ' .. suffix
    	end
    	return stem .. suffix -- something unusual
    end
    -- consonant meets consonant cases
    if (nasals and stops) and not do_not_adjust_nasals then -- nasal assimilation
    	if sub(suffix, 1, 1) == 'க' and sub(stem, -2, -2) ~= "ண" then return sub(stem, 1, -3) .. 'ங்' .. suffix
    	elseif sub(suffix, 1, 1) == 'ச' then return sub(stem, 1, -3) .. 'ஞ்' .. suffix
    	elseif sub(suffix, 1, 1) == 'ட' then return sub(stem, 1, -3) .. 'ண்' .. suffix
    	elseif sub(suffix, 1, 1) == 'த' then return sub(stem, 1, -3) .. 'ந்' .. suffix
    	elseif sub(suffix, 1, 1) == 'ப' and sub(stem, -2, -2) ~= ("ண" or "ன") then return sub(stem, 1, -3) .. 'ம்' .. suffix
    	elseif sub(suffix, 1, 1) == 'ற' then return sub(stem, 1, -3) .. 'ன்' .. suffix
    	end
    	return stem .. suffix -- something unusual
    end
    if laterals and (sub(suffix, 1, 1) == 'ட' or sub(suffix, 1, 1) == 'த') then -- lateral assimilation
    	if assimilate_lateral_to_stop then
    		if sub(stem, -2, -2) == 'ல' then return sub(stem, 1, -3) .. 'ற்ற' .. sub(suffix, 2)
    		elseif sub(stem, -2, -2) == 'ள' then return sub(stem, 1, -3) .. 'ட்ட' .. sub(suffix, 2)
    		end
    	else
    		if sub(stem, -2, -2) == 'ல' then return sub(stem, 1, -3) .. 'ன்ற' .. sub(suffix, 2)
    		elseif sub(stem, -2, -2) == 'ள' then return sub(stem, 1, -3) .. 'ண்ட' .. sub(suffix, 2)
    		end
    	end
    end    
	return stem .. suffix -- ordinary
end

local endings = { -- 10 personal endings
	"ஏன்", "ஆய்", "ஆன்", "ஆள்", "ஆர்", "அது", "ஓம்", "ஈர்கள்", "ஆர்கள்", "அன"
}

local neg_futu_endings = { -- 10 personal endings
	"மாட்டேன்", "மாட்டாய்", "மாட்டான்", "மாட்டாள்", "மாட்டார்", "ஆது", "மாட்டோம்", "மாட்டீர்கள்", "மாட்டார்கள்", "ஆ"
}

local verbal_noun_endings = { -- 6 verbal noun endings
	"அவன்", "அவள்", "அவர்", "அது", "அவர்கள்", "அவை"
}

local suffixes = {
	 = {
		 = "த",
		 = "கிற",
		 = "கின்ற",
		 = "வ",
		 = "அ",
		 = "தல்",
		 = {
			 = true
		},
		 = {}
	},
	 = {
		 = "ந்த",
		 = "கிற",
		 = "கின்ற",
		 = "வ",
		 = "அ",
		 = "தல்",
		 = {
			 = true
		},
		 = {}
	},
	 = {
		 = "ன",
		 = "கிற",
		 = "கின்ற",
		 = "வ",
		 = "அ",
		 = "தல்",
		 = {
			 = true
		},
		 = {}
	},
	 = {
		 = "ட",
		 = "கிற",
		 = "கின்ற",
		 = "வ",
		 = "அ",
		 = "தல்",
		 = {
			 = true
		},
		 = {
			 = true
		}
	},
	 = {
		 = "ட",
		 = "கிற",
		 = "கின்ற",
		 = "ப",
		 = "அ",
		 = "தல்",
		 = {
			 = true
		},
		 = {}
	},
	 = {
		 = "த்த",
		 = "க்கிற",
		 = "க்கின்ற",
		 = "ப்ப",
		 = "க்க",
		 = "த்தல்",
		 = {},
		 = {}
	},
	 = {
		 = "ந்த",
		 = "க்கிற",
		 = "க்கின்ற",
		 = "ப்ப",
		 = "க்க",
		 = "ந்தல்",
		 = {},
		 = {}
	}
}

-- Clone parent’s args while also assigning nil to empty strings.
local function clone_args(frame)
	local args = {}
	for pname, param in pairs(frame:getParent().args) do
		if param == "" then args = nil
		else args = param
		end
	end
	return args
end

function export.do_generate_forms(args)
	local data = {}
	
	assert(args, "Need a class for the word")
	local class = tonumber(args)
	data.class = class
	assert(data.class, "Class is not a number: " .. args)
	local base = args or mw.title.getCurrentTitle().text
	local namespace = mw.title.getCurrentTitle().nsText
	data.imperat_sg = args.imperat_sg or base
	data.inf = args.inf or irregular_infinitives or export.agglutinate(base, suffixes.infinitive, suffixes.infinitive_sandhi)
	data.imperat_pl = args.imperat_pl or ""
	if data.imperat_pl == "" then
	if class > 4 then
		data.imperat_pl = export.agglutinate(base, "உங்கள்", { = true })
	else data.imperat_pl = export.agglutinate(data.inf, "உங்கள்", { = true })
	end
	end
	-- if not data.inf then
	-- 	-- if data.class <= 5 then
	-- 	-- 	data.inf = export.agglutinate(data.imperat, "அ", { = true })
	-- 	-- elseif data.class <= 7 then
	-- 	-- 	data.inf = export.agglutinate(data.imperat, "க்க", {})
	-- 	-- end
	-- end
	data.adv_part = args.adv_part or ""
	if class == 3 and data.adv_part == "" then
		data.adv_part = export.agglutinate(data.inf, "இ", { = true })
	end
	data.gerunds2 = args.gerund_2 or export.agglutinate(base, suffixes.gerunds)
	data.aff_pres = {}
	local aff_pres_base = args.aff_pres_base or export.agglutinate(base, suffixes.present)
	local aff_pres_avai_base = args.aff_pres_avai_base or export.agglutinate(base, suffixes.avai_present)
	for i, ending in pairs(endings) do
		if i == 10 then
			table.insert(data.aff_pres, export.agglutinate(aff_pres_avai_base, ending,  { = true }))
		else
			table.insert(data.aff_pres, export.agglutinate(aff_pres_base, ending,  { = true }))
		end
	end
	
	data.aff_past = {}
	local aff_past_base = args.aff_past_base
	if not aff_past_base then
		if class == 3 then 
			aff_past_base = export.agglutinate(data.adv_part, suffixes.past, suffixes.past_sandhi)
elseif class == 4 and sub(base, -2) ~= "டு" and sub(base, -1) == "ு" then
aff_past_base = export.agglutinate(sub(base, 1, -3)..sub(sub(base, 1, -2), -1).."்", sub(sub(base, 1, -2), -1))
		elseif class == 4 and sub(base, -1) ~= '்' then
			aff_past_base = export.agglutinate(sub(base, 1, -2) .. '்', suffixes.past, suffixes.past_sandhi)
		else
			aff_past_base = export.agglutinate(base, suffixes.past, suffixes.past_sandhi)
		end
	end
	for i, ending in pairs(endings) do
		table.insert(data.aff_past, export.agglutinate(aff_past_base, ending,  { = true }))
	end
	if class ~= 3 and data.adv_part == "" then
		data.adv_part = export.agglutinate(aff_past_base, "உ",  { = true })
	end
	
	data.aff_futu = {}
	local aff_futu_base = args.aff_futu_base or export.agglutinate(base, suffixes.future)
	for i, ending in pairs(endings) do
		if i == 6 then
			table.insert(data.aff_futu, export.agglutinate(data.inf, "உம்",  { = true }))
		else
			table.insert(data.aff_futu, export.agglutinate(aff_futu_base, ending,  { = true }))
		end
	end
	
	data.aff_neg_futu = {}
	for i, ending in pairs(neg_futu_endings) do
		table.insert(data.aff_neg_futu, export.agglutinate(data.inf, ending,  { = true }))
	end
	
	data.aff_neg = export.agglutinate(data.inf, "வில்லை",  { = true })
	data.neg_imperat_sg = export.agglutinate(data.inf, "ஆதே",  { = true })
	data.neg_imperat_pl = export.agglutinate(data.inf, "ஆதீர்கள்",  { = true })
	local avp = data.adv_part
	data.pres_perf = export.agglutinate(avp, "விடு")
	data.past_perf = export.agglutinate(avp, "விட்டிரு")
	data.futu_perf = export.agglutinate(avp, "விடு")
	data.progressive = export.agglutinate(avp, "க்கொண்டிரு")
	data.eff = export.agglutinate(data.inf, "ப்படு")
	data.neg_inf = export.agglutinate(data.inf, "ஆமல் இருக்க", { = true })
	data.pot = export.agglutinate(data.inf, "லாம்", { = true })
	data.neg_pot = export.agglutinate(data.inf, "ஆமல் இருக்கலாம்", { = true })
	data.cohortative = export.agglutinate(data.inf, "ட்டும்", { = true })
	data.neg_cohortative = export.agglutinate(data.inf, "ஆமல் இருக்கட்டும்", { = true })
	
	data.neg_casual_conditional = export.agglutinate(data.inf, "ஆத்தால்", { = true })
	data.conditional = export.agglutinate(aff_past_base, "ஆல்", { = true })
	data.neg_conditional = export.agglutinate(data.inf, "ஆவிட்டால்", { = true })
	
	data.neg_adv_part = export.agglutinate(data.inf, "ஆமல்", { = true })
	
	data.pres_adj_part = aff_pres_base
	data.past_adj_part = aff_past_base
	data.futu_adj_part = export.agglutinate(data.inf, "உம்",  { = true })
	data.neg_adj_part = export.agglutinate(data.inf, "ஆத", { = true })
	
	data.verbal_noun_pres = {}
	for i, ending in pairs(verbal_noun_endings) do
		table.insert(data.verbal_noun_pres, export.agglutinate(aff_pres_base, ending,  { = true }))
	end
	
	data.verbal_noun_past = {}
	for i, ending in pairs(verbal_noun_endings) do
		table.insert(data.verbal_noun_past, export.agglutinate(aff_past_base, ending,  { = true }))
	end
	
	data.verbal_noun_futu = {}
	local verbal_noun_futu_base = aff_futu_base
	if suffixes.future == "வ" then
		verbal_noun_futu_base = export.agglutinate(base, "ப",  { = true })
	end
	local verbal_noun = export.agglutinate(aff_futu_base, "அது",  { = true })
	for i, ending in pairs(verbal_noun_endings) do
		if i == 4 then
			table.insert(data.verbal_noun_futu, verbal_noun)
		else
			table.insert(data.verbal_noun_futu, export.agglutinate(verbal_noun_futu_base, ending,  { = true }))
		end
	end

	data.casual_conditional = export.agglutinate(verbal_noun, "ஆல்", { = true,  = true  })
	
	data.verbal_noun_neg = {}
	local verbal_noun_neg_base = export.agglutinate(data.inf, "ஆத",  { = true })
	for i, ending in pairs(verbal_noun_endings) do
		table.insert(data.verbal_noun_neg, export.agglutinate(verbal_noun_neg_base, ending,  { = true }))
	end
	
	data.gerunds = {
		verbal_noun,
		data.gerunds2,
		export.agglutinate(data.inf, "அல்", { = true })
	}
	
	local pres_perf = data.pres_perf
	local past_perf = data.past_perf
	local futu_perf = data.futu_perf
	for k, v in pairs(data) do
		if type(v) == "table" then
			for k1, v1 in pairs(v) do
				if (v1 ~= "-") then
					data = '<span class="Taml">]</span> ' .. ' <br/><small style="color: #888">' .. m_translit.tr(v1) .. '</small>'
				end
			end
		else
			if (v ~= "-") then
				data = '<span class="Taml">]</span>' .. ' <br/><small style="color: #888">' .. m_translit.tr(v) .. '</small>'
			end
		end
	end
	data.base = base .. ' (' .. m_translit.tr(base) .. ')'
	data.pres_perf = '] (' .. m_translit.tr(pres_perf) .. ')'
	data.past_perf = '] (' .. m_translit.tr(past_perf) .. ')'
	data.futu_perf = '] (' .. m_translit.tr(futu_perf) .. ')'
	data.categories = ""
	if not (args.nocat or namespace ~= "")  then
		data.categories = "]"
	end
	return data
end

function export.show(frame)
	local args = clone_args(frame)
	local data = export.do_generate_forms(args)
	
	local res = {'<div class="NavFrame"><div class="NavHead" style="text-align: left">Conjugation of ' .. data.base .. '</div><div class="NavContent" style="text-align: center; display: none;">'}
	-- local res = {'{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="background:#F9F9F9; text-align:center; border: 1px solid #CCC; min-width: 20em"'}
	-- table.insert(res, '|- style="background: #d9ebff;"')
	-- table.insert(res, '! class="vsToggleElement" style="text-align: left;" colspan="100%" | Conjugation of ' .. data.imperat_sg)
	table.insert(res, '{| style="width:100%;;text-align:center;;background:#F0F0F0;;padding:.3em"')
	table.insert(res, '|-')
	table.insert(res, '! colspan="1" rowspan="2" style="background:#c0cfe4;;width:14.28%" | singular affective')
	table.insert(res, '! style="background:#c0cfe4;;width:14.28%" | first')
	table.insert(res, '! style="background:#c0cfe4;;width:14.28%" | second')
	table.insert(res, '! style="background:#c0cfe4;;width:14.28%" | third masculine')
	table.insert(res, '! style="background:#c0cfe4;;width:14.28%" | third feminine')
	table.insert(res, '! style="background:#c0cfe4;;width:14.28%" | third honorific')
	table.insert(res, '! style="background:#c0cfe4;;width:14.28%" | third neuter')
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | ]')
	table.insert(res, '! style="background:#c0cfe4;" | ]')
	table.insert(res, '! style="background:#c0cfe4;" | ]')
	table.insert(res, '! style="background:#c0cfe4;" | ]')
	table.insert(res, '! style="background:#c0cfe4;" | ]')
	table.insert(res, '! style="background:#c0cfe4;" | ]')
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | present')
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | past')
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | future')
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | future negative')
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | negative')
	table.insert(res, '| colspan="6" | ' .. data.aff_neg)
	table.insert(res, '|-')
	table.insert(res, '! rowspan="2" style="background:#c0cfe4;" | plural affective')
	table.insert(res, '! style="background:#c0cfe4;" | first')
	table.insert(res, '! style="background:#c0cfe4;" | second<br />(or singular polite)')
	table.insert(res, '! colspan="2" style="background:#c0cfe4;" | third epicene')
	table.insert(res, '! colspan="2" style="background:#c0cfe4;" | third neuter')
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | ] (inclusive)<br />] (exclusive)')
	table.insert(res, '! style="background:#c0cfe4;" | ]')
	table.insert(res, '! colspan="2" style="background:#c0cfe4;" | ]')
	table.insert(res, '! colspan="2" style="background:#c0cfe4;" | ]')
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | present')
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '| ' .. data.aff_pres)
	table.insert(res, '| colspan="2" | ' .. data.aff_pres)
	table.insert(res, '| colspan="2" | ' .. data.aff_pres)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | past')
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '| ' .. data.aff_past)
	table.insert(res, '| colspan="2" | ' .. data.aff_past)
	table.insert(res, '| colspan="2" | ' .. data.aff_past)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | future')
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '| ' .. data.aff_futu)
	table.insert(res, '| colspan="2" | ' .. data.aff_futu)
	table.insert(res, '| colspan="2" | ' .. data.aff_futu)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | future negative')
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '| ' .. data.aff_neg_futu)
	table.insert(res, '| colspan="2" | ' .. data.aff_neg_futu)
	table.insert(res, '| colspan="2" | ' .. data.aff_neg_futu)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0cfe4;" | negative')
	table.insert(res, '| colspan="6" | ' .. data.aff_neg)
	table.insert(res, '|-')
	table.insert(res, '! rowspan="2" style="background:#c0cfe4;" | imperative')
	table.insert(res, '! colspan="3" style="background:#c0cfe4;" | singular')
	table.insert(res, '! colspan="3" style="background:#c0cfe4;" | plural (or singular polite)')
	table.insert(res, '|-')
	table.insert(res, '| colspan="3" | ' .. data.imperat_sg)
	table.insert(res, '| colspan="3" | ' .. data.imperat_pl)
	table.insert(res, '|-')
	table.insert(res, '! rowspan="2" style="background:#c0cfe4;" | negative imperative')
	table.insert(res, '! colspan="3" style="background:#c0cfe4;" | singular')
	table.insert(res, '! colspan="3" style="background:#c0cfe4;" | plural (or singular polite)')
	table.insert(res, '|-')
	table.insert(res, '| colspan="3" | ' .. data.neg_imperat_sg)
	table.insert(res, '| colspan="3" | ' .. data.neg_imperat_pl)
	table.insert(res, '|-')
	table.insert(res, '! rowspan="2" style="background:#c0e4c0;" | perfect')
	table.insert(res, '! colspan="2" style="background:#c0e4c0;" | present')
	table.insert(res, '! colspan="2" style="background:#c0e4c0;" | past')
	table.insert(res, '! colspan="2" style="background:#c0e4c0;" | future')
	table.insert(res, '|-')
	table.insert(res, '| colspan="2" style="background:#CCC;font-weight:bold;" | past of ' .. data.pres_perf)
	table.insert(res, '| colspan="2" style="background:#CCC;font-weight:bold;" | past of ' .. data.past_perf)
	table.insert(res, '| colspan="2" style="background:#CCC;font-weight:bold;" | future of ' .. data.futu_perf)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0e4c0;" | progressive')
	table.insert(res, '| colspan="7" style="background:#CCC;font-weight:bold;" | ' .. data.progressive)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#c0e4c0;" | effective')
	table.insert(res, '| colspan="7" style="background:#CCC;font-weight:bold;" | ' .. data.eff)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e2e4cb;" | non-finite forms')
	table.insert(res, '! colspan="3" style="background:#e2e4cb;" | plain')
	table.insert(res, '! colspan="3" style="background:#e2e4cb;" | negative')
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e2e4cb;" | infinitive')
	table.insert(res, '| colspan="3" | ' .. data.inf)
	table.insert(res, '| colspan="3" | ' .. data.neg_inf)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e2e4cb;" | potential')
	table.insert(res, '| colspan="3" | ' .. data.pot)
	table.insert(res, '| colspan="3" | ' .. data.neg_pot)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e2e4cb;" | cohortative')
	table.insert(res, '| colspan="3" | ' .. data.cohortative)
	table.insert(res, '| colspan="3" | ' .. data.neg_cohortative)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e2e4cb;" | casual conditional')
	table.insert(res, '| colspan="3" | ' .. data.casual_conditional)
	table.insert(res, '| colspan="3" | ' .. data.neg_casual_conditional)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e2e4cb;" | conditional')
	table.insert(res, '| colspan="3" | ' .. data.conditional)
	table.insert(res, '| colspan="3" | ' .. data.neg_conditional)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e2e4cb;" | adverbial participle')
	table.insert(res, '| colspan="3" | ' .. data.adv_part)
	table.insert(res, '| colspan="3" | ' .. data.neg_adv_part)
	table.insert(res, '|-')
	table.insert(res, '! rowspan="2" style="background:#e2e4cb;" | adjectival participle')
	table.insert(res, '! style="background:#e2e4cb;" | present')
	table.insert(res, '! style="background:#e2e4cb;" | past')
	table.insert(res, '! style="background:#e2e4cb;" | future')
	table.insert(res, '! colspan="3" style="background:#e2e4cb;" | negative')
	table.insert(res, '|-')
	table.insert(res, '| ' .. data.pres_adj_part)
	table.insert(res, '| ' .. data.past_adj_part)
	table.insert(res, '| ' .. data.futu_adj_part)
	table.insert(res, '| colspan="3" | ' .. data.neg_adj_part)
	table.insert(res, '|-')
	table.insert(res, '! rowspan="2" style="background:#e4d4c0;" | verbal noun')
	table.insert(res, '! colspan="4" style="background:#e4d4c0;" | singular')
	table.insert(res, '! colspan="2" style="background:#e4d4c0;" | plural')
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e4d4c0;" | masculine')
	table.insert(res, '! style="background:#e4d4c0;" | feminine')
	table.insert(res, '! style="background:#e4d4c0;" | honorific')
	table.insert(res, '! style="background:#e4d4c0;" | neuter')
	table.insert(res, '! style="background:#e4d4c0;" | epicene')
	table.insert(res, '! style="background:#e4d4c0;" | neuter')
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e4d4c0;" | present')
	table.insert(res, '| ' .. data.verbal_noun_pres)
	table.insert(res, '| ' .. data.verbal_noun_pres)
	table.insert(res, '| ' .. data.verbal_noun_pres)
	table.insert(res, '| ' .. data.verbal_noun_pres)
	table.insert(res, '| ' .. data.verbal_noun_pres)
	table.insert(res, '| ' .. data.verbal_noun_pres)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e4d4c0;" | past')
	table.insert(res, '| ' .. data.verbal_noun_past)
	table.insert(res, '| ' .. data.verbal_noun_past)
	table.insert(res, '| ' .. data.verbal_noun_past)
	table.insert(res, '| ' .. data.verbal_noun_past)
	table.insert(res, '| ' .. data.verbal_noun_past)
	table.insert(res, '| ' .. data.verbal_noun_past)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e4d4c0;" | future')
	table.insert(res, '| ' .. data.verbal_noun_futu)
	table.insert(res, '| ' .. data.verbal_noun_futu)
	table.insert(res, '| ' .. data.verbal_noun_futu)
	table.insert(res, '| ' .. data.verbal_noun_futu)
	table.insert(res, '| ' .. data.verbal_noun_futu)
	table.insert(res, '| ' .. data.verbal_noun_futu)
	table.insert(res, '|-')
	table.insert(res, '! style="background:#e4d4c0;" | negative')
	table.insert(res, '| ' .. data.verbal_noun_neg)
	table.insert(res, '| ' .. data.verbal_noun_neg)
	table.insert(res, '| ' .. data.verbal_noun_neg)
	table.insert(res, '| ' .. data.verbal_noun_neg)
	table.insert(res, '| ' .. data.verbal_noun_neg)
	table.insert(res, '| ' .. data.verbal_noun_neg)
	table.insert(res, '|-')
	table.insert(res, '! rowspan="2" style="background:#e4d4c0;" | gerund')
	table.insert(res, '! colspan="2" style="background:#e4d4c0;" | Form I')
	table.insert(res, '! colspan="2" style="background:#e4d4c0;" | Form II')
	table.insert(res, '! colspan="2" style="background:#e4d4c0;" | Form III')
	table.insert(res, '|-')
	table.insert(res, '| colspan="2" | ' .. data.gerunds)
	table.insert(res, '| colspan="2" | ' .. data.gerunds)
	table.insert(res, '| colspan="2" | ' .. data.gerunds)
	table.insert(res, '|}</div></div>')
	if data.categories ~= "" then
		table.insert(res, data.categories)
	end
	
	return table.concat(res, "\n")
end

return export