Module:PageSummary:修订间差异
武外梗百科 爱国好学自强图新的百科全书
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第25行: | 第25行: | ||
until text == prev or count > 10 | until text == prev or count > 10 | ||
-- 2. | -- 2. 使用安全占位符保护普通链接,同时剔除图片 | ||
-- | -- 我们使用一个绝对唯一的纯字母字符串作为占位符,避免正则转义问题 | ||
repeat | repeat | ||
prev = text | prev = text | ||
| 第38行: | 第37行: | ||
return "" | return "" | ||
end | end | ||
-- | -- 将普通链接内容包裹在安全占位符内 | ||
return " | return "LINKSTART" .. inner .. "LINKEND" | ||
end) | end) | ||
until text == prev | until text == prev | ||
-- 3. 清理剩余的 Wikitext | -- 3. 清理剩余的 Wikitext 格式杂质 | ||
text = mw.ustring.gsub(text, "\n==+.-==+", " ") | text = mw.ustring.gsub(text, "\n==+.-==+", " ") | ||
text = mw.ustring.gsub(text, "\n%s*[*#:]+", " ") | text = mw.ustring.gsub(text, "\n%s*[*#:]+", " ") | ||
| 第49行: | 第48行: | ||
text = mw.ustring.gsub(text, "%s+", " ") | text = mw.ustring.gsub(text, "%s+", " ") | ||
-- 4. | -- 4. 恢复链接(精准替换占位符,不使用带 % 的正则) | ||
text = mw.ustring.gsub(text, " | text = mw.ustring.gsub(text, "LINKSTART", "[[") | ||
text = mw.ustring.gsub(text, "LINKEND", "]]") | |||
return mw.text.trim(text) | return mw.text.trim(text) | ||
| 第61行: | 第61行: | ||
local rawContent = title:getContent() or "" | local rawContent = title:getContent() or "" | ||
local limitedContent = mw.ustring.sub(rawContent, 1, 2000) | local limitedContent = mw.ustring.sub(rawContent, 1, 2000) | ||
-- 1. | -- 1. 提取缩略图文件名 | ||
local firstImage = mw.ustring.match(limitedContent, "%[%[%s*[Ff]ile%s*:([^|%]%s\n]+)") or | local firstImage = mw.ustring.match(limitedContent, "%[%[%s*[Ff]ile%s*:([^|%]%s\n]+)") or | ||
mw.ustring.match(limitedContent, "%[%[%s*文件%s*:([^|%]%s\n]+)") or | mw.ustring.match(limitedContent, "%[%[%s*文件%s*:([^|%]%s\n]+)") or | ||
mw.ustring.match(limitedContent, "%[%[%s*[Ii]mage%s*:([^|%]%s\n]+)") | mw.ustring.match(limitedContent, "%[%[%s*[Ii]mage%s*:([^|%]%s\n]+)") | ||
-- 2. | -- 2. 执行清理 | ||
local cleanText = cleanContent(limitedContent) | local cleanText = cleanContent(limitedContent) | ||
-- 3. | -- 3. 安全截断 | ||
local targetLen = 150 | local targetLen = 150 | ||
local summary = "" | local summary = "" | ||
| 第79行: | 第78行: | ||
summary = cleanText | summary = cleanText | ||
else | else | ||
summary = mw.ustring.sub(cleanText, 1, targetLen) .. "..." | summary = mw.ustring.sub(cleanText, 1, targetLen) .. "..." | ||
-- | -- 闭合加粗 | ||
local _, opens = mw.ustring.gsub(summary, "'''", "") | local _, opens = mw.ustring.gsub(summary, "'''", "") | ||
if opens % 2 ~= 0 then summary = summary .. "'''" end | if opens % 2 ~= 0 then summary = summary .. "'''" end | ||
-- | -- 闭合链接:如果截断在了 LINKSTART...LINKEND 之间 | ||
-- 我们先恢复链接,再检查截断 | |||
summary = mw.ustring.gsub(summary, "LINKSTART", "[[") | |||
summary = mw.ustring.gsub(summary, "LINKEND", "]]") | |||
if mw.ustring.match(summary, "%[%[[^%]]*$") then | if mw.ustring.match(summary, "%[%[[^%]]*$") then | ||
summary = mw.ustring.gsub(summary, "%[%[[^%]]*$", "") .. "..." | summary = mw.ustring.gsub(summary, "%[%[[^%]]*$", "") .. "..." | ||
| 第95行: | 第97行: | ||
local res = mw.html.create('div'):css({['display'] = 'flow-root', ['line-height'] = '1.6'}) | local res = mw.html.create('div'):css({['display'] = 'flow-root', ['line-height'] = '1.6'}) | ||
res:tag('div') | res:tag('div') | ||
:css({['font-size'] = '1.2em', ['font-weight'] = 'bold', ['margin-bottom'] = '5px'}) | :css({['font-size'] = '1.2em', ['font-weight'] = 'bold', ['margin-bottom'] = '5px'}) | ||
:wikitext('[[' .. pageName .. ']]') | :wikitext('[[' .. pageName .. ']]') | ||
if firstImage then | if firstImage then | ||
res:wikitext('[[File:' .. firstImage .. '|120px|right|link=' .. pageName .. ']]') | res:wikitext('[[File:' .. firstImage .. '|120px|right|link=' .. pageName .. ']]') | ||
end | end | ||
-- | -- 确保此时占位符已经全部被替换 | ||
summary = mw.ustring.gsub(summary, "LINKSTART", "[[") | |||
summary = mw.ustring.gsub(summary, "LINKEND", "]]") | |||
res:wikitext(summary) | res:wikitext(summary) | ||
2026年2月18日 (三) 13:32的版本
此模块的文档可以在Module:PageSummary/doc创建
local p = {}
-- 强化版清理:彻底根除内文图片,保留加粗和链接
local function cleanContent(text)
if not text then return "" end
-- 1. 基础清理(注释、脚注、表格、模板)
text = mw.ustring.gsub(text, "<!%-%-.-%-%->", "")
text = mw.ustring.gsub(text, "<ref[^>]*>.-</ref>", "")
text = mw.ustring.gsub(text, "<ref[^>]-/>", "")
-- 移除表格
local prev
repeat
prev = text
text = mw.ustring.gsub(text, "{|[^{}]*|}", "")
until text == prev
-- 移除模板
local count = 0
repeat
prev = text
text = mw.ustring.gsub(text, "{{[^{}]-}}", "")
count = count + 1
until text == prev or count > 10
-- 2. 使用安全占位符保护普通链接,同时剔除图片
-- 我们使用一个绝对唯一的纯字母字符串作为占位符,避免正则转义问题
repeat
prev = text
text = mw.ustring.gsub(text, "%[%[%s*([^%[%]]-)%s*%]%]", function(inner)
local low = mw.ustring.lower(inner)
-- 如果是文件、分类、图像等,返回空字符串(彻底剔除)
if low:match("^file:") or low:match("^image:") or
low:match("^文件:") or low:match("^图像:") or
low:match("^category:") or low:match("^分类:") then
return ""
end
-- 将普通链接内容包裹在安全占位符内
return "LINKSTART" .. inner .. "LINKEND"
end)
until text == prev
-- 3. 清理剩余的 Wikitext 格式杂质
text = mw.ustring.gsub(text, "\n==+.-==+", " ")
text = mw.ustring.gsub(text, "\n%s*[*#:]+", " ")
text = mw.ustring.gsub(text, "\n+", " ")
text = mw.ustring.gsub(text, "%s+", " ")
-- 4. 恢复链接(精准替换占位符,不使用带 % 的正则)
text = mw.ustring.gsub(text, "LINKSTART", "[[")
text = mw.ustring.gsub(text, "LINKEND", "]]")
return mw.text.trim(text)
end
function p.getSummaryAndImage(frame)
local pageName = frame.args[1] or ""
local title = mw.title.new(pageName)
if not title or not title.exists then return "" end
local rawContent = title:getContent() or ""
local limitedContent = mw.ustring.sub(rawContent, 1, 2000)
-- 1. 提取缩略图文件名
local firstImage = mw.ustring.match(limitedContent, "%[%[%s*[Ff]ile%s*:([^|%]%s\n]+)") or
mw.ustring.match(limitedContent, "%[%[%s*文件%s*:([^|%]%s\n]+)") or
mw.ustring.match(limitedContent, "%[%[%s*[Ii]mage%s*:([^|%]%s\n]+)")
-- 2. 执行清理
local cleanText = cleanContent(limitedContent)
-- 3. 安全截断
local targetLen = 150
local summary = ""
if mw.ustring.len(cleanText) <= targetLen then
summary = cleanText
else
summary = mw.ustring.sub(cleanText, 1, targetLen) .. "..."
-- 闭合加粗
local _, opens = mw.ustring.gsub(summary, "'''", "")
if opens % 2 ~= 0 then summary = summary .. "'''" end
-- 闭合链接:如果截断在了 LINKSTART...LINKEND 之间
-- 我们先恢复链接,再检查截断
summary = mw.ustring.gsub(summary, "LINKSTART", "[[")
summary = mw.ustring.gsub(summary, "LINKEND", "]]")
if mw.ustring.match(summary, "%[%[[^%]]*$") then
summary = mw.ustring.gsub(summary, "%[%[[^%]]*$", "") .. "..."
end
end
-- 4. 最终渲染
local res = mw.html.create('div'):css({['display'] = 'flow-root', ['line-height'] = '1.6'})
res:tag('div')
:css({['font-size'] = '1.2em', ['font-weight'] = 'bold', ['margin-bottom'] = '5px'})
:wikitext('[[' .. pageName .. ']]')
if firstImage then
res:wikitext('[[File:' .. firstImage .. '|120px|right|link=' .. pageName .. ']]')
end
-- 确保此时占位符已经全部被替换
summary = mw.ustring.gsub(summary, "LINKSTART", "[[")
summary = mw.ustring.gsub(summary, "LINKEND", "]]")
res:wikitext(summary)
return tostring(res)
end
return p