Módulo:generar-pron/arn

De Wikcionario, el diccionario libre

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

-- PRONUNCIACION PARA EL MAPUCHE
-- Autores: Tmagc & Lin Linao

-- ambiguedades que hay que resolver: debo detectar el tipo de alfabeto ya que
-- "g": es ɣ en el unificado o ŋ en los otros dos
-- "s": si es el Raguileo, puede ser una "s" o una "sh"
-- "t": si es el Raguileo, puede ser normal o interdental

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 strlower = m_str.lower
local strstrip = m_str.strip
local strsplit = m_str.split
local strfind = m_str.find
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 VOCAL = "[aeiouüvAEIOUÜV]"
local CONS = "[bcdfghjklmnñpqrstwxyzBCDFGHJKLMNÑPQRSTWXYZ]"

-- IPA
local VOCAL_IPA = "[aeiouɨ]"

-- alfabetos
local AMU = 1
local RAGUILEO = 2
local AZUMCHEFE = 3
local NO_AMU = 4
local NO_RAGUILEO = 5
local NO_AZUMCHEFE = 6

local busqueda_alfabeto = {
	[AMU] = {"d", "ḻ", "ṉ", "ng", "ṯ", "tr"},
	[RAGUILEO] = {"c[^h]", "v", "b", "j", "[^clns]h", "[^t]x"},
	[AZUMCHEFE] = {"lh", "nh", "t'", "tx"},
	[NO_AMU] = {"z", "q"},
	[NO_RAGUILEO] = {"ü", "ch", "ll", "sh"},
	[NO_AZUMCHEFE] = {}
}

local mapeo_fono_1 = {
	["a"] = "a",
	["c"] = "t͡ʃ",
	["d"] = "θ",
	["z"] = "θ",
	["e"] = "e",
	["f"] = "f",
	["q"] = "ɣ",
	["i"] = "i",
	["k"] = "k",
	["l"] = "l",
	["ḻ"] = "l̪",
	["b"] = "l̪",
	["j"] = "ʎ",
	["m"] = "m",
	["n"] = "n",
	["ṉ"] = "n̪",
	["h"] = "n̪",
	["ñ"] = "ɲ",
	["o"] = "o",
	["p"] = "p",
	["r"] = "ɻ",
	["s"] = "s",
	["t"] = "t",
	["ṯ"] = "t̪",
	["x"] = "ʈ͡ʂ",
	["u"] = "u",
	["ü"] = "ɨ",
	["v"] = "ɨ",
	["w"] = "w",
}

local mapeo_fono_1_bis = { --aislo este grupo para que no me convierta la j de nuevo a ʎ
	["y"] = "j",
}

local mapeo_fono_1_amu = {
	["g"] = "ɣ",
}

local mapeo_fono_1_no_amu = {
	["g"] = "ŋ",
}

local mapeo_fono_2 = {
	["ch"] = "t͡ʃ",
	["lh"] = "l̪",
	["ll"] = "ʎ",
	["nh"] = "n̪",
	["ng"] = "ŋ",
	["sh"] = "ʃ",
	["tr"] = "ʈ͡ʂ",
	["tx"] = "ʈ͡ʂ",
	["t'"] = "t̪",
}

local mapeo_fone_1_periferico = {
    ["θ"] = "ð",
    ["f"] = "v",
}

local mapeo_fone_1_chesungun = {
    ["t͡ʃ"] = "t͡s",
    ["θ"] = "s",
    ["ɻ"] = "ʂ",
}

