Module:WikiProject metrics
MyWikiBiz, Author Your Legacy — Friday November 22, 2024
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