Modül:kategori ağacı

Vikisözlük sitesinden
Gezinti kısmına atla Arama kısmına atla
--Gerekli modüllerdeki tabloları ve fonksiyonları aktar
local dilDuzenle = require("Modül:tr-araçlar").dilDuzenle
local araclar = require('Modül:araçlar')

--Gerekli tabloları oluştur
local tum = {kat = {}, tab = {}, gor = {}, par = {}, hiy = {}}

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:alfabeler").getirAsilAdaGore(tema)
end

local function duzenleBag(altKat)
	--her kategoride "veriyi düzenle" bağlantısını eklemeye yarayan fonksiyon
	return "<div class=\"blockThis noprint plainlinks\" style=\"float: right; margin: 0.5em 0 0.5em 1em; background: #f8f9fa; clear: both; border: 1px #c8ccd1 solid; border-radius: 2px; padding: 5px; font-weight: bold;\">[" ..
		mw.getCurrentFrame():callParserFunction{name = "fullurl", args = {altKat, action = "edit"}} ..
		" Kategori verisini düzenle]</div>"
end

local function ilgiliDegisiklikler()
	--her kategoriye "ilgili değişiklikler" bağlantısını eklemeye yarayan fonksiyon
	local title = mw.title.getCurrentTitle().fullText
	return "<div class=\"blockThis noprint plainlinks\" style=\"float: right; margin: 0 0 0.5em 1em; background: #f8f9fa; clear: both; border: 1px #c8ccd1 solid; border-radius: 2px; padding: 5px; font-weight: bold;\">[" ..
		tostring(mw.uri.fullUrl("Özel:İlgiliDeğişiklikler", {
			target = title,
			showlinkedto = 0,
		}))
		.. ' <span title="' .. title .. ' sayfasına ve içerisindeki sayfalarda yapılan son değişiklikler">Son değişiklikler</span>]</div>'
end

function modulVarmi(ad)
--bir modülün sayfasının var olup olmadığını tespit ederken kullanın
  if package.loaded[ad] then
    return true
  else
    for _, searcher in ipairs(package.searchers or package.loaders) do
      local loader = searcher(ad)
      if type(loader) == 'function' then
        package.preload[ad] = loader
        return true
      end
    end
    return false
  end
end

