Module:PageSummary:修订间差异
武外梗百科 爱国好学自强图新的百科全书
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- | -- 剥离 [[File:]] [[文件:]] [[Category:]] 等,防止出现在摘要文本中 | ||
local function stripImages(text) | local function stripImages(text) | ||
if not text or text == "" then return "" end | if not text or text == "" then return "" end | ||
-- | -- 统一常见前缀写法,方便后续匹配 | ||
text = text:gsub("%[%[(文件 | text = text:gsub("%[%[(文件|Image|图像):", "[[File:") | ||
:gsub("%[%[(分类|Category):", "[[Category:") | :gsub("%[%[(分类|Category):", "[[Category:") | ||
| 第19行: | 第17行: | ||
local chunk = text:sub(i, i+15) | local chunk = text:sub(i, i+15) | ||
if chunk:match("^%[%[File:") or chunk:match("^%[%[Category:") then | if chunk:match("^%[%[File:") or chunk:match("^%[%[Category:") then | ||
local depth = 1 | local depth = 1 | ||
local j = i + 2 | local j = i + 2 | ||
| 第33行: | 第30行: | ||
end | end | ||
end | end | ||
i = j | i = j | ||
else | else | ||
table.insert(out, "[[") | table.insert(out, "[[") | ||
i = i + 2 | i = i + 2 | ||
end | end | ||
else | else | ||
table.insert(out, text:sub(i,i)) | table.insert(out, text:sub(i, i)) | ||
i = i + 1 | i = i + 1 | ||
end | end | ||
if i > 1200 then break end | if i > 1200 then break end | ||
end | end | ||
| 第50行: | 第46行: | ||
end | end | ||
-- | -- 清理模板、引用、注释、标题、列表等 | ||
local function cleanFinal(text) | local function cleanFinal(text) | ||
if not text or text == "" then return "" end | if not text or text == "" then return "" end | ||
text = text | text = text | ||
:gsub("{{[^{}]*}}", "") | :gsub("{{[^{}]*}}", "") | ||
:gsub("<ref.-</?ref[^>]*>", "") | :gsub("<ref.-</?ref[^>]*>", "") | ||
:gsub("<!%-%-.-%-%->", "") | :gsub("<!%-%-.-%-%->", "") | ||
:gsub("\n==+[^=]+==+", " ") | :gsub("\n==+[^=]+==+", " ") | ||
:gsub("\n%s*[*#:;]+", " ") | :gsub("\n%s*[*#:;]+", " ") | ||
:gsub("%s*\n%s*", " ") | :gsub("%s*\n%s*", " ") | ||
:gsub("%s+", " ") | :gsub("%s+", " ") | ||
return mw.text.trim(text) | return mw.text.trim(text) | ||
end | end | ||
function p.getSummaryAndImage(frame) | function p.getSummaryAndImage(frame) | ||
local pageName = mw.text.trim(frame.args[1] or "") | local pageName = mw.text.trim(frame.args[1] or "") | ||
| 第81行: | 第72行: | ||
if not content or content == "" then return "" end | if not content or content == "" then return "" end | ||
local rawExcerpt = mw.ustring.sub(content, 1, 300) or "" | |||
local rawExcerpt = mw.ustring.sub(content, 1, 300) | |||
-- | -- 提取第一张图片 - 分开匹配各种常见写法,减少编码问题 | ||
local firstImage = mw.ustring.match(rawExcerpt, "%[%[( | local firstImage = | ||
mw.ustring.match(rawExcerpt, "%[%[File:([^|%]]+)") or | |||
mw.ustring.match(rawExcerpt, "%[%[文件:([^|%]]+)") or | |||
mw.ustring.match(rawExcerpt, "%[%[Image:([^|%]]+)") or | |||
mw.ustring.match(rawExcerpt, "%[%[图像:([^|%]]+)") | |||
-- | -- 备用方案:抓完整链接再校验命名空间 | ||
if not firstImage then | if not firstImage then | ||
local | local full = mw.ustring.match(rawExcerpt, "%[%[([^%]]+)%]%]") | ||
if | if full then | ||
local ns = | local ns, name = mw.ustring.match(full, "^([^:]+):(.+)$") | ||
if ns and (ns | if ns and (ns == "File" or ns == "文件" or ns == "Image" or ns == "图像") then | ||
firstImage = | firstImage = ns .. ":" .. name | ||
end | end | ||
end | end | ||
end | |||
-- 额外清理文件名(去除隐藏字符、两端空格等) | |||
if firstImage then | |||
firstImage = mw.text.trim(firstImage or "") | |||
firstImage = mw.ustring.gsub(firstImage, "^[%z%s]+", "") | |||
firstImage = mw.ustring.gsub(firstImage, "[%z%s]+$", "") | |||
end | end | ||
| 第108行: | 第109行: | ||
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 | ||
| 第120行: | 第120行: | ||
summary = mw.text.trim(summary) | summary = mw.text.trim(summary) | ||
-- | -- 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') | ||
| 第133行: | 第132行: | ||
:wikitext('[[' .. pageName .. ']]') | :wikitext('[[' .. pageName .. ']]') | ||
local textDiv = container:tag('div') | local textDiv = container:tag('div') | ||
:css('line-height', '1.6') | :css('line-height', '1.6') | ||
| 第140行: | 第138行: | ||
if firstImage and firstImage ~= "" then | if firstImage and firstImage ~= "" then | ||
local imgWikitext = '[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]' | |||
local | textDiv:wikitext(imgWikitext) | ||
textDiv:wikitext( | |||
end | end | ||