İçeriğe atla

Modül:tr-eylem

Vikisözlük sitesinden
Modül belgelemesi [Düzenle] [Tazele]

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

Modülün alt sayfaları:


--Gerekli modülleri yükle
local araclar = require("Modül:tr-araçlar")
local istisnaKontrol = require("Modül:tr-eylem/istisnalar")
local istisnaGenis = istisnaKontrol.istisnaGenis
local istisnaIncelme = istisnaKontrol.istisnaIncelme

----------------------------------------
--sahiplik eklerini ayarlayan fonksiyon
----------------------------------------
function sahiplik(ad, sahip, durum)
	if araclar.sonHarfUnluMu(ad) and durum then
		--Son harf ünlü ise
		if sahip == "ben" then
			ad = ad .. "m"
		elseif sahip == "sen" then
			ad = ad .. "n"
		elseif sahip == "o" then
			ad = ad
		elseif sahip == "biz" then
			ad = ad .. "k"
		elseif sahip == "siz" then
		    ad = araclar.unluUyumu(ad, "nız", "niz", "nuz", "nüz")
		end
	else
		--Son harf ünsüz ise
		if sahip == "ben" then
		    ad = araclar.unluUyumu(ad, "ım", "im", "um", "üm")
		elseif sahip == "sen" then
		    ad = araclar.unluUyumu(ad, "sın", "sin", "sun", "sün")
		elseif sahip == "o" then
			ad = ad
		elseif sahip == "biz" then
		    ad = araclar.unluUyumu(ad, "ız", "iz", "uz", "üz")
		elseif sahip == "siz" then
		    ad = araclar.unluUyumu(ad, "sınız", "siniz", "sunuz", "sünüz")
		end
	end
	if sahip == "onlar" then
	    ad = araclar.unluUyumu(ad, "lar", "ler")
	end
    
    return ad
end

function bilesikZaman(ad, zaman, cVar, tablo, sahip, durum)
    local ad2 = nil
    
	local function olmama(bir,iki)
		return (cVar == "yok" or cVar == bir) and "—" or iki
	end
	
	if zaman == "hikaye" then
		local ek = mw.ustring.find(mw.ustring.sub( ad, -1 ), "[fstkçşhp]$") and "t" or "d"
		if araclar.sonHarfUnluMu(ad) then
			ad = ad .. "y"
		end
		if sahip == "sen" or sahip == "siz" then durum = true end
		ad = olmama("h-yok", araclar.unluUyumu(ad, ek.."ı", ek.."i", ek.."u", ek.."ü"))
	elseif zaman == "rivayet" then
		if araclar.sonHarfUnluMu(ad) then
			ad = ad .. "y"
		end
		ad = olmama("r-yok", araclar.unluUyumu(ad, "mış", "miş", "muş", "müş"))
	elseif zaman == "şart" then
		if sahip == "onlar" then
			ad2 = olmama("ş-yok", araclar.unluUyumu(ad, "larsa", "lerse"))
		end
		if araclar.sonHarfUnluMu(ad) then
			ad = ad .. "y"
		end
		if sahip == "sen" or sahip == "siz" then durum = true end
		ad = olmama("ş-yok", araclar.unluUyumu(ad, "sa", "se"))
	end
	
	table.insert(tablo, sahiplik(ad, sahip, durum))
	if ad2 and ad2 ~= "—" then table.insert(tablo, ad2) end
end

---------------------------------------------------------
--bildirme kipi belirli geçmiş zamanı ayarlayan fonksiyon
---------------------------------------------------------
function belirliGecmis(ad, olumlu, sahip, zaman)
	local tablo = {}
    local ek = "d"
    
    if olumlu == "olumlu" then
    	--Bazı durumlarda olan ses olayları
	    if mw.ustring.find(mw.ustring.sub( ad, -1 ), "[fstkçşhp]$") then
			ek = "t"
		end
		ad = araclar.unluUyumu(ad, ek .. "ı", ek .. "i", ek .. "u", ek .. "ü")
	else
		ad = araclar.unluUyumu(ad, "ma" .. ek .. "ı", "me" .. ek .. "i")
	end
	
	durum = true
	bilesikZaman(ad, zaman, "r-yok", tablo, sahip, durum)
	
	return tablo
end

