--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 = {"", "", "", "", "yalın", "yalın"}
cekimler = {"ı", "i", "u", "ü", "belirtme", "belirtme"}
cekimler = {"a", "e", "a", "e", "belirtme", "yönelme"}
cekimler = {"da", "de", "da", "de", "bulunma", "bulunma"}
cekimler = {"dan", "den", "dan", "den", "bulunma", "ayrılma"}
cekimler = {"ı", "i", "u", "ü", "tamlayan", "tamlayan"}
iyelik = {}
iyelik = {"m", "m", "m", "m", "1t"}
iyelik = {"n", "n", "n", "n", "2t"}
iyelik = {"ı", "i", "u", "ü", "3t"}
iyelik = {"mız", "miz", "muz", "müz", "1ç"}
iyelik = {"nız", "niz", "nuz", "nüz", "2ç"}
iyelik = {"ı", "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 or frame:getParent().args or mw.title.getCurrentTitle()
local it = frame:getParent().args
local k = frame:getParent().args or frame:getParent().args
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' |''']'''"
.. "\n! style='background:#DEDEDE' |''']'''"
.. "\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 .. "'''"
.. "\n| style='color:black' ".. (cogul3 and "colspan='2'" or "") .."|[["
.. ayarla(say, it, "tekil", c, c, c, c, c, 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, c, c, c, c, k) .. "]]")
.. "\n|-")
end
end
tumDurumlar(ad)
table.insert(tablo, "\n! colspan='4' style='background:#DEDEDE' |''']'''"
.. "\n|-"
.. "\n! style='background:#DEDEDE' colspan='2' |"
.. "\n! style='background:#DEDEDE' |''']'''"
.. "\n! style='background:#DEDEDE' |''']'''"
.. "\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, c, c, c, "iyelik", k)
local cogul = ayarla(ad, it, "çoğul", c, c, c, c, "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, "$") then
ciftKelime = mw.ustring.match( ad, "")
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 or it == "ikizleşme"
local iy = istisnaYumusama or it == "yumuşama"
local ii = istisnaIncelme or it == "incelme"
local id = istisnaDusme or it == "düşme"
local ix = istisnaI or it == "i"
local ib = ciftKelime or istisnaBilesik 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$") and not mw.ustring.find(h1, "$") then
sonAd = mw.ustring.sub( sonAd, 1, -3 )
elseif mw.ustring.find(sonAd, "$") and mw.ustring.find(h1, "$") 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, "$") then
h1, h2, h3, h4 = "ı" .. h1, "i" .. h2, "u" .. h3, "ü" .. h4
elseif sonHarf == sonUnlu and mw.ustring.find(h1, "$") 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, "$")) 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, "$"))
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, "$") 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, "", "", 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, "$") 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, "$") 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, "$"))
and "n" or "")
end
end
if tip == "bulunma" or tip == "ayrılma" then
sonAd = sonAd .. (mw.ustring.find(sonAd, "ş$") 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$")
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, "$") 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, "$") and mw.ustring.find(ad, "$") 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 ), "$") 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, "$") 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, "()()zl()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 ] 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
--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()
--ç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 ] sayfasında bulunabilir
local it = args
--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 or args
--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 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, c, c, c, c, k) then
--eğer başka otomatik bir çekim saptandıysa başa virgül eklemeliyiz
virgul(args)
if ozel then table.insert(args, kisi) if c == "yalın" then c = "iyelik" end end
table.insert(args, c)
if ozel and mw.ustring.find(say, "lr") then table.insert(args, "ç")
else table.insert(args, "t") end
end
if cekim == ayarla(say, it, "çoğul", c, c, c, c, c, k) then
--eğer başka otomatik bir çekim saptandıysa başa virgül eklemeliyiz
virgul(args)
table.insert(args, c)
table.insert(args, "ç")
end
end
end
tumDurumlar(ad)
for i, s in ipairs(iyelik) do
local tekil = ayarla(ad, it, "tekil", s, s, s, s, "iyelik", k)
local cogul = ayarla(ad, it, "çoğul", s, s, s, s, "iyelik", k)
tumDurumlar(tekil, s, true)
tumDurumlar(cogul, s, true)
end
if args then else table.insert(args, "belirtilmemiş") end
end
return {
ayarla = ayarla,
adTablo = adTablo,
cekim_tr = cekim_tr,
}