local p =
-- A helper function to map text to numberlocal num_words =
-- Function to convert text to numberlocal 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 foundend
-- ensure no floatslocal function is_integer(num) return num
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 total reviews." 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 Book Marks, a website that 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
3 then sentence = sentence .. table.concat(reviews, ", ", 1, 2) .. ", and " .. reviews[3] .. " reviews." elseif #reviews
1 then sentence = sentence .. reviews[1] .. " reviews." else sentence = sentence .. "no reviews." end return sentenceend
return p