Module:PageSummary:修订间差异
武外梗百科 爱国好学自强图新的百科全书
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- | -- stripImages 函数保持不变(已使用字节级,但对图片提取影响小) | ||
-- | -- cleanFinal 函数保持不变 | ||
function p.getSummaryAndImage(frame) | function p.getSummaryAndImage(frame) | ||
| 第75行: | 第15行: | ||
if not content or content == "" then return "" end | if not content or content == "" then return "" end | ||
-- | -- 用 mw.ustring 安全截取(避免字节切割中文) | ||
local rawExcerpt = | local rawExcerpt = mw.ustring.sub(content, 1, 300) -- 字符级 300 个字符,够用 | ||
-- | -- 改用 mw.ustring 的模式匹配,更安全处理中文文件名 | ||
local firstImage = | 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 step1 = stripImages(rawExcerpt) or "" | ||
| 第85行: | 第36行: | ||
local targetLen = 120 | local targetLen = 120 | ||
local summary = cleanText:sub(1, targetLen * 2) or "" | local summary = cleanText:sub(1, targetLen * 2) or "" | ||
local ulen = mw.ustring.len(summary) or 0 | local ulen = mw.ustring.len(summary) or 0 | ||
if ulen > targetLen then | if ulen > targetLen then | ||
summary = mw.ustring.sub(summary, 1, targetLen) or "" | summary = mw.ustring.sub(summary, 1, targetLen) or "" | ||
local rev = summary:reverse() | local rev = summary:reverse() | ||
local lastBreak = rev:find("[ %s%p,。!?;:]") or 1 | local lastBreak = rev:find("[ %s%p,。!?;:]") or 1 | ||
| 第106行: | 第53行: | ||
summary = mw.text.trim(summary) | summary = mw.text.trim(summary) | ||
-- HTML | -- HTML 构建 | ||
local container = mw.html.create('div') | local container = mw.html.create('div') | ||
:css('margin-bottom', '25px') | :css('margin-bottom', '25px') | ||
:css('display', 'flow-root') | :css('display', 'flow-root') | ||
container:tag('div') | container:tag('div') | ||
:css('font-size', '1.3em') | :css('font-size', '1.3em') | ||
| 第119行: | 第65行: | ||
:wikitext('[[' .. pageName .. ']]') | :wikitext('[[' .. pageName .. ']]') | ||
local textDiv = container:tag('div') | local textDiv = container:tag('div') | ||
:css('line-height', '1.6') | :css('line-height', '1.6') | ||
| 第125行: | 第70行: | ||
:css('font-size', '14px') | :css('font-size', '14px') | ||
-- 关键修复:如果有图片名,确保用 mw.ustring 处理 | |||
if firstImage and firstImage ~= "" then | 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 | end | ||
2026年2月17日 (二) 23:53的版本
此模块的文档可以在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