Kullanıcı:By erdo can/deneme/Modül:kategori ağacı

local export = {}
local m_languages = require('Module:diller')
local m_utilities = require('Module:araçlar')

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	if mw.title.getCurrentTitle().nsText == "Şablon" then
		return "(Bu şablon, Kategori: ad alanlarındaki sayfalarda kullanılmalıdır.)"
	elseif mw.title.getCurrentTitle().nsText ~= "Kategori" then
		error("Bu şablon/modül yalnızca Kategori: ad alanlarındaki sayfalarda kullanılabilir.")
	end
	
	local template = frame.args["şablon"]
	
	if not template or template == "" then
		error("\"şablon\" parametresi belirtilmedi.")
	end
	
	local submodule = require("Module:kategori ağacı/" .. şablon) -- template
	
	-- Tüm parametreleri ve etiket verilerini alın
	local current
	
	if submodule.new_main then
		current = submodule.new_main(frame)
	else
		local info = {}
		
		for key, val in pairs(frame.args) do
			info[key] = val; if info[key] == "" then info[key] = nil end
		end
	
		info.template = nil
		current = submodule.new(info, true)
	end

	local boxes = {}
	local display = {}
	local categories = {}
	
	-- Kategorinin boş olup olmadığını kontrol etme
	local isEmpty = mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, "all") == 0
	
	-- Parametreler geçerli mi?
	if not current then
		table.insert(categories, "[[Kategori:Geçersiz etiketli kategoriler]]")
		table.insert(categories, isEmpty and "[[Kategori:Boş kategoriler]]" or nil)
		table.insert(display, show_error(
			"Etiketine verilen etiket " ..
			mw.getCurrentFrame():expandTemplate{title = "temp", args = {template}} ..
			" Şablon geçerli değil. Onu yanlış yazmış olabilirsiniz veya henüz oluşturulmamıştır. " ..
			"Yeni bir etiket eklemek için lütfen şablonun belgelerine bakın."))
		
		-- Buradan çıkın, buradaki tüm kodlar, mevcut olmamasına dayanıyor
		return table.concat(categories, "") .. table.concat(display, "\n\n")
	end
	
	-- Kategorinin adı doğru mu?
	if mw.title.getCurrentTitle().text ~= current:getCategoryName() then
		table.insert(categories, "[[Kategori:Yanlış isimlendirilmiş kategoriler]]")
		table.insert(display, show_error(
			"Verilen parametrelere dayanarak " ..
			mw.getCurrentFrame():expandTemplate{title = "temp", args = {template}} ..
			" Şablon, bu kategori ile adlandırılmalıdır'''[[:Kategori:" .. current:getCategoryName() .. "]]'''."))
	end
	
	-- Boş kategoriler için temizleme kategorisi ekle
	if isEmpty and not current:canBeEmpty() then
		table.insert(categories, "[[Kategori:Boş kategoriler]]")
	end
	
	if current:isHidden() then
		table.insert(categories, "__HIDDENCAT__")
	end
	
	table.insert(boxes, show_catfix(current))
	table.insert(boxes, show_editlink(current))
	table.insert(boxes, show_pagelist(current))
	
	-- Görüntülenen bilgileri oluştur
	table.insert(display, show_breadcrumbs(current))
	table.insert(display, show_description(current))
	table.insert(display, show_appendix(current))
	table.insert(display, show_children(current))
	table.insert(display, show_TOC(current))
	
	show_categories(current, categories)
	
	return table.concat(categories, "") .. table.concat(boxes, "\n") .. "\n" .. table.concat(display, "\n\n")
end

function show_error(text)
	return  mw.getCurrentFrame():expandTemplate{title = "maintenance box", args = {
		"red",
		image = "[[File:Ambox warning pn.svg|50px]]",
		title = "Bu kategorinin otomatik olarak oluşturulan içeriğinde hata var.",
		text = text,
		}}
end

