Script error: The function "main" does not exist.

local export = {}

-- Category object

local Category = {}
Category.__index = Category


local function infobox(fam)
	local ret = {}
	
	table.insert(ret, "<table class=\"wikitable\">\n")
	table.insert(ret, "<tr>\n<th colspan=\"2\" class=\"plainlinks\">[//sr.wiktionary.org/w/index.php?title=Module:families/data&action=edit Унос фамилије података]</th>\n</tr>\n")
	table.insert(ret, "<tr>\n<th>Канонско име</th><td>" .. fam:getCanonicalName() .. "</td>\n</tr>\n")
	
	if #fam:getOtherNames() > 0 then
		local names = {}
		
		for _, name in ipairs(fam:getOtherNames()) do
			table.insert(names, "<li>" .. name .. "</li>")
		end
		
		table.insert(ret, "<tr>\n<th>Other names</th><td>" .. table.concat(names, "\n") .. "</td>\n</tr>\n")
	end
	
	table.insert(ret, "<tr>\n<th>[[Wiktionary:Families|Family code]]</th><td><code>" .. fam:getCode() .. "</code></td>\n</tr>\n")
	table.insert(ret, "<tr>\n<th>[[w:Proto-language|Common ancestor]]</th><td>")
	
	local protoLanguage = fam:getProtoLanguage()
	
	if protoLanguage then
		table.insert(ret, "[[:Категорија:" .. mw.getContentLanguage():ucfirst(protoLanguage:getCategoryName()) .. "|" .. protoLanguage:getCanonicalName() .. "]]")
	else
		table.insert(ret, "none")
	end
	
	table.insert(ret, "</td>\n")
	table.insert(ret, "\n</tr>\n")
	
	local parent = fam:getFamily()
	
	if not parent then
		table.insert(ret, "<tr>\n<th>[[Викиречник:Families|Parent family]]</th>\n<td>")
		table.insert(ret, "unclassified")
	elseif parent:getCode() == "qfa-not" then
		table.insert(ret, "<tr>\n<th>[[Викиречник:Families|Parent family]]</th>\n<td>")
		table.insert(ret, "not a family")
	else
		local chain = {}
		while parent do
			table.insert(chain, "[[:Категорија:" .. mw.ustring.gsub(parent:getCategoryName(), "^.", mw.ustring.upper) .. "|" .. parent:getCanonicalName() .. "]]")
			parent = parent:getFamily()
		end
		
		table.insert(ret, "<tr>\n<th>[[Викиречник:Families|Parent famil"
			.. (#chain == 1 and "y" or "ies") .. "]]</th>\n<td>")
		
		for i = #chain, 1, -1 do
			table.insert(ret, "<ul><li>" .. chain[i])
		end
		
		table.insert(ret, string.rep("</li></ul>", #chain))
	end
	
	table.insert(ret, "</td>\n</tr>\n")
	
	if fam:getWikidataItem() and mw.wikibase then
		local link = '[' .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. ' ' .. fam:getWikidataItem() .. ']'
		table.insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
	end
	
	table.insert(ret, "</table>")
	
	return table.concat(ret)
end


function Category.new(info)
	local self = setmetatable({}, Category)
	assert(type(info) == "table", "The \"info\" parameter must be a table.")
	self._info = {}
	
	for key, val in pairs(info) do
		if key == "code" then
			self._info.code = val
			self._fam = require("Module:families").getByCode(val) or error("The family code \"" .. val .. "\" is not valid.")
		else
			error("The parameter \"" .. key .. "\" was not recognized.")
		end
	end
	
	return self
end

export.new = Category.new


function Category:getInfo()
	return self._info
end


function Category:getBreadcrumbName()
	if not self._fam then
		return "Језици по фамилији"
	else
		return self._fam:getCanonicalName()
	end
end


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


function Category:canBeEmpty()
	return true
end

function Category:isHidden()
	return false
end


function Category:getCategoryName()
	local ret = nil
	
	if not self._fam then
		ret = "Језици по фамилији"
	else
		ret = self._fam:getCategoryName()
	end
	
	return mw.getContentLanguage():ucfirst(ret)
end


function Category:getDescription()
	if not self._fam then
		return nil
	else
		local ret =
			mw.getCurrentFrame():expandTemplate{title = "sisterlinks", args = {self._fam:getCategoryName()}} ..
			mw.getCurrentFrame():expandTemplate{title = "wikipedia", args = {}} ..
			"Ово је главна категорија од '''" .. self._fam:getCategoryName() .. "'''.\n\nИнформације о " .. self._fam:getCanonicalName() .. ":\n\n" .. infobox(self._fam)
		
		return ret
	end
end


function Category:getParents()
	if not self._fam then
		return {
			{
				name = "Категорија:Сви језици",
				sort = " "
			},
			{
				name = "Категорија:Све језичке фамилије",
				sort = " "
			},
		}
	else
		local pinfo = mw.clone(self._info)
		local fam = self._fam:getFamily()
		
		if not fam or fam:getCode() == "qfa-iso" or fam:getCode() == "qfa-not" then
			pinfo.code = nil
		else
			pinfo.code = fam:getCode()
		end
		
		return {{name = Category.new(pinfo), sort = self._fam:getCanonicalName()}}
	end
end


function Category:getChildren()
	return nil
end


function Category:getUmbrella()
	return "Категорија:Све језичке фамилије"
end


return export