Модул:category tree/affix cat

Документација модула[прикажи] [уреди] [историја] [освежи]

This module implements {{circumfixcat}}, {{infixcat}}, {{interfixcat}}, {{prefixcat}} and {{suffixcat}}. The documentation here describes how the module works, and how to add, modify or remove information from the category tree. For information on how to use the template itself, see its documentation.

This module does not use labels. Effectively, there is only one label, whose data is hard-coded into the module.

local m_links = require("Модул:links")
local m_compound = require("Модул:compound")

local export = {}

-- Category object

local Category = {}
Category.__index = Category

function Category.new_main(frame)
	local params = {
		[1] = {required = true},
		[2] = {required = true},
		[3] = {},
		
		["id"] = {},
		["pos"] = {},
		["sc"] = {},
		["sort"] = {},
		["tr"] = {},
	}
	
	args = require("Модул:parameters").process(frame:getParent().args, params)
	local info = {code = args[1], term = args[2], alt = args[3], id = args["id"], pos = args["pos"], sc = args["sc"], sort = args["sort"], tr = args["tr"], affixtype = frame.args["affixtype"]}
	
	return Category.new(info)
end

function Category.new(info)
	local self = setmetatable({}, Category)
	
	for key, val in pairs(info) do
		if not (key == "affixtype" or key == "alt" or key == "code" or key == "id" or key == "pos" or key == "sc" or key == "sort" or key == "term" or key == "tr") then
			error("The parameter \"" .. key .. "\" was not recognized.")
		end
	end
	
	self._info = info
	
	-- Add default POS, or make POS plural.
	self._pos = self._info.pos or "речи"
	
	if not self._pos:find("ч$") then
		if self._pos:find("са$") then
			self._pos = self._pos .. "и"
		else
			self._pos = self._pos .. "са"
		end
	end
	
	if not self._info.code then
		error("No language code was specified.")
	end
	
	if not self._info.term then
		error("No term was specified.")
	end
	
	self._lang = require("Модул:languages").getByCode(self._info.code) or error("Језички код \"" .. self._info.code .. "\" није добар.")
	self._sc = (self._info.sc and (require("Модул:scripts").getByCode(val) or error("Код писма \"" .. val .. "\" није добар.")) or nil)
	
	self._term = m_compound.make_affix(self._info.term, self._lang, self._sc, self._info.affixtype)
	self._alt = m_compound.make_affix(self._info.alt, self._lang, self._sc, self._info.affixtype)
	self._tr = m_compound.make_affix(self._info.tr, self._lang, require("Модул:scripts").getByCode("Latn"), self._info.affixtype)
	
	-- Convert term/alt into affixes if needed
	local desc = {
		["са префиксом"]	= "beginning with the prefix",
		["affix"]	= "завршава са суфиксом",
		["circumfix"]	= "bookended with the circumfix",
		["уметнуте са"]		= "спојена са инфиксом",
		["interfix"]	= "joined with the interfix",
		["transfix"]	= "patterned with the transfix",
	}
	
	if self._info.affixtype then
		self._desc = desc[self._info.affixtype] or error(self._info.affixtype .. " није препознат тип афикса.")
	else
		error("Молим provide a тип of affix in the affixtype параметар.")
	end
	
	return self
end

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


function Category:getInfo()
	return self._info
end


function Category:getBreadcrumbName()
	if self._pos and self._pos == "речи" then
		local affix = require("Модул:script utilities").tag_text(
			self._alt or self._term,
			self._lang,
			self._sc,
			"term"
		)
		
		if self._info.id then
			return affix ..  " (" .. self._info.id .. ")"
		else
			return affix
		end
	else
		return self._pos
	end
end


function Category:getDataModule()
	return "Модул:category tree/affix cat"
end


function Category:canBeEmpty()
	return false
end


function Category:isHidden()
	return false
end


function Category:getCategoryName()
	return self._lang:getCanonicalName() .. " " .. self._pos .. " " .. self._info.affixtype .. " са " .. self._lang:makeEntryName(self._term) ..  (self._info.id and " (" .. self._info.id .. ")" or "")
end


function Category:getDescription()
	local description =
		self._lang:getCanonicalName() .. " " .. self._pos .. " " .. self._desc .. " " ..
		m_links.full_link({lang = self._lang, term = self._term, alt = self._alt, sc = self._sc, id = self._info.id, tr = self._tr}, "term") ..
		"."
	
	mw.getCurrentFrame():callParserFunction(
		"DISPLAYTITLE",
		"Категорија:" .. self._lang:getCanonicalName() .. " " .. self._pos .. " " .. self._info.affixtype .. 'са ' .. require("Модул:script utilities").tag_text(self._lang:makeEntryName(self._term), self._lang, self._script, "term") .. (self._info.id and " (" .. self._info.id .. ")" or "")
	)
	
	return description
end


function Category:getParents()
	local parents = {}
	local parent
	
	if self._info.id then
		if self._pos and self._pos == "речи" then
			parent = {}
			parent.name = export.new({
				code = self._info.code,
				term = self._info.term,
				affixtype = self._info.affixtype
			})
			parent.sort = self._info.id
			table.insert(parents, parent)
		else
			parent = {}
			parent.name = export.new({
					code = self._info.code,
					term = self._info.term,
					affixtype = self._info.affixtype,
					id = self._info.id
			})
			parent.sort = self._info.id .. ", " .. self._info.pos
			table.insert(parents, parent)
			
			parent = {}
			parent.name = export.new({
					code = self._info.code,
					term = self._info.term,
					affixtype = self._info.affixtype,
					pos = self._info.pos
			})
			parent.sort = self._info.id
			table.insert(parents, parent)
		end
	else
		if self._pos and self._pos ~= "речи" then
			parent = {}
			parent.name = export.new({
				code = self._info.code,
				term = self._info.term,
				affixtype = self._info.affixtype
			})
			parent.sort = self._info.pos
			table.insert(parents, parent)
		end
	end
	
	parent = {}
	parent.name = require("Модул:category tree/poscatboiler").new({code = self._info.code, label = "речи са" .. self._info.affixtype})
	parent.sort = self._lang:makeSortKey(self._info.sort or self._term)
	table.insert(parents, parent)
	
	return parents
end


function Category:getChildren()
	return nil
end


function Category:getUmbrella()
	return nil
end


return export