Modül:kategori ağacı/konu

Merhaba, buraya Modül:kategori ağacı/konu kelimesinin anlamını aramaya geldiniz. DICTIOUS'da Modül:kategori ağacı/konu kelimesinin tüm sözlük anlamlarını bulmakla kalmayacak, aynı zamanda etimolojisini, özelliklerini ve Modül:kategori ağacı/konu kelimesinin tekil ve çoğul olarak nasıl söylendiğini de öğreneceksiniz. Modül:kategori ağacı/konu kelimesi hakkında bilmeniz gereken her şey burada. Modül:kategori ağacı/konu kelimesinin tanımı, konuşurken veya metinlerinizi yazarken daha kesin ve doğru olmanıza yardımcı olacaktır. XXX'in ve diğer kelimelerin tanımını bilmek, kelime dağarcığınızı zenginleştirir ve size daha fazla ve daha iyi dilsel kaynaklar sağlar.
Modül belgelemesi

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