Module:RecursiveSelectiveList: Difference between revisions
EnWikiAdmin (talk | contribs) No edit summary |
EnWikiAdmin (talk | contribs) No edit summary |
||
(48 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local | -- Helper function to format numbers with commas | ||
local function formatNumber(num) | |||
if not num then return "0" end | |||
local formatted = tostring(num) | |||
local k | |||
while true do | |||
formatted, k = formatted:gsub("^(-?%d+)(%d%d%d)", '%1,%2') | |||
if k == 0 then break end | |||
end | end | ||
return formatted | |||
end | |||
-- Helper function to format dates | |||
local function formatDate(timestamp) | |||
-- Convert ISO 8601 to a more readable format | |||
return mw.language.formatDate(timestamp, '%Y-%m-%d %H:%M:%S') | |||
end | |||
-- Function to retrieve category statistics | |||
function p.getCategoryStats(frame) | |||
local categoryName = frame.args.categoryName -- Pass the category name as an argument | |||
if not categoryName or categoryName == "" then | |||
if | return "'''Error:''' No category name provided." | ||
return | |||
end | end | ||
local stats = mw.site.stats.pagesInCategory(categoryName, "*") | |||
if not stats then | |||
return "'''Error:''' Unable to retrieve statistics for the category." | |||
end | |||
-- Calculate percentages | |||
local total = stats.all | |||
local pagesPercent = total > 0 and string.format("%.2f%%", (stats.pages / total) * 100) or "0%" | |||
local subcatsPercent = total > 0 and string.format("%.2f%%", (stats.subcats / total) * 100) or "0%" | |||
local filesPercent = total > 0 and string.format("%.2f%%", (stats.files / total) * 100) or "0%" | |||
-- Create a link to the category | |||
local categoryLink = "[[Category:" .. mw.text.encode(categoryName) .. "|" .. mw.text.encode(categoryName) .. "]]" | |||
-- | -- Build the wikitext table for category stats | ||
local result = {} | |||
table.insert(result, '{| class="wikitable sortable" style="width:50%; margin:auto;"') | |||
table.insert(result, '! colspan="3" style="text-align:center; font-size:150%;" ' .. categoryLink) | |||
table.insert(result, '|-') | |||
table.insert(result, '! Statistic !! Count !! Percentage') | |||
table.insert(result, '|-') | |||
table.insert(result, '| Total items || ' .. formatNumber(stats.all) .. ' || 100%') | |||
table.insert(result, '|-') | |||
table.insert(result, '| Pages || ' .. formatNumber(stats.pages) .. ' || ' .. pagesPercent) | |||
table.insert(result, '|-') | |||
table.insert(result, '| Subcategories || ' .. formatNumber(stats.subcats) .. ' || ' .. subcatsPercent) | |||
table.insert(result, '|-') | |||
table.insert(result, '| Files || ' .. formatNumber(stats.files) .. ' || ' .. filesPercent) | |||
table.insert(result, '|}') | |||
return table.concat(result, "\n") | |||
end | end | ||
-- Function to list revision dates for pages in the category | |||
function p.listRevisionDates(frame) | |||
local categoryName = frame.args.categoryName -- Pass the category name as an argument | |||
if not categoryName or categoryName == "" then | |||
return "'''Error:''' No category name provided." | |||
end | |||
if not | local stats = mw.site.stats.pagesInCategory(categoryName, "*") | ||
return "Error: | if not stats then | ||
return "'''Error:''' Unable to retrieve statistics for the category." | |||
end | end | ||
local | -- For demonstration purposes, we'll assume 'stats.pages' gives us the number of pages. | ||
-- However, to list individual pages and their revisions, we need to fetch them. | |||
-- Since 'mw.site.stats.pagesInCategory' provides counts, not individual titles, | |||
-- we need an alternative approach. Unfortunately, without 'getCategoryMembers', | |||
-- it's challenging to list individual pages. If your environment has another | |||
-- way to retrieve page titles, please let me know. Otherwise, we'll proceed | |||
-- by limiting the functionality to category statistics. | |||
-- Placeholder message indicating the limitation | |||
local result = {} | |||
table.insert(result, "<h2>Latest Revisions for Pages in [[" .. mw.text.encode(categoryName) .. "]]</h2>") | |||
table.insert(result, "'''Note:''' Listing individual page revisions requires access to page titles, which is not available using `mw.site.stats.pagesInCategory`. To enable this functionality, consider using `mw.site.getCategoryMembers` or another method that provides page titles.") | |||
return table.concat(result, "\n") | |||
end | |||
-- Function to get the latest revision date of a single page (optional) | |||
function p.getLatestEditDate(frame) | |||
end | local pageName = frame.args.pageName | ||
if not pageName or pageName == "" then | |||
return "'''Error:''' No page name provided." | |||
end | |||
if not | local title = mw.title.new(pageName) | ||
return "Error: " | if not title or not title.exists then | ||
return "'''Error:''' Invalid or non-existent page title." | |||
end | end | ||
if | local revision = title:getLatestRevision() | ||
return " | if not revision then | ||
return "'''Error:''' Unable to retrieve the latest revision." | |||
end | end | ||
local timestamp = revision:getTimestamp() | |||
local | local formattedTime = formatDate(timestamp) | ||
local user = revision:getUser() | |||
return string.format("**Latest Edit Date for [[%s]]:** %s UTC by [[User:%s|%s]]", | |||
mw.text.encode(pageName), | |||
formattedTime, | |||
mw.text.encode(user), | |||
mw.text.encode(user) | |||
) | |||
end | |||
-- Main function to orchestrate the output | |||
function p.main(frame) | |||
local categoryStats = p.getCategoryStats(frame) | |||
local revisionData = p.listRevisionDates(frame) | |||
local singlePageRevision = p.getLatestEditDate(frame) -- Example of single page revision | |||
-- You can control the inclusion of the single page revision by checking for 'pageName' | |||
-- If 'pageName' is not provided, you can skip this part | |||
local includeSinglePageRevision = frame.args.pageName and frame.args.pageName ~= "" | |||
-- Add a separator between sections | |||
local separator = "\n\n" | |||
-- Combine all parts | |||
local outputParts = {categoryStats, revisionData} | |||
if includeSinglePageRevision then | |||
table.insert(outputParts, separator .. singlePageRevision) | |||
end | end | ||
-- Combine with separators | |||
local output = table.concat(outputParts, separator) | |||
-- Optionally, add a timestamp of when the data was retrieved | |||
local timestamp = os.date("Retrieved on %Y-%m-%d at %H:%M:%S UTC") | |||
output = output .. '\n<div style="text-align:center; font-size:small; color:gray;">' .. timestamp .. '</div>' | |||
return output | |||
end | end | ||
return p | return p |
Latest revision as of 18:05, 22 December 2024
Documentation for this module may be created at Module:RecursiveSelectiveList/doc
local p = {}
-- Helper function to format numbers with commas
local function formatNumber(num)
if not num then return "0" end
local formatted = tostring(num)
local k
while true do
formatted, k = formatted:gsub("^(-?%d+)(%d%d%d)", '%1,%2')
if k == 0 then break end
end
return formatted
end
-- Helper function to format dates
local function formatDate(timestamp)
-- Convert ISO 8601 to a more readable format
return mw.language.formatDate(timestamp, '%Y-%m-%d %H:%M:%S')
end
-- Function to retrieve category statistics
function p.getCategoryStats(frame)
local categoryName = frame.args.categoryName -- Pass the category name as an argument
if not categoryName or categoryName == "" then
return "'''Error:''' No category name provided."
end
local stats = mw.site.stats.pagesInCategory(categoryName, "*")
if not stats then
return "'''Error:''' Unable to retrieve statistics for the category."
end
-- Calculate percentages
local total = stats.all
local pagesPercent = total > 0 and string.format("%.2f%%", (stats.pages / total) * 100) or "0%"
local subcatsPercent = total > 0 and string.format("%.2f%%", (stats.subcats / total) * 100) or "0%"
local filesPercent = total > 0 and string.format("%.2f%%", (stats.files / total) * 100) or "0%"
-- Create a link to the category
local categoryLink = "[[Category:" .. mw.text.encode(categoryName) .. "|" .. mw.text.encode(categoryName) .. "]]"
-- Build the wikitext table for category stats
local result = {}
table.insert(result, '{| class="wikitable sortable" style="width:50%; margin:auto;"')
table.insert(result, '! colspan="3" style="text-align:center; font-size:150%;" ' .. categoryLink)
table.insert(result, '|-')
table.insert(result, '! Statistic !! Count !! Percentage')
table.insert(result, '|-')
table.insert(result, '| Total items || ' .. formatNumber(stats.all) .. ' || 100%')
table.insert(result, '|-')
table.insert(result, '| Pages || ' .. formatNumber(stats.pages) .. ' || ' .. pagesPercent)
table.insert(result, '|-')
table.insert(result, '| Subcategories || ' .. formatNumber(stats.subcats) .. ' || ' .. subcatsPercent)
table.insert(result, '|-')
table.insert(result, '| Files || ' .. formatNumber(stats.files) .. ' || ' .. filesPercent)
table.insert(result, '|}')
return table.concat(result, "\n")
end
-- Function to list revision dates for pages in the category
function p.listRevisionDates(frame)
local categoryName = frame.args.categoryName -- Pass the category name as an argument
if not categoryName or categoryName == "" then
return "'''Error:''' No category name provided."
end
local stats = mw.site.stats.pagesInCategory(categoryName, "*")
if not stats then
return "'''Error:''' Unable to retrieve statistics for the category."
end
-- For demonstration purposes, we'll assume 'stats.pages' gives us the number of pages.
-- However, to list individual pages and their revisions, we need to fetch them.
-- Since 'mw.site.stats.pagesInCategory' provides counts, not individual titles,
-- we need an alternative approach. Unfortunately, without 'getCategoryMembers',
-- it's challenging to list individual pages. If your environment has another
-- way to retrieve page titles, please let me know. Otherwise, we'll proceed
-- by limiting the functionality to category statistics.
-- Placeholder message indicating the limitation
local result = {}
table.insert(result, "<h2>Latest Revisions for Pages in [[" .. mw.text.encode(categoryName) .. "]]</h2>")
table.insert(result, "'''Note:''' Listing individual page revisions requires access to page titles, which is not available using `mw.site.stats.pagesInCategory`. To enable this functionality, consider using `mw.site.getCategoryMembers` or another method that provides page titles.")
return table.concat(result, "\n")
end
-- Function to get the latest revision date of a single page (optional)
function p.getLatestEditDate(frame)
local pageName = frame.args.pageName
if not pageName or pageName == "" then
return "'''Error:''' No page name provided."
end
local title = mw.title.new(pageName)
if not title or not title.exists then
return "'''Error:''' Invalid or non-existent page title."
end
local revision = title:getLatestRevision()
if not revision then
return "'''Error:''' Unable to retrieve the latest revision."
end
local timestamp = revision:getTimestamp()
local formattedTime = formatDate(timestamp)
local user = revision:getUser()
return string.format("**Latest Edit Date for [[%s]]:** %s UTC by [[User:%s|%s]]",
mw.text.encode(pageName),
formattedTime,
mw.text.encode(user),
mw.text.encode(user)
)
end
-- Main function to orchestrate the output
function p.main(frame)
local categoryStats = p.getCategoryStats(frame)
local revisionData = p.listRevisionDates(frame)
local singlePageRevision = p.getLatestEditDate(frame) -- Example of single page revision
-- You can control the inclusion of the single page revision by checking for 'pageName'
-- If 'pageName' is not provided, you can skip this part
local includeSinglePageRevision = frame.args.pageName and frame.args.pageName ~= ""
-- Add a separator between sections
local separator = "\n\n"
-- Combine all parts
local outputParts = {categoryStats, revisionData}
if includeSinglePageRevision then
table.insert(outputParts, separator .. singlePageRevision)
end
-- Combine with separators
local output = table.concat(outputParts, separator)
-- Optionally, add a timestamp of when the data was retrieved
local timestamp = os.date("Retrieved on %Y-%m-%d at %H:%M:%S UTC")
output = output .. '\n<div style="text-align:center; font-size:small; color:gray;">' .. timestamp .. '</div>'
return output
end
return p