Modül:Kategori

Modül belgelemesi[gör] [değiştir] [geçmiş] [temizle]

{{otomatik kategori}} şablonunu çalıştıran modüldür.

Çalışma mantığı[kaynağı değiştir]

  1. Önce sayfa adını işleme sokuyoruz. Mesela 2000 doğumlular.
  2. Bu sayfa adını parçalarına ayırıyoruz. Baştaki tüm sayıları yıl yerine sayıyoruz; çünkü en başta daima yıl olacağı biliniyor (şimdilik, eğer yılın başta olmadığı durumlar da bu modüle dahil edilirse buraya yeni argümanlar ekleyebiliriz). Yılın devamındaki tüm sözcükleri de sayfanın türü yani kategori adı olarak sayıyoruz. Bu durumda yılımız 2000, kategori adımız da doğumlular oluyor.
  3. Şimdi de bulduğumuz kategori adına göre işleme devam etmeliyiz. Modül:Kategori/veri sayfasında listelenen nesneler arasından doğumlular başlığını saptıyoruz. 2000 doğumlular veya 2000'lerde doğanlar gibi sayfaların ortak kategori nesnesi bu.
  4. En başta, nesnenin kategori değerine göre yukarıya bulunduğu yıldan 5 değer öncesi ve 5 değer sonrasına kadar mevcut bir gezinti çubuğu eklenir. Bu çubuğun alt satırında bir de ebeveyn çubuk bulunur. Bu da, mesela bir yıl kategorisindeysek şu anda olduğu gibi; 2000 doğumlular bir yıl kategorisi. Bunun bir üstü onyıl kategorisidir. Yani 2000'lerde doğanlar. Eğer mevcut kategorinin bir üstü yani onyıl kategorisi mevcutsa ebeveyn çubuk da, gezinti çubuğu ile birlikte görünür. Yoksa yalnızca gezinti çubuğu görünür. Ama biz zaten bir onyıl kategorisindeysek bu defa onyıllar ebeveyn çubuk değil, gezinti çubuğu olurlar. Çünkü her zaman bulunduğumuz kategorinin yıl tipi bizim asıl gezinti çubuğumuzdur. Bu durumda 2000'lerde doğanlar kategorisinin ebeveyn çubuğu da yüzyıllar olur. Yani 21. yüzyılda doğanlar. Gidebildiğimiz kadar üst rütbeye çıkabiliriz yani. Fakat görüntüleyebileceğimiz çubuk sayısı her sayfada iki adettir. Bir gezinti çubuğu ve bir de ebeveyn çubuk.
  5. Çubukların hemen altında açıklama yazıları mevcuttur. Nesnemizin bir açıklama yazısı var ise, onu gösteririz. Yoksa da boş görüntülenir.
  6. Açıklama yazısının yanında, sağ tarafa sabit bir Commons bağlantı şablonu da bulunabilir. Bu da şu şekilde çalışmakta, sayfa eğer bir vikiveri ögesine bağlıysa bu ögeyi çağırıyoruz. Daha sonra bu ögenin bir Commons değeri olup olmadığını kontrol ediyoruz. Varsa da şablonu ekliyoruz.
  7. Son olarak da yukarıda ebeveynler değerlerinde anlatıldığı şekilde, tüm ebeveynler, sıra anahtarları kullanılarak sayfaya eklenir. Yani kategori, eklenmesi gereken tüm üst kategorilere eklenir.

Nesnelerin yapısı[kaynağı değiştir]

Bir nesnenin yapısı şu şekildedir (her nesnede aynı etiketler mevcut):

k["doğanlar"] = {
	"doğumlular",
	ek = {"y", "d"},
	ebeveynler = {"başlangıçlar", "kişiler"},
	sira_anahtari = {"D", "D"},
	kademe = 4,
	aciklama = "{{{yılda}}} doğmuş olan insanlar",
	bak = {"ölenler"},
	gore = "doğum",
}

numaralı değerler[kaynağı değiştir]

1, 2, 3 veya 4 numaralı değerler şu anlamda kullanılır; mesela genel olarak eserler kategorileri şu şekildedir:

Görüleceği üzere tüm kademelerde (yıl, onyıl, yüzyıl ve binyıl) sonuna eklenen kısım aynı ve bu eserler. Ama bazu durumlarda bu adlar aynı olmayabilir. Yukarıdaki doğanlar nesnesinde 1 numaralı değer doğumlular olarak girilmiş, bunun sebebi şudur:

Birinci kademede (yıl değerinde) doğumlular yazılırken üst kademelerde doğanlar yazılır. Eğer bu durum şöyle olsaydı:

  • 2012'de doğanlar
  • 2010'lar doğumlular
  • 21. yüzyılda doğanlar
  • 3. binyılda doğanlar

Bu defa da nesnede şöyle bir giriş yapılması gerekirdi:

k["doğanlar"] = {
	nil, "doğumlular"
}

1 numaralı değeri geçersiz kılacak "nil" değerini girmeliyiz ve ardından 2 numaralı değere de ikinci kademe kategorinin (onyıl) adında doğumlular eklendiği için bu değeri yazmalıyız. 3 ve 4 numaralı değerleri kullanmıyoruz, çünkü bir farklılık olmadığı sürece gerek yok.

ek=[kaynağı değiştir]

Bu değer bir nesne tipindeki yıl, onyıl, yüzyıl veya binyıl değerinden sonra "de, da" eklerinin eklenip eklenmeyeceğini saptamamıza yardım eder. Bu değerin tipi bir string de olabilir, table da. Yukarıda gördüğümüz örnekte bir tablo olarak eklenmiş. Bunun sebebi şu:

