Przejdź do zawartości

Moduł:transkrypcja-uk/PWN

Z Wikisłownika – wolnego słownika wielojęzycznego

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:transkrypcja-uk/PWN/opis

local p = {}

local errcat = '[[Kategoria:Błąd w transkrypcji]]'

local commonTransliteration = {
    ["-"] = "-",
    ["–"] = "–",
    ["—"] = "—",
    ["="] = "=",
    [","] = ",",
    ["."] = ".",
    ["/"] = "/",
    [";"] = ";",
    ["'"] = "'",
    ["["] = "[",
    ["]"] = "]",
    ["\\"] = "\\",
    ["`"] = "`",
    ["~"] = "~",
    ["!"] = "!",
    ["@"] = "@",
    ["#"] = "#",
    ["$"] = "$",
    ["%"] = "%",
    ["^"] = "^",
    ["&"] = "&",
    ["*"] = "*",
    ["("] = "(",
    [")"] = ")",
    ["_"] = "_",
    ["+"] = "+",
    ["{"] = "{",
    ["}"] = "}",
    ["|"] = "|",
    [":"] = ":",
    ["\""] = "\"",
    ["<"] = "<",
    [">"] = ">",
    ["?"] = "?" ,
    [" "] = " "
}

local transliterationUk = {
    ["а"] = "a",
    ["б"] = "b",
    ["в"] = "w",
    ["г"] = "h",
    ["ґ"] = "g",
    ["д"] = "d",
    ["е"] = "e",
    -- Є > JE
    ["є"] = "je",
    ["еє"] = "eje",
    ["иє"] = "yje",
    ["іє"] = "ije",
    ["їє"] = "jije",
    ["оє"] = "oje",
    ["ює"] = "juje",
    ["яє"] = "jaje",
    ["’є"] = "je",
    -- koniec
    -- Є > E
    ["лє"] = "le",
    -- koniec
    -- Є > IE
    ["бє"] = "bie",
    ["вє"] = "wie",
    ["гє"] = "gie",
    ["ґє"] = "gie",
    ["дє"] = "die",
    ["жє"] = "żie",
    ["зє"] = "zie",
    ["йє"] = "jie",
    ["кє"] = "kie",
    ["мє"] = "mie",
    ["нє"] = "nie",
    ["пє"] = "pie",
    ["рє"] = "rie",
    ["сє"] = "sie",
    ["тє"] = "tie",
    ["фє"] = "fie",
    ["хє"] = "chie",
    ["цє"] = "cie",
    ["чє"] = "czie",
    ["шє"] = "szie",
    ["щє"] = "szczie",
    -- koniec
    ["ж"] = "ż",
    ["з"] = "z",
    ["и"] = "y",
    ["і"] = "i",
    ["ї"] = "ji",
    ["й"] = "j",
    ["к"] = "k",
    -- Л > L
    ["ля"] = "lja",
    ["лі"] = "li",
    ["лї"] = "lji",
    ["ль"] = "l",
    -- koniec
    -- Л > Ł
    ["ла"] = "ła",
    ["ле"] = "łe",
    ["ли"] = "ły",
    ["ло"] = "ło",
    ["лу"] = "łu",
    ["лб"] = "łb",
    ["лв"] = "łw",
    ["лг"] = "łh",
    ["лґ"] = "łg",
    ["лд"] = "łd",
    ["лж"] = "łż",
    ["лз"] = "łz",
    ["лй"] = "łj",
    ["лк"] = "łk",
    ["лм"] = "łm",
    ["лн"] = "łn",
    ["лп"] = "łp",
    ["лр"] = "łr",
    ["лс"] = "łs",
    ["лт"] = "łt",
    ["лф"] = "łf",
    ["лх"] = "łch",
    ["лц"] = "łc",
    ["лч"] = "łcz",
    ["лш"] = "łsz",
    ["лщ"] = "łszcz",
    -- koniec
    ["л~"] = "ł", -- tylko na końcu wyrazu
    ["л"] = "l",
    ["м"] = "m",
    ["н"] = "n",
    ["о"] = "o",
    ["п"] = "p",
    ["р"] = "r",
    ["с"] = "s",
    ["т"] = "t",
    ["у"] = "u",
    ["ф"] = "f",
    ["х"] = "ch",
    ["ц"] = "c",
    ["ч"] = "cz",
    ["ш"] = "sz",
    ["щ"] = "szcz",
    -- Ь
    ["ь"] = "´",
    ["ьо"] = "io",
    ["льо"] = "lo",
    ["нь"] = "ń",
    ["зь"] = "ź",
    ["сь"] = "ś",
    ["ць"] = "ć",
    ["ньо"] = "nio",
    ["зьо"] = "zio",
    ["сьо"] = "sio",
    ["цьо"] = "cio",
    -- Ю > JU
    ["ю"] = "ju",
    ["аю"] = "aju",
    ["ею"] = "eju",
    ["єю"] = "jeju",
    ["ию"] = "yju",
    ["ію"] = "iju",
    ["їю"] = "jiju",
    ["ою"] = "oju",
    ["яю"] = "jaju",
    ["’ю"] = "ju",
    -- koniec
    -- Ю > U
    ["лю"] = "lu",
    -- koniec
    -- Ю > IU
    ["бю"] = "biu",
    ["вю"] = "wiu",
    ["гю"] = "hiu",
    ["ґю"] = "giu",
    ["дю"] = "diu",
    ["жю"] = "żiu",
    ["зю"] = "ziu",
    ["йю"] = "kiu",
    ["кю"] = "kiu",
    ["мю"] = "miu",
    ["ню"] = "niu",
    ["пю"] = "piu",
    ["рю"] = "riu",
    ["сю"] = "siu",
    ["тю"] = "tiu",
    ["фю"] = "fiu",
    ["хю"] = "chiu",
    ["цю"] = "ciu",
    ["чю"] = "cziu",
    ["шю"] = "sziu",
    ["щю"] = "szcziu",
    -- koniec
    -- Я > JA
    ["я"] = "ja",
    ["ая"] = "aja",
    ["ея"] = "eja",
    ["єя"] = "jeja",
    ["ия"] = "yja",
    ["ія"] = "ija",
    ["їя"] = "jija",
    ["оя"] = "oja",
    ["юя"] = "juja",
    ["’я"] = "ja",
    -- koniec
    -- Я > A
    ["ля"] = "la",
    -- koniec
    -- Я > IA
    ["бя"] = "bia",
    ["вя"] = "wia",
    ["гя"] = "hia",
    ["ґя"] = "gia",
    ["дя"] = "dia",
    ["жя"] = "żia",
    ["зя"] = "zia",
    ["йя"] = "kia",
    ["кя"] = "kia",
    ["мя"] = "mia",
    ["ня"] = "nia",
    ["пя"] = "pia",
    ["ря"] = "ria",
    ["ся"] = "sia",
    ["тя"] = "tia",
    ["фя"] = "fia",
    ["хя"] = "chia",
    ["ця"] = "cia",
    ["чя"] = "czia",
    ["шя"] = "szia",
    ["щя"] = "szczia",
    -- koniec
    ["’"] = ""
}

