Przejdź do zawartości

Moduł:transkrypcja-bg/PWN

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

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

local p = {}

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

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

local transliterationBg = {
    ["а"] = "a",
    ["б"] = "b",
    ["в"] = "w",
    ["г"] = "g",
    ["д"] = "d",
    -- Е > E
    ["бе"] = "be",
    ["ве"] = "we",
    ["ге"] = "ge",
    ["де"] = "de",
    ["же"] = "że",
    ["зе"] = "ze",
    ["йе"] = "je",
    ["ке"] = "ke",
    ["ле"] = "le",
    ["ме"] = "me",
    ["не"] = "ne",
    ["пе"] = "pe",
    ["ре"] = "re",
    ["се"] = "se",
    ["те"] = "te",
    ["фе"] = "fe",
    ["хе"] = "che",
    ["це"] = "ce",
    ["че"] = "cze",
    ["ше"] = "sze",
    ["ще"] = "szte",
    -- koniec
    ["е"] = "e",
    ["ж"] = "ż",
    ["з"] = "z",
    ["и"] = "i",
    ["й"] = "j",
    ["к"] = "k",
    -- Л > L
    ["ле"] = "le",
    ["ли"] = "li",
    ["ля"] = "lja",
    ["лю"] = "lju",
    -- koniec
    -- Л > Ł
    ["лб"] = "łb",
    ["лв"] = "łw",
    ["лг"] = "łg",
    ["лд"] = "łd",
    ["лж"] = "łż",
    ["лз"] = "łz",
    ["лй"] = "łj",
    ["лк"] = "łk",
    ["лм"] = "łm",
    ["лн"] = "łn",
    ["лп"] = "łp",
    ["лр"] = "łr",
    ["лс"] = "łs",
    ["лт"] = "łt",
    ["лф"] = "łf",
    ["лх"] = "łch",
    ["лц"] = "łc",
    ["лч"] = "łcz",
    ["лш"] = "łsz",
    ["лщ"] = "łszt",
    ["ла"] = "ła",
    ["ло"] = "ło",
    ["лу"] = "łu",
    ["л~"] = "ł", -- tylko na końcu wyrazu
    -- koniec
    ["м"] = "m",
    ["н"] = "n",
    ["о"] = "o",
    ["п"] = "p",
    ["р"] = "r",
    ["с"] = "s",
    ["т"] = "t",
    ["у"] = "u",
    ["ф"] = "f",
    ["х"] = "ch",
    ["ц"] = "c",
    ["ч"] = "cz",
    ["ш"] = "sz",
    ["щ"] = "szt",
    ["ъ"] = "y",
    ["ь"] = "´",
    ["ю"] = "ju",
    ["я"] = "ja",
}

local transliterations = {
    ["bg"] = transliterationBg
}

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