Módulo:generar-pron/alc

De Wikcionario, el diccionario libre

La documentación para este módulo puede ser creada en Módulo:generar-pron/alc/doc

-- PRONUNCIACION PARA EL KAWESQAR
-- Autores: Tmagc 

local export = {}

local insert = table.insert
local concat = table.concat

local m_str = require("Módulo:String")

local u = m_str.char
local strsubn = m_str.gsub
local strsubb = m_str.gsubb
local strsubrep = m_str.gsub_rep
local substr = m_str.sub
local strfind = m_str.find
local strlower = m_str.lower
local strstrip = m_str.strip
local strsplit = m_str.split
local strfind = m_str.find
local strnfd = m_str.toNFD
local strnfc = m_str.toNFC
local strhtml = m_str.encode_html

--CONVENCION: mayúscula para patrones encerrados entre corchetes, minúscula para todo lo demás
local ac_primario = u(0x02C8)
local ac_secundario = u(0x02CC)

local acentos_ipa = ac_primario..ac_secundario
local ACENTOS_IPA = "[" .. acentos_ipa .. "]"

local divsil = u(0xFFF0)
local sepsil = "%-." .. divsil
local SEPARADORES_SILABICOS = "[" .. sepsil .. "]"
local SALVO_SEPARADORES_SILABICOS = "[^" .. sepsil .. "]"
local seppal = "# "
local separador_excepto_palabras = acentos_ipa .. sepsil
local separador = separador_excepto_palabras .. seppal
local SEPARADOR = "[" .. separador .. "]"

local PUNTUACION = "[%(%)%[%]%{%}¡!¿?.,;:–—]"
local PUNTUACION_EXTRA = "[%(%)%[%]%{%}¡!¿?.,;:–—\"“”„‟‘’«»»«‹››‹]"

-- grafía
local agudo = u(0x301)
local grave = u(0x300)
local breve = u(0x30c)
local TILDE = "["..agudo..grave.."]"
local DIACR_NO_TILDE = "["..breve.."]"

local apos = "'ʼꞌꞋ"
local vocal = "aæeiouAÆEIOU"
local cons = "jwčcfhklmnpqrstxJWCČFHKLMNPQRSTXṕṔţŢķĶćĆċĊ"
local cons_no_eyectiva = "jwčcfhklmnpqrstxJWCČFHKLMNPQRSTX"
local parada_o_fricativa = "cfhkpqstCFHKPQST"
local eyectiva = "ṕṔţŢķĶćĆċĊ"

local codificar_eyectiva = {
	["p"] = "ṕ",
	["P"] = "Ṕ",
	["t"] = "ţ",
	["T"] = "Ţ",
	["k"] = "ķ",
	["K"] = "Ķ",
	["c"] = "ć",
	["C"] = "Ć",
	["č"] = "ċ",
	["Č"] = "Ċ"
}

local recuperar_eyectiva = {}
for k,v in pairs(codificar_eyectiva) do
	recuperar_eyectiva[v] = k.."ʼ"
end

local APOS = "["..apos.."]"
local VOCAL = "["..vocal.."]"..TILDE.."?"
--local CONS = "["..cons.."]"..APOS.."?" -- no me deja hacer la separación en sílabas si hago esto
local CONS = "["..cons.."]" -- esto sí va a funcionar con el Regex, para más comodidad codifico los apóstrofes (eyectivas) con letras especiales
local permitido = vocal..cons..apos..agudo..grave..separador.."|" --asumo que limpié la puntuación

local function normalizar(texto)
	texto = strlower(texto)
	texto = strsubrep(texto, PUNTUACION, " | ") -- convierto lo que delimite fragmentos a los IPA foot boundaries |
	texto = strsubrep(texto, PUNTUACION_EXTRA, "") -- elimino la puntuación restante que haya quedado
	texto = strsubrep(texto, "[%-‐]", " ") --los guiones pasan a ser espacios (austro-húngaro, franco-italiano)
	   
	texto = strnfd(texto)
    texto = strsubrep(texto, "("..TILDE..")("..DIACR_NO_TILDE..")", "%2%1")
    texto = strsubn(texto, "."..DIACR_NO_TILDE, {
		["c" .. breve] = "č",
		["C" .. breve] = "Č",
    })
	
	if strfind(texto, "[^"..permitido.."]") then
		error("caracteres no permitidos en el texto")
	end
	
	if strfind(texto, "[^pPtTkKcCčČ]"..APOS) then
		error("Sólo los siguientes caracteres pueden tener apóstrofe: p, t, k, c, č")	
	end

    texto = strsubrep(texto, "%s*|%s*|%s*", " | ") --finalmente, elimino las barras y espacios de más
    texto = strsubrep(texto, "%s+", " ")
	texto = strstrip(texto, "[%s|]+")
	
	return texto
end

