Modül:tr-ad

Vikisözlük sitesinden
Gezinti kısmına atla Arama kısmına atla
[Düzenle] [Tazele] Template-info.svg Modül belgelemesi

Bu modül şu şablonlarda kullanılmaktadır:

Modülün alt sayfaları:


--Gerekli modülleri yükle
local istisnaKontrol = require("Modül:tr-ad/istisnalar")
local istisnaYumusama = istisnaKontrol.istisnaYumusama
local istisnaIncelme = istisnaKontrol.istisnaIncelme
local istisnaDusme = istisnaKontrol.istisnaDusme
local istisnaBilesik = istisnaKontrol.istisnaBilesik
local istisnaIkizlesme = istisnaKontrol.istisnaIkizlesme

--Stringleri ters çevirmeye yarayan fonksiyon, ünlü ikizleşmesinde gerekiyor
function terscevir(s)
	local uzunluk = mw.ustring.len( s )
	local harfler = {}
	
	u = 1
	repeat
		table.insert(harfler, mw.ustring.sub( s, -1 ))
		s = mw.ustring.sub( s, 1, -2 )
		u = u + 1
	until(u == uzunluk + 1)
	
	return table.concat(harfler, "")
end

------------------------------------------------
--tr-ad-tablo şablonuna yardımcı olan fonksiyon
------------------------------------------------
function adTablo(frame)
	--Ana parametreler
	local ad = frame:getParent().args[1] or frame:getParent().args['ad'] or mw.title.getCurrentTitle()["text"]
	local it = frame:getParent().args['istisna']
	local k = frame:getParent().args['k'] or frame:getParent().args['a']
	
	return "<div class='NavFrame' style='width:65%'>"
		.. "<div class='NavHead' style='' >''" .. ad .. "'' adının çekimi</div>"
		.. "<div class='NavContent'>"
		.. "\n{| style='background:#F9F9F9; text-align:center; width:100%' class='çekim inflection-table'"
		.. "\n|-"
		.. "\n! style='width:33%;background:#DEDEDE' |"
		.. "\n! style='background:#DEDEDE' |'''[[tekil]]'''"
		.. "\n! style='background:#DEDEDE' |'''[[çoğul]]'''"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[yalın hâl|yalın]]'''"
		.. "\n| style='color:black' |[[" .. ad .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "", "", "", "", "yalın", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[belirtme hâli|belirtme]]'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "ı", "i", "u", "ü", "belirtme", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "ı", "i", "u", "ü", "belirtme", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[yönelme hâli|yönelme]]'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "a", "e", "a", "e", "belirtme", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "a", "e", "a", "e", "belirtme", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[bulunma hâli|bulunma]]'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "da", "de", "da", "de", "bulunma", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "da", "de", "da", "de", "bulunma", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[ayrılma hâli|ayrılma]]'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "dan", "den", "dan", "den", "bulunma", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "dan", "den", "dan", "den", "bulunma", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''[[tamlayan hâli|tamlayan]]'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "ı", "i", "u", "ü", "tamlayan", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "ı", "i", "u", "ü", "tamlayan", k) .. "]]"
		.. "\n|-"
		.. "\n! colspan='3' style='background:#EFEFEF' |'''[[iyelik]]'''"
		.. "\n|-"
		.. "\n! style='width:33%;background:#EFEFEF' |"
		.. "\n! style='background:#EFEFEF' |'''[[tekil]]'''"
		.. "\n! style='background:#EFEFEF' |'''[[çoğul]]'''"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''1. tekil (benim)'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "m", "m", "m", "m", "iyelik", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "m", "m", "m", "m", "iyelik", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''2. tekil (senin)'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "n", "n", "n", "n", "iyelik", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "n", "n", "n", "n", "iyelik", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''3. tekil (onun)'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "ı", "i", "u", "ü", "iyelik", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "ı", "i", "u", "ü", "iyelik", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''1. çoğul (bizim)'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "mız", "miz", "muz", "müz", "iyelik", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "mız", "miz", "muz", "müz", "iyelik", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''2. çoğul (sizin)'''"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", "nız", "niz", "nuz", "nüz", "iyelik", k) .. "]]"
		.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", "nız", "niz", "nuz", "nüz", "iyelik", k) .. "]]"
		.. "\n|-"
		.. "\n! style='background:#EFEFEF' |'''3. çoğul (onların)'''"
		.. "\n| style='color:black' colspan='2' |[[" .. ayarla(ad, it, "tekil", "ı", "i", "u", "ü", "iyelik", k) .. 
									"]]<br>[[" .. ayarla(ad, it, "çoğul", "ı", "i", "u", "ü", "iyelik", k) .. "]]"
		.. "\n|}"
		.. "</div></div>"
