Module:Category tree

local export = {} local m_languages = require('Module:languages')

-- 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 == "Template" then return "(This template should be used on pages in the Category: namespace.)" elseif mw.title.getCurrentTitle.nsText ~= "Category" then error("This template/module can only be used on pages in the Category: namespace.") end local args = frame.args -- Get all the parameters and the label data local info = {} for key, val in pairs(args) do		info[key] = val; if info[key] == "" then info[key] = nil end end if not info.template then error("The \"template\" parameter was not specified.") end local template = info.template info.template = nil local current = require("Module:category tree/" .. template).new(info, true) local boxes = {} local display = {} local categories = {} -- Check if the category is empty local isEmpty = mw.site.stats.pagesInCategory(mw.title.getCurrentTitle.text, "all") == 0 -- Are the parameters valid? if not current then table.insert(categories, "") table.insert(categories, isEmpty and "" or nil) table.insert(display, show_error( "The label \"" .. (info.label or "") .. "\" given to the " .. mw.getCurrentFrame:expandTemplate{title = "temp", args = {template}} .. " template is not valid. You may have mistyped it, or it simply has not been created yet. " .. "To add a new label, please consult the documentation of the template.")) -- Exit here, as all code beyond here relies on current not being nil return table.concat(categories, "") .. table.concat(display, "\n\n") .. "" end -- Does the category have the correct name? if mw.title.getCurrentTitle.text ~= current:getCategoryName then table.insert(categories, "") table.insert(display, show_error( "Based on the parameters given to the " .. mw.getCurrentFrame:expandTemplate{title = "temp", args = {template}} .. " template, this category should be called Category:" .. current:getCategoryName .. ".")) end -- Add cleanup category for empty categories if isEmpty and not current:canBeEmpty then table.insert(categories, "") end if current:isHidden then table.insert(categories, "__HIDDENCAT__") end table.insert(boxes, show_editlink(current)) table.insert(boxes, show_pagelist(info)) -- Generate the displayed information table.insert(display, show_breadcrumbs(current)) table.insert(display, show_description(current)) table.insert(display, show_children(current)) table.insert(display, show_TOC(info)) 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 = "", title = "The automatically-generated contents of this category has errors.", text = text, }} end

-- Check the name of the current page, and return an error if it's not right. function check_name(current, template, info) local errortext = nil local category = nil if not current then errortext = "The label \"" .. (info.label or "") .. "\" given to the " .. mw.getCurrentFrame:expandTemplate{title = "temp", args = {template}} .. " template is not valid. " .. "You may have mistyped it, or it simply has not been created yet. To add a new label, please consult the documentation of the template." category = "" else end if errortext then return (category or "") .. show_error(errortext) else return nil end end

-- Show the parent categories that the current category should be placed in. 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 table.insert(categories, "" .. parent.sort .. "") else local parent_name = parent.name:getCategoryName table.insert(categories, "") 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, "" .. current:getCategoryName .. "") else table.insert(categories, "") end end end

function show_editlink(current) return "[" .. mw.getCurrentFrame:newChild(1):callParserFunction{name = "fullurl", args = {current:getDataModule, action = "edit"}} .. " Edit category data] " end

function show_pagelist(info) local namespace = "" if info.label == "citations" or info.label == "citations of undefined terms" then namespace = "Citations" elseif info.code then local lang = require("Module:languages").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:newChild: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:newChild: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 [=[ end

-- Show navigational "breadcrumbs" at the top of the page. function show_breadcrumbs(current) local steps = {} -- Start at the current label and move our way up the "chain" from child to parent, until we can't go further. while current do		local category = nil local display_name = nil if type(current) == "string" then category = current display_name = current:gsub("^Category:", "") else category = "Category:" .. current:getCategoryName display_name = current:getBreadcrumbName end display_name = mw.getContentLanguage:ucfirst(display_name) table.insert(steps, 1, "» " .. display_name .. "") -- Move up the "chain" by one level. if type(current) == "string" then current = nil else current = current:getParents if current then current = current[1].name end end end return " " .. table.concat(steps, " ") .. " " end

-- Show a short description text for the category. function show_description(current) return (current:getDescription or "") end

-- Show a list of child categories. 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("Category:" .. child_basic) if child_page.exists then local child_description = child.name:getDescription table.insert(children_list, "* Category:" .. child_basic .. ": " .. child_description) end end return table.concat(children_list, "\n") end

-- Show a table of contents with links to each letter in the language's script. function show_TOC(info) local code = info.code or "en" local num_pages = 300 --mw.site.stats.pagesInCategory(mw.title.getCurrentTitle.text, "pages") -- No need for a TOC if all entry names can fit on one page. if num_pages > 200 then -- This category is very large, see if there is an "extended" version of the TOC. if num_pages > 2500 then local TOC_template_extended = mw.title.new("Template:" .. 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("Template:" .. code .. "-categoryTOC") if TOC_template.exists then return mw.getCurrentFrame:expandTemplate{title = TOC_template.text, args = {}} end end return nil end

return export