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,
}