-----------------------------------------------------------
--bildirme kipi belirsiz geçmiş zamanı ayarlayan fonksiyon
-----------------------------------------------------------
function belirsizGecmis(ad, olumlu, sahip, zaman)
	local tablo = {}

    if olumlu == "olumlu" then
		ad = araclar.unluUyumu(ad, "mış", "miş", "muş", "müş")
	else
		ad = araclar.unluUyumu(ad, "mamış", "memiş")
	end
	
	durum = true
	bilesikZaman(ad, zaman, "var", tablo, sahip, durum)
	
	return tablo
end

-------------------------------------------------
--bildirme kipi geniş zamanı ayarlayan fonksiyon
-------------------------------------------------
function genis(ad, olumlu, sahip, zaman)
	local tablo = {}
    local sonSozcuk = mw.ustring.gsub( ad, ".*[%s]", "")
    local sonHarfUnluMu = araclar.sonHarfUnluMu(ad)

    if olumlu == "olumlu" then
		--Bazı durumlarda sondaki "t", "d"ye dönüşür
		if istisnaIncelme[sonSozcuk] then
			ad = mw.ustring.sub( ad, 1, -2 ) .. "d"
		end
    	--Biçim olarak olumsuz olan eylemler için
		if mw.ustring.sub( ad, -2 ) == "me" or mw.ustring.sub( ad, -2 ) == "ma" then
			if sahip == "ben" then
				ad = ad
			elseif sahip == "biz" then
				ad = ad .. "y"
			else
				ad = ad .. "z"
			end
		--Bazı tek heceli sözcükler istisna durumlarıdır
		elseif istisnaGenis[sonSozcuk] then
			ad = ad .. istisnaGenis[sonSozcuk]
		else
    	--Eğer ünlü harf ile bitiyorsa sonuna "-r" eki gelir
	    	if sonHarfUnluMu then
	    		ad = ad .. "r"
	    	--Eğer ünlü ile bitmiyorsa
	    	else
	    		--Eğer tek heceli ise sonuna "-ar, -er" ekleri gelir
	    		if mw.ustring.len(araclar.harfAyikla(sonSozcuk, "sessiz")) == 1 then
					ad = araclar.unluUyumu(ad, "ar", "er")
				else
	    		--Eğer tek heceli değil ise sonuna "-ır, -ir, -ur, -ür" ekleri gelir
					ad = araclar.unluUyumu(ad, "ır", "ir", "ur", "ür")
				end
			end
		end
	else
		ad = araclar.unluUyumu(ad, "ma", "me")
	    
		if sahip == "ben" then
			if zaman == "basit" then
			else
				ad = ad .. "z"
				end
		elseif sahip == "biz" then
		    if zaman == "basit" then
		    	ad = ad .. "y"
		    else 
	    		ad = ad .. "z"
	    		end
		else
			ad = ad .. "z"
		end
	end
	
	durum = true
	bilesikZaman(ad, zaman, "var", tablo, sahip, durum)
	
	return tablo
end

---------------------------------------------------
--bildirme kipi şimdiki zamanı ayarlayan fonksiyon
---------------------------------------------------
function simdiki(ad, olumlu, sahip, zaman)
	local tablo = {}
    local sonSozcuk = mw.ustring.gsub( ad, ".*[%s]", "")
    local sonHarfUnluMu = araclar.sonHarfUnluMu(ad)

    if olumlu == "olumlu" then
    	--Ünlü bir harfle biten eylemlerde son ünlü düşer
    	if sonHarfUnluMu then
    		ad = mw.ustring.sub( ad, 1, -2 )
    	end
		--Bazı durumlarda sondaki "t", "d"ye dönüşür
		if istisnaIncelme[sonSozcuk] then
			ad = mw.ustring.sub( ad, 1, -2 ) .. "d"
		end
    	--demek ve yemek fiillerinde e harfi i'ye dönüşür
    	if sonSozcuk == "de" or sonSozcuk == "ye" then
    		ad = mw.ustring.sub( ad, 1, -1 ) .. "iyor"
    	else
			ad = araclar.unluUyumu(ad, "ıyor", "iyor", "uyor", "üyor")
			ad = sonSozcuk == "yu" and ad.."uyor" or ad
	    end
    else
		ad = araclar.unluUyumu(ad, "mıyor", "miyor", "muyor", "müyor")
    end
	
	durum = true
	bilesikZaman(ad, zaman, "var", tablo, sahip, durum)
	
	return tablo
end

