Bước tới nội dung

Mô đun:ta-decl

Từ điển mở Wiktionary
local export = {}
local m_translit = require("Module:ta-translit")
local m_tamil = require("Module:ta-conj")
local agglutinate = m_tamil.agglutinate

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

local long_vowels = {
	['ா']= 'ā' , ['ீ']='ī' , ['ூ']='ū' ,
	['ே']='ē' , ['ோ']='ō' 
}

-- 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[pname] = nil
		else args[pname] = param
		end
	end
	return args
end

function export.do_generate_forms(args)
	local data = {}

	local base = args[1] or ""
	local PAGENAME = mw.title.getCurrentTitle().text
	if base == "" then
		base = PAGENAME
	end
	
	local type_stem = args.type
	data.type_stem = ""
	
	local oblique_sg_base = ""
	local plu_base = agglutinate(base, 'கள்', {["do_not_adjust_nasals"] = true})  --default
	local special_vocative = nil
	
	categories = ""
	
	oblique_sg_base = base -- default
	if (type_stem == "root" or type_stem == "basic" or type_stem == "none") then
		-- do nothing
		data.type_stem = "root-stem"
	elseif (type_stem == "m" or (type_stem == nil and sub(base, -2) == 'ம்')) then
		data.type_stem = "m-stem"
		oblique_sg_base = sub(base, 1, -3) .. 'த்து'
        plu_base = agglutinate(base, 'கள்')  --merge nasals
	elseif (type_stem == "i" or (type_stem == nil and sub(base, -1) == 'ி')) then
		data.type_stem = "i-stem"
	elseif (type_stem == "ai" or (type_stem == nil and sub(base, -1) == 'ை')) then
		data.type_stem = "ai-stem"
	elseif (type_stem == "y" or (type_stem == nil and sub(base, -2) == 'ய்')) then
		data.type_stem = "y-stem"
	elseif (type_stem == "ā" or (type_stem == nil and sub(base, -1) == 'ா')) then
		data.type_stem = "ā-stem"
		plu_base = agglutinate(base, 'க்கள்', {})
	elseif (type_stem == "ī" or (type_stem == nil and sub(base, -1) == "ீ")) then
		data.type_stem = "ī-stem"
		plu_base = agglutinate(base, 'க்கள்', {})
	elseif (type_stem == "ṟu" or (type_stem == nil and sub(base, -2) == "று" and sub(base, 3) ~= "ற்று")) then
		data.type_stem = "ṟu-stem"
		oblique_sg_base = sub(base, 1, -3) .. 'ற்று'
	elseif (type_stem == "ṭu" or (type_stem == nil and sub(base, -2) == "டு" and sub(base, 3) ~= "ட்டு")) then
		data.type_stem = "ṭu-stem"
		oblique_sg_base = sub(base, 1, -3) .. 'ட்டு'
	elseif (type_stem == "u" or (type_stem == nil and sub(base, -1) == 'ு')) then
		data.type_stem = "u-stem"
	elseif (type_stem == "l" or (type_stem == nil and sub(base, -2) == "ல்")) then
		data.type_stem = "l-stem"
		special_vocative = base .. 'லே'
		oblique_sg_base = base .. 'லு'
		plu_base = sub(base, 1, -3) .. 'ற்கள்'
	elseif (type_stem == "ṉ" or (type_stem == nil and sub(base, -2) == "ன்")) then
		data.type_stem = "ṉ-stem"
		oblique_sg_base = sub(base, 1, -3) .. 'னு'
		plu_base = sub(base, 1, -3) .. "ர்கள்"
	elseif (type_stem == "ū" or (type_stem == nil and sub(base, -1) == "ூ")) then
		data.type_stem = "ū-stem"
		oblique_sg_base = base .. "வு"
		plu_base = base .. 'க்கள்'
	elseif (type_stem == "ḷ" or (type_stem == nil and sub(base, -2) == "ள்")) then
		data.type_stem = "ḷ-stem"
		oblique_sg_base = sub(base, 1, -3) .. 'ளு'
		plu_base = agglutinate(sub(base, 1, -3), 'ட்கள்', {})
	else
		data.type_stem = "root-stem"
	end
	
	if (data.type_stem ~= "root-stem") then
		categories = categories .. "[[Category:Tamil " .. data.type_stem .. " nouns]]"
	end

	if ((args.oblique_sg_base or args[4]) and (args.plu_base or args[2])) then
		oblique_sg_base = args.oblique_sg_base or args[4]
		plu_base = args.plu_base or args[2]
	end
	
	data.nom_sg = args.nom_s or base
	data.voc_sg = args.voc_s or args[3] or special_vocative or agglutinate(base, "ஏ", {["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true })
	-- mw.log(oblique_sg_base)
	data.acc_sg = args.acc_s or agglutinate(oblique_sg_base, 'ஐ', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true })
	data.dat_sg = args.dat_s or agglutinate(oblique_sg_base, 'க்கு', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	data.dat_sg_2 = args.ben_s or agglutinate(oblique_sg_base, 'க்காக', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	if (data.type_stem == "root-stem") then
		if not args.dat_s then
			data.dat_sg = agglutinate(oblique_sg_base, 'உக்கு', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
		end
		if not args.ben_s then
			data.dat_sg_2 = agglutinate(oblique_sg_base, 'உக்காக', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
		end
	end
	data.gen_sg = args.gen_s or agglutinate(oblique_sg_base, 'உடைய', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	data.gen_sg_2 = args.gen2_s or agglutinate(oblique_sg_base, 'இன்', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	data.loc_sg = args.loc_s or agglutinate(oblique_sg_base, 'இல்', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	data.loc_sg_2 = args.loc2_s or agglutinate(oblique_sg_base, 'இடம்', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	data.soc_sg = args.soc_s or agglutinate(oblique_sg_base, 'ஓடு', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	data.soc_sg_2 = args.soc2_s or agglutinate(oblique_sg_base, 'உடன்', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true })
	data.ins_sg = args.ins_s or agglutinate(oblique_sg_base, 'ஆல்', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true })
	data.abl_sg = args.abl_s or agglutinate(oblique_sg_base, 'இலிருந்து', {["delete_final_a"] = true, ["delete_final_u"] = true, [ "do_not_duplicate_nasals"] = true, [ "do_not_duplicate_laterals"] = true  })
	
	data.nom_pl = args.nom_p or plu_base
	data.voc_pl = args.voc_p or agglutinate(plu_base, 'ஏ', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.acc_pl = args.acc_p or agglutinate(plu_base, 'ஐ', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.dat_pl = args.dat_p or agglutinate(plu_base, 'உக்கு', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.dat_pl_2 = args.ben_p or agglutinate(plu_base, 'உக்காக', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.gen_pl = args.gen_p or agglutinate(plu_base, 'உடைய', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.gen_pl_2 = args.gen2_p or agglutinate(plu_base, 'இன்', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.loc_pl = args.loc_p or agglutinate(plu_base, 'இல்', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.loc_pl_2 = args.loc2_p or agglutinate(plu_base, 'இடம்', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.soc_pl = args.soc_p or agglutinate(plu_base, 'ஓடு', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.soc_pl_2 = args.soc2_p or agglutinate(plu_base, 'உடன்', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.ins_pl = args.ins_p or agglutinate(plu_base, 'ஆல்', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	data.abl_pl = args.abl_p or agglutinate(plu_base, 'இலிருந்து', {["delete_final_a"] = true, [ "do_not_duplicate_laterals"] = true })
	
	numbers = "both"
	if (args.num == "sg") or args[2] == "-" then
		numbers = "singular only"
		data.nom_pl = "-"
		data.voc_pl = "-"
		data.acc_pl = "-"
		data.dat_pl = "-"
		data.dat_pl_2 = "-"
		data.gen_pl = "-"
		data.gen_pl_2 = "-"
		data.loc_pl = "-"
		data.loc_pl_2 = "-"
		data.soc_pl = "-"
		data.soc_pl_2 = "-"
		data.ins_pl = "-"
		data.abl_pl = "-"
	elseif (args.num == "pl") then 
		numbers = "plural only"
		data.nom_sg = args.nom_s or "-"
		data.voc_sg = "-"
		data.acc_sg = "-"
		data.dat_sg = "-"
		data.dat_sg_2 = "-"
		data.gen_sg = "-"
		data.gen_sg_2 = "-"
		data.loc_sg = "-"
		data.loc_sg_2 = "-"
		data.soc_sg = "-"
		data.soc_sg_2 = "-"
		data.ins_sg = "-"
		data.abl_sg = "-"
	end
	
	local data_type = data.type_stem
	for k, v in pairs(data) do
		if type(v) == "table" then
			for k1, v1 in pairs(v) do
				if (v1 ~= "-") then
					data[k][k1] = '<span class="Taml">[[' .. v1 .. ']]</span> ' .. ' <br/><small style="color: #888">' .. m_translit.tr(v1) .. '</small>'
				end
			end
		else
			if (v ~= "-") then
				data[k] = '<span class="Taml">[[' .. v .. ']]</span>' .. ' <br/><small style="color: #888">' .. m_translit.tr(v) .. '</small>'
			end
		end
	end
	data.base = base .. ' (' .. m_translit.tr(base) .. ')'
	data.type_stem = data_type
	data.numbers = numbers
	data.categories = categories
	
	return data
end

function export.show(frame)
	local args = clone_args(frame)
	local data = export.do_generate_forms(args)
	
	if (args.notes) then
		if (data.type_stem == "") then 
			data.type_stem = args.notes
		else 
			data.type_stem = data.type_stem .. ", " .. args.notes
		end
	end
	
	local header = ""
	if (data.type_stem ~= "" and data.type_stem ~= "root-stem") then
		header = data.type_stem .. " declension of " .. data.base
	else
		header = "Biến cách của " .. data.base
	end
	if (data.numbers ~= "both") then
		header = header .. " " .. "<small>(" .. data.numbers .. ")</small>"
	end
	
	local res = {'{| class="inflection-table vsSwitcher" data-toggle-category="biến tố" style="background:#FEFEFE; text-align:center; border: 1px solid #CCC;"'}
	table.insert(res, '|- style="background: #d9ebff;"')
	table.insert(res, '! class="vsToggleElement" style="text-align: left;" colspan="3" | ' .. header)
	table.insert(res, '|- class="vsShow"')
	table.insert(res, '! style="background:#eff7ff; width: 7em;" | ')
	table.insert(res, '! style="background:#eff7ff; width: 10em;" | Số ít')
	table.insert(res, '! style="background:#eff7ff; width: 10em;" | Số nhiều')
	table.insert(res, '|- class="vsShow"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[nominative|Nom.]]')
	table.insert(res, '| ' .. data.nom_sg)
	table.insert(res, '| ' .. data.nom_pl)
	table.insert(res, '|- class="vsShow"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[vocative|Voc.]]')
	table.insert(res, '| ' .. data.voc_sg)
	table.insert(res, '| ' .. data.voc_pl)
	table.insert(res, '|- class="vsShow"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[accusative|Acc.]]')
	table.insert(res, '| ' .. data.acc_sg)
	table.insert(res, '| ' .. data.acc_pl)
	table.insert(res, '|- class="vsShow"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[dative|Dat.]]')
	table.insert(res, '| ' .. data.dat_sg)
	table.insert(res, '| ' .. data.dat_pl)
	table.insert(res, '|- class="vsShow"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[genitive|Gen.]]')
	table.insert(res, '| ' .. data.gen_sg)
	table.insert(res, '| ' .. data.gen_pl)
	
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '! style="background:#eff7ff; width: 7em;" | ')
	table.insert(res, '! style="background:#eff7ff; width: 10em;" | Số ít')
	table.insert(res, '! style="background:#eff7ff; width: 10em;" | Số nhiều')
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[nominative|Nom.]]')
	table.insert(res, '| ' .. data.nom_sg)
	table.insert(res, '| ' .. data.nom_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[vocative|Voc.]]')
	table.insert(res, '| ' .. data.voc_sg)
	table.insert(res, '| ' .. data.voc_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[accusative|Acc.]]')
	table.insert(res, '| ' .. data.acc_sg)
	table.insert(res, '| ' .. data.acc_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[dative|Dat.]]')
	table.insert(res, '| ' .. data.dat_sg)
	table.insert(res, '| ' .. data.dat_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[benefactive|Ben.]]')
	table.insert(res, '| ' .. data.dat_sg_2)
	table.insert(res, '| ' .. data.dat_pl_2)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[genitive|Gen.]] 1')
	table.insert(res, '| ' .. data.gen_sg)
	table.insert(res, '| ' .. data.gen_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[genitive|Gen.]] 2')
	table.insert(res, '| ' .. data.gen_sg_2)
	table.insert(res, '| ' .. data.gen_pl_2)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[locative|Loc.]] 1')
	table.insert(res, '| ' .. data.loc_sg)
	table.insert(res, '| ' .. data.loc_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[locative|Loc.]] 2')
	table.insert(res, '| ' .. data.loc_sg_2)
	table.insert(res, '| ' .. data.loc_pl_2)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[sociative|Soc.]] 1')
	table.insert(res, '| ' .. data.soc_sg)
	table.insert(res, '| ' .. data.soc_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[sociative|Soc.]] 2')
	table.insert(res, '| ' .. data.soc_sg_2)
	table.insert(res, '| ' .. data.soc_pl_2)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[instrumental|Ins.]]')
	table.insert(res, '| ' .. data.ins_sg)
	table.insert(res, '| ' .. data.ins_pl)
	table.insert(res, '|- class="vsHide"')
	table.insert(res, '!style="background:#eff7ff; width: 5em"| [[ablative|Abl.]]')
	table.insert(res, '| ' .. data.abl_sg)
	table.insert(res, '| ' .. data.abl_pl)
	table.insert(res, '|}')
	if (args.no_categories ~= "true" and mw.title.getCurrentTitle().nsText == "") then
		table.insert(res, data.categories)
	end
	
	return table.concat(res, "\n")
end

return export