Jump to content

Module:az-translit

From Wiktionary, the free dictionary

This module will transliterate Azerbaijani language 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:az-translit/testcases.

Functions

[edit]
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 single_letters = {
	['а']='a', ['А']='A',  ['б']='b', ['Б']='B',  ['в']='v', ['В']='V',
	['г']='q', ['Г']='Q',  ['д']='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',  ['ц']='s',['Ц']='S',
	['ч']='ç', ['Ч']='Č',  ['ш']='ş', ['Ш']='Ş',  ['щ']='şç',['Щ']='Şç',
	['ъ']='',  ['Ъ']='',   ['ы']='ı', ['Ы']='I',  ['ь']='ʹ', ['Ь']='ʹ',
	['э']='e', ['Э']='E',  ['ю']='yu',['Ю']='Yu', ['я']='ya',['Я']='Ya',
	['ј']='y', ['Ј']='Y',  ['һ']='h',  ['Һ']='H', ['ғ']='ğ',  ['Ғ']='Ğ',
	['ә']='ə',  ['Ә']='Ə', ['ө']='ö',  ['Ө']='Ö', ['ү']='ü',  ['Ү']='Ü',
	['ҹ']='ç',  ['Ҹ']='Ç', ['ҝ']='g',  ['Ҝ']='G',
}

function export.tr(text, lang, sc)

    if not sc then
        sc = require("Module:languages").getByCode("az"):findBestScript(text):getCode()
    end

    if sc == "Arab" then
        text = nil
    elseif sc == "Latn" then
        text = nil
    elseif sc == "Cyrl" then
        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)

        text = mw.ustring.gsub(text, '.', single_letters)
    end

    return text
end
return export