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, "'", "'" )
result = string.gsub( result, """, "\"" )
result = string.gsub( result, "&", "&" )
return result
end
local function sanitizeText( text )
local result = text
result = string.gsub( result, "'", "'" )
result = string.gsub( result, """, "\"" )
result = string.gsub( result, "&", "&" )
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