Module:Book Marks2
Appearance
local p = {}
-- A helper function to map text to number
local num_words = {
["zero"] = 0, ["one"] = 1, ["two"] = 2, ["three"] = 3, ["four"] = 4,
["five"] = 5, ["six"] = 6, ["seven"] = 7, ["eight"] = 8, ["nine"] = 9,
["ten"] = 10, ["eleven"] = 11, ["twelve"] = 12, ["thirteen"] = 13,
["fourteen"] = 14, ["fifteen"] = 15, ["sixteen"] = 16, ["seventeen"] = 17,
["eighteen"] = 18, ["nineteen"] = 19, ["twenty"] = 20, ["twenty-one"] = 21,
["twenty-two"] = 22, ["twenty-three"] = 23, ["twenty-four"] = 24,
["twenty-five"] = 25, ["twenty-six"] = 26, ["twenty-seven"] = 27,
["twenty-eight"] = 28, ["twenty-nine"] = 29, ["thirty"] = 30
}
-- Function to convert text to number
local function text_to_number(text)
text = text:lower() -- Convert text to lowercase to handle cases like "One" or "one"
return num_words[text] or nil -- Return the mapped number or nil if not found
end
-- ensure no floats
local function is_integer(num)
return num == math.floor(num) -- Ensure the number has no fractional part
end
function p.generateSummary(frame)
-- Retrieve input parameters
local total_reviews = tonumber(frame.args['total_reviews']) or text_to_number(frame.args['total_reviews']) or 0
local rave = tonumber(frame.args['rave']) or text_to_number(frame.args['rave']) or 0
local positive = tonumber(frame.args['positive']) or text_to_number(frame.args['positive']) or 0
local m = tonumber(frame.args['m']) or text_to_number(frame.args['m']) or 0
local pan = tonumber(frame.args['pan']) or text_to_number(frame.args['pan']) or 0
local consensus = frame.args['consensus'] or "Unknown"
-- Check if review counts sum up to total_reviews
if total_reviews ~= (rave + positive + m + pan) then
return "Error: Review counts do not sum to total."
end
-- Check for reasonable total
if total_reviews < 5 then
return "Error: There must be at least 5 tot rev"
end
-- Check for non-negative integers
if rave < 0 or positive < 0 or m < 0 or pan < 0 then
return "Error: All inputs must be non-negative integers."
end
-- Build the sentence
local sentence = "Per [[Literary_Hub#Book_Marks|Book Marks]], a website that [[Review_aggregation|aggregates]] critical reviews for literature from mainstream critics, the book received an overall \"" .. consensus .. "\" consensus rating based on " .. total_reviews .. " independent third-party assessments, including "
rave = rave or 0
positive = positive or 0
m = m or 0
pan = pan or 0
local reviews = {}
if rave > 0 then
table.insert(reviews, rave .. " \"rave\"")
end
if positive > 0 then
table.insert(reviews, positive .. " \"positive\"")
end
if m > 0 then
table.insert(reviews, m .. " \"mixed\"")
end
if pan > 0 then
table.insert(reviews, pan .. " \"pan\"")
end
-- Handle the cases based on the number of reviews
if #reviews == 4 then
sentence = sentence .. table.concat(reviews, ", ", 1, 3) .. ", and " .. reviews[4] .. " reviews."
elseif #reviews == 3 then
sentence = sentence .. table.concat(reviews, ", ", 1, 2) .. ", and " .. reviews[3] .. " reviews."
elseif #reviews == 2 then
sentence = sentence .. reviews[1] .. " and " .. reviews[2] .. " reviews."
elseif #reviews == 1 then
sentence = sentence .. reviews[1] .. " reviews."
else
sentence = sentence .. "no reviews."
end
return sentence
end
return p