More actions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- | -- Trim leading/trailing whitespace | ||
local function trim(s) | local function trim(s) | ||
return s:match("^%s*(.-)%s*$") | return s:match("^%s*(.-)%s*$") | ||
Line 14: | Line 14: | ||
end | end | ||
-- Parse | -- Parse link-style input | ||
local raw = mw.ustring.match(page, "%[%[(.-)%]%]") or page | local raw = mw.ustring.match(page, "%[%[(.-)%]%]") or page | ||
local pageText = mw.text.split(raw, "|")[1] | local pageText = mw.text.split(raw, "|")[1] | ||
local | local title = mw.title.new(pageText) | ||
if not | if not title or not title.exists then | ||
return "Page not found: " .. pageText | return "Page not found: " .. pageText | ||
end | end | ||
local | -- Use MediaWiki parser to preprocess and expand the page content | ||
if not | local expanded = frame:preprocess('{{:' .. pageText .. '}}') | ||
if not expanded then | |||
return "No content." | return "No content." | ||
end | end | ||
-- | -- Attempt to skip content before the first section (e.g., infobox/template blob) | ||
local body = mw.ustring.match(expanded, "==.*") or expanded | |||
-- | -- Clean up formatting | ||
body = mw.text.killMarkers(body) | |||
body = mw.ustring.gsub(body, '%[%[(.-)%|(.-)%]%]', '%2') -- [[Page|Label]] → Label | |||
body = mw.ustring.gsub(body, '%[%[', '') -- [[Page]] → Page | |||
body = mw.ustring.gsub(body, '%]%]', '') | |||
body = mw.ustring.gsub(body, "''+", "") -- remove bold/italics | |||
body = mw.ustring.gsub(body, "=+%s*(.-)%s*=+", "") -- remove section headers | |||
body = mw.ustring.gsub(body, "{{.-}}", "") -- remove remaining inline templates | |||
-- Normalize whitespace | -- Normalize whitespace | ||
body = body:gsub("\n", " ") | |||
body = body:gsub("%s+", " ") | |||
body = trim(body) | |||
if body == "" then | |||
return "No description available." | |||
return | |||
end | end | ||
local truncated = mw.ustring.sub(body, 1, length) | |||
local truncated = mw.ustring.sub( | if #body > length then | ||
if # | |||
truncated = truncated .. "..." | truncated = truncated .. "..." | ||
end | end |
Latest revision as of 17:02, 30 May 2025
Documentation for this module may be created at Module:SummarySnippet/doc
local p = {}
-- Trim leading/trailing whitespace
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 link-style input
local raw = mw.ustring.match(page, "%[%[(.-)%]%]") or page
local pageText = mw.text.split(raw, "|")[1]
local title = mw.title.new(pageText)
if not title or not title.exists then
return "Page not found: " .. pageText
end
-- Use MediaWiki parser to preprocess and expand the page content
local expanded = frame:preprocess('{{:' .. pageText .. '}}')
if not expanded then
return "No content."
end
-- Attempt to skip content before the first section (e.g., infobox/template blob)
local body = mw.ustring.match(expanded, "==.*") or expanded
-- Clean up formatting
body = mw.text.killMarkers(body)
body = mw.ustring.gsub(body, '%[%[(.-)%|(.-)%]%]', '%2') -- [[Page|Label]] → Label
body = mw.ustring.gsub(body, '%[%[', '') -- [[Page]] → Page
body = mw.ustring.gsub(body, '%]%]', '')
body = mw.ustring.gsub(body, "''+", "") -- remove bold/italics
body = mw.ustring.gsub(body, "=+%s*(.-)%s*=+", "") -- remove section headers
body = mw.ustring.gsub(body, "{{.-}}", "") -- remove remaining inline templates
-- Normalize whitespace
body = body:gsub("\n", " ")
body = body:gsub("%s+", " ")
body = trim(body)
if body == "" then
return "No description available."
end
local truncated = mw.ustring.sub(body, 1, length)
if #body > length then
truncated = truncated .. "..."
end
return truncated
end
return p