Módulo:generar-pron/cub
La documentación para este módulo puede ser creada en Módulo:generar-pron/cub/doc
-- Trascripciones fonológicas para Cubeo
-- Autor original: Marquetto
-- Traducido a Lua por Tmagc
local export = {}
local insert = table.insert
local concat = table.concat
local sort = table.sort
local m_str = require("Módulo:String")
local u = m_str.char
local strmatchit = m_str.gmatch
local strlen = m_str.ulen
local substr = m_str.sub
local strfind = m_str.find
local strsubn = m_str.gsub
local strsubrep = m_str.gsub_rep
local strsplit = m_str.split
local strexplode = m_str.explode_utf8
local strlower = m_str.lower
local strstrip = m_str.strip
local strnfd = m_str.toNFD
local strnfc = m_str.toNFC
local strhtml = m_str.encode_html
-- sustitución descartando todo salvo el string retornado
local function strsub(text, pattern, repl, n)
local t, _ = strsubn(text, pattern, repl, n)
return t
end
local AC = u(0x0301) -- acute = ́
local TILDE = u(0x0303) -- tilde = ̃
local ACCENT_C = "["..AC..TILDE.."]"
local PUNTUACION = "[%(%)%[%]%{%}¡!¿?.,;:–—]"
local PUNTUACION_EXTRA = "[%(%)%[%]%{%}¡!¿?.,;:–—\"“”„‟‘’«»»«‹››‹'´]"
local vowels = "aeiɨou" -- faltarían las tildes y las virgulillas --> las tratamos por separado
local function aislar_diacriticos(text)
text = strnfd(text)
text = strsubn(text, "." .. TILDE , {
["n" .. TILDE] = "ñ",
["N" .. TILDE] = "Ñ",
})
return text
end
local function reorder_accents(text)
local function reorder_accent_string(accentstr)
local accents = strexplode(accentstr)
local accent_order = {
[TILDE] = 1,
[AC] = 2,
}
sort(accents, function(ac1, ac2)
return accent_order[ac1] < accent_order[ac2]
end)
return concat(accents)
end
text = strsub(text, "(" .. ACCENT_C .. "+)", reorder_accent_string)
-- Remove duplicate accents.
text = strsubrep(text, "(" .. ACCENT_C .. ")%1", "%1")
return text
end
local revert_ortography_2 = {
["ch"] = "t͡ʃ",
["qu"] = "k",
}
local revert_ortography_1 = {
["s"] = "t͡ʃ",
["v"] = "w",
["c"] = "k",
["j"] = "h",
["ʉ"] = "ɨ",
["r"] = "ɾ"
}
local revert_ortography_0 = { --aislamos esto para que no vuelva a sustituir la j por x
["y"] = "j",
}
local function normalizar(texto)
texto = strlower(texto)
texto = aislar_diacriticos(texto)
texto = reorder_accents(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
-- Syllabification
local function syllabification(word)
local syllables = {}
for m in strmatchit(word, "[".."^"..vowels.."]".."*".."["..vowels.."]"..TILDE.."?"..AC.."?") do
insert(syllables, m)
end
if #syllables == 0 then
syllables = {word}
end
return syllables
end
-- Adding primary stress
local function give_accent(word)
local syllables = syllabification(word)
local L = #syllables
local insert_position = -1
local ignore = false
if L == 1 then
insert_position = 1
else
for i=1, L do
if not ignore then
if strfind(syllables[i], AC) then
insert_position = i
ignore = true
else
insert_position = 2
end
end
syllables[i] = strsub(syllables[i], AC, "")
end
end
insert(syllables, insert_position, "ˈ")
return concat(syllables)
end
-- Nasalization
local function nasalize_vowels(word)
local syllables = syllabification(word)
local L = #syllables
local NASAL_CONSONANT = "[mñn]"
local remove_nasal = {
["m"] = "b",
["ñ"] = "j",
["n"] = "d"
}
for i=1, L do
if strfind(syllables[i], NASAL_CONSONANT) then
syllables[i] = strsub(syllables[i], "["..vowels.."]", "%0"..TILDE)
end
syllables[i] = strsub(syllables[i], NASAL_CONSONANT, remove_nasal)
end
return strsub(concat(syllables, "."), ".ˈ", "ˈ")
end
local function generar_pron(t)
t = normalizar(t)
local convertido = {}
local fragmentos = strsplit(t, "%s*|%s*")
for _,fragmento in ipairs(fragmentos) do
local palabras = strsplit(fragmento, "%s")
local palabras_convertidas = {}
for _,p in ipairs(palabras) do
for a, b in pairs(revert_ortography_2) do
p = strsub(p, a, b)
end
for a, b in pairs(revert_ortography_1) do
p = strsub(p, a, b)
end
for a, b in pairs(revert_ortography_0) do
p = strsub(p, a, b)
end
p = give_accent(p)
p = nasalize_vowels(p)
insert(palabras_convertidas, p)
end
insert(convertido, concat(palabras_convertidas, " "))
end
return {{strhtml(strnfc(concat(convertido, " | ")))}}
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])
for i,_ in ipairs(fono) do
table.insert(args["fono"], fono[i])
k = k + 1
if k > 9 then
break
end
end
j = j + 1
end
local rim = args["fono"][1][1]
rim = aislar_diacriticos(rim)
rim = strsub(rim, "^.*ˈ(.-)$", "%1")
rim = strsub(rim, ".-".."(["..vowels.."].*"..")".."$", "%1")
args["rima"][1] = strnfc(rim)
end
return args
end
return export