Module:WikiProject metrics

From IxWiki
Revision as of 02:20, 5 August 2016 by wp>The Earwig (try a transparent final month in chart)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

This 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="-moz-column-width: %s; -webkit-column-width: %s; 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}}")
		
			table.insert(xdata, month:text("%b %Y"))
			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