Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:WikiProject assessment progression/sandbox

From Wikipedia, the free encyclopedia
require('strict')

local classes = {
	'List','Stub','Start','C','B',
	'GA','A','FA','FL','FM',
	'Book','Category','Disambig','File',
	'Portal','Project','Redirect','Template', 'Unassessed'
}

local p = {}
local getArgs = require('Module:Arguments').getArgs

local function categoryCount(category, project)
	local success, count = pcall(function()
		return mw.site.stats.pagesInCategory(
			string.format('%s %s articles', category, project),
			'pages'
		)
	end)

	if success then return count end

    mw.log('Error retreiving category')
	return 0
end

-- rounding to first decimal, from http://lua-users.org/wiki/SimpleRound
local function round(num)
	return math.floor(num * 10 + 0.5) / 10
end

local function percentComplete(sum, total)
	if total == 0 then return '0' end
	return tostring(round(100 * (sum / total)))
end

local function countCategoryArticles(classesToCount, project)
	local classCount = 0
	for _, class in ipairs(classesToCount) do
		classCount = classCount + categoryCount(class..'-Class', project)
	end
	return classCount
end

local function calculateProjectTotal(project)
	return countCategoryArticles(classes, project) + categoryCount('Unassessed', project)
end

local function arg_or_default(args, from_arg, default)
	if args[from_arg] and args[from_arg] ~= '' then
		return args[from_arg]
	else
		return default
	end
end

function p.main(frame)
	local args = getArgs(frame)
	return p._main(args)
end

function p._main(args)
	local project = arg_or_default(args, "project", nil)
	local class = arg_or_default(args, "class", nil)

	mw.addWarning('No project defined for [[Template:WikiProject assessment progression]]')
	if not project then return 0 end

	if not class then
		local classCount = countCategoryArticles(classes, project)
		local total = calculateProjectTotal(project)
		return percentComplete(classCount, total)
	else
		local classCount = categoryCount(class..'-Class', project)
		local total = calculateProjectTotal(project)
		return percentComplete(classCount, total)
	end
end

return p