Module:RecursiveSelectiveList: Difference between revisions

From Ikwipedia
No edit summary
No edit summary
 
(22 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}
local mw = require('mw')


function p.debug(frame)
-- Helper function to format numbers with commas
     local html = mw.html.create("div"):addClass("debug-output")
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, '|}')


     -- Retrieve parameters from the template invocation
     return table.concat(result, "\n")
    local args = frame.args
end
    html:tag("h3"):wikitext("Debugging Information")


    -- Add each parameter as a key-value pair
-- Function to list revision dates for pages in the category
    html:tag("h4"):wikitext("Template Arguments:")
function p.listRevisionDates(frame)
     local argsList = html:tag("ul")
     local categoryName = frame.args.categoryName -- Pass the category name as an argument
    for key, value in pairs(args) do
 
         argsList:tag("li"):wikitext(key .. " = " .. (value or "nil"))
    if not categoryName or categoryName == "" then
         return "'''Error:''' No category name provided."
     end
     end


     -- Example of debugging mw.title.new
     local stats = mw.site.stats.pagesInCategory(categoryName, "*")
    local pageName = args.pageName or "No pageName provided"
     if not stats then
     html:tag("h4"):wikitext("Page Name Provided:")
        return "'''Error:''' Unable to retrieve statistics for the category."
     html:tag("p"):wikitext(pageName)
     end


     if pageName ~= "No pageName provided" then
     -- For demonstration purposes, we'll assume 'stats.pages' gives us the number of pages.
        local titleObject = mw.title.new(pageName)
    -- However, to list individual pages and their revisions, we need to fetch them.
        if titleObject then
    -- Since 'mw.site.stats.pagesInCategory' provides counts, not individual titles,
            html:tag("h4"):wikitext("Title Object Debugging:")
    -- we need an alternative approach. Unfortunately, without 'getCategoryMembers',
            local titleList = html:tag("ul")
    -- it's challenging to list individual pages. If your environment has another
            titleList:tag("li"):wikitext("Full Text: " .. (titleObject.fullText or "nil"))
    -- way to retrieve page titles, please let me know. Otherwise, we'll proceed
            titleList:tag("li"):wikitext("Namespace: " .. (titleObject.namespace or "nil"))
    -- by limiting the functionality to category statistics.
            titleList:tag("li"):wikitext("ID: " .. (titleObject.id or "nil"))


            -- Try to get content
    -- Placeholder message indicating the limitation
            local pageContent = titleObject:getContent()
    local result = {}
            if pageContent then
    table.insert(result, "<h2>Latest Revisions for Pages in [[" .. mw.text.encode(categoryName) .. "]]</h2>")
                html:tag("h4"):wikitext("Page Content:")
    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.")
                html:tag("pre"):wikitext(pageContent)
 
            else
    return table.concat(result, "\n")
                html:tag("h4"):wikitext("Page Content:"):tag("p"):wikitext("No content found or page does not exist.")
end
            end
 
        else
-- Function to get the latest revision date of a single page (optional)
            html:tag("h4"):wikitext("Title Object:"):tag("p"):wikitext("Failed to create title object for page name.")
function p.getLatestEditDate(frame)
        end
    local pageName = frame.args.pageName
    if not pageName or pageName == "" then
        return "'''Error:''' No page name provided."
     end
     end


     return tostring(html)
     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
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