Modul:Výslovnost češtiny

Dokumentaci tohoto modulu lze vytvořit na stránce Nápověda:Modul:Výslovnost češtiny

p = {}
function p.Nahrad (a)
	local out = mw.ustring.lower(a)
	local consonants_group = "([bcdďfghjklmnpqrřsštťvwxzž])"
	local voiceless_group = "([ptťkfsščp])"
	-- Spíše experimentálně stanovená skupina, nebojte se opravovat
	local voiced_assimilation_group = "([bdďghzž])"

	local replacements = {
		-- Spodoba znělosti
		-- Nepřevádí přímo do IPA (kvůli eliminaci konfliktů s dalšími pravidly)
		-- Znělá, neznělá -> neznělá, neznělá
		{"b" .. voiceless_group, "p%1"},
		{"d" .. voiceless_group, "t%1"},
		{"ď" .. voiceless_group, "ť%1"},
		{"g" .. voiceless_group, "k%1"},
		{"([^c])h" .. voiceless_group, "%1ch%2"},
		{"^h" .. voiceless_group, "ch%1"},
		{"v" .. voiceless_group, "f%1"},
		{"z" .. voiceless_group, "s%1"},
		{"ž" .. voiceless_group, "š%1"},
		{"bch", "pch"},
		{"dch", "tch"},
		{"ďch", "ťch"},
		{"gch", "kch"},
		{"vch", "fch"},
		{"zch", "sch"},
		{"žch", "šch"},
		-- Neznělá, znělá -> znělá, znělá
		{"p" .. voiced_assimilation_group, "b%1"},
		{"t" .. voiced_assimilation_group, "d%1"},
		{"ť" .. voiced_assimilation_group, "ď%1"},
		{"k" .. voiced_assimilation_group, "g%1"},
		{"ch" .. voiced_assimilation_group, "h%1"},
		{"f" .. voiced_assimilation_group, "v%1"},
		{"s" .. voiced_assimilation_group, "z%1"},
		{"š" .. voiced_assimilation_group, "ž%1"},
		-- Konec slova
		{"b$", "p"},
		{"b ", "p "},
		{"d$", "t"},
		{"d ", "t "},
		{"ď$", "ť"},
		{"ď ", "ť "},
		{"g$", "k"},
		{"g ", "k "},
		{"([^c])h$", "%1ch"},
		{"([^c])h ", "%1ch "},
		{"v$", "f"},
		{"v ", "f "},
		{"z$", "s"},
		{"z ", "s "},
		{"ž$", "š"},
		{"ž ", "š "},
		
		-- Slabikotvorné r (priorita kvůli závislosti na kontextu)
		{consonants_group .. "r" .. consonants_group, "%1r̩%2"},
		{consonants_group .. "r$", "%1r̩"},
		{consonants_group .. "r ", "%1r̩ "},
	   
		-- Slabikotvorné l (priorita kvůli závislosti na kontextu)
		{consonants_group .. "l" .. consonants_group, "%1l̩%2"},
		{consonants_group .. "l$", "%1l̩"},
		{consonants_group .. "l ", "%1l̩ "},
		
		-- Slabikotvorné m (nižší priorita než r, l kvůli řidčímu výskytu)
		{consonants_group .. "m" .. consonants_group, "%1m̩%2"},
		{consonants_group .. "m$", "%1m̩"},
		{consonants_group .. "m ", "%1m̩ "},
									  
		-- Znělé a neznělé ř (priorita kvůli závislosti na kontextu)
		{voiceless_group .. "ř", "%1r̝̊"},
		{"ř" .. voiceless_group, "r̝̊%1"},
		{"chř", "chr̝̊"},
		{"řch", "r̝̊ch"},
		{"ř$", "r̝̊"},
		{"ř ", "r̝̊ "},
		{"ř", "r̝"},
	
		-- dvojhlásky
		{"au", "aʊ̯"},
		{"eu", "ɛʊ̯"},
		{"ou", "ɔʊ̯"},	
	
		-- Skupiny samohlásek <ia, ie, ii, io, iu> v cizích slovech
		{"ia", "ɪja̯"},
		{"ie", "ɪjɛ"},
		{"ii", "ɪjɪ̯"},
		{"io", "ɪjo̯"},
		{"iu", "ɪju̯"},
		
		-- Prioritně nahrazené x, ch, c a ts (pro zamezení konfliktů)
		{"ex([aeiou])", "egz%1"},
		{"x", "ks"},
		{"ch", "x"},
		{"c", "t͡s"},
		{"ts", "t͡s"},
	
		-- di, ti, ni (í nepřevedeno přímo kvůli konfliktu s pravidlem pro i)
		{"di", "ɟɪ"},
		{"dí", "ɟí"},
		{"ti", "cɪ"},
		{"tí", "cí"},
		{"ni", "ɲɪ"},
		{"ní", "ɲí"},
	
		-- ě
		{"bě", "bjɛ"},
		{"dě", "ɟɛ"},	
		{"mě", "mɲɛ"},
		{"ně", "ɲɛ"},	
		{"pě", "pjɛ"},
		{"tě", "cɛ"},	
		{"vě", "vjɛ"},
	
		-- samohlásky
		{"a", "a"},
		{"á", "aː"},
		{"e", "ɛ"},
		{"é", "ɛː"},
		{"i", "ɪ"},	
		{"y", "ɪ"},
		{"í", "iː"},	
		{"ý", "iː"},
		{"o", "ɔ"},
		{"ó", "ɔː"},
		{"u", "ʊ"},	
		{"ú", "uː"},	
		{"ů", "uː"},
	
		--souhlásky
		{"dž", "d͡ʒ"},
		{"čb", "d͡ʒb"},
		{"š", "ʃ"},	
		{"ž", "ʒ"},
		{"ň", "ɲ"},
		{"ť", "c"},
		{"ď", "ɟ"},
		{"h", "ɦ"},
		{"dz", "d͡z"},
		{"č", "t͡ʃ"},
	
		--[ɱ] je realizací /m/ před /f/ a /v/ (např. ve slově tramvaj)
		{"mf", "ɱf"},	
		{"mv", "ɱv"},
		
		--[ŋ] je realizací /n/ před /k/ a /g/ (např. ve slově banka)	
		{"nk", "ŋk"},	
		{"ng", "ŋg"},
	}
	
	for _, replacement in ipairs(replacements) do
		out = mw.ustring.gsub(out, replacement[1], replacement[2])
	end
	
	return out
