Modul:dara kategoriyan/gelemperkatbike

Documentation for this module may be created at Modul:dara kategoriyan/gelemperkatbike/belge

local export = {}

local label_data = require("Modul:dara kategoriyan/gelemperkatbike/dane")
local b = require("Module:bingeh")
-- Category object

local Category = {}
Category.__index = Category

function Category.new_main(frame)
	local self = setmetatable({}, Category)
	
	local params = {
		[1] = {},
		[2] = {required = true},
		["sc"] = {},
	}
	
	args = require("Module:parameters").process(frame:getParent().args, params)
	self._info = {code = args[1], label = args[2], sc = args["sc"]}
	
	self:initCommon()
	
	if not self._data then
		return nil
	end
	
	return self
end

function Category.new(info)
	for key, val in pairs(info) do
		if not (key == "code" or key == "label" or key == "sc" or key == "no_catfix") then
			error("The parameter \"" .. key .. "\" was not recognized.")
		end
	end
	
	local self = setmetatable({}, Category)
	self._info = info
	
	if not self._info.label then
		error("No label was specified.")
	end
	
	self:initCommon()
	
	if not self._data then
		error("The label \"" .. self._info.label .. "\" does not exist.")
	end
	
	return self
end

export.new = Category.new
export.new_main = Category.new_main


function Category:initCommon()
	if self._info.code then
		self._lang = require("Module:ziman").getByCode(self._info.code) or require("Module:ziman").err(self._info.code, 1)
		if self._info.label:find('^redlink') then
			self._info.no_catfix = true
		end
	else
		self._lang = nil
	end
	
	if self._info.sc then
		self._sc = require("Module:scripts").getByCode(self._info.sc) or error("The script code \"" .. self._info.sc .. "\" is not valid.")
	else
		self._sc = nil
	end
	
	-- Check if the label exists
	local labels = label_data["LABELS"]
	self._data = labels[self._info.label]
	
	-- Go through handlers
	if not self._data then
		for _, handler in ipairs(label_data["HANDLERS"]) do
			self._data = handler.handler(self._info.label)
			if self._data then
				self._data.edit = handler.module
				break
			end
		end
	end

	-- Umbrella categories cannot have a script
	if self._sc and not self._lang then
		error("Umbrella categories cannot have a script specified.")
	end
end


function Category:getBreadcrumbName()
	local ret = self._data["breadcrumb"] or self._info.label
	
	if ( ret == "modules" or ret == "templates" ) and not self._lang then
		ret = "by language"
	end
	
	if self._sc then
		ret = ret .. " in " .. self._sc:getCategoryName()
	end
	
	return ret
end


function Category:getInfo()
	return self._info
end


function Category:getDataModule()
	return self._data["edit"]
end


function Category:canBeEmpty()
	if not self._lang then
		return true
	else
		return self._data["can_be_empty"]
	end
end


function Category:isHidden()
	return self._data["hidden"] and self._info.code
end


function Category:getCategoryName()
	if self._lang then
		local ret = "Peyvên " .. self._lang:getCanonicalName().. " yên " ..  self._info.label
		
		if self._sc then
			ret = ret .. " in " .. self._sc:getCategoryName()
		end
		
		return mw.getContentLanguage():ucfirst(ret)
	else
		return "Peyvên " .. self._info.label 
	end
end


