Module:PageSummary:修订间差异
武外梗百科 爱国好学自强图新的百科全书
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- 核心函数:通过计数平衡括号,彻底移除 [[File: ... ]] 及其嵌套内容 | |||
local function stripComplexTags(text) | |||
if not text then return "" end | |||
local result = text | |||
local i = 1 | |||
while true do | |||
-- 寻找可能的图片起始标签 | |||
local startPos = nil | |||
local patterns = {"%[%[[Ff]ile:", "%[%[[Ii]mage:", "%[%[文件:", "%[%[图像:"} | |||
local foundPat = nil | |||
for _, pat in ipairs(patterns) do | |||
local s = string.find(result, pat) | |||
if s and (not startPos or s < startPos) then | |||
startPos = s | |||
foundPat = pat | |||
end | |||
end | |||
if not startPos then break end -- 没有更多图片标签了 | |||
-- 从 startPos 开始寻找匹配的闭合括号 | |||
local count = 0 | |||
local endPos = nil | |||
for j = startPos, mw.ustring.len(result) do | |||
local char2 = mw.ustring.sub(result, j, j+1) | |||
if char2 == "[[" then | |||
count = count + 1 | |||
elseif char2 == "]]" then | |||
count = count - 1 | |||
if count == 0 then | |||
endPos = j + 1 | |||
break | |||
end | |||
end | |||
end | |||
if endPos then | |||
-- 移除整段图片代码 | |||
result = mw.ustring.sub(result, 1, startPos - 1) .. mw.ustring.sub(result, endPos + 1) | |||
else | |||
-- 如果没找到闭合(语法错误),强制跳过这个起始点,防止死循环 | |||
result = mw.ustring.sub(result, 1, startPos - 1) .. mw.ustring.sub(result, startPos + 2) | |||
end | |||
end | |||
return result | |||
end | |||
function p.getSummaryAndImage(frame) | function p.getSummaryAndImage(frame) | ||
local pageName = frame.args[1] or "" | local pageName = frame.args[1] or "" | ||
local title = mw.title.new(pageName) | local title = mw.title.new(pageName) | ||
if not title or not title.exists then return "页面不存在" end | if not title or not title.exists then return "页面不存在" end | ||
local content = title:getContent() | local content = title:getContent() | ||
-- 1. | -- 1. 提取第一张图(在清理前提取) | ||
local firstImage = string.match(content, "%[%[([Ff]ile:.-)[|%]]") or | local firstImage = string.match(content, "%[%[([Ff]ile:.-)[|%]]") or | ||
string.match(content, "%[%[([Ii]mage:.-)[|%]]") or | string.match(content, "%[%[([Ii]mage:.-)[|%]]") or | ||
| 第14行: | 第63行: | ||
string.match(content, "%[%[(图像:.-)[|%]]") | string.match(content, "%[%[(图像:.-)[|%]]") | ||
-- 2. 处理内容:预加载 | -- 2. 处理内容:预加载 1500 字符(处理长条目) | ||
local rawText = mw.ustring.sub(content, 1, | local rawText = mw.ustring.sub(content, 1, 1500) | ||
-- A. 使用递归逻辑剥离图片 | |||
rawText = stripComplexTags(rawText) | |||
-- | -- B. 移除模板 {{...}} - 同样使用平衡计数逻辑处理嵌套 | ||
while true do | |||
local | local s = string.find(rawText, "{{") | ||
if not s then break end | |||
local count = 0 | |||
local | local e = nil | ||
for | for j = s, mw.ustring.len(rawText) do | ||
local c2 = mw.ustring.sub(rawText, j, j+1) | |||
if c2 == "{{" then count = count + 1 | |||
elseif c2 == "}}" then | |||
count = count - 1 | |||
if count == 0 then e = j + 1 break end | |||
end | end | ||
end | end | ||
if e then | |||
rawText = mw.ustring.sub(rawText, 1, s - 1) .. mw.ustring.sub(rawText, e + 1) | |||
else | |||
rawText = mw.ustring.sub(rawText, 1, s - 1) .. mw.ustring.sub(rawText, s + 2) | |||
end | |||
end | end | ||
-- C. 移除标题符号、列表符、引用 | |||
rawText = string.gsub(rawText, "\n==+.-==+", " ") | |||
rawText = string.gsub(rawText, "\n%s*[*#:]+", " ") | rawText = string.gsub(rawText, "\n%s*[*#:]+", " ") | ||
rawText = string.gsub(rawText, "<ref.-</ref>", "") | rawText = string.gsub(rawText, "<ref.-</ref>", "") | ||
rawText = string.gsub(rawText, "<ref.->", "") | rawText = string.gsub(rawText, "<ref.->", "") | ||
rawText = string.gsub(rawText, "<!%-%-.-%-%->", "") | rawText = string.gsub(rawText, "<!%-%-.-%-%->", "") | ||
rawText = string.gsub(rawText, "&[Nn][Bb][Ss][Pp];", " ") | |||
rawText = string.gsub(rawText, "& | |||
rawText = string.gsub(rawText, "\n", " ") | rawText = string.gsub(rawText, "\n", " ") | ||
rawText = string.gsub(rawText, "%s+", " ") | rawText = string.gsub(rawText, "%s+", " ") | ||
| 第94行: | 第139行: | ||
-- 4. 渲染 | -- 4. 渲染 | ||
local container = mw.html.create('div') | local container = mw.html.create('div'):css({['margin']='15px 0', ['display']='flow-root'}) | ||
if firstImage then | if firstImage then | ||
container:wikitext('[[' .. firstImage .. '|150px|right|link=' .. pageName .. ']]') | container:wikitext('[[' .. firstImage .. '|150px|right|link=' .. pageName .. ']]') | ||
end | end | ||
container:tag('div') | container:tag('div') | ||
:css({ | :css({['font-size']='1.4em', ['font-weight']='bold', ['margin-bottom']='8px'}) | ||
:wikitext('[[' .. pageName .. ']]') | :wikitext('[[' .. pageName .. ']]') | ||
container:tag('div') | container:tag('div') | ||
:css({ | :css({['line-height']='1.6', ['color']='#202122'}) | ||
:wikitext(summary) | :wikitext(summary) | ||