Module:PageSummary:修订间差异
武外梗百科 爱国好学自强图新的百科全书
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- 剥离图片和分类链接,避免出现在摘要里 | |||
local function stripImages(text) | local function stripImages(text) | ||
if not text or text == "" then return "" end | if not text or text == "" then return "" end | ||
| 第39行: | 第40行: | ||
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 | ||
| 第61行: | 第63行: | ||
if not content or content == "" then return "" end | if not content or content == "" then return "" end | ||
-- 清理控制字符 | |||
content = string.gsub(content, "[\0-\31\127]", "") | content = string.gsub(content, "[\0-\31\127]", "") | ||
local rawExcerpt = mw.ustring.sub(content, 1, 800) or "" | local rawExcerpt = mw.ustring.sub(content, 1, 800) or "" | ||
| 第66行: | 第69行: | ||
-- 提取第一张图片 | -- 提取第一张图片 | ||
local firstImage = nil | local firstImage = nil | ||
local | local startPos = mw.ustring.find(rawExcerpt, "%[%[File:") | ||
if not startPos then | |||
startPos = mw.ustring.find(rawExcerpt, "%[%[文件:") | |||
end | |||
if startPos then | |||
local pipePos = mw.ustring.find(rawExcerpt, "|", startPos) | |||
local closePos = mw.ustring.find(rawExcerpt, "%]%]", startPos) | |||
local endPos = pipePos or closePos | |||
if endPos then | |||
local name = mw.ustring.sub(rawExcerpt, startPos + 7, endPos - 1) -- 7 = length of "[[File:" | |||
name = mw.text.trim(name) | |||
if name ~= "" and mw.ustring.find(name, "%.") then | |||
firstImage = "File:" .. name | |||
end | end | ||
end | end | ||
| 第87行: | 第89行: | ||
local cleanText = cleanFinal(step1) or "" | local cleanText = cleanFinal(step1) or "" | ||
-- | -- 摘要截断(最简单安全的方式) | ||
local targetLen = 120 | local targetLen = 120 | ||
local summary = cleanText | local summary = cleanText | ||
if mw.ustring.len(summary) > targetLen then | |||
summary = mw.ustring.sub(summary, 1, targetLen) | summary = mw.ustring.sub(summary, 1, targetLen) | ||
summary = mw.text.trim(summary) .. "…" | summary = mw.text.trim(summary) .. "…" | ||
| 第99行: | 第99行: | ||
end | end | ||
-- 输出 | |||
local container = mw.html.create('div') | local container = mw.html.create('div') | ||
:css('margin-bottom', '25px') | :css('margin-bottom', '25px') | ||
| 第115行: | 第116行: | ||
:css('font-size', '14px') | :css('font-size', '14px') | ||
if firstImage | if firstImage then | ||
textDiv:wikitext('[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]') | textDiv:wikitext('[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]') | ||
end | end | ||
2026年2月18日 (三) 09:42的版本
此模块的文档可以在Module:PageSummary/doc创建
local p = {}
-- 剥离图片和分类链接,避免出现在摘要里
local function stripImages(text)
if not text or text == "" then return "" end
text = string.gsub(text, "%[%[(文件|Image|图像):", "[[File:")
text = string.gsub(text, "%[%[(分类|Category):", "[[Category:")
local out = {}
local i = 1
local len = #text
while i <= len do
if text:byte(i) == 91 and text:byte(i+1) == 91 then
local chunk = text:sub(i, i+15)
if chunk:find("^%[%[File:") or chunk:find("^%[%[Category:") then
local depth = 1
local j = i + 2
while j <= len and depth > 0 do
if text:byte(j) == 91 and text:byte(j+1) == 91 then
depth = depth + 1
j = j + 2
elseif text:byte(j) == 93 and text:byte(j+1) == 93 then
depth = depth - 1
j = j + 2
else
j = j + 1
end
end
i = j
else
table.insert(out, text:sub(i, i+1))
i = i + 2
end
else
table.insert(out, text:sub(i, i))
i = i + 1
end
if i > 1200 then break end
end
return table.concat(out)
end
-- 清理模板、引用、标题、列表等
local function cleanFinal(text)
if not text or text == "" then return "" end
text = string.gsub(text, "{{[^{}]*}}", "")
text = string.gsub(text, "<ref.-</?ref[^>]*>", "")
text = string.gsub(text, "<!%-%-.-%-%->", "")
text = string.gsub(text, "\n==+[^=]+==+", " ")
text = string.gsub(text, "\n%s*[*#:;]+", " ")
text = string.gsub(text, "%s*\n%s*", " ")
text = string.gsub(text, "%s+", " ")
return mw.text.trim(text)
end
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
-- 清理控制字符
content = string.gsub(content, "[\0-\31\127]", "")
local rawExcerpt = mw.ustring.sub(content, 1, 800) or ""
-- 提取第一张图片
local firstImage = nil
local startPos = mw.ustring.find(rawExcerpt, "%[%[File:")
if not startPos then
startPos = mw.ustring.find(rawExcerpt, "%[%[文件:")
end
if startPos then
local pipePos = mw.ustring.find(rawExcerpt, "|", startPos)
local closePos = mw.ustring.find(rawExcerpt, "%]%]", startPos)
local endPos = pipePos or closePos
if endPos then
local name = mw.ustring.sub(rawExcerpt, startPos + 7, endPos - 1) -- 7 = length of "[[File:"
name = mw.text.trim(name)
if name ~= "" and mw.ustring.find(name, "%.") then
firstImage = "File:" .. name
end
end
end
local step1 = stripImages(rawExcerpt) or ""
local cleanText = cleanFinal(step1) or ""
-- 摘要截断(最简单安全的方式)
local targetLen = 120
local summary = cleanText
if mw.ustring.len(summary) > targetLen then
summary = mw.ustring.sub(summary, 1, targetLen)
summary = mw.text.trim(summary) .. "…"
else
summary = mw.text.trim(summary)
end
-- 输出
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')
if firstImage then
textDiv:wikitext('[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]')
end
textDiv:wikitext(summary)
return tostring(container)
end
return p