Bu listede yıl kademesinde ek yok, fakat üst kademelerde var. Bu sebeple şu şekilde tablo eklenmiş: {"y", "d"} Birinci "y" değeri, "yanlış" demek, yani ek eklenmemeli. İkinci "d" değeri ise "doğru" demek yani ek eklenmeli. Bunun sıralaması da şu şekildedir, bu tablo içerisine 4 numaraya kadar değer eklenebilir, her bir değer bir kademe (yıl, onyıl, yüzyıl veya binyıl) içindir. Birinci değer yıl kademesi içindir, ikinci değer onyıl kademesi içindir ve eğer devamında bir değer yoksa ikinci değerde olduğu gibi kullanılır.

Tabi hepsi birbiri ile tutarlı ise, yukarıdaki eserler örneğindeki gibi. Buraya tablo yerine ek = "d", şeklinde bir değer eklenir yalnızca. Bu da her kademede ek eklenmesi gerektiğini söyler.

ebeveynler=[kaynağı değiştir]

Kategorinin eklenmesi gereken üst kategorilerin tipine göre kategori adlarının listesini bize verir. Yukarıdaki durumda ilk ebeveynimiz başlangıçlar mesela. Bu demek oluyor ki, en başta sayfa adından ayırdığımız yıl değerini en başa ekleyip uygun ebeveyne eklememiz gerek. Yılımız 2000 idi. Yani ilk ebeveynimiz 2000'de başlangıçlar olacak. Burada yılın ekinin eklenip eklenmeyeceğini de başlangıçlar nesnesine bakarak anlıyoruz:

k["başlangıçlar"] = {
	ek = "d",
	ebeveynler = {"kategoriler"},
	sira_anahtari = {"B"},
	kademe = 4,
}

İkinci ebeveynimiz de kişiler, aynı işlem bu ebeveyne de yapılır.

Şimdi ise, bir üst kademe kategorisine geçmemiz gerek, bir üst kademe onyıl kategorisi olduğu için mevcut yılın bulunduğu onyılı saptıyoruz öncelikle, ki bu da 2000'ler, yani sonuç olarak da 2000'lerde doğanlar ebeveynini elde ediyoruz. Her bir nesnenin bir üst seviyedeki kategorisi otomatik olarak saptanmaktadır. Yani, bu durumda 2000'lerde doğanlar nesnesinin üst kategorisini elde ettik, fakat eğer bu tipi onyıla göre ayırıyorsak bu kategori eklenir. Aksi takdirde eklenmez. Bir üst kademe kategorisinin hangi durumlarda eklenip eklenmeyeceği aşağıdaki kademe= başlığında açıklanmıştır.

sira_anahtari=[kaynağı değiştir]

