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