function Category:getDescription(isChild)
	-- Allows different text in the list of a category's children
	local isChild = isChild == "child"
	
	if self._lang then
		if self._sc then
			return self:getCategoryName() .. "."
		else
			local desc = self._data["description"]
			
			if not isChild and self._data.additional then
				desc = desc .. " " .. self._data.additional
			end
			
			if desc then
				desc = desc:gsub("{{PAGENAME}}", mw.title.getCurrentTitle().text)
				desc = desc:gsub("{{{langname}}}", self._lang:getCanonicalName())
				desc = desc:gsub("{{{langcode}}}", self._lang:getCode())
				desc = desc:gsub("{{{langcat}}}", self._lang:getCategoryName())
			end
			
			return desc
		end
	else
		local desc = self._data["description"]
		if desc then
			desc = desc:gsub("{{{langname}}} yên ", "")
			desc = desc:gsub("{{{langcode}}} ", "")
			desc = desc:gsub("{{{langcat}}} ", "")
			desc = desc:gsub("%.$", "")
			desc = desc:gsub("{{PAGENAME}}", mw.title.getCurrentTitle().text)
			desc = "Kategoriyên ji bo " .. b.lcfirst(desc) .. "."
		else
			desc = "Kategoriyên ji bo peyvên " .. self._info.label .. " li gorî zimanan."
		end

		desc = desc .. "\n\n" ..
			"Tenê binkategorî li gorî zimanan di vê kategoriyê de hene. Divê gotar li vir tunebin."
		return desc
	end
end


function Category:getParents()
	if self._lang then
		if self._sc then
			local parent1 = Category.new({code = self._info.code, label = "terms in " .. self._sc:getCanonicalName() .. " script"})
			local pinfo = mw.clone(self._info)
			pinfo.sc = nil
			local parent2 = Category.new(pinfo)
			
			return {
				{name = parent1, sort = self._sc:getCanonicalName()},
				{name = parent2, sort = self._sc:getCanonicalName()},
			}
		else
			local parents = self._data["parents"]
			
			if not parents or #parents == 0 then
				return nil
			end
			
			local ret = {}
			
			for _, parent in ipairs(parents) do
				local parent = mw.clone(parent)
				
				if type(parent) ~= "table" then
					parent = {name = parent}
				end
				
				if not parent.sort then
					parent.sort = self._info.label
				end
				
				parent.sort = parent.sort:gsub("{{{langname}}}", self._lang:getCanonicalName())
				parent.sort = parent.sort:gsub("{{{langcat}}}", self._lang:getCategoryName())
				
				if parent.name and parent.name:find("^Category:") then
					parent.name = parent.name:gsub("{{{langname}}}", self._lang:getCanonicalName())
					parent.name = parent.name:gsub("{{{langcat}}}", self._lang:getCategoryName())
				else
					local pinfo = mw.clone(self._info)
					pinfo.label = parent.name
					pinfo.no_catfix = nil
					
					if parent.template then
						parent.name = require("Modul:dara kategoriyan/" .. parent.template).new(pinfo)
					else
						parent.name = Category.new(pinfo)
					end
				end
				
				table.insert(ret, parent)
			end
			
			return ret
		end
	else
		if self._data["fundamental"] then
			local fundamental = self._data["fundamental"]
			local sortparentumbrella = self._data["sortparentumbrella"]
			
			return {{name = "Kategorî:" .. fundamental, sort = sortparentumbrella or self._info.label}}
		else
			return nil
		end
	end
end


function Category:getChildren()
	local children = self._data["children"]
	
	if not self._lang or not children or #children == 0 then
		return nil
	end
	
	local ret = {}
	
	for _, child in ipairs(children) do
		child = mw.clone(child)
		
		if type(child) ~= "table" then
			child = {name = child}
		end
		
		if not child.sort then
			child.sort = child.name
		end
		
		local cinfo = mw.clone(self._info)
		cinfo.label = child.name
		child.name = Category.new(cinfo)
		
		table.insert(ret, child)
	end
	
	return ret
end


function Category:getUmbrella()
	if not self._lang or self._sc then
		return nil
	end
	
	local uinfo = mw.clone(self._info)
	uinfo.code = nil
	return Category.new(uinfo)
end


function Category:getAppendix()
	if self._info.label and self._lang then
		local appendixName = "Appendix:" .. self._lang:getCanonicalName() .. " " .. self._info.label
		local appendix = mw.title.new(appendixName).exists
		if appendix then
			return appendixName
		else
			return nil
		end
	else
		return nil
	end
end


return export