Implementează {{Transliterează}}. Expune și funcțiile transliterate și isTransliterationSupported pentru alte module.

Funcții expuse

Funcție Argumente Comportament
transliterate
  • text - textul de transliterat, scris în alfabetul nativ al limbii respective
  • codul limbii
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ă

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