Documentation for this module may be created at Module:SummarySnippet/doc
local p = {}
-- Trims whitespace from a string
local function trim(s)
return s:match("^%s*(.-)%s*$")
end
function p.fromPage(frame)
local page = frame.args[1]
local length = tonumber(frame.args[2]) or 150
if not page or page == '' then
return "No page name provided."
end
-- Parse input: extract page name from link-style input if needed
local raw = mw.ustring.match(page, "%[%[(.-)%]%]") or page
local pageText = mw.text.split(raw, "|")[1]
local content = mw.title.new(pageText)
if not content or not content.exists then
return "Page not found: " .. pageText
end
local text = content:getContent()
if not text then
return "No content."
end
-- Strip templates and most formatting (basic)
text = mw.text.killMarkers(text)
text = mw.ustring.gsub(text, '{{.-}}', '') -- remove templates
text = mw.ustring.gsub(text, '%[%[.-%|', '') -- remove link alt text
text = mw.ustring.gsub(text, '%[%[', '') -- remove opening brackets
text = mw.ustring.gsub(text, '%]%]', '') -- remove closing brackets
text = mw.ustring.gsub(text, "''+", "") -- remove italics/bold
text = mw.ustring.gsub(text, "=+%s*(.-)%s*=+", "") -- remove headers
-- Collapse whitespace
text = text:gsub("\n", " ")
text = text:gsub("%s+", " ")
text = trim(text)
-- Handle empty content after cleanup
if text == "" then
return "No description available."
end
-- Tag on a snippet-text class otherwise size gets overwritten and tack on a final read more
local link = string.format(" [[:%s|Read more]]", pageText)
return string.format('<span class="snippet-text">%s... %s</span>', mw.text.nowiki(truncatedText), link)
end
return p