Module:PageSummary
武外梗百科 爱国好学自强图新的百科全书
更多操作
此模块的文档可以在Module:PageSummary/doc创建
local p = {}
-- stripImages 函数保持不变(已使用字节级,但对图片提取影响小)
-- cleanFinal 函数保持不变
function p.getSummaryAndImage(frame)
local pageName = mw.text.trim(frame.args[1] or "")
if pageName == "" then return "" end
local title = mw.title.new(pageName)
if not title or not title.exists then return "" end
local content = title:getContent()
if not content or content == "" then return "" end
-- 用 mw.ustring 安全截取(避免字节切割中文)
local rawExcerpt = mw.ustring.sub(content, 1, 300) -- 字符级 300 个字符,够用
-- 改用 mw.ustring 的模式匹配,更安全处理中文文件名
local firstImage
-- 尝试匹配 File: 或 文件: 开头的
firstImage = mw.ustring.match(rawExcerpt, "%[%[(File|文件|Image|图像):([^|%]]+)")
-- 如果没匹配到,再试更宽松的(但优先上面)
if not firstImage then
firstImage = mw.ustring.match(rawExcerpt, "%[%[([^|%]]+)%]")
if firstImage and not (firstImage:find("File:") or firstImage:find("文件:")
or firstImage:find("Image:") or firstImage:find("图像:")) then
firstImage = nil -- 不是文件就丢掉
end
end
local step1 = stripImages(rawExcerpt) or ""
local cleanText = cleanFinal(step1) or ""
local targetLen = 120
local summary = cleanText:sub(1, targetLen * 2) or ""
local ulen = mw.ustring.len(summary) or 0
if ulen > targetLen then
summary = mw.ustring.sub(summary, 1, targetLen) or ""
local rev = summary:reverse()
local lastBreak = rev:find("[ %s%p,。!?;:]") or 1
if lastBreak > 1 and lastBreak < 20 then
summary = mw.ustring.sub(summary, 1, #summary - lastBreak + 1) or ""
end
summary = mw.text.trim(summary) .. "..."
end
summary = mw.text.trim(summary)
-- HTML 构建
local container = mw.html.create('div')
:css('margin-bottom', '25px')
:css('display', 'flow-root')
container:tag('div')
:css('font-size', '1.3em')
:css('font-weight', 'bold')
:css('margin-bottom', '6px')
:css('border-bottom', '1px solid #eee')
:wikitext('[[' .. pageName .. ']]')
local textDiv = container:tag('div')
:css('line-height', '1.6')
:css('color', '#222')
:css('font-size', '14px')
-- 关键修复:如果有图片名,确保用 mw.ustring 处理
if firstImage and firstImage ~= "" then
-- 额外清理:去掉可能的前后空格(虽然 match 已捕获干净)
firstImage = mw.text.trim(firstImage)
-- 用 [[File:xxx|...]] 格式,确保 MediaWiki 正确解析
local imgWikitext = '[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]'
textDiv:wikitext(imgWikitext)
end
textDiv:wikitext(summary)
return tostring(container)
end
return p