-- Geçerli sayfanın adını kontrol edin ve doğru değilse bir hata gönderin.
function check_name(current, template, info)
	local errortext = nil
	local category = nil
	
	if not current then
		errortext =
			"Etiket \"" .. (info.label or "") .. "\" verilen " .. mw.getCurrentFrame():expandTemplate{title = "temp", args = {template}} .. " şablon geçerli değil" ..
			"Onu yanlış yazmış olabilirsiniz veya henüz oluşturulmamıştır. Yeni bir etiket eklemek için lütfen şablonun belgelerine bakın."
		category = "[[Kategori:Geçersiz etiketli kategoriler]]"
	else
		
	end
	
	if errortext then
		return (category or "") .. show_error(errortext)
	else
		return nil
	end
end

function show_catfix(current)
	if not current._lang or current._lang:getCode() == "he" or current._lang:getCode() == "ar" then
		return nil
	end
	
	return m_utilities.catfix(current._lang, (sc and require("Module:scripts").getByCode(info.sc) or nil))
end

-- Geçerli kategorinin yerleştirileceği ana kategorileri gösterin.
function show_categories(current, categories)
	local parents = current:getParents()
	
	if not parents then
		return
	end
	
	for _, parent in ipairs(parents) do
		if type(parent.name) == "string" then
			if not (current._lang and current:getCategoryName() == mw.getContentLanguage():ucfirst(current._lang:getCategoryName())) and not (current._sc and current:getCategoryName():find(mw.getContentLanguage():ucfirst(current._sc:getCategoryName()), nil, true)) and current:getInfo().code then
				require("Module:debug").track("category tree/string")
			end
			
			table.insert(categories, "[[" .. parent.name .. "|" .. parent.sort .. "]]")
		else
			table.insert(categories, "[[Kategori:" .. parent.name:getCategoryName() .. "|" .. parent.sort .. "]]")
		end
	end
	
	-- Also put the category in its corresponding "umbrella" or "by language" category.
	local umbrella = current:getUmbrella()
	
	if umbrella then
		if type(umbrella) == "string" then
			table.insert(categories, "[[" .. umbrella .. "|" .. current:getCategoryName() .. "]]")
		else
			table.insert(categories, "[[Kategori:" .. umbrella:getCategoryName() .. "|" .. current:getCategoryName() .. "]]")
		end
	end
end

function show_editlink(current)
	return
		"<div class=\"noprint plainlinks\" style=\"float: right; clear: both; margin: 0 0 .5em 1em; background: #f9f9f9; border: 1px #aaaaaa solid; padding: 5px; font-weight: bold;\">[" ..
		mw.getCurrentFrame():callParserFunction{name = "fullurl", args = {current:getDataModule(), action = "edit"}} ..
		" Kategori verilerini düzenle]</div>"
end

function show_pagelist(current)
	local namespace = ""
	local info = current:getInfo()
	
	if info.label == "citations" or info.label == "Tanımsız terimlerin kaynakları" then
		namespace = "Citations"
	elseif info.code then
		local lang = require("Modül:diller").getByCode(info.code)
		
		if lang then
			if lang:getType() == "reconstructed" then
				namespace = "Reconstruction"
			elseif lang:getType() == "appendix-constructed" then
				namespace = "Appendix"
			end
		end
	end
	
	local recent = mw.getCurrentFrame():callParserFunction{
		name = "#tag",
		args = {
			"DynamicPageList",
			"category=" .. mw.title.getCurrentTitle().text .. "\n" ..
			"namespace=" .. namespace .. "\n" ..
			"count=10\n" ..
			"mode=ordered\n" ..
			"ordermethod=categoryadd\n" ..
			"order=descending"
		}
	}
	
	local oldest = mw.getCurrentFrame():callParserFunction{
		name = "#tag",
		args = {
			"DynamicPageList",
			"category=" .. mw.title.getCurrentTitle().text .. "\n" ..
			"namespace=" .. namespace .. "\n" ..
			"count=10\n" ..
			"mode=ordered\n" ..
			"ordermethod=lastedit\n" ..
			"order=ascending"
		}
	}
	
	return [=[
{| class="wikitable" style="float: right; clear: both; margin: 0 0 .5em 1em;"
! Kategoriye yeni eklemeler
|-
| style="font-size:0.9em;" | ]=] .. recent .. [=[

|-
! Son düzenleme ile sıralanmış en eski sayfalar
|-
| style="font-size:0.9em;" | ]=] .. oldest .. [=[

|}]=]
end

