Bu modül Vikisözlük'teki konular, gruplar, söz türleri, kullanım yerlerine sözcükler gibi kategoriler için kullanılan modüldür.
p = {}
local dilDuzenle = require("Modül:tr-araçlar").dilDuzenle
--girilen string'in baş harfini büyük yapan fonksiyon
local function buyukHarf(x)
return mw.getContentLanguage():ucfirst(x)
end
local function temalar(tema)
return require("Modül:temalar").getirAsilAdaGore(tema)
or require("Modül:diller").getirAsilAdaGore(tema)
or require("Modül:köken dilleri").getirAsilAdaGore(tema)
end
-- Şablon:kategori konu ve grup isimli şablonlarda kullanılan fonksiyonu oluştur.
function p.kategoriAgaci(tum)
--girilen dil kodu parametresinden dilin Türkçedeki adını getiren yardımcı modül
if tum.par then
dil = require("Modül:kategori ağacı").getirDilAdi(tum.par)
--hiçbir şeye başlamadan önce şunu kontrol edelim:
--bazen dil adları, sonuna de, da ekleri eklenecek şekilde olmayabiliyor
--böyle olunca da dil parametresi boş görünüyor ve
--küçük harfle başlayan anlamsız kategoriler ortaya çıkıyor
--bunu önlemek için dil adının Türkçe yazılmış,
--yani çevrilmiş olup olmadığını kontrol edelim
dil = dilDuzenle(dil) ~= "" and dil or error("Girilen dil kodunun Türkçe bir karşılığı henüz veritabanında bulunmamakta, eklenmesine yardımcı olun")
end
--girilen temayı çok kullanacağımız için yerine kısaltma atayalım,
--aynı şekilde tip ve ebeveynler için de
local tema = tum.par
local tip = temalar(tema):getirTip()
local ebeveynler = temalar(tema):getirEbeveynler()
--yukarıda belirtilen bütün durumlara göre kategori eklemelerini yap
--bu eklemeler konuların listesinin bulunduğu dizine göre eklenmektedir
if dil then
--dillerin sonuna "de, da" eklerini ekleyen fonksiyonu uyarla
ekliDil = dilDuzenle(dil)
--bu kısım dil parametresi girilen konu ve grup kategorileri içindir
--"Türkçede teknoloji" veya "Arapçada canlılar" gibi.
if temalar(tema):getirOrtak() == true then
--tema değeri diller ise "Dillerine göre diller" gibi
--anlamsız bir kategori oluşmasının önlemek için
--bu kategorileri direkt "Diller" kategorisine ekle
local kat = tema == "diller" and buyukHarf(tema) or "Dillerine göre " .. tema
--eğer dil dillerarası ise bu kategorinin herhangi bir
--"dillerine göre .." kategorisinde en başta olmasını istiyoruz,
--bu yüzden anahtarını burada " " olarak ayarla
local anahtar = dil == "Dillerarası" and mw.ustring.char(0x0020) or dil
--diğer tüm temalar için normal olarak hepsini "Dillerine göre .." kategorilerine ekle
table.insert(tum.kat, "]")
end
--eğer bir dil girildiyse, "Türkçede ana kategoriler" olmayacağı için,
--bu kategorileri değiştirerek direk "Türkçe" olarak çevir
if ebeveynler == "ana kategoriler" or ebeveynler == "maddeler" then
table.remove(ebeveynler, t)
table.insert(ebeveynler, dil)
end
else
--dil kodu girilmeyen söz türü kategorilerini tek bir yerde toplayıp
--toplam kaç söz türü olduğunu görmek için toplu kategori
if temalar(tema):getirTip() == "söz türü" and temalar(tema):getirKategori() ~= "yanlış kullanımlar" then
table.insert(tum.kat, "]")
end
end
--konu ve grup kategorilerinde her bir konunun veya grubun
--bir ana kategoriye eklenmesi gerekiyor, mesela "Türkçede kuşlar"
--kategorisi üst kategorisi "Türkçede omurgalılar"a eklenecek,
--ama aynı zamanda tüm Türkçe grupların toplandığı,
--"Türkçede gruplar" kategorisine de eklenmesi gerekiyor
--ayrıca dil kodu girilmediyse de "Kuşlar" kategorisini
--direk "Grup listeleri" kategorisine ekliyor
if temalar(tema):getirTip() == "konu" or temalar(tema):getirTip() == "grup" then
if tema ~= "tüm gruplar" and tema ~= "tüm konular" and tema ~= "konu listeleri" and tema ~= "grup listeleri" then
tipkat = dil and ekliDil .. " " .. tip or buyukHarf(tip)
table.insert(tum.kat, "]")
end
--sonDil parametresi tamamen şu işe yarıyor: Vikisözlük'teki
--kategori sisteminde konu ve grup kategorilerinde diller "de, da" eki alıyor,
--ama söz türü vs diğer kategorilerde bu ekleri almıyorlar,
--bu yüzden bu kısımda ekliDil'i atıyoruz
sonDil = ekliDil
else
--bu kısımda da ek almamış dil'i atıyoruz
sonDil = dil
end
--kategoriyi bütün ebeveyn kategorilerine anahtarı ile birlikte ekle
for _,ebeveyn in ipairs(ebeveynler) do
--kategori şablon için bir istisna (dil kodu varsa
--"şablonları" ifadesi var ama yoksa sadece "şablonlar" şeklinde)
if not dil and (ebeveyn == "şablonları" or ebeveyn == "modülleri") then
ebeveyn = "şablonlar"
end
--dil parametresi var mı yok mu?
durum = dil and ebeveyn ~= dil
kategoriAdi = durum and temalar(ebeveyn):getirKategoriAdi(sonDil) or temalar(ebeveyn):getirKategoriAdi()
--en son kategori adlarının hepsini kategori tablosuna
--çıktı vermek için temanın anahtarı ile birlikte atıyoruz
table.insert(tum.kat, "]")
end
--Ön ek kategorileri için özelleştirme
if dil and tum.par and mw.ustring.find(tum.par, "-%s") then
local sec = mw.ustring.gsub( tum.par, "-.*", "" ) .. "-"
mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Kategori:" .. dil .. " " .. '<i>' .. sec .. '</i>'
.. mw.ustring.gsub( tum.par, ".*-", "" ))
end
--Son ek kategorileri için özelleştirme
if dil and tum.par and mw.ustring.find(tum.par, "^-") then
local sec = mw.ustring.gsub( tum.par, "%s.*", "" )
mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Kategori:" .. dil .. " " .. '<i>' .. sec .. '</i>'
.. " " .. mw.ustring.gsub( tum.par, "^*%s*", "" ))
end
--üst kısımda çıktı verilen yazıları şablonuna göre
--ayırt edip ona göre görüntü tablosuna gönderiyoruz
if tip == "konu" or tip == "grup" then
table.insert(tum.gor, yaziKonu(dil, tema))
elseif tip == "söz türü" or tip == "söz biçim" or tip == "şablon" then
table.insert(tum.gor, p.yaziSoz(dil, temalar(tema), ekliDil))
end
end
--konu ve grup kategorilerinde kullanılan açıklama fonksiyonu
function yaziKonu(dil, tema)
if dil then
--eğer dil parametresi girildiyse iki seçenek bulunmakta:
if tema == "tüm konular" or tema == "tüm gruplar" or tema == "konu listeleri" or tema == "grup listeleri" then
--eğer tema yukarıdaki dörtlüden birisiyse o zaman bu açıklama çıkmalı:
return "Bu kategori " .. dil .. " " .. tema .. " alt kategorilerini barındırmaktadır."
else
--ama normal bir tema ise bu açıklama hepsinde geçerli olacaktır:
return "Bu kategori " .. tema .. " ile ilgili " .. dil .. " söz türlerini barındırmaktadır."
end
else
--ama eğer dil parametresi yoksa:
if tema == "diller" then
--temamız diller ise, bir "Dillerine göre diller" kategorisi
--olmadığı için bu açıklamayı kullanıyoruz:
return "Bu kategori tüm dillerdeki " .. tema .. " ile ilgili söz türlerini barındırmaktadır. Buradan ulaşabileceğiniz alt sayfalar şöyledir:"
.. "\n*Özellikle Türkçe söz türleri için "
.. "] kategorisini arıyor olabilirsiniz."
else
--diğer tüm temalarda aynı açıklama geçerli:
return "Bu kategori tüm dillerdeki " .. tema .. " ile ilgili söz türlerini barındırmaktadır. Buradan ulaşabileceğiniz alt sayfalar şöyledir:"
.. "\n*İlgili söz türlerini belirli dillerdeki alt kategorilerini barındıran sayfa [[:Kategori:Dillerine göre " .. tema
.. "]] kategorisidir. Özellikle Türkçe söz türleri için "
.. "] kategorisini arıyor olabilirsiniz."
.. "\n*Diğer alt kategoriler ise başka bir konuyu içeren kategorilerdir."
end
end
end
--[[
DİKKAT: bu fonksiyon Modül:kategori ağacı/dil modülünde kullanılmaktadır.
]]--
--söz türü kategorilerinde geçerli olan açıklama fonksiyonu
function p.yaziSoz(dil, soz)
--çocuk kategorileri toplamak için tablo oluştur
cocuklar = {}
local ekliDil = dil and dilDuzenle(dil) or ""
--söz türü verilerini çekeceğimiz tablolar
veriler = require("Modül:temalar/veri/tümveri")
--şablonlar teması için bir istisna
if soz:getirKategori() == "şablonlar" then soz = temalar("şablonları") end
if soz:getirKategori() == "modüller" then soz = temalar("modülleri") end
--çocukları tek tek "çocuklar" tablosuna eklemeden önce "zincir" isimli bir tablo oluşturuyoruz
zincir = {}
--daha sonra verilerin içerisinde bulunan tabloların her biri için şunları yap:
for n, m in pairs(veriler) do
--her bir verinin ebeveynini topluyoruz çocuklara erişmek için, nedeni ise:
--bir temanın çocuklarına ulaşabilmek için önce hangi
--temalarda istenilen temanın "ebeveyn" olarak girildiğini bulmalıyız
kategoriAdi = dil and temalar(n):getirKategoriAdi(dil) or temalar(n):getirKategoriAdi()
for i=1, 5, 1 do
--yani ebeveyni girilen temaya eşit olan bütün kategorileri aşağıdaki if sorgusu ile saptayabiliriz
if m.ebeveynler and soz:getirKategori() == m.ebeveynler and mw.title.new(kategoriAdi, "Kategori").exists then
--sonra da bu çocukları tek tek zincir tablosuna atalım
table.insert(zincir, n)
end
end
end
if soz:getirKategori() == "maddeler" then
table.insert(zincir, "tüm konular") table.insert(zincir, "tüm gruplar")
table.insert(zincir, "modülleri") table.insert(zincir, "şablonları")
end
--şimdi de eğer zincir tablosunda en az 1 çocuk varsa, yani gösterecek
--çocuk kategorisi varsa şu yazıyı "çocuklar" tablosuna atalım
--eğer bunu if sorgusu yapmadan atarsak bütün söz türü kategorilerinde
--bu yazı çıkar ve altında bir alt kategori yoksa tek başına kalır
if zincir then
table.insert(cocuklar, " Buradan ulaşabileceğiniz sayfalar şöyledir:")
end
--şimdi de zincir tablosuna attığımız tüm çocukları asıl
--"çocuklar" tablosuna sırasıyla aktarma zamanı
for _,m in pairs(zincir) do
--dil olup olmamasına göre kategori adını yardımcı modülden alalım
kategoriAdi = dil and temalar(m):getirKategoriAdi(dil) or temalar(m):getirKategoriAdi()
kategoriAdi2 = dil and temalar(m):getirKategoriAdi(ekliDil) or temalar(m):getirKategoriAdi()
--girilen temanın bir açıklaması veritabanında var ise onu da alalım
aciklama = ekliDil and temalar(m):getirAciklama(ekliDil) or temalar(m):getirAciklama()
--son olarak da eğer girilen çocuk kategorimizin bir sayfası
--Vikisözlük üzerinde mevcut ise bunu açıklama kısmına ekleyebiliriz
if mw.title.new(kategoriAdi, "Kategori").exists then
table.insert(cocuklar, "]: " .. aciklama)
elseif mw.title.new(kategoriAdi2, "Kategori").exists then
table.insert(cocuklar, "]: " .. aciklama)
end
end
--eğer dil yoksa bu kategori tüm dilleri kapsayacağı için dil parametresini bu şekilde atayabiliriz
if not dil then
dil = "Tüm dillerdeki"
end
--sonuç olarak da açıklamayı ve yanına "çocuklar" tablosundaki her şeyi çıktı olarak alalım
return dil .. " " .. soz:getirKategori() .. ". "
.. soz:getirAciklama() .. " "
.. table.concat(cocuklar, "\n*")
end
--"dillerine göre .." kategorilerinin açıklaması
function p.gore(dil, tema)
if not tema then
tema = dil
end
return "Bu kategori " .. tema .. " ile ilgili söz türlerinin dillerine göre ayrılmış alt kategorilerini barındırmaktadır."
.. (mw.title.new(mw.getContentLanguage():ucfirst(tema), "Kategori").exists and " Özel olarak bu kategorinin ana sayfası olan [[:Kategori:"
.. mw.getContentLanguage():ucfirst(tema) .. "]] kategorisini arıyor olabilirsiniz." or "")
.. " Ayrıca buradan ulaşabileceğiniz alt sayfalar şöyledir:"
.. "\n*'Diladında " .. tema .. "' gibi kategoriler, ilgili söz türlerini belirli dillerde barındıran alt kategorilerdir."
end
return p