Module:Reading time: Difference between revisions

From ProleWiki, the proletarian encyclopedia
(adding a function for reading length, editors can pick between reading time and reading length)
No edit summary
Line 1: Line 1:
local p = {}
local p = {}
local mw = require("mw")
local mw = require("mw")
-- Global variables
local minReadingTime
local maxReadingTime


function p.estimateReadingTime(frame)
function p.estimateReadingTime(frame)
Line 17: Line 21:
             local maxSpeed = 238
             local maxSpeed = 238


             local minReadingTime = math.floor(wordCount / maxSpeed)
             minReadingTime = math.floor(wordCount / maxSpeed)
             local maxReadingTime = math.ceil(wordCount / minSpeed)
             maxReadingTime = math.ceil(wordCount / minSpeed)


             minReadingTime = math.floor(minReadingTime / 5) * 5
             minReadingTime = math.floor(minReadingTime / 5) * 5
Line 27: Line 31:
             end
             end


             local readingTime = minReadingTime .. "-" .. maxReadingTime .. " minutes"
             return minReadingTime .. "-" .. maxReadingTime .. " minutes"
 
            return readingTime
         else
         else
             return "Error: Invalid content"
             return "Error: Invalid content"
Line 39: Line 41:


function p.estimateReadingLength(frame)
function p.estimateReadingLength(frame)
     local readingTime = p.estimateReadingTime(frame)
     if not minReadingTime or not maxReadingTime then
    local minReadingTime, maxReadingTime = readingTime:match("(%d+)%-(%d+)")
        error("Error: Reading time not calculated")
     local averageReadingTime = (tonumber(minReadingTime) + tonumber(maxReadingTime)) / 2
    end
 
     local averageReadingTime = (minReadingTime + maxReadingTime) / 2


     if averageReadingTime < 120 then
     if averageReadingTime < 120 then

Revision as of 19:27, 10 March 2024

local p = {}
local mw = require("mw")

-- Global variables
local minReadingTime
local maxReadingTime

function p.estimateReadingTime(frame)
    local pageTitle = frame.args[1]
    
    if type(pageTitle) == "string" then
        local content = mw.title.new(pageTitle):getContent()

        if type(content) == "string" then
            local wordCount = 0
            for word in content:gmatch("%S+") do
                wordCount = wordCount + 1
            end

            local minSpeed = 160
            local maxSpeed = 238

            minReadingTime = math.floor(wordCount / maxSpeed)
            maxReadingTime = math.ceil(wordCount / minSpeed)

            minReadingTime = math.floor(minReadingTime / 5) * 5
            maxReadingTime = math.ceil(maxReadingTime / 5) * 5

            if minReadingTime == 0 then
                minReadingTime = 1
            end

            return minReadingTime .. "-" .. maxReadingTime .. " minutes"
        else
            return "Error: Invalid content"
        end
    else
        return "Error: Invalid page title"
    end
end

function p.estimateReadingLength(frame)
    if not minReadingTime or not maxReadingTime then
        error("Error: Reading time not calculated")
    end

    local averageReadingTime = (minReadingTime + maxReadingTime) / 2

    if averageReadingTime < 120 then
        return "Short"
    elseif averageReadingTime >= 120 and averageReadingTime < 360 then
        return "Medium"
    elseif averageReadingTime >= 360 and averageReadingTime < 720 then
        return "Long"
    else
        return "Very Long"
    end
end

return p