Bir tablodur. Bu tablonun içerisinde sırasıyla her ebeveyne eklenecek olan kategori anahtarı bulunur. Kategori anahtarı ise, bir kategori eklerken sıralanacağı harfi belirler. Yani [[Kategori:2020'de sanat|E]] ifadesindeki E bir kategori anahtarıdır. Her kategori, her ebeveynine farklı bir anahtar ile eklenebilir. Önemli olan ebeveynlerin ve anahtarların aynı sıralamada olmasıdır.

kademe=[kaynağı değiştir]

Bir kategori tipinin hangi kademeye kadar devam edeceğini belirtir. Mesela yukarıdaki örnekte bu değer 4 olarak belirlenmiş. Bu demek oluyor ki, doğanlar kategorilerini yıldan, binyıla kadar ayırt edebiliyoruz. Fakat derleme albümleri nesnesini incelediğimizde:

k["derleme albümleri"] = {
	ek = "y",
	ebeveynler = {"albümler"},
	sira_anahtari = {"D"},
	kademe = 2,
	sonHarfSil = true,
}

Görüyoruz ki, buradaki kademe 2, yani bu derleme albümlerini yalnızca yıla ve onyıla göre ayırt edebiliyoruz. Bu kademe değerleri zamanla yoğunluğa göre değiştirilebilir.

aciklama=[kaynağı değiştir]

Sayfada eğer bir açıklama yazısı eklenecek ise bu yazıdır.

bak=[kaynağı değiştir]

Eğer {{kategori ayrıca bakınız}} şablonu ile en başa eklenmesi gereken başka bir kategori varsa, bunu buraya ekleyebiliriz. Örnekte {"ölenler"} şeklinde eklenmiş. Bir tablonun içerisinde "ölenler" değeri var. Yani ölenler nesnesini çağırıp onun aynı kademediki karşılık kategorisini en üste ekliyoruz.

sonHarfSil=[kaynağı değiştir]

Bu varsa true değeri ile eklenebilir. Bu şu amaç için kullanılır, mesela derleme albümleri kategorileri şu şekildedir:

Ama bunların her biri şöyle ana kategorilere sahiptir:

Görüldüğü üzere "yıla göre ..." ifadesinde kullanılırken derleme albümleri ifadesindeki son harf olan "i" silinmiştir, yani eğer bu değer girilirse göre kategorilerinde hep son harf silinir. Benzer durumlar; "2010 şarkıları", "2010 albümleri" vs...

gore=[kaynağı değiştir]

Bu değer Yıla göre derleme albümler veya Döneme göre müzik tarzı kategoriler için kullanılan bir değerdir. Mesela en üstteki örneğimizde bu değer gore = "doğum", şeklinde girilmiş. Bu demek oluyor ki, Döneme göre doğanlar kategorisindeysek, bu kategorinin üst kategorisi "doğanlar" veya "doğumlular" değil "doğum" şeklinde olmalıdır.

Bu değer eğer üst olursa, Yıla göre remiks albümlerinde olduğu gibi, bunun üst kategorisi yani bir "Döneme göre ..." kategorisi yoktur, bu sebeple de direkt Remiks albümleri kategorisine eklenir.

Bu değer eğer hayır olursa, Başladığı döneme göre televizyon dizilerinde olduğu gibi, bunun üst kademesi eklenmez, yalnızca ebeveynler değerleri eklenir.

Veri modülleri[kaynağı değiştir]

Eğer bir ana kategori genişlemiş ise bunun alt kategorisinin modülü ayrıca açılabilir.

Liste[kaynağı değiştir]

Tüm veriler detaylıca buradan incelenebilir: {{otomatik kategori/liste}}

--Genel veriler

local degerler = {"kurulan", "feshedilen", "feshedilmiş", "kapanan", "kapatılan", "varlığı sona eren",
	"başlayan", "sona eren", "tamamlanan", "tamamlanmış", "tanıtılan", "tanıtılmış", "tanımlanan",
	"oluşturulan", "doğan", "ölen",
}

--lazım olabilecek kademe listesi
local kademeler = {"yıl", "onyıl", "yüzyıl", "binyıl"}

--bu fonksiyon girilen bir yazıda birinci değeri bulup
--onu ikinci değer ile değiştirmeye yarar
local function bulvedeg(yazi, bir, iki)
	return mw.ustring.sub(mw.ustring.gsub(yazi, bir, iki), 1, -1)
end

--yerelde kod kısaltmak için
local bul = mw.ustring.find

--zaman modülü
local zaman = require("Modül:Zaman")
local function yilBul(p1, p2) return zaman.YIL({args={p1, p2}}) end
-- bu fonksiyonun sonucu "2020'ler" gibi olur
local function onYil(p1, p2) return zaman.ONYIL({args={p1, p2}}) end
-- bu fonksiyonun sonucu "21. yüzyıl" gibi olur
local function yuzYil(p1, p2) return zaman.YUZYIL({args={p1, p2}}) end
-- bu fonksiyonun sonucu "3. binyıl" gibi olur
local function binYil(p1, p2) return zaman.BINYIL({args={p1, p2}}) end

-- tipe göre ikinci tablodaki değerleri verir
local function tipeGorePar(tip, tab)
	if tip == "yıl" then return tab[1]
	elseif tip == "onyıl" then return tab[2]
	elseif tip == "yüzyıl" then return tab[3]
	elseif tip == "binyıl" then return tab[4] end
end

---*---*---*---*---*---*---*---*---*---*---*---*---
-- kategori nesnesini ilgilendiren
-- fonksiyon ve tablolar
---*---*---*---*---*---*---*---*---*---*---*---*---
local Kategori = {}


function Kategori:getirAsilAd()
	return tipeGorePar(self._tip, self._rawData) or self._asilAd
end


function Kategori:getirKategoriAdi()
	local yil = self:getirYil()
	local ad = self:getirAsilAd()
	
	local function mevcutMu(yil, ad)
		local d1, d2 = yil, ad
		if self:yilSondaMi() == true then
			d1, d2 = ad, yil
		end
		return mw.title.new('Kategori:' .. d1 .. d2).exists and d1 .. d2 or d1 .. " " .. d2
	end
	
	local k = type(self._rawData.ek) == "table"
	local yEk = k and self._rawData.ek[1] or self._rawData.ek
	local oEk = k and self._rawData.ek[2] or yEk
	local uEk = k and self._rawData.ek[3] or oEk
	local bEk = k and self._rawData.ek[4] or uEk

	local ek = tipeGorePar(self:getirTip(), {yEk, oEk, uEk, bEk})
	
	if yil then
		return ek == "d" and mevcutMu(yilEki(yil), ad) or mevcutMu(yil, ad)
	else
		return ad
	end
end


function Kategori:getirCubukAdi()
	return tipeGorePar(self._tip, {
		yilBul(self._yil), self._yil,
		bulvedeg(self._yil, "yüzyıl", "yy"), bulvedeg(self._yil, "binyıl", "by")
	})
end


function Kategori:getirYil()
	return tipeGorePar(self._tip, {
		yilBul(self._yil), onYil(self._yil),
		yilBul(self._yil)..". yüzyıl", yilBul(self._yil)..". binyıl"
	})
end


function Kategori:gore()
	return self._rawData.gore
end


function Kategori:kademe()
	return self._rawData.kademe
end


function Kategori:yilSondaMi()
	return self._rawData.y_son or nil
end


function Kategori:getirUstYil()
	return tipeGorePar(self._tip, {
		onYil(self._yil), yuzYil(self._yil), binYil(self._yil)
	})
end


function Kategori:getirVikiveri()
	return mw.wikibase.getEntity(mw.wikibase.getEntityIdForCurrentPage())
end


function Kategori:sonHarfSil()
	local shs = self._rawData.sonHarfSil
	local shs2 = self._rawData.sonIkiHarfSil
	local asilAd = type(shs) == "table" and self:getirAsilAd() or self._asilAd
	
	if type(shs) == "table" then
		shs = tipeGorePar(self._tip, shs)
	end
	if shs  == true or shs2  == true then
		asilAd = mw.ustring.sub(asilAd, 1, (shs2 and -3 or -2))
	end
	
	return asilAd
end


function Kategori:getirEbeveynler()
	local ebeveynler = {}

	--ebeveynlerin listesi
	islem = self._rawData.ebeveynler or {}
	local tip = self._tip

	--her ebeveynimizi nesneye dönüştürüyoruz
	for _,ebeveyn in ipairs(islem) do
		--normalde ana dizinimiz kategoriler'dir, fakat "göre" tipli kategorilerde
		if ebeveyn == "kategoriler" and tip ~= "göre" then ebeveyn = "" end
		--bu ebeveynlerin birer döneme göre ... kategorisi mevcut değildir
		if ebeveyn == "yıllar" or ebeveyn == "onyıllar" or ebeveyn == "yüzyıllar" or ebeveyn == "binyıllar" then tip = "üst" end
		--burada da "kişiler" nesnesi için "[YIL] kişileri" ve "[ONYIL] kişileri"
		--kategorilerinin oluşmasından kaçınıyoruz
		if ebeveyn == "kişiler" and (tip == "yıl" or tip == "onyıl") then else
			table.insert(ebeveynler, getirAsilAdaGore(ebeveyn, self._yil, tip))
		end
	end
	
	--[[
		ebeveynleri çağırırken, her birini yeni bir kategori nesnesi olarak çağıracağız,
		fakat, normal ebeveyn nesnelerinin dışında her bir kategorinin kendisine ait
		bir üst kategorisi vardır; mesela 2010'da eserler'in üst kategorisi: 2010'larda eserler
		onun da bir üstü 21. yüzyılda eserler; bu üst kategorilerin var olup olmadığını
		kontrol etmek gerekiyor
	--]]
	if self:getirUstTip() then
		table.insert(ebeveynler, getirAsilAdaGore(self:getirAsilAd(), self:getirUstYil(), self:getirUstTip()))
	end

	--[[
		işte burası eğer ebeveynlerde bir "göre" kategorisi yoksa
		otomatik "Yıla göre .." veya "Yüzyıla göre .." düzeninde
		kategoriler ekleniyor
		
		eğer self:sonHarfSil() fonksiyonunu kullanıyorsa bir nesne,
		bunun "Yıla göre .." kategorisi eklenirken en sondan bir harfi silinir
		sebebi de, mesela "2010 kişileri" kategorisini "Yıla göre kişileri"
		değil de "Yıla göre kişiler" yapmalıyız, bu tarz kategorilerde "sonHarfSil"
		değeri mevcuttur, bu da bu işlemin yapılmasına olanak sağlar
	--]]
	local katAd = self:sonHarfSil()
	if katAd ~= "" and tip ~= "göre" then
		if bul(katAd, "göre") and not bul(katAd, "kıtalara") then
			table.insert(ebeveynler, getirAsilAdaGore(tip.."a ve "..katAd, self._yil, self._tip))
		else
			table.insert(ebeveynler, getirAsilAdaGore(tipHallet(katAd, tip), self._yil, self._tip))
		end
	end
	
	--tüm nesnelerin çıktısı
	return ebeveynler or {}
end


function Kategori:getirBak()
	local bak = self._rawData.bak or {}
	local son = {}
	
	if self._tip == "göre" then
		for _,b in ipairs(bak) do
			local baslik = mw.getContentLanguage():ucfirst(tipHallet(b, self._yil))
			if mw.title.new("Kategori:"..baslik).exists then table.insert(son, baslik) end
		end
	else
		for _,b in ipairs(bak) do
			local baslik = getirAsilAdaGore(b, self._yil, self._tip):getirKategoriAdi()
			if mw.title.new("Kategori:"..baslik).exists then table.insert(son, baslik) end
		end
	end
	
	return son
end


function Kategori:getirPortaller()
	local portaller = {}
	for _,p in ipairs(self._rawData.portaller or {}) do table.insert(portaller, p) end
	local alt = mw.ustring.gsub(self:getirVeriModulu(), ".*/", "")
	if mw.title.new('Portal:' .. alt).exists then
		table.insert(portaller, alt) 
	end
	if self._asilAd ~= "" and mw.title.new('Portal:' .. self:sonHarfSil()).exists and alt ~= self:sonHarfSil() then
		table.insert(portaller, self:sonHarfSil())
	end
	return portaller
end


function Kategori:getirAciklama()
	if self._rawData.aciklama then
		return mw.getContentLanguage():ucfirst(parametreleriHallet(self._rawData.aciklama, self:getirYil(), self:getirTip(), self._yil)) .. "."
	elseif bul(mw.title.getCurrentTitle().text, "^MÖ") then
		return "Bu kategori "..mw.title.getCurrentTitle().text.." içindir."
	else
		return "Bu kategori "..mw.getContentLanguage():lcfirst(mw.title.getCurrentTitle().text).." içindir."
	end
end


function Kategori:getirTip()
	return self._tip
end


function Kategori:getirUstTip()
	if self._tip == "yıl" and self._rawData.kademe and self._rawData.kademe > 1 then
		return "onyıl"
	elseif self._tip == "onyıl" and self._rawData.kademe and self._rawData.kademe > 2 then
		return "yüzyıl"
	elseif self._tip == "yüzyıl" and self._rawData.kademe and self._rawData.kademe > 3 then
		return "binyıl"
	end
end


function Kategori:getirVeriModulu()
	return self._modul
end


function Kategori:getirSiraAnahtari()
	local zincir = {}
	local siraAnahtarlari = {}
	
	--buradaki seviyeler tablosu aynı ebeveynlerde olduğu
	--gibi onlarla eşleşecek şekilde çalışıyor
	local anahtarlar = {["yıl"]="YSON", ["onyıl"]="YSONİKİ", ["yüzyıl"]="DORTLU", ["binyıl"]="DORTLU"}
	
	
	for s,a in ipairs(self._rawData.sira_anahtari or {}) do
		table.insert(zincir, a)
	end
	
	if self:getirUstTip() then
		table.insert(zincir, anahtarlar[self._tip])
	end
	
	local tip = self._tip
	if self._rawData.ebeveynler and self._rawData.ebeveynler[2] == "kişiler" and (tip == "yıl" or tip == "onyıl") then
		table.remove(zincir, 2)
	end
	
	table.insert(zincir, "DORTLU")

	for _,anahtar in ipairs(zincir) do
		if anahtar == "YSON" then anahtar = mw.ustring.sub( self._yil, -1 )
		elseif anahtar == "YSON-1" then anahtar = mw.ustring.sub( tostring(tonumber(self._yil)-1), -1 )
		elseif anahtar == "YSONİKİ" then anahtar = mw.ustring.sub( self._yil, -2 )
		elseif anahtar == "YIL" then anahtar = self._yil
		elseif anahtar == "DORTLU" then anahtar = bul(self._yil, "-") and "-"..tostring(9999+tonumber(self._yil))
			or (string.len(self._yil) == 1 and "000"..self._yil
			or (string.len(self._yil) == 2 and "00"..self._yil
			or (string.len(self._yil) == 3 and "0"..self._yil
			or (string.len(self._yil) == 4 and self._yil)))) end
		table.insert(siraAnahtarlari, anahtar)
	end

	return siraAnahtarlari
end


function Kategori:toJSON()
	local ret = {
		ebeveynler = self:getirEbeveynler(),
		aciklama = self:getirAciklama(),
		asilAd = self:getirAsilAd(),
		yil = _yil,
		tip = _tip,
		sira_anahtari = self:getirSiraAnahtari(),
		sonHarfSil = self:sonHarfSil(),
		}
	
	return require("Modül:JSON").toJSON(ret)
end


function Kategori:getRawData()
	return self._rawData
end


Kategori.__index = Kategori


function olusturNesne(asilAd, veri, yil, tip, modul)
	return veri and
		setmetatable({ _rawData = veri, _asilAd = asilAd, _yil = yil, _tip = tip, _modul = modul }
			, Kategori)or nil
end


function tipHallet(ad, tip)
	tip = bul(ad, "kurulan") and "kurulduğu "..tip
		or (bul(ad, "feshedil") and "feshedildiği "..tip)
		or (bul(ad, "varlığı sona eren") and "feshedildiği "..tip)
		or (bul(ad, "kapa[tn][ıa][ln]") and "feshedildiği "..tip)
		or (bul(ad, "başlayan") and "başladığı "..tip)
		or (bul(ad, "sona eren") and "sona erdiği "..tip)
		or (bul(ad, "tamamlan") and "tamamlandığı "..tip)
		or (bul(ad, "tanıtıl") and "tanıtıldığı "..tip)
		or (bul(ad, "tanımlan") and "tanımlandığı "..tip)
		or (bul(ad, "oluşturulan") and "verilmeye başlandığı "..tip)
		or (bul(ad, "doğan%s") and "doğduğu "..tip)
		or (bul(ad, "ölen%s") and "öldüğü "..tip)
		or tip
	
	for _,d in ipairs(degerler) do
		ad = bulvedeg(ad, d.."%s", "")
	end
	
	if bul(ad, "kıtalara") then
		return "Kıtalara göre "..tip.."l"..(bul(tip, "dönem$") and "e" or "a").."r"
	else
		return tip
			..(bul(tip, "dönem$") and "e" or "a")
			..(bul(ad, "göre") and " ve " or " göre ")
			..ad
	end
end


function getirAsilAdaGore(asilAd, yil, tip)
	local altsayfalar = {
		"veri",
		"veri/kişiler",
		"veri/sanat",
		"veri/bilim",
		"veri/kıtalara göre",
	}
	
	local verimodulu
	
	for _, altsayfa in ipairs(altsayfalar) do
		verimodulu = "Modül:Kategori/" .. altsayfa
		if require(verimodulu)[asilAd] then
			asilAd = type(require(verimodulu)[asilAd]) == "string" and require(verimodulu)[asilAd] or asilAd
			break
		end
	end
	
	tablo = mw.loadData(verimodulu)
	
	if not tablo[asilAd] then
		tablo = {[asilAd] = {}}
		if asilAd == "" then
			tablo[""] = {
				ebeveynler = {tip.."lar"},
				sira_anahtari = {"DORTLU"},
				kademe = 4,
			}
		end
		if bul(asilAd, "göre") then
			tip = "göre"
			tablo[asilAd] = {
				ebeveynler = {bulvedeg(asilAd, ".*göre%s", "")},
				sira_anahtari = {mw.ustring.char(0x0020)},
			}
		end
		verimodulu = "Modül:Kategori"
	end
	
	return olusturNesne(asilAd, tablo[asilAd], yil, tip, verimodulu)
end

---*---*---*---*---*---*---*---*---*---*---*---*---
-- nesneleri kategori sayfalarında yansıtan
-- fonksiyonlar
---*---*---*---*---*---*---*---*---*---*---*---*---

local function duzenleBag(altKat)
	--her kategoride "veriyi düzenle" bağlantısını eklemeye yarayan fonksiyon
	return "<div class=\"toccolours hlist plainlinks\" style=\"float: right; margin: 0.5em 0 0.5em 1em; font-weight: bold;\">[" ..
		mw.getCurrentFrame():callParserFunction{name = "fullurl", args = {altKat, action = "edit"}} ..
		" Kategori verisini düzenle]</div>"
end

function parametreleriHallet(ad, yil, tip, yil2)
	local sonuc = ad
	
	if tip == "göre" then
		yil = tipHallet("", yil2)
	end
	if yil then
		sonuc = bulvedeg(sonuc, "{{{yıl}}}", yil)
		sonuc = bulvedeg(sonuc, "{{{yılda}}}", yilEki(yil))
	end
	
	return sonuc
end

--bu fonksiyon bir kategorinin bulunduğu yıla göre üst kısımda
--bir gezinti çubuğu oluşturur
function gezintiCubugu(kategori)
	--en başta bir tablo oluşturuyoruz, en sonda
	--bu tablonun içine sırayla yüklediğimiz gezinti
	--bağlantılarının çıktısını alacağız
	local tablo = {}
	
	--[[
		bu :getirAsilAd() değeri, bir kategori türünün yıldan
		sonra gelen kısmıdır, yani 2010'de eserler kategorisinde
		bu değer "eserler" dir
	
		burada sayfa son ekini belirliyoruz, yani herhangi bir yıldan
		sonra kategorinin adında gelen kısım, bunu kod satırı azaltmak
		amacıyla burada belirttik
	
		burada kontrol ettiğimiz şey de şu, eğer iki farklı değerimiz
		var ise, yani 2010 yılında doğanlar kategorisinde normalde
		bu değerin "yılında doğanlar" olması gerekir, fakat bunun bir üst
		kategorisi "2010'larda doğanlar" olduğu için burada iki farklı
		değeri birbirinden ayırmamız gerekiyor
	--]]
	local sayfa = kategori:getirAsilAd()
	
	--eğer en baştaki yıl değerine sonradan ihtiyacımız olursa diye,
	--bir sonYil değeri belirtiyoruz, çünkü gezinti çubuğunda sürekli
	--bu değer üzerinde oynama yapacağız
	local yil = kategori:getirYil()

	local function tekrarla(y, tip, sayfa)
		local function mevcutMu(sayfa)
			return mw.title.new('Kategori:' .. sayfa).exists
		end
		--5 tane alt kategori, 5 tane de üst kategoriyi çağırmalıyız
		for i = -5, 5 do
			--burada döngü her seferinde sayıyı bir artırarak
			--bize bir sonraki yıl değerini verecek
			local arYil = tipeGorePar(tip, {
				yilBul(y, i), onYil(y, i..0),
				yilBul(y, i) .. ". yüzyıl", yilBul(y, i) .. ". binyıl"
			})
			son = getirAsilAdaGore(sayfa, arYil, tip)
			--şimdi sayfaları kontrol edelim
			--MÖ 0'lar için özel durum
			if tip == "onyıl" and son:getirCubukAdi() == "0'lar" then
				if mevcutMu("MÖ "..son:getirKategoriAdi()) then
					table.insert(tablo, '\n*[[:Kategori:' .. "MÖ "..son:getirKategoriAdi() .. "|MÖ " .. son:getirCubukAdi() .. "]]")
				else
					table.insert(tablo, '\n*<span style="color:#888">MÖ ' .. son:getirCubukAdi() .. "</span>")
				end
			end
			--eğer kategorimiz "2020'de eserler" gibi "de, da" eki
			--içeren bir kategoriyse
			if mevcutMu(son:getirKategoriAdi()) then
				table.insert(tablo, '\n*[[:Kategori:' .. son:getirKategoriAdi() .. "|" .. son:getirCubukAdi() .. "]]")
			else
				--ya da o yıla dair, mevcut kategori türünde hiçbir sayfa mevcut değilse
				table.insert(tablo, '\n*<span style="color:#888">' .. son:getirCubukAdi() .. "</span>")
			end
		end
	end
	
	local function ebeveynKontrol(kategori, tablo, tip)
		if kategori:getirUstTip() and kategori:getirUstTip() == tip then
			--eğer bir yıl kategorisinin içerisindeysek ve ebeveyn kategoriler mevcutsa,
			--yani "2020'de eserler" için "2020'lerde eserler" kategorisi mevcutsa
			--bir ebeveyn çubuk tablo başı çağırabiliriz
			table.insert(tablo, '\n|}')
			table.insert(tablo, '\n{| class="toccolours hlist" style="border: none; background: transparent;"'
				.. '\n|')
		end
	end
	
	--asil gezinti çubuğunun tablo başlangıcı
	table.insert(tablo, '<center><div style="padding-bottom: 10px;">\n{| class="toccolours hlist"'
		.. '\n|')
	
	--eğer bir yıl kategorisindeysek direk asil gezinti çubuğunda
	--yılları listeleyebiliriz
	if kategori:getirTip() == "yıl" then
		tekrarla(yil, "yıl", sayfa)
	end
	
	--[[normalde bir on yıl kategorisindeysek, bu on yılı yuzYil() fonksiyonuna
	    gönderip, onun yüz yılını öğrenmemiz gerekiyor, fakat
	    zaten bir yüz yıl kategorisindeysek, oraya göndermemizin bir anlamı yok
	    çünkü elimizdeki değer zaten yüz yıl, bu nedenle burada bu fonksiyonu sıfırlıyoruz
	--]]
	if kategori:getirTip() == "yüzyıl" then
		function yuzYil(yil) return yil end
	elseif kategori:getirTip() == "binyıl" then
		function binYil(yil) return yil end
	end
	
	--ONYIL
	ebeveynKontrol(kategori, tablo, "onyıl")
	--şimdi gelelim on yılları listelemeye
	--eğer bir yıl veya on yıl kategorisindeysek on yılları listeleyebiliriz
	if (kategori:getirUstTip() and kategori:getirUstTip() == "onyıl") or kategori:getirTip() == "onyıl" then
		tekrarla(yil, "onyıl", sayfa)
	end
	
	--YÜZYIL
	ebeveynKontrol(kategori, tablo, "yüzyıl")
	--şimdi gelelim yüzyılları listelemeye
	--eğer on yıl veya yüzyıl kategorisindeysek yüzyılları listeleyebiliriz
	if (kategori:getirUstTip() and kategori:getirUstTip() == "yüzyıl") or kategori:getirTip() == "yüzyıl" then
		tekrarla(yuzYil(yil), "yüzyıl", sayfa)
	end
	
	--BİNYIL
	ebeveynKontrol(kategori, tablo, "binyıl")
	--şimdi gelelim binyılları listelemeye
	--eğer yüzyıl veya binyıl kategorisindeysek binyılları listeleyebiliriz
	if (kategori:getirUstTip() and kategori:getirUstTip() == "binyıl") or kategori:getirTip() == "binyıl" then
		tekrarla(binYil(yil), "binyıl", sayfa)
	end
	
	--sonunda tüm gezinti çubuklarının kapanışını yapıyoruz
	table.insert(tablo, '\n|}\n</div></center>')
	
	--ve hepsinin çıktısı da burada alınıyor
	return table.concat(tablo)
end

--yıllara ek getirmeye yarayan fonksiyon
--örnek olarak 2010'da veya 2015'te
function yilEki(yil)
	--bu durum ondalık yıllarda kullanılma durumlarında geçerlidir
	--yani 2010'larda, 2080'lerde gibi
	if bul(yil, "l[ea]r$") then
		local harf = mw.ustring.sub(yil, -2, -2)
		return yil .. "d" .. harf
	elseif bul(yil, "yüzyıl$") or bul(yil, "binyıl$") then
		return yil .. "da"
	elseif bul(yil, "%d") then
		--[[buradaki durumlarda bir yıla ek getirmek içindir
		    yani 2009'da veya 2003'te gibi
		    eğer yılın son rakamı "3,4,5" ise ekimizin ilk harfi
		    t olmalı çünkü bu rakamlarda kalın ek kullanıyoruz
		    bunların dışındaki durumlarda ise "d olacak"
		--]]
		local ilkek = bul(yil, "[345]$") and "t" or "d"
		--ve eğer son rakam "0,6,9" ise ekimizin ikinci harfi
		--a olur, kalan durumlarda ise e
		local sonek = bul(yil, "[069]$") and "a" or "e"
		--yukarıdaki durumlar birleştirildiğinde "de, da, te, ta"
		--eklerini elde edip çıkartacağız
		ilkek = (bul(yil, "40$") or bul(yil, "60$") or bul(yil, "70$")) and "t" or ilkek
		sonek = (bul(yil, "00$") or bul(yil, "20$") or bul(yil, "50$") or bul(yil, "70$") or bul(yil, "80$")) and "e" or sonek
		return yil .. "'" .. ilkek .. sonek
	else
		return yil
	end
end

--[[bu fonksiyon kategori adındaki yılı ve kategori tipini
    ayırt edip ayıklamaya yarar
    mesela "2017'de başlayan internet dizileri" kategorisini
    ele alalım bu ad, işleme sokulduğunda çıktıda elimize
    birinci değeri "2017" olan ve ikinci değeri de
    "yılda başlayan internet dizileri" olan bir tablo verir
--]]
function karsilastirYillari(ad)
	--yıl değerini başlatıyoruz
	local yil = ""
	local tip
	
	--bu bir MÖ yıl kategorisi mi?
	if bul(ad, "MÖ%s%d") then
		ad = bulvedeg(ad, "MÖ%s", "")
		mo = true
	end
	
	--eğer girilen adın en başında bir rakam bulunuyorsa
	--bu demektir ki yılımız kategorinin başında mevcut
	--bu yılı en baştan ayıklayabiliriz
	if mw.ustring.match(ad, "%d+") then
		yil = mw.ustring.match(ad, "%d+")
		ad = bulvedeg(ad, yil, "")
		--eğer bir yıl saptayabildiysek bunu onaylayalım
		yilVarMi = true
	end
	
	--bir yıl değerimiz varsa
	if yilVarMi then
		--yılda de da eki varsa bunu silmemiz gerek
		--çünkü veri modülünden kategoriyi çağırırken
		--"yılda" ile başlayan değerler ile çağıracağız
		if bul(ad, "'[dt][ea]") then
			ad = bulvedeg(ad, "'[dt][ea]", "")
			tip = "yıl"
		elseif bul(ad, "'l[ea]rd[ea]") then
			ad = bulvedeg(ad, "'l[ea]rd[ea]", "")
			tip = "onyıl"
		elseif bul(ad, "'l[ea]r") then
			ad = bulvedeg(ad, "'l[ea]r", "")
			tip = "onyıl"
		elseif bul(ad, ". yüzyılda") then
			ad = bulvedeg(ad, ". yüzyılda", "")
			tip = "yüzyıl"
		elseif bul(ad, ". yüzyıl") then
			ad = bulvedeg(ad, ". yüzyıl", "")
			tip = "yüzyıl"
		elseif bul(ad, ". binyılda") then
			ad = bulvedeg(ad, ". binyılda", "")
			tip = "binyıl"
		elseif bul(ad, ". binyıl") then
			ad = bulvedeg(ad, ". binyıl", "")
			tip = "binyıl"
		else
			tip = "yıl"
		end
		ad = bulvedeg(ad, "^%s", "")
		ad = bulvedeg(ad, "%s$", "")
		--çıktı tablomuzu alalım
		return {(mo and "-" or "") .. yil, ad, tip}
	else
		return {nil, ad}
	end
end

local function siraliSablon(sablon, t, l)
	if l[1] then
		table.insert(t, mw.getCurrentFrame():expandTemplate{
			title = sablon,
			args = {l[1], l[2], l[3], l[4], l[5], l[6], l[7], l[8], l[9]}})
	end
end

local function commons(kat, tablo)
	if kat:getirVikiveri() and kat:getirVikiveri().claims and kat:getirVikiveri().claims["P373"] then
		table.insert(tablo, mw.getCurrentFrame():expandTemplate{
			title = "Commons kategori",
			args = {kat:getirVikiveri():formatPropertyValues("P373").value}})
	end
end

function goster(frame)
	--ilk parametreye girilen değeri veya direk kategori adını işleme alalım
	local ad = frame:getParent().args[1] or mw.title.getCurrentTitle()["text"]

	--en son çıktı verecek kategoriler tablosu
	local kategoriler = {}
	--en son çıktı verecek görüntülenecek nesneler tablosu
	local goruntuler = {}
	
	--kategori sayfamızda bahsi geçen yıl
	local yil = karsilastirYillari(ad)[1]
	--kategori nesnemizi de çağıralım
	local kategori = getirAsilAdaGore(karsilastirYillari(ad)[2], yil, karsilastirYillari(ad)[3])
	--kategorinin eklenmesi gereken ebeveyn kategoriler
	local ebeveynler = kategori:getirEbeveynler()
	
	table.insert(goruntuler, gezintiCubugu(kategori))
	table.insert(goruntuler, duzenleBag(kategori:getirVeriModulu()))

	--Commons kategorisi
	commons(kategori, goruntuler)
	
	siraliSablon("Portal", goruntuler, kategori:getirPortaller())
	
	if mw.title.new(ad).exists then
		table.insert(goruntuler, mw.getCurrentFrame():expandTemplate{
			title = "Ana",
			args = {ad}})
	end
	
	siraliSablon("Kategori ayrıca bakınız", goruntuler, kategori:getirBak())
	
	if kategori:getirAciklama() then
		table.insert(goruntuler, kategori:getirAciklama())
	end
	
	--her bir ebeveyn için gerekli kategorileri oluşturmamız gerekiyor
	for sira,ebeveyn in ipairs(ebeveynler) do
		table.insert(kategoriler, "[[Kategori:" .. ebeveyn:getirKategoriAdi() .. "|" .. kategori:getirSiraAnahtari()[sira] .. "]]")
	end
	
	--kategori boş mu?
	if mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, "all") == 0 then
		table.insert(kategoriler, "[[Kategori:Boş kategoriler]]")
	end
	
	return table.concat(goruntuler) .. table.concat(kategoriler)
end

function gore(frame)
	local args = frame:getParent().args
	
	local kategoriler = {}
	local goruntuler = {}
	
	local yil = args[1]
	local tip = args[2]
	local kategori = getirAsilAdaGore(tip, yil, "göre")
	
	local gore = kategori:gore()
	
	if type(gore) == "table" then
		yukari = gore[2]
		gore = gore[1]
	end
	yukari = yukari or ((gore ~= "üst" and gore ~= "hayır") and gore)

	table.insert(goruntuler, mw.getCurrentFrame():expandTemplate{title = "kapsayıcı kategori", args = {}})
	
	--gezinti çubuğu
	if kategori:kademe() and kategori:kademe() > 1 and gore ~= "üst" then
		table.insert(goruntuler, "<center>")
		local donemKat = tipHallet(tip, "dönem")
		if mw.title.new("Kategori:" .. donemKat).exists then
			table.insert(goruntuler, '\n'
				..'[[:Kategori:' .. donemKat
				.. "|"..mw.getContentLanguage():ucfirst(donemKat).."]]</div>")
		end
		
		table.insert(goruntuler, '<div style="padding-bottom: 10px;">'
		.. '\n{| class="toccolours hlist"'
		.. '\n|')
		
		for _, kademe in ipairs(kademeler) do
			if mw.title.new("Kategori:" .. tipHallet(tip, kademe)).exists then
				table.insert(goruntuler, "\n*[[:Kategori:" .. tipHallet(tip, kademe)
					.. "|".. mw.getContentLanguage():ucfirst(tipHallet("", kademe)) .."]]")
			end
		end
		
		table.insert(goruntuler, '\n|}\n</center>')
	end

	table.insert(goruntuler, duzenleBag(kategori:getirVeriModulu()))
	
	--Commons kategorisi
	commons(kategori, goruntuler)
	
	siraliSablon("Portal", goruntuler, kategori:getirPortaller())
	siraliSablon("Kategori ayrıca bakınız", goruntuler, kategori:getirBak())
	
	if kategori:getirAciklama() then
		table.insert(goruntuler, kategori:getirAciklama())
	end
	
	for _,d in ipairs(degerler) do
		tip = (yil == "dönem" or gore == "üst") and bulvedeg(tip, "^"..d.."%s", "") or tip
	end
	
	if yil == "dönem" and gore == "hayır" then
	elseif yil == "dönem" or gore == "üst" then
		table.insert(kategoriler, "[[Kategori:" .. mw.getContentLanguage():ucfirst(yukari or tip) .. "|+]]")
	elseif bul(tip, "^tipe göre") then else
		table.insert(kategoriler, "[[Kategori:".. tipHallet(tip, "dönem").. "| ]]")
	end
	
	if kategori:getirEbeveynler() then
		--her bir ebeveyn için gerekli kategorileri oluşturmamız gerekiyor
		for sira,ebeveyn in ipairs(kategori:getirEbeveynler()) do
			local e =  ebeveyn:sonHarfSil()
			local ust = not bul(kategori:getirAsilAd(), "göre")
				and mw.title.new("Kategori:" .. tipHallet("tipe göre ".. e, yil)).exists
				and tipHallet("tipe göre ".. e, yil)
				or tipHallet(e, yil)
			if yil == "dönem" and ebeveyn:gore() == "üst" then else
				table.insert(kategoriler, "[[Kategori:" .. ust .. "|"
					.. ((mw.site.stats.pagesInCategory(ust, "subcats") > 200 or bul(tip, "göre"))
					and mw.ustring.char(0x0020) or kategori:getirSiraAnahtari()[sira]) .. "]]")
			end
		end
	end
	
	return table.concat(goruntuler) .. table.concat(kategoriler)
end

return {goster = goster, gore = gore, tipHallet = tipHallet, test = test}