Moduł:transkrypcja-hy/polska

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

local p = {}

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

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

local transliterationHy = {
	["ա"] = "a",
    ["բ"] = "b",
    ["գ"] = "g",
    ["դ"] = "d",
    ["~ե"] = "je", -- tylko na początku
    ["ե"] = "e",
    ["զ"] = "z",
    ["է"] = "e",
    ["ը"] = "y",
    ["թ"] = "t",
    ["ժ"] = "ż",
    ["ի"] = "i",
    ["լ"] = "l",
    ["խ"] = "ch",
    ["ծ"] = "c",
    ["կ"] = "k",
    ["հ"] = "h",
    ["ձ"] = "dz",
    ["ղ"] = "gh",
    -- Ղ > CH
    ["ղբ"] = "chp",
    ["ղգ"] = "chl",
    ["ղդ"] = "cht",
    ["ղձ"] = "chc",
    ["ղջ"] = "chcz",
    -- koniec
    ["ճ"] = "cz",
    ["մ"] = "m",
    ["յ"] = "j",
    ["ն"] = "n",
    ["շ"] = "sz",
    ["~ո"] = "wo", -- tylko na początku
    ["ո"] = "o",
    ["չ"] = "cz",
    ["պ"] = "p",
    ["ջ"] = "dż",
    ["ռ"] = "r", -- do zrobienia: rr między samogłoskami
    ["ս"] = "s",
    ["վ"] = "w",
    ["տ"] = "t",
    ["ր"] = "r",
    ["ց"] = "c",
    ["ՈՒ"] = "U",
    ["ու"] = "u",
    ["փ"] = "p",
    ["ք"] = "k",
    ["օ"] = "o",
    ["ֆ"] = "f",
}

local transliterations = {
    ["hy"] = transliterationHy
}

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

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 początku lub końcu wyrazu
    local boundaryMarker = '~'
    local result = {}
    
    for word in mw.text.gsplit( text, ' ', true ) do
	    word = boundaryMarker .. word .. boundaryMarker
	    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, 1 ) == boundaryMarker then
	    	partialResult = mw.ustring.sub( partialResult, 2 )
	    end
		
		if mw.ustring.sub( partialResult, -1 ) == boundaryMarker then
			partialResult = mw.ustring.sub( partialResult, 1, -2 )
		end
		
		table.insert( result, partialResult )
    end
	
	return table.concat( result, ' ' )
end

return p