Module:WikiProject metrics
MyWikiBiz, Author Your Legacy — Friday October 31, 2025
Jump to navigationJump to searchThis module contains assorted tools for building WikiProject X metrics pages.
Usage
{{#invoke:WikiProject metrics|list|start month}}
Generates a list of months and the number of pages created in each month, starting with the given month
{{#invoke:WikiProject metrics|recent}}
Transcludes the current month's article list; if the month has just started, it may show last month's as well
{{#invoke:WikiProject metrics|chart|start month}}
Generates a line chart showing article creations over time, starting with the given month
local p = {}
local Date = require("Module:Date")._Date
local lang = mw.language.new(mw.language.getContentLanguage().code)
local function getMonths(start)
	local month = Date("1 " .. start)
	local current = Date("currentdate")
	current = Date(current.year, current.month, 1)
	if month > current then
		return {}
	end
	local months = {month}
	while month < current do
		month = month + "1 month"
		table.insert(months, month)
	end
	return months
end
function p.list(frame)
	local baseTitle = frame:getParent():getTitle()
	local startMonth = frame.args[1]
	local months = getMonths(startMonth)
	local list = {}
	for i, month in pairs(months) do
		if i == 1 or month:text("%B") == "January" then
			local tag = '<span style="font-size: 120%%;">%s</span>'
			table.insert(list,  string.format(tag, month:text("%Y")))
		end
		local line = "* [[%s|%s]]: %s"
		local title = baseTitle .. "/" .. month:text("%B %Y")
		if mw.title.new(title).exists then
			local count = frame:preprocess("{{#lst:" .. title .. "|count}}")
			count = lang:formatNum(tonumber(count))
			local item = string.format(line, title, month:text("%b"), count)
			table.insert(list, item)
		end
	end
	return table.concat(list, "\n")
end
local function getList(frame, baseTitle, month, cols)
	local title = baseTitle .. "/" .. month:text("%B %Y")
	if not mw.title.new(title).exists then
		return ""
	end
	local list = frame:preprocess("{{#lst:" .. title .. "|list}}")
	local output = string.format("== %s ==\n", month:text("%B %Y"))
	output = output .. frame:expandTemplate{ title = "Hatnote", args = {
		"[[" .. title .. "]] (" ..
		frame:expandTemplate{ title = "Edit", args = { title } } ..
		")"
	} }
	if cols ~= nil then
		local div = '\n<div style="column-width: %s;">' 
		output = output .. string.format(div, cols, cols, cols)
	end
	output = output .. "\n" .. list
	if cols ~= nil then
		output = output .. "\n</div>"
	end
	return output
end
function p.recent(frame)
	local baseTitle = frame:getParent():getTitle()
	local cols = frame.args[1]
	local now = Date("currentdate")
	
	local output = getList(frame, baseTitle, now, cols)
	
	if now.day < 10 then
		local older = getList(frame, baseTitle, now - "1 month", cols)
		output = output .. "\n" .. older
	end
	
	return output
end
function p.chart(frame)
	local baseTitle = frame:getParent():getTitle()
	local startMonth = frame.args[1]
	local now = Date("currentdate")
	local currentMonth = Date(now.year, now.month, 1)
	local months = getMonths(startMonth)
	local xdata = {}
	local y1data = {}
	local y2data = {}
	for i, month in pairs(months) do
		local title = baseTitle .. "/" .. month:text("%B %Y")
		
		if mw.title.new(title).exists then
			local count = frame:preprocess("{{#lst:" .. title .. "|count}}")
			mw.logObject(count)
		
			table.insert(xdata, month:text("%Y-%m-%d"))
			table.insert(y1data, count)
			if month ~= currentMonth then
				table.insert(y2data, count)
			end
		end
	end
	local chart = frame:expandTemplate{ title = "Graph:Chart", args = {
		width = "600",
		height = "200",
		type = "line",
		xAxisTitle = "Month",
		yAxisTitle = "Number of articles created",
		xType = "date",
		yAxisMin = "0",
		colors = "#501f77b4,#1f77b4",
		x = table.concat(xdata, ","),
		y1 = table.concat(y1data, ","),
		y2 = table.concat(y2data, ",")
	}}
	local div = '<div style="text-align: center; margin: auto;">%s</div>'
	return string.format(div, chart)
end
return p
