Modül:kategori ağacı
Görünüm
Bu belgeleme Modül:kategori ağacı/belge (düzenle | geçmiş) sayfasından yansıtılmaktadır. Arayüz düzenleyicilerinin deney yapabilmeleri için ayrıca Modül:kategori ağacı/deneme tahtası sayfası kullanılabilir.
Bu modül şu şablonlarda kullanılmaktadır:
{{kategori dillerine göre}}
{{kategori tema}}
{{kategori köken}}
{{kategori dil}}
{{kategori aile}}
{{kategori alfabe}}
{{kategori karakter}}
Şablona girilmiş olan yanlış parametreleri takip etmeye yarayan kategoriler:
- Kategori:Dil adı yanlış kategori şablonu kullanan kategoriler
- Kategori:Kategori konu ve kategori grup hataları
Modülün alt sayfaları:
--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
function getirDilAdi(x)
return require("Modül:köken dilleri").getirKodaGore(x)
and require("Modül:köken dilleri").getirKodaGore(x):getirAsilAd()
or require("Modül:diller").getirKodaGore(x):getirAsilAd()
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)
or require("Modül:köken dilleri").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 getirDilAdi(tum.par["dil"])
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 .. "]]")
local kokenDiliMi = require("Modül:köken dilleri").getirKodaGore(tum.par["dil"])
if kokenDiliMi then
local kokEb = kokenDiliMi:getirEbeveynKodu()
table.insert(tum.hiy, "[[:Kategori:" .. getirDilAdi(kokEb) .. "|" .. getirDilAdi(kokEb) .. "]]")
end
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 getirDilAdi(tum.par["dil"])
--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
--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, getirDilAdi = getirDilAdi}