function ters(tbl)
  --bir string'i ters çevirmeye yarıyan fonksiyon
  for i=1, math.floor(#tbl / 2) do
    tbl[i], tbl[#tbl - i + 1] = tbl[#tbl - i + 1], tbl[i]
  end
end

function hiyerasi(tum)
	--birçok kategori şablonunun hiyeraşisi buradadır. oldukça karmaşık olabilir
	--düzenlemeden önce tartışma sayfasında fikir belirtin
	
	--dil parametresini "dil adı" olarak getir, "nesne" olarak değil unutmayın
	local dil = tum.par["dil"] and require("Modül:diller").getirKodaGore(tum.par["dil"]):getirAsilAd()
	local alfabe = tum.par["alfabe"] and require("Modül:alfabeler").getirKodaGore(tum.par["alfabe"]):getirAsilAd()
	local tema = tum.par["tema"] or dil or alfabe
	local sablon = tum.par["şablon"]
	
	--girilen temanın tipini getir
	local tip = temalar(tema):getirTip()
	
	--dil parametresi kullanan şablonlar için
	if dil then
		--şu anda yalnızca "konu" ve "grup" şablonlarında dil adlarından
		--sonra "de, da" ekleri gelmekte, bunu ekle
		if tip == "konu" or tip == "grup" then
			ekliDil = dilDuzenle(dil)
		else
			--aksi takdirde diğer şablonlar için bu ekleri ekleme
			ekliDil = dil
		end
		--kategori dil şablonunda tema girdisi olmadığı için modül hatası
		--almamak için temayı direk dile eşitliyoruz
		if sablon == "dil" then
			tema = dil	
		end
	end
	
	--eğer bir dillerine göre kategorisi sayfasındaysak, temamızın başına
	--dillerine göre eklenmesi gerekiyor, zira şablondaki girdide bu kısım yazmıyor
	if sablon == "dillerine göre" then
		tema = temalar(tema):direktMi() and tema or "Dillerine göre " .. tema
	end
	
	--NOT: tabloya verileri tersten ekliyoruz, en sonunda da tabloyu tersine
	--çeviriyoruz, bu fonksiyonu niye böyle tersten yazmışlar diye sorgulamayın,
	--başta öyle yazılmış sonra da kalmış; bir gün daha iyi bir metod bulunursa
	--düz hâle çevrilebilir
	
	--burada asıl bulunduğumuz kategorinin adını kalın bir şekilde hiyeraşimize
	--ekliyoruz, en başta ekliyoruz bunu; çünkü daha sonra tabloyu ters çevireceğiz
	--ve bu yazı en sona gelecek
	table.insert(tum.hiy, "'''" .. temalar(tema):getirKategoriAdi() .. "'''")
	
	--girilen temanın ebeveyn kategorisinin adını tespit edelim,
	--çünkü kendisinden hemen önce ebeveynlerini tabloya eklememiz gerek
	local ebeveyn = temalar(tema):getirEbeveynler()[1]
	--bir ebeveyn saptayabiliyorsak bu ebeveyn üzerinden işlemlerimize
	--devam edebiliriz, yoksa zaten hata alacağız
	while ebeveyn do
		--dil şablonu hariç tüm şablonlar için, eğer dil parametresi
		--girildiyse, hiyeraşide en üst kategoride, kategoride bahsi
		--geçen dil ve onun üzerinde de Tüm diller kategorisi olur
		--ama bu kısım sadece ebeveynimiz en üst kategorinin bir altıysa uygulanır
		if sablon ~= "dil" and dil and ebeveyn == "ana kategoriler" then
			table.insert(tum.hiy, "[[:Kategori:" .. dil  .. "|" .. dil .. "]]")
			table.insert(tum.hiy, "[[:Kategori:Tüm diller|Tüm diller]]")
		end
		--kategori şablon için bir istisna
		--bu istisna da şöyle ki; normalde dil parametresi varken
		--"Türkçe şablonları" olur kategorinin adı,
		--ama yokken "Şablonları" olmaz, direk "Şablonlar" olur
		if not dil and (ebeveyn == "şablonları" or ebeveyn == "modülleri") then
			ebeveyn = "şablonlar"
		end
		--eğer dil parametremiz varsa, kategori adına dili de dahil ediyoruz,
		--mesela "Türkçe adıllar" gibi,
		--yoksa zaten direk "Adıllar" olacaktır kategori adı
		kategoriAdi = dil and temalar(ebeveyn):getirKategoriAdi(ekliDil) or temalar(ebeveyn):getirKategoriAdi()
		--hiçbir dil için "Türkçe maddeler" kategorisini kullanmıyoruz, bunun yerine
		--direk ana kategori olan "Türkçe" kategorisini kullanıyoruz, bu nedenden
		--dolayı da burada eğer kategori adı "Türkçe maddeler"e eşit olursa
		--bunu yoksayıyoruz ki böyle bir kategori oluşmasın
		karsilastirma = dil and dil ..  " maddeler" or nil
		if kategoriAdi ~= karsilastirma then
			table.insert(tum.hiy, "[[:Kategori:" .. kategoriAdi  .. "|" .. temalar(ebeveyn):getirAsilAd() .. "]]")
		end
		--burada da ilk bulduğumuz ebeveyn ile ilgili tüm işlemlerimizi
		--bitirmiş bulunuyoruz, ama eğer ebeveyn kategorisinin de
		--başka bir ebeveyni varsa bu defa da o ebeveyni seçip aynı
		--işlemleri tekrar onunla yapmalıyız bu işlemler en sonda hiçbir
		--ebeveyn kalmayana kadar döngü şeklinde tekrarlayacaktır
		ebeveyn = temalar(ebeveyn):getirEbeveynler()[1]
	end
	
	--işte burası da tüm tabloyu tersine çevirdiğimiz kısım
	ters(tum.hiy)
	
	--ve artık tabloyu yazıya dökelim
	return "<p class=\"clearThis\"><small>" .. table.concat(tum.hiy, " » ") .. "</small></p>"
end

function icerikCiz(tum)
	--dillere göre içerik çizelgesini bulup kategorilere ekleyen fonksiyon
	local dil = tum.par["dil"] and require("Modül:diller").getirKodaGore(tum.par["dil"]):getirAsilAd()
	
	--eğer dil parametresi yoksa, bu demektir ki kategori
	--"Sözcükler" veya "Canlılar" gibi bir kategori
	--bu kategorileri biz Türkçe Vikisözlükte olduğumuz için de
	--Türkçe içerik çizelgesi ile düşünüyoruz
	--bundan dolayı da olmayan dil parametresini Türkçe'ye eşitliyoruz
	if not dil then
		dil = "Türkçe"
	end
	
	--Var olan sayfanın başlığını alıyoruz ki başlıklara bağlantı verirken kullanalım
	local baslikYazi = mw.title.getCurrentTitle().text
	local sayfaIst = mw.site.stats.pagesInCategory(baslikYazi, "pages")
	local icKategori
	
	if sayfaIst == 0 then
		icKategori = mw.site.stats.pagesInCategory(baslikYazi, "subcats")
	else
		icKategori = mw.site.stats.pagesInCategory(baslikYazi, "pages")
	end
	
	--Eğer sayfada 200'ün üzerinde eleman varsa İçerik Çizelgesi ekle
	if icKategori > 200 then
		--Sayfa çok büyükse de eğer İçerik Çizelgesi'nin geniş versiyonu varsa onu ekle
		if icKategori > 2500 then
			local TOC_genis = mw.title.new("Şablon:" .. dil .. " içerik çizelgesi/geniş")
			
			if TOC_genis.exists then
				return mw.getCurrentFrame():expandTemplate{title = TOC_genis.text, args = {}}
			end
		end
		
		local TOC_normal = mw.title.new("Şablon:" .. dil .. " içerik çizelgesi")
		local TOC_tr = mw.title.new("Şablon:Türkçe içerik çizelgesi")
		
		if TOC_normal.exists then
			return mw.getCurrentFrame():expandTemplate{title = TOC_normal.text, args = {}}
		else
			return mw.getCurrentFrame():expandTemplate{title = TOC_tr.text, args = {}}
		end
	end
	
	return nil
end

function goster(frame)
	--bütün kategori şablonlarında kullanılan parametrelerin listesi
	local all_param = {
		[1] = {},
		["dil"] = {},
		["konu"] = {alias_of = "tema"},
		["grup"] = {alias_of = "tema"},
		["söz"] = {alias_of = "tema"},
		["karakter"] = {alias_of = "tema"},
		["tema"] = {},
		["köken"] = {},
		["tip"] = {},
		["aile"] = {},
		["alfabe"] = {},
		["vikipedi"] = {},
		["kardeşproje"] = {},
		["girdiadı"] = {},
		["anahtar"] = {},
		["okunuş"] = {},
		["okunuş2"] = {},
	}
	--listedeki tüm parametreleri okunur hâle getir
	tum.par = require("Modül:parameters").process(frame:getParent().args, all_param)
	--şablon parametresi yalnızca ana şablonların içerisinde bulunduğu için bunu ayrıyeten atıyoruz
	tum.par["şablon"] = frame.args['şablon']
	tum.par["modül"] = frame.args['modül']
	tum.frame = frame

	--eğer tema parametresi varsa bir tip parametremiz olabilir, ama yoksa olamaz
	if tum.par["tema"] then
		if temalar(tum.par["tema"]) then
			tip = temalar(tum.par["tema"]):getirTip()
		else
			--eğer girilen tema henüz oluşturulmamışsa
			return "'''<span style='color:red'>HATA:</span>''' Girdiğiniz tema kategorisi henüz veri modüllerinde mevcut değil."
				.. " Eğer tema adını doğru yazdığınıza eminseniz,"
				.. " lütfen [[Modül:temalar]]'ı ziyaret ederek gerekli veri sayfasına"
				.. " ekleme yapınız."
				.. "[[Kategori:Kategori ağacı hataları]]"
		end
		gore = tip
		--normalde tipe göre ayrı ayrı alt modül oluşturmamız gerekiyor,
		--ama aşağıdaki dört şablonun biçemleri çok benzer oldukları için
		--hepsini bir "konu" ismindeki alt modülde topladık,
		--yani dördünü de konuya eşitlememizin sebebi bu
		if tip == "grup" or tip == "söz türü" or tip == "söz biçim" or tip == "şablon" then
			gore = "konu"
		end
	end
	
	--Girilen dil adı veritabanında olan geçerli bir dil mi?
	if tum.par["dil"] then
		if not require('Modül:diller').getirKodaGore(tum.par["dil"]) then
			table.insert(tum.kat, "[[Kategori:Dil adı yanlış kategori şablonu kullanan kategoriler]]")
		end
	end
	
	--alt modülümüze erişme zamanı
	local modul = "Modül:" .. (tum.par["modül"] or "kategori ağacı/" .. tum.par["şablon"])
	local baglanti = tip and temalar(tum.par["tema"]):getirVeriModulu() or modul
	
	--Kategori verisini düzenleme bağlantısı ekle
	table.insert(tum.tab, duzenleBag(baglanti))
	table.insert(tum.tab, ilgiliDegisiklikler())
	
	--eğer dillerine göre şablonunu kullanıyorsak kategoride, bu düzenlemeler geçerli olacak
	if tum.par["şablon"] == "dillerine göre" then
		--hiyeraşiyi tanımla
		table.insert(tum.gor, hiyerasi(tum))
		--bahsi geçen konunun kategorisine "+" sıra anahtarı ile ekle
		local sonTema = temalar(tum.par["tema"]):direktMi() and temalar(tum.par["tema"]):getirEbeveynler()[1] or tum.par["tema"]
		table.insert(tum.kat, "[[Kategori:" .. buyukHarf(sonTema) .. "|+]]")
		--daha sonra da girilen temanın tipine göre açıklama yazısı ekle
		if mw.title.new("Modül:kategori ağacı/" .. gore).exists then
			table.insert(tum.gor, require("Modül:kategori ağacı/" .. gore).gore(tum.par["tema"]))
		end
	else
		--eğer alt modülümüz özel bir hiyeraşi fonksiyonuna sahipse onu aktif et
		--ama eğer değilse klasik hiyeraşi fonksiyonunu kullan
		table.insert(tum.gor, require(modul).hiyerasi and require(modul).hiyerasi(tum) or hiyerasi(tum))
		--ve alt modülümüzün ana fonksiyonu olan sonucu çalıştırabiliriz
		require(modul).kategoriAgaci(tum)
	end
	
	--Dillerine göre içerik çizelgesi ekle
	table.insert(tum.gor, icerikCiz(tum))
	
	--Dillerin yazı tiplerini ayarlar
	if tum.par['dil'] and require('Modül:diller').getirKodaGore(tum.par['dil']) and tum.par["tema"] ~= "alfabesi düzeltilmesi gereken sözcükler" then
		dil = require('Modül:diller').getirKodaGore(tum.par['dil'])
		table.insert(tum.gor, araclar.catfix(dil, dil:getirAlfabeler()[1]))
	end
	
	--kategori boş mu?
	if mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, "all") == 0 then
		table.insert(tum.kat, "[[Kategori:Boş kategoriler]]")
	end
	
	--kategori bir gizli kategori mi?
	if tum.par["tema"] and temalar(tum.par["tema"]):getirGizli() then
		table.insert(tum.gor, "__HIDDENCAT__")
	end
	
	--z_wikistyles'ı getiriyoruz, çünkü bu şablon [[MediaWiki:Z_wikistyles.css]]
	--sayfasındaki css kodlarını kategori sayfasında yüklememize yardımcı oluyor
	return require("Modül:TemplateStyles")("MediaWiki:Z_wikistyles.css") ..
			table.concat(tum.tab, "\n") .. "\n" .. table.concat(tum.gor, "\n\n") .. table.concat(tum.kat, "\n")
end

return {goster = goster}