This module will transliterate ภาษาคูมุก text. The module should preferably not be called directly from templates or other modules. To use it from a template, use {{xlit}}. Within a module, use Module:languages#Language:transliterate.

For testcases, see Module:kum-translit/testcases.

tr(text, lang, sc)
Transliterates a given piece of text written in the script specified by the code sc, and language specified by the code lang.
When the transliteration fails, returns nil.

local export = {}

local digraphs = {
	['гь']= 'h', ['Гь']='H', ['гъ']='ğ', ['Гъ']='Ğ', ['уь']='ü', ['Уь']='Ü',
    ['къ']='q',  ['Къ']='Q', ['нг']='ñ', ['Нг']='Ñ', ['оь']='ö', ['Оь']='Ö'
}

local single_letters = {
	['а']='a', ['А']='A',  ['б']='b', ['Б']='B',  ['в']='w', ['В']='w',
	['г']='g', ['Г']='G',  ['д']='d', ['Д']='D',  ['е']='e', ['Е']='E',
	['ё']='yo',['Ё']='Yo', ['ж']='j', ['Ж']='J',  ['з']='z', ['З']='Z',
	['и']='i', ['И']='İ',  ['й']='y', ['Й']='Y',  ['к']='k', ['К']='K',
	['л']='l', ['Л']='L',  ['м']='m', ['М']='M',  ['н']='n', ['Н']='N',
	['о']='o', ['О']='O',  ['п']='p', ['П']='P',  ['р']='r', ['Р']='R',
	['с']='s', ['С']='S',  ['т']='t', ['Т']='T',  ['у']='u', ['У']='U',
	['ф']='f', ['Ф']='F',  ['х']='x', ['Х']='X',  ['ц']='ts',['Ц']='Ts',
	['ч']='ç', ['Ч']='Č',  ['ш']='ş', ['Ш']='Ş',  ['щ']='şç',['Щ']='Şç',
	['ъ']='',  ['Ъ']='',   ['ы']='ı', ['Ы']='I',  ['ь']='ʹ', ['Ь']='ʹ',
	['э']='e', ['Э']='E',  ['ю']='yu',['Ю']='Yu', ['я']='ya',['Я']='Ya',
}

function export.tr(text, lang, sc)
	for digraph, replacement in pairs(digraphs) do
		text = mw.ustring.gsub(text, digraph, replacement)
	end
	
 	text = mw.ustring.gsub(text,
 		"()([ЕеЮюЁё])",
 		function (pos, iotated)
 			-- modifier letter apostrophe or right single quotation mark
 			local preceding = mw.ustring.sub(text, math.max(1, pos - 2), math.max(0, pos - 1))
 			local capital = iotated == "Е" or iotated == "Ю"
 			local lower = mw.ustring.lower(iotated)
 			
 			local translit
 			if preceding == "" or mw.ustring.match(preceding, "[АОӨӘУЫЕЯЁЮИЕаоөәуыэяёюиеъь%A][́̀]?$") then
 				if capital then
 					if lower == "ю" then return "Yu"
 					elseif lower == "ё" then return "Yo"
 					else return "Ye" end
 				else
 					if lower == "ю" then return "yu"
 					elseif lower == "ё" then return "yo"
 					else return "ye" end
 				end
 			else
 				if capital then
 					if lower == "ю" then return "Ü"
 					elseif lower == "ё" then return "Ö"
 					else return "E" end
 				else
 					if lower == "ю" then return "ü"
 					elseif lower == "ё" then return "ö"
 					else return "e" end
 				end
 			end
 			return translit
 		end)
	
	return (mw.ustring.gsub(text, '.', single_letters))
end

return export