---------------------------------------------------
--bildirme kipi gelecek zamanı ayarlayan fonksiyon
---------------------------------------------------
function gelecek(ad, olumlu, sahip, zaman)
	local tablo = {}
    local sonSozcuk = mw.ustring.gsub( ad, ".*[%s]", "")
    local sonHarfUnluMu = araclar.sonHarfUnluMu(ad)

    if olumlu == "olumlu" then
    	--Ünlü bir harfle biten eylemlerde araya "y" harfi girer
    	if sonHarfUnluMu then
    		ad = ad .. "y"
    	end
		--Bazı durumlarda sondaki "t", "d"ye dönüşür
		if istisnaIncelme[sonSozcuk] then
			ad = mw.ustring.sub( ad, 1, -2 ) .. "d"
		end
    	--demek ve yemek fiillerinde e harfi i'ye dönüşür
    	if sonSozcuk == "de" or sonSozcuk == "ye" then
    		ad = mw.ustring.sub( ad, 1, -3 ) .. "iyece"
    	else
			ad = araclar.unluUyumu(ad, "aca", "ece")
	    end
    else
		ad = araclar.unluUyumu(ad, "mayaca", "meyece")
	end
	
	if zaman == "basit" and (sahip == "ben" or sahip == "biz") then
		ad = ad .. "ğ"
	else
		ad = ad .. "k"
	end
	
	durum = true
	bilesikZaman(ad, zaman, "var", tablo, sahip, durum)
	
	return tablo
end

----------------------------------------------
--dilek kipi istek kipini ayarlayan fonksiyon
----------------------------------------------
function istek(ad, olumlu, sahip, zaman)
	local tablo = {}
    local sonSozcuk = mw.ustring.gsub( ad, ".*[%s]", "")
    local sonHarfUnluMu = araclar.sonHarfUnluMu(ad)

    if olumlu == "olumlu" then
    	--Ünlü bir harfle biten eylemlerde araya "y" harfi girer
    	if sonHarfUnluMu then
    		ad = ad .. "y"
    	end
		--Bazı durumlarda sondaki "t", "d"ye dönüşür
		if istisnaIncelme[sonSozcuk] then
			ad = mw.ustring.sub( ad, 1, -2 ) .. "d"
		end
    	--demek ve yemek fiillerinde e harfi i'ye dönüşür
    	if sonSozcuk == "de" or sonSozcuk == "ye" then
    		ad = mw.ustring.sub( ad, 1, -3 ) .. "iye"
    	else
			ad = araclar.unluUyumu(ad, "a", "e")
	    end
    else
		ad = araclar.unluUyumu(ad, "maya", "meye")
    end
	    
	if sahip == "ben" then
		ad = ad .. "y"
	elseif sahip == "biz" then
		if zaman == "basit" then
			ad = ad .. "l"
			sahip = "ben"
		else
			durum = true
			end
	elseif sahip == "sen" or sahip == "siz" then
		durum = nil
	else
		durum = true
	end
	
	bilesikZaman(ad, zaman, "ş-yok", tablo, sahip, durum)
	
	return tablo
end

---------------------------------------------
--dilek kipi şart kipini ayarlayan fonksiyon
---------------------------------------------
function sart(ad, olumlu, sahip, zaman)
	local tablo = {}

    if olumlu == "olumlu" then
    	ad = araclar.unluUyumu(ad, "sa", "se")
    else
		ad = araclar.unluUyumu(ad, "masa", "mese")
    end
	
	durum = true
	bilesikZaman(ad, zaman, "ş-yok", tablo, sahip, durum)
	
	return tablo
end

--------------------------------------------------
--dilek kipi gereklilik kipini ayarlayan fonksiyon
--------------------------------------------------
function gereklilik(ad, olumlu, sahip, zaman)
	local tablo = {}

    if olumlu == "olumlu" then
    	ad = araclar.unluUyumu(ad, "malı", "meli")
    else
		ad = araclar.unluUyumu(ad, "mamalı", "memeli")
    end
	    
	if sahip == "ben" or sahip == "biz" then
		ad = ad .. "y"
	elseif sahip == "sen" or sahip == "siz" then
		durum = nil
	else
		durum = true
	end
	
	bilesikZaman(ad, zaman, "var", tablo, sahip, durum)
	
	return tablo
end