-- Sayfanın üst kısmında gezinme "kırıntıları" göster.
function show_breadcrumbs(current)
	local steps = {}
	
	-- Mevcut etikette başlayın ve ilerleyemeyene kadar çocuktan ebeveyne "zincir"de yukarı doğru ilerleyin.
	while current do
		local category = nil
		local display_name = nil
		
		if type(current) == "string" then
			category = current
			display_name = current:gsub("^Kategori:", "")
		else
			category = "Kategori:" .. current:getCategoryName()
			display_name = current:getBreadcrumbName()
		end
		
		display_name = mw.getContentLanguage():ucfirst(display_name)
		table.insert(steps, 1, "» [[:" .. category .. "|" .. display_name .. "]]")
		
		-- "Zinciri" bir adım yukarı kaldırın.
		if type(current) == "string" then
			current = nil
		else
			current = current:getParents()
			
			if current then
				current = current[1].name
			end
		end
	end
	
	return "<small>" .. table.concat(steps, " ") .. "</small>"
end

-- Kategori için kısa bir açıklama metni gösterin.
function show_description(current)
	return (current:getDescription() or "")
end

function show_appendix(current)
	local appendix
	
	if current.getAppendix then
		appendix = current:getAppendix()
	end
	
	if appendix then
		return "Daha fazla bilgi için, [[" .. appendix .. "]] sayfasına bak."
	else
		return nil
	end
end

-- Çocuk kategorilerinin listesini gösterin.
function show_children(current)
	local children = current:getChildren()
	
	if not children then
		return nil
	end
	
	table.sort(children, function(first, second) return first.sort < second.sort end)
	
	local children_list = {}
	
	for _, child in ipairs(children) do
		local child_basic = child.name:getCategoryName()
		local child_page = mw.title.new("Kategori:" .. child_basic)
		
		if child_page.exists then
			local child_description = child.name:getDescription()
			table.insert(children_list, "* [[:Kategori:" .. child_basic .. "]]: " .. child_description)
		end
	end
	
	return table.concat(children_list, "\n")
end

-- Dil komutundaki her harfe bağlantı içeren bir içindekiler tablosu gösterin.
function show_TOC(current)
	local code = current:getInfo().code
	
	if not code or not require("Modül:diller").getByCode(code) then
		return nil
	end
	
	-- Kategori boş olursa, yalnızca alt kategoriler bulunur.
	local hasPages = not current:canBeEmpty()
	
	local titleText = mw.title.getCurrentTitle().text
	
	local inCategory

	if hasPages then
		inCategory = mw.site.stats.pagesInCategory(titleText, "pages")
	else
		inCategory = mw.site.stats.pagesInCategory(titleText, "subcats")
	end
	
	-- No need for a TOC if all pages or subcategories can fit on one page.
	if inCategory > 200 then
		-- This category is very large, see if there is an "extended" version of the TOC.
		if inCategory > 2500 then
			local TOC_template_extended = mw.title.new("Şablon:" .. code .. "-categoryTOC/full")
			
			if TOC_template_extended.exists then
				return mw.getCurrentFrame():expandTemplate{title = TOC_template_extended.text, args = {}}
			end
		end
		
		local TOC_template = mw.title.new("Şablon:" .. code .. "-categoryTOC")
		
		if TOC_template.exists then
			return mw.getCurrentFrame():expandTemplate{title = TOC_template.text, args = {}}
		end
	end
	
	return nil
end

return export