Modul:Transliteration
Aceasta este pagina de documentație pentru Modul:Transliteration. Pagina descrie modul de folosire al formatului și conține categoriile de care acesta aparține, precum și orice altceva ce nu face parte din formatul propriu-zis. Ea poate fi editată modificând pagina Modul:Transliteration/doc |
Implementează {{Transliterează}}. Expune și funcțiile transliterate și isTransliterationSupported pentru alte module.
Funcții expuse
Funcție | Argumente | Comportament |
---|---|---|
transliterate |
|
Dacă limba este suportată și textul este scris în alfabetul nativ al acelei limbi, returnează transliterarea lui în alfabet latin. Dacă limba nu este suportată, aruncă o eroare. Simbolurile din text care nu sunt din alfabetul respectivei limbi sunt păstrate așa cum sunt. Disponibilă pentru formate prin intermediul funcției transliterateFromFrame |
isTransliterationSupported | codul limbii | Întoarce true dacă limba cu codul respectiv este suporatată. |
Extindere
Pentru a adăuga limbi suportate, modificați Modul:Transliteration/langdata și adăugați tabelului returnat un nou tabel care asociază fiecărei litere din alfabetul nativ al limbii de transliterat, o regulă de transliterare.
- Dacă regula de transliterare este un șir de caractere, atunci acel șir se consideră a fi cel în care se transformă litera în toate cazurile posibile.
- Dacă regula de transliterare este un tabel, atunci acel tabel trebuie să aibă următoarea structură:
- câmpul
def
reprezintă șirul implicit (default) în care se transformă litera - câmpul
ah
(ahead) care va mapa fiecărui caracter regula de transliterare corespunzătoare cazului în care litera de bază este precedată de această literă - câmpul
bh
(behind) care va mapa fiecărui caracter regula de transliterare corespunzătoare cazului în care litera de bază este urmată de această literă
- câmpul
Pentru a anula transliterarea literei anterioare, respectiv, pentru a preveni transliterarea literei următoare sau, se pot introduce simbolurile Unicode Erase to the left și, respectiv, Erase to the right. Ele vor fi procesate la finalul transliterării, și se pot introduce în Lua cu ajutorul secvențelor de octeți \226\140\171 respectiv \226\140\166.
local p = {}
local getArgs = require('Modul:Arguments').getArgs
local transliterationMaps = mw.loadData('Modul:Transliteration/langdata')
local function isTransliterationSupported(langCode)
if transliterationMaps[langCode] then return true end
return false
end
p.isTransliterationSupported = isTransliterationSupported
local function postProcess(str)
local chars = {}
local idx = 1
while idx <= mw.ustring.len(str) do
local crtChar = mw.ustring.sub(str, idx, idx)
if crtChar == '\226\140\166' then
idx = idx + 1
elseif crtChar == '\226\140\171' and #table > 1 then
table.remove(chars, #chars)
else
table.insert(chars, crtChar)
end
idx = idx + 1
end
return table.concat(chars)
end
local function applyConversionRule(conversionRule, crtChar, prevChar, nextChar)
if not conversionRule then
return nil
end
if type(conversionRule) == 'string' then
return conversionRule
end
if type(conversionRule) == 'table' then
return prevChar and conversionRule['bh'] and applyConversionRule(conversionRule['bh'][prevChar], crtChar, prevChar, nextChar)
or nextChar and conversionRule['ah'] and applyConversionRule(conversionRule['ah'][nextChar], crtChar, prevChar, nextChar)
or conversionRule['def']
end
return nil
end
local function transliterate(text, langCode)
if text == nil then return nil end
local map = transliterationMaps[langCode]
local lang = mw.language.new(langCode)
if not map then
error('Transliteration from language ' .. langCode .. ' not supported', 2)
end
local out = ''
for strIdx = 1,mw.ustring.len(text) do
local crtChar = mw.ustring.sub(text, strIdx, strIdx)
local prevChar = strIdx > 1 and lang:lc(mw.ustring.sub(text, strIdx - 1, strIdx - 1)) or ''
local nextChar = strIdx < mw.ustring.len(text) and lang:lc(mw.ustring.sub(text, strIdx + 1, strIdx + 1)) or ''
local convertedChar = applyConversionRule(map[crtChar], crtChar, prevChar, nextChar)
if not convertedChar then
local lcCrtChar = lang:lc(crtChar)
local ucConvertedChar = applyConversionRule(map[lcCrtChar], lcCrtChar, prevChar, nextChar)
convertedChar = ucConvertedChar and lang:ucfirst(ucConvertedChar)
end
out = out .. (convertedChar or crtChar)
end
return postProcess(out)
end
p.transliterate = transliterate
local function transliterateFromFrame(frame)
local args = getArgs(frame)
local text = args.text or args[1]
local lang = args.lang or args[2]
return transliterate(text, lang)
end
p.transliterateFromFrame = transliterateFromFrame
return p