local function separar_en_silabas(p)
	p = strsubn(p, "("..CONS..")"..APOS, codificar_eyectiva)
	p = divsil .. p .. divsil

	-- Primero: asumo que es como el mapuche, no pueden haber dos consonantes o vocales seguidas
	p = strsubrep(p, "(" .. VOCAL .. CONS .. "+)(" .. CONS .. VOCAL .. ")", "%1"..divsil.."%2")
    p = strsubrep(p, "(" .. VOCAL .. ")(".. CONS .. "+" .. VOCAL .. ")", "%1"..divsil.."%2")
	p = strsubrep(p, "(" .. VOCAL .. ")(" .. VOCAL .. ")", "%1"..divsil.."%2")
	
	-- Segundo, muevo a la sílaba anterior las eyectivas
	p = strsubrep(p, divsil.."(["..eyectiva.."])(["..vocal..cons.."])", "%1"..divsil.."%2")

	--Tercero, junto digrafos: doble r, las semivocales, y las líquidas (lr) cuando están al final (tl, tr, kl, kr, etc.)
	p = strsubrep(p, "([rR])"..divsil.."([rR]"..VOCAL..")", divsil.."%1%2")
	p = strsubrep(p, "([rR][rR])"..divsil.."("..VOCAL..")", divsil.."%1%2")
	p = strsubrep(p, "([rR])"..divsil.."([rR])("..CONS..")", "%1%2"..divsil.."%3")
	
	p = strsubrep(p, "(["..cons_no_eyectiva.."])"..divsil.."([jJwW]"..VOCAL..")", divsil.."%1%2")
	p = strsubrep(p, "(["..cons_no_eyectiva.."][jJwW])"..divsil.."("..VOCAL..")", divsil.."%1%2")
	
	p = strsubrep(p, "(["..parada_o_fricativa.."])"..divsil.."([rRlL]"..VOCAL..")", divsil.."%1%2")
	p = strsubrep(p, "(["..parada_o_fricativa.."][rRlL])"..divsil.."("..VOCAL..")", divsil.."%1%2")
	
	-- correcciones finales
	p = strsubn(p, "(["..eyectiva.."])", recuperar_eyectiva)
	
	p = strsubn(p, "["..divsil.."]+", divsil)
	p = strsubrep(p, SEPARADORES_SILABICOS.."("..CONS.."+)"..SEPARADORES_SILABICOS.."("..SALVO_SEPARADORES_SILABICOS.."-"..VOCAL..")", divsil.."%1%2")
	p = strsubrep(p, SEPARADORES_SILABICOS.."("..SALVO_SEPARADORES_SILABICOS.."-)"..SEPARADORES_SILABICOS.."("..CONS.."+)"..SEPARADORES_SILABICOS, divsil.."%1%2"..divsil)

	p = strsubn(p, "["..divsil.."]+", divsil)
	p = strstrip(p, "["..divsil.."%s]+")

	return p
end

local function generar_pron(texto)
	if strfind(texto, "[‘’]") then
		error("Por favor, utilice el caracter 0x2bc (ʼ) para el apóstrofe")	
	end

	texto = normalizar(texto)
	local convertido = {}
	local fragmentos = strsplit(texto, "%s*|%s*")

	for _,fragmento in ipairs(fragmentos) do
	    local palabras = strsplit(fragmento, "%s")
		local palabras_convertidas = {}
	    for _,p in ipairs(palabras) do
	    	p = separar_en_silabas(p)
	    	local sus1, sus2
            p, sus1 = strsubb(p, "^("..SALVO_SEPARADORES_SILABICOS.."-)"..TILDE, ac_primario.."%1")
            p, sus2 = strsubb(p, divsil.."("..SALVO_SEPARADORES_SILABICOS.."-)"..TILDE, ac_primario.."%1")
            if not sus1 and not sus2 then
	    	    p = strsubn(p, divsil.."("..SALVO_SEPARADORES_SILABICOS.."-)$", ac_primario.."%1")
            end
			p = strsubn(p, divsil, ".")
			
			p = strsubn(p, "č", "ʨ")
			p = strsubn(p, "r", "ɾ")
			p = strsubn(p, "ɾɾ", "r")

	    	insert(palabras_convertidas, p)
	    end
	    insert(convertido, concat(palabras_convertidas, " "))
	end

    local res = concat(convertido, " | ")
    return {{strhtml(res)}}
end

-- Punto de entrada externo, recibe el título de página y los argumentos de plantilla
function export.procesar_pron_args(titulo, args)
	if #args["ayuda"] < 1 then
		args["ayuda"][1] = titulo
	end

	if #args["fone"] < 1 and #args["fono"] < 1 then
		--local x = pron_abc[args["ayuda"][1]]
		--if x then
		--	args["tl"] = x
		--	args["ayuda"][1] = x
		--end
		local A = #args["ayuda"]
		local j = 1 -- indice de la ayuda
		local k = 1 -- cantidad de pronunciaciones insertadas (máximo 9)
		while k <= 9 and j <= A do
			local fono = generar_pron(args["ayuda"][j], true)
			for i,_ in ipairs(fono) do
				insert(args["fono"], fono[i])
				k = k + 1
				if k > 9 then
					break
				end
			end
			j = j + 1
		end
		
		local tiene_espacios = strfind(titulo, " ")
		
		if not tiene_espacios then
			if not args["d"][1] then
				local aux = separar_en_silabas(normalizar(args["ayuda"][1]))
				args["d"][1] = strsubn(aux, divsil, "-")
			end
		end
		
		if args["fono"][1] and args["fono"][1][1] then
			local rim = args["fono"][1][1]
			rim = strsubn(rim, "^.*ˈ(.-)$", "%1")
			args["rima"] = strsubn(rim, ".-".."(["..vocal.."].*"..")".."$", "%1")
		end
	end

	return args
end
 
return export