local mapeo_fone_2 = {
    ["aa"] = "aja",
    ["ae"] = "aɣe",
	["#i"] = "#ʲi",
	["#u"] = "#ʷu",
	["#ü"] = "#ˠɨ",
}

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 = 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 predecir_alfabeto(t)
	local detectado = {false, false, false, false, false, false}

	for i, patrones in ipairs(busqueda_alfabeto) do
		for _,p in ipairs(patrones) do
			if strfind(t, p) then
				detectado[i] = true
				break
			end
		end
	end

	if detectado[NO_AMU] and detectado[NO_RAGUILEO] then
		detectado[AZUMCHEFE] = true
	end

	if detectado[NO_RAGUILEO] and detectado[NO_AZUMCHEFE] then
		detectado[AMU] = true
	end

	if detectado[NO_AMU] and detectado[NO_AZUMCHEFE] then
		detectado[RAGUILEO] = true
	end

	if (detectado[AMU] and detectado[RAGUILEO])
	or (detectado[RAGUILEO] and detectado[AZUMCHEFE])
	or (detectado[AMU] and detectado[AZUMCHEFE])
	then
		error("La grafía no es estándar")
	end

	for i = 1,6 do
		if detectado[i] then
			return i
		end
	end

	return nil
end

local function separar_en_silabas(p)
	
	p = divsil .. p .. divsil

	-- Primero: las sílabas son todas del estilo CVC, el punto es que no puede haber dos vocales seguidas o dos consonantes seguidas en una misma sílaba
	p = strsubrep(p, "(" .. VOCAL .. CONS .. "?" .. ")(" .. CONS .. "+" .. VOCAL .. CONS .. "?" .. ")", "%1"..divsil.."%2")
	p = strsubrep(p, "(" .. VOCAL .. ")(" .. VOCAL .. ")", "%1"..divsil.."%2")

	--Segundo, eximo de la regla anterior los digrafos
	for cc, fono in pairs(mapeo_fono_2) do
		local a, b = cc:sub(1,1), cc:sub(2,2)
		local A, B = a:upper(), b:upper()
		p = strsubrep(p, "(["..a..A.."])"..divsil.."(["..b..B.."]"..VOCAL..")", divsil.."%1%2")
		p = strsubrep(p, "(["..a..A.."]["..b..B.."])"..divsil.."("..VOCAL..")", divsil.."%1%2")
		p = strsubrep(p, "(["..a..A.."])"..divsil.."(["..b..B.."])("..CONS..")", "%1%2"..divsil.."%3")
	end
	
		-- correcciones finales
	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.." ]+")

	return p
end

local function generar_pron(texto, fone)
	texto = normalizar(texto)
	local alfabeto = predecir_alfabeto(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)
            p = strsubn(p, divsil, ".")

            p = "#" .. p .. "#"

	    	-- mapeo fonológico
	    	for a,b in pairs(mapeo_fono_2) do
	    		p = strsubn(p, a, b)
	    	end
	    	p = strsubn(p, ".", mapeo_fono_1)
	    	p = strsubn(p, ".", mapeo_fono_1_bis)

            if alfabeto and (alfabeto == AMU or alfabeto == NO_RAGUILEO or alfabeto ~= NO_AZUMCHEFE) then
                p = strsubn(p, ".", mapeo_fono_1_amu)
            else
                p = strsubn(p, ".", mapeo_fono_1_no_amu)
            end

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

    local res = concat(convertido, " | ")

    if not fone then
        res = strsubn(res, "#", "")
        res = strhtml(res)
        return {{"pronunciación"}}, {{res}}
    end

    local central = res
    
    for a,b in pairs(mapeo_fone_2) do
    	central = strsubn(central, a, b)
    end
    
    central = strsubn(central, "#", "")
    central = strhtml(central)

    local periferico = strsubn(central, ".", mapeo_fone_1_periferico)
    local chesungun = strsubn(central, ".", mapeo_fone_1_chesungun)

    return {{"central"}, {"periférico"}, {"chesüngun"}}, {{central}, {periferico}, {chesungun}}
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 pron, fone = generar_pron(args["ayuda"][j], true)
			for i,_ in ipairs(fone) do
				insert(args["pron"], pron[i])
				insert(args["fone"], fone[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(args["ayuda"][1])
				args["d"][1] = strsubn(aux, divsil, "-")
			end
		end	
		
        -- sin rimas porque no hay acentuación definida
		--local rim = args["fono"][1][1]
		--rim = strsubn(rim, "^.*ˈ(.-)$", "%1")
		--args["rima"] = strsubn(rim, ".-".."([aãeẽiĩoõuũɨɨ̃].*"..")".."$", "%1")

	end

	return args

end
 
return export