end

function p.print (frame)
	if frame.args[1] and frame.args[1] ~= "" then
		return p.Nahrad (frame.args[1])
	elseif not frame.args[1] then
		return "Chyba: Nic nezadáno"
	elseif frame.args[1] == "" then
		return "Chyba: Prázdný argument"		
	else
		return "Neznámá chyba"
	end
end

function p.test (frame)

	local arg = {}
	local nArg = 0
	for a in pairs (frame:getParent().args) do
		nArg = nArg + 1
		table.insert (arg, mw.text.trim (frame:getParent().args[nArg]) )

	end

	local out = "TEST automatické vyslovnosti pro češtinu<br />"
	out = out .. "<hr />"
	
	if nArg == 1 then
		out = out .. "Zadáno: <b>" .. arg[1] .. "</b> IPA: <i>" .. p.Nahrad (arg[1]) .. "</i><br />"

		local audio = mw.title.new( 'File:Cs-' .. arg[1] .. '.ogg').file
		if audio.exists then
			out = out .. "Audio soubor odpovídající " .. arg[1] .. " existuje.<br />"
		else 
			out = out .. "Soubor " .. 'Cs-' .. arg[1] .. '.ogg nenalezen.<br />'
		end
	
	elseif nArg >1 then
		out = out .. "<table class=\"wikitable sortable\">"
		out = out .. "<th>zadáno</th><th>IPA</th><th>soubor</th>"
		for n in pairs (arg) do
			out = out .. "<tr><td>" .. arg[n] .. "</td><td>" .. p.Nahrad (arg[n]) .. "</td>"
			local audio = mw.title.new( 'File:Cs-' .. arg[n] .. '.ogg').file
			if audio.exists then
				out = out .. "<td>Soubor " .. 'Cs-' .. arg[n] .. '.ogg' .. " existuje </td>"
			else 
				out = out .. "<td>Soubor " .. 'Cs-' .. arg[n] .. '.ogg' .. " neexistuje </td>"
			end	
			out = out .. "</tr>"
		end
		out = out .. "</table>"
	end
	return out
end

return p