Modül:kategori ağacı/konu

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

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["dil"] then
		dil = require("Modül:kategori ağacı").getirDilAdi(tum.par["dil"])
		
		--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["tema"]
	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, "[[Kategori:" .. kat .. "|" .. anahtar .. "]]")
    	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[1] == "ana kategoriler" or ebeveynler[1] == "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, "[[Kategori:Tüm söz türleri]]")
		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, "[[Kategori:" .. tipkat .. " listeleri|" .. temalar(tema):getirSiraAnahtari() .. "]]")
	    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, "[[Kategori:" .. kategoriAdi .. "|" .. temalar(tema):getirSiraAnahtari() .. "]]")
	end
	
	--Ön ek kategorileri için özelleştirme
	if dil and tum.par["tema"] and mw.ustring.find(tum.par["tema"], "-%s") then
		local sec = mw.ustring.gsub( tum.par["tema"], "-.*", "" ) .. "-"
		mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Kategori:" .. dil .. " " .. '<i>' .. sec .. '</i>' 
			.. mw.ustring.gsub( tum.par["tema"], ".*-", "" ))
	end
	
	--Son ek kategorileri için özelleştirme
	if dil and tum.par["tema"] and mw.ustring.find(tum.par["tema"], "^-") then
		local sec = mw.ustring.gsub( tum.par["tema"], "%s.*", "" )
		mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Kategori:" .. dil .. " " .. '<i>' .. sec .. '</i>' 
			.. " " .. mw.ustring.gsub( tum.par["tema"], "^[^%s]*%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 "
					.. "[[:Kategori:Türkçede " .. tema .. "]] 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 "
					.. "[[:Kategori:Türkçede " .. tema .. "]] 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[i] 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[1] 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, "[[:Kategori:" .. kategoriAdi .. "]]: " .. aciklama)
		elseif mw.title.new(kategoriAdi2, "Kategori").exists then
			table.insert(cocuklar, "[[:Kategori:" .. kategoriAdi2 .. "]]: " .. 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