end

--------------------------------------------
--adların tüm hallerini ayarlayan fonksiyon
--------------------------------------------
function ayarla(ad, it, tekil, h1, h2, h3, h4, tip, k)
	--sözcüğün son harfini tut
    local sonHarf = mw.ustring.sub( ad, -1 )
    --sözcüğün son ünlü harfini tut
    local sonUnlu = mw.ustring.sub( require("Modül:tr-araçlar").harfAyikla(ad, "sessiz"), -1 )
    --sonAd string'ini başlat, olabilecek hatalara karşı
    local sonAd = ad
    
    --eğer bir sözcük grubu ise, sondaki sözcüğü yakala
    local sonKelime = mw.ustring.sub( ad, -3, -3 )
    local ciftKelime
    if sonKelime ~= " " then
	    if sonUnlu == sonHarf and mw.ustring.find(sonUnlu, "[ıiuü]$") then
	    	ciftKelime = mw.ustring.match( ad, "[%s]")
	    end
    end
    
	if k == "1" then
		sonAd = ad .. "'"
	end
	
	if sonHarf == "'" then
		sonHarf = mw.ustring.sub( ad, -2, -2 )
	end
    
    local ik = istisnaIkizlesme[ad] or it == "ikizleşme"
    local iy = istisnaYumusama[ad] or it == "yumuşama"
    local ii = istisnaIncelme[ad] or it == "incelme"
    local id = istisnaDusme[ad] or it == "düşme"
    local ib = ciftKelime or istisnaBilesik[ad] or it == "bileşik"
    
    if it == "çoğulsuz" then
    	tekil = "tekil"
    end
    
    --Tekil hal buradan başlıyor
    if tekil == "tekil" then
		--Bazı durumlarda gerçekleşen ses olayları
		--
    	if tip == "belirtme" or tip == "tamlayan" or tip == "iyelik" then
			if tip == "iyelik" then
				if ib then
					if mw.ustring.find(mw.ustring.sub( sonAd, -2 ), "s[aeıioöuü]$") and not mw.ustring.find(mw.ustring.sub( h1, 1 ), "[ıiuü]$") then
						sonAd = mw.ustring.sub( sonAd, 1, -3 )
					elseif mw.ustring.find(mw.ustring.sub(sonAd, -1), "[aeıiuüoö]") and mw.ustring.find(mw.ustring.sub( h1, 1 ), "[ıiuü]$") then
						h1, h2, h3, h4 = "", "", "", ""
					end
				elseif mw.ustring.sub( ad, -2 ) == "su" then
					h3 = "yu" .. (mw.ustring.sub( h3, -1 ) ~= "u" and h3 or "")
				elseif sonHarf ~= sonUnlu and not mw.ustring.find(mw.ustring.sub( h1, 1 ), "[ıiuü]$") then
					h1, h2, h3, h4 = "ı" .. h1, "i" .. h2, "u" .. h3, "ü" .. h4
				elseif sonHarf == sonUnlu and mw.ustring.find(mw.ustring.sub( h1, 1 ), "[ıiuü]$") and not ib then
					h1, h2, h3, h4 = "s" .. h1, "s" .. h2, "s" .. h3, "s" .. h4
				end
			else
				--İSTİSNA: Kelime grubu ya da birleşik kelime ise ve tamlama şeklindeyse "n" ünsüzü ekten önce gelir
				if ib then
					sonAd = sonAd .. "n"
				--İSTİSNA: Kelime grubu ya da birleşik kelime dışındaki sözcüklerde son harf ünlü ise "y" ünsüzü ekten önce gelir
				elseif sonUnlu == sonHarf then
					if mw.ustring.sub( ad, -2 ) == "su" then
						sonAd = sonAd .. "y"
					else
						sonAd = sonAd .. (tip == "tamlayan" and "n" or "y")
					end
				end
			end
		    --İSTİSNA: Bazı istisnalar dışında sözcüklerin sonlarındaki "k, t, ç, p" harfleri incelerek "ğ, d, c, b" harflerine dönüşür
		    if iy or k == "1" then else
		    	if mw.ustring.sub( ad, -2 ) == "nk" then
		    		sonAd = mw.ustring.sub( sonAd, 1, -2 ) .. "g"
		    	elseif mw.ustring.find(sonHarf, "[ktçp]$") then
				    sonAd = mw.ustring.sub( sonAd, 1, -2 )
				    .. (sonHarf == "k" and "ğ" or sonHarf == "t" and "d" or sonHarf == "ç" and "c" or sonHarf == "p" and "b" or "")
			    end
			end
			--İSTİSNA: Bazı kelimelerin belirtme, yönelme, tamlayan hâllerinde sonraki ünsüz ikizleşir
			if ik then
				sonAd = sonAd .. mw.ustring.sub( sonAd, -1 )
			end
			--İSTİSNA: Bazı kelimelerde yönelme, belirtme, tamlayan hâllerinde ortadaki ünlü düşebilir ama çoğullarda düşmez
			if id then
				--YAPILACAK: Buradaki kod yalnızca UTF-8 karakterleri ile çalıştığı için "ı, İ" harfleri bu duruma dahil olamıyor.
				sonAd = terscevir( sonAd )
				sonAd = mw.ustring.gsub( sonAd, "[aAeEıIiİoOöÖuUüÜ]", "", 1)
				sonAd = terscevir( sonAd )
			end
		end
		if tip == "bulunma" then
			if ib then
				if sonHarf == sonUnlu then
					sonAd = sonAd .. "n"
				else
					sonAd = require("Modül:tr-araçlar").unluUyumu(sonAd, ((ii) and "in" or "ın"), "in", ((ii) and "ün" or "un"), "ün")
				end
			else
				--İSTİSNA: Sonu "f, s, t, k, ç, ş, h, p" harfleri ile biten sözcüklerden sonra "de, da, den, dan" ekleri geldiği zaman bu eklerdeki
				--"d" harfleri sertleşerek "t" harfine dönüşür
				if mw.ustring.find(sonHarf, "[fstkçşhp]$") then
					h1 = "t" .. mw.ustring.sub( h1, 2, -1 )
					h2 = "t" .. mw.ustring.sub( h2, 2, -1 )
					h3 = "t" .. mw.ustring.sub( h1, 2, -1 )
					h4 = "t" .. mw.ustring.sub( h2, 2, -1 )
				end
			end
		end
		
		--Sonuç
		sonAd = require("Modül:tr-araçlar").unluUyumu(sonAd, ((ii) and h2 or h1), h2, ((ii) and h4 or h3), h4)
	--Çoğul hal burada başlıyor
	else
		--Bazı durumlarda olan ses olayları
		--
		--Tamlama şeklinde olan sözcüklerde son ek düşer
		if mw.ustring.len( ad ) ~= 2 and mw.ustring.find(mw.ustring.sub( sonAd, -2 ), "s[ıuiü]$") then
			sonAd = mw.ustring.sub( ad, 1, -2 )
		end
		if ib and sonHarf == sonUnlu then
			if k == "1" then
				sonAd = mw.ustring.sub( sonAd, 1, -3 ) .. "'"
			else
				sonAd = mw.ustring.sub( sonAd, 1, -2 )
			end
		end
	    sonHarf = mw.ustring.sub( sonAd, -1 )
		--Son harfi "ğ" ile biten söczüklerde bu harf kalınlaşarak "k" harflerine dönüşür
		if mw.ustring.find(sonHarf, "[ğcb]$") and not mw.ustring.find(ad, "[ğcb][ıiuü]$") then
		    sonAd = mw.ustring.sub( sonAd, 1, -2 )
		    .. (sonHarf == "ğ" and "k" or sonHarf == "c" and "ç" or sonHarf == "b" and "p" or "")
	    end
		if tip == "iyelik" and not mw.ustring.find(mw.ustring.sub( h1, 1 ), "[ıiuü]$") then
			h1, h2, h3, h4 = "ı" .. h1, "i" .. h2, "u" .. h3, "ü" .. h4
		end
		if ib then
			if ii then
				sonAd = sonAd .. "leri" .. (tip == "yalın" and "" or "n") .. h2
			elseif tip == "iyelik" then
				sonAd = require("Modül:tr-araçlar").unluUyumu(sonAd, "lar" .. h1, "ler" .. h2)
			else
				sonAd = require("Modül:tr-araçlar").unluUyumu(sonAd, "ları" .. (tip == "yalın" and "" or "n") .. h1, "leri" .. (tip == "yalın" and "" or "n") .. h2)
			end
		else
			if ii then
				sonAd = sonAd .. "ler" .. h2
			else
				sonAd = require("Modül:tr-araçlar").unluUyumu(sonAd, "lar" .. h1, "ler" .. h2)
			end
		end
	end
	if tip == "tamlayan" then
		sonAd = sonAd .. "n"
	end
	
	return sonAd
end

return {
	ayarla = ayarla,
	adTablo = adTablo,
}