More languages
More actions
No edit summary |
(rolling back tests) Tag: Manual revert |
||
Line 1: | Line 1: | ||
-- Calculate estimated reading time for any page rounded to multiple of 5. Outputs "X-Y minutes". | |||
-- invoke on any page or template with {{#invoke:Reading time|estimateReadingTime|YourPageHere}} (change YourPageHere) | |||
local p = {} | local p = {} | ||
local mw = require("mw") | local mw = require("mw") | ||
function p.estimateReadingTime(frame) | |||
-- Get the page title from the frame parameter | |||
local pageTitle = frame.args[1] | |||
function p. | |||
-- | |||
pageTitle = | |||
-- Ensure that pageTitle is a string | |||
if type(pageTitle) == "string" then | if type(pageTitle) == "string" then | ||
-- Use MediaWiki's built-in function to get the page content | |||
local content = mw.title.new(pageTitle):getContent() | local content = mw.title.new(pageTitle):getContent() | ||
-- Ensure that content is a string | |||
if type(content) == "string" then | if type(content) == "string" then | ||
-- Count words using a more robust pattern | |||
local wordCount = 0 | local wordCount = 0 | ||
for word in content:gmatch("%S+") do | for word in content:gmatch("%S+") do | ||
Line 22: | Line 22: | ||
end | end | ||
-- | -- Define the range of reading speeds | ||
local minSpeed = 160 | local minSpeed = 160 | ||
local maxSpeed = 238 | local maxSpeed = 238 | ||
-- Calculate reading times for both minimum and maximum speeds | -- Calculate reading times for both minimum and maximum speeds | ||
minReadingTime = math.floor(wordCount / maxSpeed) | local minReadingTime = math.floor(wordCount / maxSpeed) | ||
maxReadingTime = math.ceil(wordCount / minSpeed) | local maxReadingTime = math.ceil(wordCount / minSpeed) | ||
-- Round the reading times to the nearest multiple of 5 | |||
minReadingTime = math.floor(minReadingTime / 5) * 5 | minReadingTime = math.floor(minReadingTime / 5) * 5 | ||
maxReadingTime = math.ceil(maxReadingTime / 5) * 5 | maxReadingTime = math.ceil(maxReadingTime / 5) * 5 | ||
-- | -- Ensure that minReadingTime is at least 1 | ||
if minReadingTime == 0 then | if minReadingTime == 0 then | ||
minReadingTime = 1 | |||
end | end | ||
-- Create the reading time string | |||
local readingTime = minReadingTime .. "-" .. maxReadingTime .. " minutes" | |||
return readingTime | |||
else | |||
return "Error: Invalid content" | |||
end | |||
else | else | ||
return " | return "Error: Invalid page title" | ||
end | end | ||
end | end | ||
return p | return p |
Revision as of 20:12, 10 March 2024
-- Calculate estimated reading time for any page rounded to multiple of 5. Outputs "X-Y minutes".
-- invoke on any page or template with {{#invoke:Reading time|estimateReadingTime|YourPageHere}} (change YourPageHere)
local p = {}
local mw = require("mw")
function p.estimateReadingTime(frame)
-- Get the page title from the frame parameter
local pageTitle = frame.args[1]
-- Ensure that pageTitle is a string
if type(pageTitle) == "string" then
-- Use MediaWiki's built-in function to get the page content
local content = mw.title.new(pageTitle):getContent()
-- Ensure that content is a string
if type(content) == "string" then
-- Count words using a more robust pattern
local wordCount = 0
for word in content:gmatch("%S+") do
wordCount = wordCount + 1
end
-- Define the range of reading speeds
local minSpeed = 160
local maxSpeed = 238
-- Calculate reading times for both minimum and maximum speeds
local minReadingTime = math.floor(wordCount / maxSpeed)
local maxReadingTime = math.ceil(wordCount / minSpeed)
-- Round the reading times to the nearest multiple of 5
minReadingTime = math.floor(minReadingTime / 5) * 5
maxReadingTime = math.ceil(maxReadingTime / 5) * 5
-- Ensure that minReadingTime is at least 1
if minReadingTime == 0 then
minReadingTime = 1
end
-- Create the reading time string
local readingTime = minReadingTime .. "-" .. maxReadingTime .. " minutes"
return readingTime
else
return "Error: Invalid content"
end
else
return "Error: Invalid page title"
end
end
return p