local transliterations = {
    ["uk"] = transliterationUk
}

local function sanitizeText( text )
    local result = text
    result = string.gsub( result, "&#39;", "'" )
    result = string.gsub( result, "&quot;", "\"" )
    result = string.gsub( result, "&amp;", "&" )
    return result
end

function p.transliterate( frame )
    local language = frame.args[1]
    local text = sanitizeText( frame.args[2] )
    local transliteration = transliterations[ language ]
    
    if transliteration == nil then
        return "Błędny kod języka: " .. language
    end
    
    -- Dla znaków, które należy transkrybować inaczej na końcu wyrazu
    local endOfTextMarker = '~'
    local result = {}
    
    for word in mw.text.gsplit( text, ' ', true ) do
	    word = word .. endOfTextMarker
	    local inputLength = mw.ustring.len( word )
	    local currentPos = 1
	    local partialResult = ''
	    local maxSeqLength = 1
	    
	    -- Wyznacz najdłuższą sekwencję w języku wejściowym
	    for seq, _ in pairs( transliteration ) do
	    	maxSeqLength = math.max( maxSeqLength, mw.ustring.len( seq ) )
	    end
	    
	    while currentPos <= inputLength do
	    	-- Zacznij od najdłuższej sekwencji, która jeszcze się zmieści
	    	local initialSeqLength = math.min( maxSeqLength, inputLength - currentPos + 1 )
	    	local textLower = mw.ustring.lower( word )
	    	
	    	-- Próbuj dopasować sekwencje od najdłuższej możliwej (czyli najszczegółowszej)
	    	for seqLength = initialSeqLength, 1, -1 do
	    		local unTrl = mw.ustring.sub( textLower, currentPos, currentPos + seqLength - 1 )
	    		local trl = transliteration[ unTrl ] or commonTransliteration[ unTrl ]
	    		
	    		-- Jeśli dopasowano, dopisz do wyniku i przesuń wskaźnik pozycji
	    		if trl ~= nil then
	    			-- Jeśli w oryginale była wielka litera, zmień pierwszą literę wyniku na wielką
	    			local firstChar = mw.ustring.sub( word, currentPos, currentPos )
	    			if firstChar ~= mw.ustring.lower( firstChar ) then
	    				local firstTrl = mw.ustring.sub( trl, 1, 1 )
	    				trl = mw.ustring.upper( firstTrl ) .. mw.ustring.sub( trl, 2 )
	    			end
	    			
	    			partialResult = partialResult .. trl
	    			currentPos = currentPos + seqLength
	    			break
	    		end
	    		
	    		-- Jeśli nie dopasowano, zwróć błąd tylko przy sekwencji długości 1 (nie ma już ratunku)
	    		if trl == nil and seqLength == 1 then
	    			return "Nieprawidłowy znak " .. unTrl .. " dla języka o kodzie " .. language .. "." .. (
	            		mw.title.getCurrentTitle():inNamespace( 0 ) and errcat or ''
	            	)
	    		end
	    	end
	    end
		
		if mw.ustring.sub( partialResult, -1 ) == endOfTextMarker then
			partialResult = mw.ustring.sub( partialResult, 1, -2 )
		end
		
		table.insert( result, partialResult )
    end
	
	return table.concat( result, ' ' )
end

return p