Module:Io-IPA

Frae Wikipedia, the free beuk o knawledge
local export = {}

function export.show(word,alternative,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)
			
	--digraphs and such
	word = mw.ustring.gsub(word,"c","ɕ") --fixed later
	word = mw.ustring.gsub(word,"ɕh","θ") --fixed later
	word = mw.ustring.gsub(word,"gu([aeiou])",(alternative and 'ɡv%1' or 'ɡw%1'))
	word = mw.ustring.gsub(word,"j",(alternative and 'ɟ' or 'ʒ')) --fixed later
	word = mw.ustring.gsub(word,"qu([aeiou])",(alternative and 'kv%1' or 'kw%1'))
	word = mw.ustring.gsub(word,"sh","ʃ")
	word = mw.ustring.gsub(word,"x",(alternative and 'ɡz' or 'ks'))
	word = mw.ustring.gsub(word,"y","j")
	
    word = mw.ustring.gsub(word,"ez$",(alternative and 'es' or 'ez'))
	
	word = mw.ustring.gsub(word,'g','ɡ')

	table.insert(debug,word)
	
	--syllable division
	for _ = 1, 2 do
		word = mw.ustring.gsub(word,"([aeiouáéíóú])([^aeiouáéíóú.])([aeiouáéíóú])","%1.%2%3")
	end
	for _ = 1, 2 do
		word = mw.ustring.gsub(word,"([aeiouáéíóú])([^aeiouáéíóú.])([^aeiouáéíóú.])([aeiouáéíóú])","%1%2.%3%4")
	end
	for _ = 1, 2 do
		word = mw.ustring.gsub(word,"([aeiouáéíóú])([^aeiouáéíóú.])([^aeiouáéíóú.])([^aeiouáéíóú.])([aeiouáéíóú])","%1%2.%3%4%5")
	end
	word = mw.ustring.gsub(word,"([pbktdɡ])%.([lr])",".%1%2")
	word = mw.ustring.gsub(word,"([^aeiouáéíóú.])%.s([^aeiouáéíóú.])","%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,"([ae])u","%1w")
	
	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,"[^abcdefghijklmnopqstuvwxyz]$") then
			syllables[#syllables] = "ˈ"..syllables[#syllables]
		else
			if #syllables > 1 then syllables[#syllables-1] = "ˈ"..syllables[#syllables-1] end
		end
	end

	table.insert(debug,word)
	
	local remove_accent = {['á']='a', ['é']='e', ['í']='i', ['ó']='o', ['ú']='u'}
	for i=1,#syllables do
		syllables[i] = mw.ustring.gsub(syllables[i],'[áéíóú]',remove_accent)
	end
	word = table.concat(syllables)	
	--secondary stress
	word = mw.ustring.gsub(word,'ˈ(.+)ˈ','ˌ%1ˈ')
	word = mw.ustring.gsub(word,'ˈ(.+)ˌ','ˌ%1ˌ')
	word = mw.ustring.gsub(word,'ˌ(.+)ˈ(.+)ˈ','ˌ%1ˌ%2ˈ')

	--softening i and u
	word = mw.ustring.gsub(word,'i([aeou])','i̯%1')
	
	--softening open and closed e and o
	word = mw.ustring.gsub(word,'e([bcdfghjklmnprstvwxyzɕθɟ])%.','ɛ%1')
	word = mw.ustring.gsub(word,'e([bcdfghjklmnprstvwxyzɕθɟ])([bcdfghjklmnprstvwxyzɕθɟ])%.','ɛ%1%2')
	word = mw.ustring.gsub(word,'e([bcdfghjklmnprstvwxyzɕθɟ])$','ɛ%1')
	word = mw.ustring.gsub(word,'e([bcdfghjklmnprstvwxyzɕθɟ])([bcdfghjklmnprstvwxyzɕθɟ])$','ɛ%1%2')
	word = mw.ustring.gsub(word,'o([bcdfghjklmnprstvwxyzɕθɟ])%.','ɔ%1')
	word = mw.ustring.gsub(word,'o([bcdfghjklmnprstvwxyzɕθɟ])([bcdfghjklmnprstvwxyzɕθɟ])%.','ɔ%1%2')
	word = mw.ustring.gsub(word,'o([bcdfghjklmnprstvwxyzɕθɟ])$','ɔ%1')
	word = mw.ustring.gsub(word,'o([bcdfghjklmnprstvwxyzɕθɟ])([bcdfghjklmnprstvwxyzɕθɟ])$','ɔ%1%2')

	
	table.insert(debug,word)
			
	--fixing fakes
	word = mw.ustring.gsub(word,'ɕ','t͡s') --fake c to real c
	word = mw.ustring.gsub(word,'θ','t͡ʃ') --fake ch to real ch
	word = mw.ustring.gsub(word,'ɟ','d͡ʒ') --fake j to real j

	word = mw.ustring.gsub(word,'([ɡkae])w','%1u̯')
	
	if do_debug == 'yes' then
		return word .. table.concat(debug,"")
	else
		return word
	end
end

function export.alternative(frame)
	return export.show(frame,true)
end

return export