Modül:tr-ad/deneme tahtası

Modül belgelemesi [Oluştur]


--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
local istisnaI = istisnaKontrol.istisnaI

--[[
	Burası çekimler tablosu, tüm parametrelerin açıklamaları şu şekildedir:
	
	1: sözcüğün son ünlüsü "aıâ" harflerinden biriyse bundan sonra gelecek ek
	2: sözcüğün son ünlüsü "eiî" harflerinden biriyse bundan sonra gelecek ek
	3: sözcüğün son ünlüsü "ouû" harflerinden biriyse bundan sonra gelecek ek
	4: sözcüğün son ünlüsü "öü" harflerinden biriyse bundan sonra gelecek ek
	5 ve 6: çekimleme tipi
]]
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='background:#DEDEDE' colspan='2' |"
		.. "\n! style='background:#DEDEDE' |'''[[tekil]]'''"
		.. "\n! style='background:#DEDEDE' |'''[[çoğul]]'''"
		.. "\n|-")
	
	local function tumDurumlar(say, say2, ozel, cogul3)
		for _, c in ipairs(cekimler) do
			table.insert(tablo, "\n! style='background:#EFEFEF'"
				..(ozel and "" or "colspan='2'").." |'''" .. c[6] .. "'''"
				.. "\n| style='color:black' ".. (cogul3 and "colspan='2'" or "") .."|[["
				.. ayarla(say, it, "tekil", c[1], c[2], c[3], c[4], c[5], k) .. "]]"
				.. (cogul3 and "<br>" or "\n| style='color:black' |")
				.. (k == "1" and "—" or "[["
				.. ayarla((ozel and say2 or say), it, (ozel and "tekil" or "çoğul"), c[1], c[2], c[3], c[4], c[5], k) .. "]]")
				.. "\n|-")
		end
	end
	
	tumDurumlar(ad)
	
	table.insert(tablo, "\n! colspan='4' style='background:#DEDEDE' |'''[[iyelik]]'''"
		.. "\n|-"
		.. "\n! style='background:#DEDEDE' colspan='2' |"
		.. "\n! style='background:#DEDEDE' |'''[[tekil]]'''"
		.. "\n! style='background:#DEDEDE' |'''[[çoğul]]'''"
		.. "\n|-")
	
	for s, c in ipairs(iyelik) do
		local sira = s >= 4 and tostring(s-3) or tostring(s)
		local sen = s >= 4 and "çoğul" or "tekil"
		local tekil = ayarla(ad, it, "tekil", c[1], c[2], c[3], c[4], "iyelik", k)
		local cogul = ayarla(ad, it, "çoğul", c[1], c[2], c[3], c[4], "iyelik", k)
		
		table.insert(tablo, "\n! style='background:#DEDEDE' rowspan='6' |'''".. sira .. ". "..sen.."'''")
			tumDurumlar(tekil, cogul, true)
		table.insert(tablo, "\n|-")
	end
	
	table.insert(tablo, "\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" and not mw.ustring.find(ad, "'") 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 ix = istisnaI[ad] or it == "i"
    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 and sonAd ~= "su" 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 and sonAd ~= "su" then
					--İSTİSNA: Burada suyu istisnası mevcut; suyuyu değil suyunu olacak çünkü
					sonAd = sonAd .. ((tip ~= "tamlayan" and mw.ustring.sub( ad, -4 ) ~= "suyu" 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"
								or not ix and mw.ustring.find(ad, "[ıiuü]$"))
								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 and sonAd ~= "su" then
				if sonHarf == sonUnlu then
					-- İSTİSNA: suyu istisnası
					sonAd = sonAd .. (mw.ustring.sub( ad, -4 ) ~= "suyu" and 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
				
				sonAd = sonAd .. (not ix and ( mw.ustring.find(ad, "[uüıi]$"))
						and "n" or "")
			end
		end
		if tip == "bulunma" or tip == "ayrılma" then
			sonAd = sonAd .. (mw.ustring.find(sonAd, "ş[uüıi]$") and "n" or "")
		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ü]$")
		and not mw.ustring.find(sonAd, "ksi$") then
			sonAd = mw.ustring.sub( ad, 1, -2 )
		end
		if ib and sonAd ~= "su" and not mw.ustring.find(sonAd, "şu$") 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
			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
				if mw.ustring.sub( ad, -4 ) == "suyu" then
					sonAd = mw.ustring.sub( ad, 1, -3 )
					if tip == "yalın" then h1 = h1.. "ı" end
					if tip == "bulunma" then h1 = "ın"..h1 end
				end
				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
	if mw.ustring.sub(sonAd, -1) == "'" then
		sonAd = mw.ustring.sub(sonAd, 0, -2)
	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
	local function tumDurumlar(say, kisi, ozel)
		for i, c in ipairs(cekimler) do
			if cekim == ayarla(say, 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])
				if ozel then table.insert(args[3], kisi) if c[6] == "yalın" then c[6] = "iyelik" end end
				table.insert(args[3], c[6])
				if ozel and mw.ustring.find(say, "l[ea]r") then table.insert(args[3], "ç")
				else table.insert(args[3], "t") end
			end
			if cekim == ayarla(say, 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
	end
	
	tumDurumlar(ad)

	for i, s in ipairs(iyelik) do
		local tekil = ayarla(ad, it, "tekil", s[1], s[2], s[3], s[4], "iyelik", k)
		local cogul = ayarla(ad, it, "çoğul", s[1], s[2], s[3], s[4], "iyelik", k)
		tumDurumlar(tekil, s[5], true)
		tumDurumlar(cogul, s[5], true)
	end
	
	if args[3][1] then else table.insert(args[3], "belirtilmemiş") end
	
end

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