Módulo:generar-pron/arn
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