---------------------------------------------
--dilek kipi emir kipini ayarlayan fonksiyon
---------------------------------------------
function emir(ad, olumlu, sahip, zaman)
	local tablo = {}
    local sonSozcuk = mw.ustring.gsub( ad, ".*[%s]", "")
    local sonHarfUnluMu = araclar.sonHarfUnluMu(ad)

    if olumlu == "olumlu" then
    	if sahip == "siz" then
			--Bazı durumlarda sondaki "t", "d"ye dönüşür
			if istisnaIncelme[sonSozcuk] then
				ad = mw.ustring.sub( ad, 1, -2 ) .. "d"
			end
			if sonHarfUnluMu then
				ad = araclar.unluUyumu(ad, "yı", "yi")
			else
				ad = araclar.unluUyumu(ad, "ı", "i", "u", "ü")
			end
			if zaman == "basit" then table.insert(tablo, ad.."n") end
		end
	else
		ad = araclar.unluUyumu(ad, "ma", "me")
		if sahip == "siz" then
			ad = araclar.unluUyumu(ad, "yı", "yi")
			if zaman == "basit" then table.insert(tablo, ad.."n") end
		end
	end
	
	if sahip == "onlar" then
		ad = araclar.unluUyumu(ad, "sın", "sin", "sun", "sün")
	end
	    
	if sahip == "ben" or sahip == "biz" then
		ad = "—"
	elseif sahip == "sen" then
		sahip = "o"
	elseif sahip == "o" then
		sahip = "sen"
		durum = nil
	else
		durum = true
	end
	
	bilesikZaman(ad, zaman, "yok", tablo, sahip, durum)
	
	return tablo
end

local kisiler = {{"ben","1t"}, {"sen","2t"}, {"o","3t"}, {"biz","1ç"}, {"siz","2ç"}, {"onlar","3ç"}}
local tipler = {"olumlu", "olumsuz"}
local fonksiyonlar = {belirliGecmis, belirsizGecmis, genis, simdiki, gelecek, istek, sart, gereklilik, emir}
local degerler = {"belirli geçmiş","belirsiz geçmiş","geniş","şimdiki","gelecek", "istek", "şart", "gereklilik", "emir"}
local zamanlar = {"basit", "hikaye", "rivayet", "şart"}

