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