Модул:es-pronunc
Документацију овог модула можете да направите на страници Модул:es-pronunc/док
local export = {}
-- ɟ and ʃ are used internally to represent [ʝ⁓ɟ͡ʝ] and [t͡ʃ]
function export.show(word,LatinAmerica,phonetic,do_debug)
local debug = {}
if type(word) == 'table' then
do_debug = word.args[4]
word = word.args[1]
end
local orig_word = word
word = mw.ustring.lower(word or mw.title.getCurrentTitle().text)
word = mw.ustring.gsub(word,"[^abcdefghijklmnopqrstuvwxyzáéíóúüñ.]","")
table.insert(debug,word)
local V = "[aeiouáéíóú]" -- vowel
local C = "[^aeiouáéíóú.]" -- consonant
--determining whether "y" is a consonant or a vowel + diphthongs, "-mente" suffix
word = mw.ustring.gsub(word,"y(" .. C .. ")","i%1")
word = mw.ustring.gsub(word,"y(" .. V .. ")","ɟ%1") -- not the real sound
word = mw.ustring.gsub(word,"hi(" .. V .. ")","ɟ%1")
word = mw.ustring.gsub(word,"y$","ï")
word = mw.ustring.gsub(word,"mente$","ménte")
--x
word = mw.ustring.gsub(word,"x","ks")
--"c" & "g" before "i" and "e" and all that stuff
word = mw.ustring.gsub(word,"c([ieíé])",(LatinAmerica and 's' or 'θ') .. "%1")
word = mw.ustring.gsub(word,"gü([ieíé])","ɡw%1")
word = mw.ustring.gsub(word,"ü","")
word = mw.ustring.gsub(word,"gu([ieíé])","ɡ%1")
word = mw.ustring.gsub(word,"g([ieíé])","x%1")
table.insert(debug,word)
--alphabet-to-phoneme
word = mw.ustring.gsub(word,"qu","c")
word = mw.ustring.gsub(word,"ch","ʃ") --not the real sound
word = mw.ustring.gsub(word,'[cgjñrvy]',
--['g']='ɡ': U+0067 LATIN SMALL LETTER G → U+0261 LATIN SMALL LETTER SCRIPT G
{['c']='k', ['g']='ɡ', ['j']='x', ['ñ']='ɲ', ['r']='ɾ', ['v']='b' })
-- trill in #r, lr, nr, rr
local match_count = 0
word = mw.ustring.gsub(
word,
'(.?)ɾ(.?)',
function (before, after)
match_count = match_count + 1
-- mw.log(word, before, after)
if match_count == 1 and before == '' or before == 'l' or before == 'n'
or after ~= '' and ('bdfɡklʎmnɲpstxzʃɟ'):match(after) then
return before .. 'r' .. after
elseif before == 'ɾ' then
return 'r' .. after
elseif after == 'ɾ' then
return before .. 'r'
end
end)
word = mw.ustring.gsub(word,'n([bm])','m%1')
word = mw.ustring.gsub(word,'ll',(LatinAmerica and 'ɟ' or 'ʎ'))
word = mw.ustring.gsub(word,'z',(LatinAmerica and 'z' or 'θ')) -- not the real LatAm sound
table.insert(debug,word)
--syllable division
for _ = 1, 2 do
word = mw.ustring.gsub(word,"(" .. V .. ")(" .. C .. ")(" .. V .. ")","%1.%2%3")
end
for _ = 1, 2 do
word = mw.ustring.gsub(word,"(" .. V .. ")(" .. C .. ")(" .. C .. ")(" .. V .. ")","%1%2.%3%4")
end
for _ = 1, 2 do
word = mw.ustring.gsub(word,"(" .. V .. ")(" .. C .. ")(" .. C .. ")(" .. C .. ")(" .. V .. ")","%1%2.%3%4%5")
end
word = mw.ustring.gsub(word,"([pbktdɡ])%.([lɾ])",".%1%2")
word = mw.ustring.gsub(word,"(" .. C .. ")%.s(" .. C .. ")","%1s.%2")
word = mw.ustring.gsub(word,"([aeoáéíóú])([aeoáéíóú])","%1.%2")
word = mw.ustring.gsub(word,"([ií])([ií])","%1.%2")
word = mw.ustring.gsub(word,"([uú])([uú])","%1.%2")
table.insert(debug,word)
--diphthongs
word = mw.ustring.gsub(word,'ih?([aeouáéóú])','j%1')
word = mw.ustring.gsub(word,'uh?([aeioáéíó])','w%1')
table.insert(debug,word)
--accentuation
local syllables = mw.text.split(word,"%.")
if mw.ustring.find(word,"[áéíóú]") then
for i=1,#syllables do
if mw.ustring.find(syllables[i],"[áéíóú]") then syllables[i] = "ˈ"..syllables[i] end
end
else
if mw.ustring.find(word,"[^aeiouns]$") then
syllables[#syllables] = "ˈ"..syllables[#syllables]
else
if #syllables > 1 then syllables[#syllables-1] = "ˈ"..syllables[#syllables-1] end
end
end
table.insert(debug,word)
--syllables nasalized if ending with "n", voiceless consonants in syllable-final position to voiced
local remove_accent = {['á']='a', ['é']='e', ['í']='i', ['ó']='o', ['ú']='u'}
local nasalize = {['a']='ã',['e']='ẽ',['i']='ĩ',['o']='õ',['u']='ũ'}
for i=1,#syllables do
syllables[i] = mw.ustring.gsub(syllables[i],'[áéíóú]',remove_accent)
if phonetic and mw.ustring.find(syllables[i],'[mnɲ]' .. C .. '?$') then
syllables[i] = mw.ustring.gsub(syllables[i],'([aeiou])',nasalize)
end
syllables[i] = mw.ustring.gsub(syllables[i],'[ptk]$',{['p']='b',['t']='d',['k']='ɡ'})
end
word = table.concat(syllables)
--real sound of LatAm Z
word = mw.ustring.gsub(word,'z','s')
--secondary stress
word = mw.ustring.gsub(word,'ˈ(.+)ˈ','ˌ%1ˈ')
word = mw.ustring.gsub(word,'ˈ(.+)ˌ','ˌ%1ˌ')
word = mw.ustring.gsub(word,'ˌ(.+)ˈ(.+)ˈ','ˌ%1ˌ%2ˈ')
--phonetic transcription
if phonetic then
--θ, s, f before voiced consonants
local voiced = 'mnɲbdɟɡʎ'
local r = 'ɾr'
local tovoiced = {
['θ'] = 'θ̬',
['s'] = 'z',
['f'] = 'v',
}
local function voice(sound, following)
return tovoiced[sound]..following
end
word = mw.ustring.gsub(word,'([θs])([ˈˌ]?['..voiced..r..'])',voice)
word = mw.ustring.gsub(word,'(f)([ˈˌ]?['..voiced..'])',voice)
local stop_to_fricative = {['b']='β',['d']='ð',['ɟ']='ʝ',['ɡ']='ɣ'}
local fricative_to_stop = {['β']='b',['ð']='d',['ʝ']='ɟ',['ɣ']='ɡ',}
--lots of allophones going on
word = mw.ustring.gsub(word,'[bdɟɡ]',stop_to_fricative)
word = mw.ustring.gsub(
word,
'(.?)([ˈˌ]?)([βðɣʝ])',
function (before, stress, fricative)
-- mw.log(orig_word, before, stress, fricative)
-- '.?' matches stress if there's no character before the stress, because it's greedy.
if before == '' or before == 'ˈ' or before == 'ˌ'
or (fricative == 'ɣ' or fricative == 'β') and ('mnɲ'):find(before)
or ('lʎmnɲ'):find(before) then -- fricative is 'ð' or 'ʝ'
return before .. stress .. fricative_to_stop[fricative]
end -- else no change
end)
word = mw.ustring.gsub(word,'[td]',{['t']='t̪',['d']='d̪'})
--nasal assimilation before consonants
local labiodental, dentialveolar, dental, alveolopalatal, palatal, velar =
'ɱ', 'n̪', 'n̟', 'nʲ', 'ɲ', 'ŋ'
local nasal_assimilation = {
['f'] = labiodental,
['t'] = dentialveolar, ['d'] = dentialveolar,
['θ'] = dental,
['ʃ'] = alveolopalatal,
['ɟ'] = palatal, ['ʎ'] = palatal,
['k'] = velar, ['x'] = velar, ['ɡ'] = velar,
}
word = mw.ustring.gsub(
word,
'n([ˈˌ]?)(.)',
function (stress, following)
return (nasal_assimilation[following] or 'n') .. stress .. following
end)
--lateral assimilation before consonants
word = mw.ustring.gsub(
word,
'l([ˈˌ]?)(.)',
function (stress, following)
local l = 'l'
if following == 't' or following == 'd' then -- dentialveolar
l = 'l̪'
elseif following == 'θ' then -- dental
l = 'l̟'
elseif following == 'ʃ' then -- alveolopalatal
l = 'lʲ'
end
return l .. stress .. following
end)
--semivowels
word = mw.ustring.gsub(word,'([aeouãẽõũ][iïĩ])','%1̯')
word = mw.ustring.gsub(word,'([aeioãẽĩõ][uũ])','%1̯')
end
table.insert(debug,word)
word = mw.ustring.gsub(word,'h','') --silent "h"
word = mw.ustring.gsub(word,'ʃ','t͡ʃ') --fake "ch" to real "ch"
word = mw.ustring.gsub(word,'ɟ','ɟ͡ʝ') --fake "y" to real "y"
word = mw.ustring.gsub(word,'ï','i') --fake "y$" to real "y$"
if do_debug == 'yes' then
return word .. table.concat(debug,"")
else
return word
end
end
function export.LatinAmerica(frame)
return export.show(frame,true)
end
function export.phonetic(frame)
return export.show(frame,false,true)
end
function export.phoneticLatinAmerica(frame)
return export.show(frame,true,true)
end
return export