打开/关闭菜单
60
73
29
1.1K
武外梗百科
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

Module:PageSummary:修订间差异

武外梗百科 爱国好学自强图新的百科全书
无编辑摘要
无编辑摘要
第1行: 第1行:
local p = {}
local p = {}


-- 剥离 [[File:]] [[文件:]] 等,避免污染摘要
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 = mw.ustring.gsub(text, "%[%[(文件|Image|图像):", "[[File:")
    -- 模式全部重新写,避免复制隐藏字符
     text = mw.ustring.gsub(text, "%[%[(分类|Category):", "[[Category:")
     text = string.gsub(text, "%[%[(文件|Image|图像):", "[[File:")
     text = string.gsub(text, "%[%[(分类|Category):", "[[Category:")
      
      
     local out = {}
     local out = {}
第15行: 第15行:
         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:find("^%[%[File:") or chunk:find("^%[%[Category:") then
                 local depth = 1
                 local depth = 1
                 local j = i + 2
                 local j = i + 2
第44行: 第44行:
end
end


-- 清理函数,全用 mw.ustring.gsub
local function cleanFinal(text)
local function cleanFinal(text)
     if not text or text == "" then return "" end
     if not text or text == "" then return "" end
      
      
     text = mw.ustring.gsub(text, "{{[^{}]*}}", "")
    -- 所有模式都重新手写,使用 string.gsub(模式是纯 ASCII)
     text = mw.ustring.gsub(text, "<ref.-</?ref[^>]*>", "")
     text = string.gsub(text, "{{[^{}]*}}", "")
     text = mw.ustring.gsub(text, "<!%-%-.-%-%->", "")
     text = string.gsub(text, "<ref.-</?ref[^>]*>", "")
     text = mw.ustring.gsub(text, "\n==+[^=]+==+", " ")
     text = string.gsub(text, "<!%-%-.-%-%->", "")
     text = mw.ustring.gsub(text, "\n%s*[*#:;]+", " ")
     text = string.gsub(text, "\n==+[^=]+==+", " ")
     text = mw.ustring.gsub(text, "%s*\n%s*", " ")
     text = string.gsub(text, "\n%s*[*#:;]+", " ")
     text = mw.ustring.gsub(text, "%s+", " ")
     text = string.gsub(text, "%s*\n%s*", " ")
     text = string.gsub(text, "%s+", " ")
      
      
     return mw.text.trim(text)
     return mw.text.trim(text)
第69行: 第69行:
     if not content or content == "" then return "" end
     if not content or content == "" then return "" end
      
      
     -- 关键:清洗无效 UTF-8,避免 gsub 报错
     -- 简单清洗 content,避免传入 gsub 的文本有问题
     content = mw.ustring.gsub(content, "[\128-\191][\128-\191]*[^\128-\191]", "")  -- 替换常见无效序列
     content = string.gsub(content, "[\0-\31\127]", "")  -- 移除控制字符
    content = mw.text.decode(content) or content  -- 尝试解码实体
   
     local rawExcerpt = mw.ustring.sub(content, 1, 800) or ""
     local rawExcerpt = mw.ustring.sub(content, 1, 800) or ""
      
      
     -- 提取第一张图片(find + 手动截取,更可靠)
     -- 提取第一张图片(使用 find + 手动截取)
     local firstImage = nil
     local firstImage = nil
     local prefixes = {"File:", "文件:"}
     local prefixes = {"File:", "文件:"}
第88行: 第86行:
                 local candidate = mw.ustring.sub(rawExcerpt, start + #pattern + 1, boundary - 1)
                 local candidate = mw.ustring.sub(rawExcerpt, start + #pattern + 1, boundary - 1)
                 candidate = mw.text.trim(candidate)
                 candidate = mw.text.trim(candidate)
                 if candidate ~= "" and mw.ustring.find(candidate, "%.") then -- 有扩展名才算图片
                 if candidate ~= "" and mw.ustring.find(candidate, "%.") then
                     firstImage = prefix .. candidate
                     firstImage = prefix .. candidate
                     break
                     break
第99行: 第97行:
     local cleanText = cleanFinal(step1) or ""
     local cleanText = cleanFinal(step1) or ""
      
      
    -- 摘要截断:全程 ustring + 安全断点
     local targetLen = 120
     local targetLen = 120
     local summary = cleanText
     local summary = cleanText
第127行: 第124行:
     end
     end
      
      
    -- HTML 输出
     local container = mw.html.create('div')
     local container = mw.html.create('div')
         :css('margin-bottom', '25px')
         :css('margin-bottom', '25px')