Modül:tr-ad

Vikisözlük sitesinden
Gezinti kısmına atla Arama kısmına atla
Test Template Info-Icon - Version (2).svgModül belgelemesi [Düzenle] [Tazele]

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


cekimler = {}
cekimler[1] = {"", "", "", "", "yalın", "yalın"}
cekimler[2] = {"ı", "i", "u", "ü", "belirtme", "belirtme"}
cekimler[3] = {"a", "e", "a", "e", "belirtme", "yönelme"}
cekimler[4] = {"da", "de", "da", "de", "bulunma", "bulunma"}
cekimler[5] = {"dan", "den", "dan", "den", "bulunma", "ayrılma"}
cekimler[6] = {"ı", "i", "u", "ü", "tamlayan", "tamlayan"}

iyelik = {}
iyelik[1] = {"m", "m", "m", "m", "1t"}
iyelik[2] = {"n", "n", "n", "n", "2t"}
iyelik[3] = {"ı", "i", "u", "ü", "3t"}
iyelik[4] = {"mız", "miz", "muz", "müz", "1ç"}
iyelik[5] = {"nız", "niz", "nuz", "nüz", "2ç"}
iyelik[6] = {"ı", "i", "u", "ü", "3ç"}

--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']
	
	local tablo = {}
	
	table.insert(tablo, "<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|-")
	
	for _, c in ipairs(cekimler) do
		table.insert(tablo, "\n! style='background:#EFEFEF' |'''" .. c[6] .. "'''"
			.. "\n| style='color:black' |[[" .. ayarla(ad, it, "tekil", c[1], c[2], c[3], c[4], c[5], k) .. "]]"
			.. "\n| style='color:black' |[[" .. ayarla(ad, it, "çoğul", c[1], c[2], c[3], c[4], c[5], k) .. "]]"
			.. "\n|-")
	end
	
	table.insert(tablo, "\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>")
	
	return table.concat(tablo)
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 = mw.ustring.find(sonAd, "s[ıiuü]$") or 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(sonAd, "s[aeıioöuü]$") and not mw.ustring.find(h1, "[ıiuü]$") then
						sonAd = mw.ustring.sub( sonAd, 1, -3 )
					elseif mw.ustring.find(sonAd, "[aeıiuüoö]$") and mw.ustring.find(h1, "[ı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(h1, "[ıiuü]$") then
					h1, h2, h3, h4 = "ı" .. h1, "i" .. h2, "u" .. h3, "ü" .. h4
				elseif sonHarf == sonUnlu and mw.ustring.find(h1, "[ı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 .. ((tip ~= "tamlayan" and mw.ustring.find(sonAd, "[yc][ıiuü]$")) and "y" or "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 .. (mw.ustring.find(sonAd, "[yc][ıiuü]$") and "" or "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 and not mw.ustring.find(ad, "[yc][ıiuü]$") 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 ib then else
			if mw.ustring.find(sonHarf, "[ğcb]$") and 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
		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" or mw.ustring.find(ad, "[yc][ıiuü]$") 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
		sonAd = mw.ustring.sub( mw.ustring.gsub(sonAd, "([mn])([ıi])zl([ae])r", "l%3r%2%1%2z"), 1, -1 )
	end
	if tip == "tamlayan" then
		sonAd = sonAd .. "n"
	end
	
	return sonAd
end

--bu fonksiyon [[Modül:çekim/şablonlar]] tarafından kullanılmaktadır
--burada yapacağınız değişiklikler sadece o modülü ilgilendirir
--Türkçe dilindeki adlara gelen ekleri ayırt eden fonksiyon
function cekim_tr(args)
	--çekimlemesi yapılan sözcüğün yalın hali
	local ad = args[1]
	--asıl çekimleme, bu modül sadece çekimlemenin yapıldığı asıl
	--maddede kullanılacağı için direk sayfa adını alıyoruz
	local cekim = mw.title.getCurrentTitle()["text"]
	--çekimleme yapılırken bir istisnai durum gerçekleşti mi,
	--ilk parametrede girilen yalın hale ek gelirken bir istisna olduysa
	--o girilmeli, bu istisnalar [[Modül:tr-ad/istisnalar]] sayfasında bulunabilir
	local it = args['istisna']
	--ekten önce bir kesme işareti gelecek mi? özel adlarda genellikle
	--kesme işareti gelir, bu parametreye herhangi bir değer girilmesi
	--bu durumu aktif hale getirir
	local k = args['k'] or args['a']
	
	--eğer çekimde ' varsa, bu bir özel ad çekimidir
	if mw.ustring.find(cekim, "'") then k = "1" end
	
	--otomatik çekimlemeler arasına virgül ekleyen fonksiyon
	local function virgul(tablo)
		if tablo[1] then
			table.insert(tablo, ",")
		end
	end
	
	--tek tek tüm çekimlemeleri karşılaştırdığımız kısım
	--burada Modül:tr-ad'ın ayarla() fonksiyonu sayesinde
	--ilk parametrede girilen yalın sözcüğün tüm çekimlemelerini
	--çağırıp karşılaştırma yapabiliyoruz ve sonuç olarak ilgili açıklamaları ekliyoruz
	--ayarla() fonksiyonunun nasıl çalıştığını daha iyi anlamak için
	--ilgili modüle bakabilirsiniz
	for i, c in ipairs(cekimler) do
		if cekim == ayarla(ad, it, "tekil", c[1], c[2], c[3], c[4], c[5], k) then
			--eğer başka otomatik bir çekim saptandıysa başa virgül eklemeliyiz
			virgul(args[3])
			table.insert(args[3], c[6])
			table.insert(args[3], "t")
		end
		if cekim == ayarla(ad, it, "çoğul", c[1], c[2], c[3], c[4], c[5], k) then
			--eğer başka otomatik bir çekim saptandıysa başa virgül eklemeliyiz
			virgul(args[3])
			table.insert(args[3], c[6])
			table.insert(args[3], "ç")
		end
	end

	for i, s in ipairs(iyelik) do
		if cekim == ayarla(ad, it, "tekil", s[1], s[2], s[3], s[4], "iyelik", k) then
			--eğer başka otomatik bir çekim saptandıysa başa virgül eklemeliyiz
			virgul(args[3])
			table.insert(args[3], s[5])
			table.insert(args[3], "iyelik")
			table.insert(args[3], "t")
		end
		if cekim == ayarla(ad, it, "çoğul", s[1], s[2], s[3], s[4], "iyelik", k) then
			--eğer başka otomatik bir çekim saptandıysa başa virgül eklemeliyiz
			virgul(args[3])
			table.insert(args[3], s[5])
			table.insert(args[3], "iyelik")
			table.insert(args[3], "ç")
		end
	end
	
	if args[3][1] then else table.insert(args[3], "belirtilmemiş") end
	
end

return {
	ayarla = ayarla,
	adTablo = adTablo,
	cekim_tr = cekim_tr,
}