Module:PageSummary:修订间差异
武外梗百科 爱国好学自强图新的百科全书
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- | -- 核心递归清理函数:通过平衡括号计数,彻底移除 [[File: ... ]] 或 {{模板}} 及其嵌套内容 | ||
local function | local function stripBalancedTags(text, openTag, closeTag) | ||
if not text then return "" end | if not text then return "" end | ||
local result = text | local result = text | ||
while true do | while true do | ||
local startPos = string.find(result, openTag, 1, true) | |||
local startPos | if not startPos then break end | ||
local count = 0 | local count = 0 | ||
local endPos = nil | local endPos = nil | ||
local len = mw.ustring.len(result) | |||
local char2 = mw.ustring.sub(result, j, j+1) | |||
if char2 == | for j = startPos, len do | ||
local char2 = mw.ustring.sub(result, j, j + 1) | |||
if char2 == openTag then | |||
count = count + 1 | count = count + 1 | ||
elseif char2 == | elseif char2 == closeTag then | ||
count = count - 1 | count = count - 1 | ||
if count == 0 then | if count == 0 then | ||
| 第41行: | 第28行: | ||
if endPos then | if endPos then | ||
result = mw.ustring.sub(result, 1, startPos - 1) .. mw.ustring.sub(result, endPos + 1) | result = mw.ustring.sub(result, 1, startPos - 1) .. mw.ustring.sub(result, endPos + 1) | ||
else | else | ||
-- | -- 容错:若未闭合则移除起始符防止死循环 | ||
result = mw.ustring.sub(result, 1, startPos - 1) .. mw.ustring.sub(result, startPos + 2) | result = mw.ustring.sub(result, 1, startPos - 1) .. mw.ustring.sub(result, startPos + 2) | ||
end | end | ||
| 第57行: | 第43行: | ||
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 | ||
| 第63行: | 第49行: | ||
string.match(content, "%[%[(图像:.-)[|%]]") | string.match(content, "%[%[(图像:.-)[|%]]") | ||
-- 2. 处理内容:预加载 | -- 2. 处理内容:预加载 500 字符 | ||
local rawText = mw.ustring.sub(content, 1, | local rawText = mw.ustring.sub(content, 1, 500) | ||
-- A. | -- A. 剥离图片和模板(递归处理嵌套链接和长描述) | ||
rawText = | rawText = stripBalancedTags(rawText, "[[", "]]") -- 移除所有链接(含图片),后文再截断 | ||
-- 注意:因为上面已经移除了所有 [[ ]],摘要里的链接会暂时丢失。 | |||
-- 如果要保留链接,我们需要更复杂的正则。但为了“删干净”图片描述, | |||
-- 我们重新从 content 获取一个不含图片但保留链接的版本。 | |||
-- | -- 重新逻辑:仅针对图片前缀进行剥离,保留普通链接 | ||
local function stripOnlyImages(text) | |||
local prefixes = {"[[File:", "[[Image:", "[[文件:", "[[图像:", "[[file:", "[[image:"} | |||
for _, pre in ipairs(prefixes) do | |||
while string.find(text, pre, 1, true) do | |||
local s = string.find(text, pre, 1, true) | |||
local count = 0 | |||
local e = nil | |||
for j = s, mw.ustring.len(text) do | |||
local c2 = mw.ustring.sub(text, 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 | |||
if e then text = mw.ustring.sub(text, 1, s - 1) .. mw.ustring.sub(text, e + 1) | |||
else text = mw.ustring.sub(text, 1, s - 1) .. mw.ustring.sub(text, s + 2) end | |||
end | end | ||
end | end | ||
return text | |||
end | end | ||
local processedText = mw.ustring.sub(content, 1, 500) | |||
processedText = stripOnlyImages(processedText) -- 仅删图片,保留链接 | |||
processedText = stripBalancedTags(processedText, "{{", "}}") -- 删模板 | |||
-- | -- B. 移除格式符号 | ||
processedText = string.gsub(processedText, "\n==+.-==+", " ") -- 删标题 | |||
processedText = string.gsub(processedText, "\n%s*[*#:]+", " ") -- 删列表符 | |||
processedText = string.gsub(processedText, "<ref.-</ref>", "") | |||
processedText = string.gsub(processedText, "<ref.->", "") | |||
processedText = string.gsub(processedText, "<!%-%-.-%-%->", "") | |||
processedText = string.gsub(processedText, "&[Nn][Bb][Ss][Pp];", " ") | |||
processedText = string.gsub(processedText, "\n", " ") | |||
processedText = string.gsub(processedText, "%s+", " ") | |||
local cleanText = mw.text.trim( | local cleanText = mw.text.trim(processedText) | ||
-- 3. 截断逻辑:150 | -- 3. 截断逻辑:150 字并处理链接补全 | ||
local targetLen = 150 | local targetLen = 150 | ||
local summary = "" | local summary = "" | ||
| 第111行: | 第106行: | ||
local restText = mw.ustring.sub(cleanText, targetLen + 1) | local restText = mw.ustring.sub(cleanText, targetLen + 1) | ||
-- | -- 链接延展 | ||
local lastOpen = 0 | local lastOpen = 0 | ||
local lastClose = 0 | local lastClose = 0 | ||