--------------------------------------------------
--tr-eylem-tablo şablonuna yardımcı olan fonksiyon
--------------------------------------------------
function eylemTablo(frame)
	--Ana parametreler
	local eylem = frame.args[1] or frame:getParent():getTitle()
	
	local tablo = {}
	
	table.insert(tablo, 
		"<div class='NavFrame' style='width:100%'>"
		.. "<div class='NavHead' style='' >''" .. eylem .. "'' eyleminin çekimi</div>"
		.. "<div class='NavContent'>"
		.. "\n{| style='background:#F9F9F9; text-align:center; width:100%' class='çekim inflection-table'")
	
	--yalın yapma işlemini buraya aldık, çünkü şablonun açılır kutusunda
	--eylemin "mek, mak" hali gözükmeli
	local eylem = araclar.yalinYap(eylem)
	
	--eğer eylemin son hecesi "me, ma" ise bu olumsuz bir eylemdir
	--bu nedenle de bu eylemin olumlu versiyonunun tam tersine
	--çevrilmesi gerekir
	if mw.ustring.find(mw.ustring.sub( eylem, -2 ), "m[ea]") then
		tipler = {"olumsuz", "olumlu"}
		eylem = mw.ustring.sub( eylem, 1, -3 )
		olumsuz = true
	end
	
	for _,tip in ipairs(tipler) do
		--eğer eylemin son hecesi "me, ma" ise bu olumsuz bir eylemdir
		--bu nedenle de bu eylemin olumlu versiyonunun tam tersine
		--çevrilmesi gerekir
		if olumsuz then gorunumTip = tip == "olumsuz" and "olumlu" or "olumsuz" else gorunumTip = tip end
		table.insert(tablo, 
			"\n|-"
			.. "\n! style='background:#DEDEDE;' colspan='9' |" .. gorunumTip .. " çekimler"
			.. "\n|-"
			.. "\n! style='background:#DEDEDE' colspan='3' rowspan='2' |"
			.. "\n! style='background:#DEDEDE' colspan='3' |'''[[tekil]]'''"
			.. "\n! style='background:#DEDEDE' colspan='3' |'''[[çoğul]]'''"
			.. "\n|-"
			.. "\n! style='background:#EFEFEF' |'''ben'''"
			.. "\n! style='background:#EFEFEF' |'''sen'''"
			.. "\n! style='background:#EFEFEF' |'''o'''"
			.. "\n! style='background:#EFEFEF' |'''biz'''"
			.. "\n! style='background:#EFEFEF' |'''siz'''"
			.. "\n! style='background:#EFEFEF' |'''onlar'''"
			.. "\n|-")
		for x, fonk in ipairs(fonksiyonlar) do
			if x == 1 then table.insert(tablo, "\n! style='background:#DEDEDE' rowspan='20' |'''bildirme (haber)<br>kipleri'''") end
			if x == 6 then table.insert(tablo, "\n! style='background:#DEDEDE' rowspan='16' |'''dilek (tasarlama)<br>kipleri'''") end
			table.insert(tablo, "\n! style='background:#EFEFEF' rowspan='4' |'''" .. degerler[x] .. "'''")
			for y, zaman in ipairs(zamanlar) do
				table.insert(tablo, "\n! style='background:#EFEFEF' |'''" .. zaman .. "'''")
				for z, kisi in ipairs(kisiler) do
					table.insert(tablo, "\n| style='color:black' |[[" .. table.concat(fonk(eylem, tip, kisi[1], zaman), "]]<br>[[") .. "]]")
				end
				table.insert(tablo, "\n|-")
			end
			table.insert(tablo, "\n|-")
		end
	end
	
	table.insert(tablo, "\n|}"
		.. "</div></div>")
	
	return table.concat(tablo, "")
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 eylemlere gelen ekleri ayırt eden fonksiyon
function cekim_tr(args)
	--çekimlemesi yapılan sözcüğün yalın hali
	local eylem = araclar.yalinYap(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"]
	
	--eğer eylemin son hecesi "me, ma" ise bu olumsuz bir eylemdir
	--bu nedenle de bu eylemin olumlu versiyonunun tam tersine
	--çevrilmesi gerekir
	if mw.ustring.find(mw.ustring.sub( eylem, -2 ), "m[ea]") then
		tipler = {"olumsuz", "olumlu"}
		ilkEylem = eylem
		eylem = mw.ustring.sub( eylem, 1, -3 )
		olumsuz = true
	end
	
	--otomatik çekimlemeler arasına virgül ekleyen fonksiyon
	local function virgul(tablo)
		if tablo[1] then
			table.insert(tablo, ";")
		end
	end
	
	--çekimleme fonksiyonlarının sonuç çıktıları her zaman
	--bir tablodur, bu nedenle de tablonun içerisindeki
	--her bir çekimle tek tek karşılaştırma yapılması gerek
	local function durumCoz(tablo, cekim)
		if tablo[2] then
			return tablo[1] == cekim or tablo[2] == cekim
		elseif tablo[1] then
			return tablo[1] == cekim
		end
	end
	
	--burası asıl tüm karşılaştırmanın yapıldığı ve çekim
	--saptandığında {{tr-çekim}} şablonuna ilgili etiketlerin
	--eklendiği kısım
	for _, kisi in ipairs(kisiler) do
		for _, tip in ipairs(tipler) do
			for _, zaman in ipairs(zamanlar) do
				for z, fonk in ipairs(fonksiyonlar) do
					if durumCoz(fonk(eylem, tip, kisi[1], zaman), cekim) then
						--eğer saptanan başka otomatik çekim varsa önce virgül eklemeliyiz
						virgul(args[3])
						table.insert(args[3], (z >= 6 and "dilek" or "bildirme"))
						if z >= 6 then table.insert(args[3], "-") end
						table.insert(args[3], degerler[z])
						table.insert(args[3], zaman)
						table.insert(args[3], kisi[2])
						--eğer eylemin son hecesi "me, ma" ise bu olumsuz bir eylemdir
						--bu nedenle de bu eylemin olumlu versiyonunun tam tersine
						--çevrilmesi gerekir
						if olumsuz then gorunumTip = tip == "olumsuz" and "olumlu" or "olumsuz" else gorunumTip = tip end
						table.insert(args[3], gorunumTip)
						args[1] = araclar.yaliniTersCevir((olumsuz and ilkEylem or eylem))
					end
				end
			end
		end
	end
	
	--eğer çekimleme karşılaştırması sonucu bu modüldeki
	--fonksiyonların ürünleri sayfa adı ile eşleşmiyorsa
	--bu demektir ki, sayfa adı henüz bu modül tarafından
	--desteklenmeyen bir çekim türü
	--böyle sayfalarda normalde {{tr-çekim}} kullanılmamalı
	--fakat eğer kullanıldıysa bunu saptamamız ve izleyici
	--kategoriye eklememiz gerekiyor
	--bakınız: [[Kategori:Otomatik modüller tarafından henüz tanınmayan çekimler]]
	if args[3][1] then else table.insert(args[3], "belirtilmemiş") end
end

return {eylemTablo = eylemTablo, genis = genis, cekim_tr = cekim_tr}