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 | ||
text = text:gsub("%[%[(文件|Image|图像):", "[[File:") | text = text:gsub("%[%[(文件|Image|图像):", "[[File:") | ||
:gsub("%[%[(分类|Category):", "[[Category:") | :gsub("%[%[(分类|Category):", "[[Category:") | ||
| 第14行: | 第12行: | ||
while i <= len do | while i <= len do | ||
if text:byte(i) == 91 and text:byte(i+1) == 91 then | if text:byte(i) == 91 and text:byte(i+1) == 91 then | ||
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 | ||
| 第32行: | 第30行: | ||
i = j | i = j | ||
else | else | ||
table.insert(out, | table.insert(out, text:sub(i, i+1)) | ||
i = i + 2 | i = i + 2 | ||
end | end | ||
| 第46行: | 第44行: | ||
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 | ||
| 第72行: | 第69行: | ||
if not content or content == "" then return "" end | if not content or content == "" then return "" end | ||
local rawExcerpt = mw.ustring.sub(content, 1, | local rawExcerpt = mw.ustring.sub(content, 1, 400) or "" -- 加大到400字符,提高抓图概率 | ||
-- | -- 改进:优先从 title 对象取页面关联图片(如果有代表图) | ||
local firstImage = | local firstImage = title:getImage() -- MediaWiki 1.35+ 支持,优先用这个 | ||
-- | if not firstImage or firstImage == "" then | ||
-- 后备:从文本匹配(分开匹配,避免捕获组中文问题) | |||
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 | |||
local full = mw.ustring.match(rawExcerpt, "%[%[([^%]]+)%]%]") | |||
if full then | |||
local ns, name = mw.ustring.match(full, "^(%a+):(.+)$") | |||
if ns and (ns:lower() == "file" or ns == "文件" or ns:lower() == "image" or ns == "图像") then | |||
firstImage = ns .. ":" .. name | |||
end | |||
end | end | ||
end | end | ||
end | end | ||
if firstImage then | if firstImage then | ||
firstImage = mw.text.trim(firstImage | firstImage = mw.text.trim(firstImage) | ||
firstImage = mw.ustring.gsub(firstImage, "[%z%s]+", "") -- 清理隐藏字符 | |||
firstImage = mw.ustring.gsub(firstImage, "[%z%s]+ | |||
end | end | ||
local step1 | local step1 = stripImages(rawExcerpt) or "" | ||
local cleanText = cleanFinal(step1) or "" | local cleanText = cleanFinal(step1) or "" | ||
local targetLen = 120 | local targetLen = 120 | ||
local summary | local summary = cleanText:sub(1, targetLen * 2) or "" | ||
local ulen = mw.ustring.len(summary) or 0 | local ulen = mw.ustring.len(summary) or 0 | ||
| 第120行: | 第118行: | ||
summary = mw.text.trim(summary) | summary = mw.text.trim(summary) | ||
-- | -- 输出容器 | ||
local container = mw.html.create('div') | local container = mw.html.create('div') | ||
:css('margin-bottom', '25px') | :css('margin-bottom', '25px') | ||
| 第137行: | 第135行: | ||
:css('font-size', '14px') | :css('font-size', '14px') | ||
-- 关键:如果有图,输出完整 wikitext;否则不输出图片部分 | |||
if firstImage and firstImage ~= "" then | if firstImage and firstImage ~= "" then | ||
-- 限制大小 + right 浮动 + link 到页面 | |||
local imgWikitext = '[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]' | local imgWikitext = '[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]' | ||
textDiv:wikitext(imgWikitext) | textDiv:wikitext(imgWikitext) | ||
2026年2月18日 (三) 00:01的版本
此模块的文档可以在Module:PageSummary/doc创建
local p = {}
local function stripImages(text)
if not text or text == "" then return "" end
text = text:gsub("%[%[(文件|Image|图像):", "[[File:")
:gsub("%[%[(分类|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:match("^%[%[File:") or chunk:match("^%[%[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 = text
:gsub("{{[^{}]*}}", "")
:gsub("<ref.-</?ref[^>]*>", "")
:gsub("<!%-%-.-%-%->", "")
:gsub("\n==+[^=]+==+", " ")
:gsub("\n%s*[*#:;]+", " ")
:gsub("%s*\n%s*", " ")
:gsub("%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
local rawExcerpt = mw.ustring.sub(content, 1, 400) or "" -- 加大到400字符,提高抓图概率
-- 改进:优先从 title 对象取页面关联图片(如果有代表图)
local firstImage = title:getImage() -- MediaWiki 1.35+ 支持,优先用这个
if not firstImage or firstImage == "" then
-- 后备:从文本匹配(分开匹配,避免捕获组中文问题)
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
local full = mw.ustring.match(rawExcerpt, "%[%[([^%]]+)%]%]")
if full then
local ns, name = mw.ustring.match(full, "^(%a+):(.+)$")
if ns and (ns:lower() == "file" or ns == "文件" or ns:lower() == "image" or ns == "图像") then
firstImage = ns .. ":" .. name
end
end
end
end
if firstImage then
firstImage = mw.text.trim(firstImage)
firstImage = mw.ustring.gsub(firstImage, "[%z%s]+", "") -- 清理隐藏字符
end
local step1 = stripImages(rawExcerpt) or ""
local cleanText = cleanFinal(step1) or ""
local targetLen = 120
local summary = cleanText:sub(1, targetLen * 2) or ""
local ulen = mw.ustring.len(summary) or 0
if ulen > targetLen then
summary = mw.ustring.sub(summary, 1, targetLen) or ""
local rev = summary:reverse()
local lastBreak = rev:find("[ %s%p,。!?;:,…]") or 1
if lastBreak > 1 and lastBreak < 20 then
summary = mw.ustring.sub(summary, 1, #summary - lastBreak + 1) or ""
end
summary = mw.text.trim(summary) .. "..."
end
summary = mw.text.trim(summary)
-- 输出容器
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')
-- 关键:如果有图,输出完整 wikitext;否则不输出图片部分
if firstImage and firstImage ~= "" then
-- 限制大小 + right 浮动 + link 到页面
local imgWikitext = '[[' .. firstImage .. '|120px|right|link=' .. pageName .. ']]'
textDiv:wikitext(imgWikitext)
end
textDiv:wikitext(summary)
return tostring(container)
end
return p