<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://wflswiki.zelda-110.link/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=240D%3AC010%3A18%3A4%3A0%3A0%3A0%3A95</id>
	<title>武外梗百科 - 用户贡献 [zh]</title>
	<link rel="self" type="application/atom+xml" href="https://wflswiki.zelda-110.link/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=240D%3AC010%3A18%3A4%3A0%3A0%3A0%3A95"/>
	<link rel="alternate" type="text/html" href="https://wflswiki.zelda-110.link/wiki/Special:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/240D:C010:18:4:0:0:0:95"/>
	<updated>2026-07-30T22:34:55Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1038</id>
		<title>Module:PageSummary</title>
		<link rel="alternate" type="text/html" href="https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1038"/>
		<updated>2026-02-17T16:02:06Z</updated>

		<summary type="html">&lt;p&gt;240D:C010:18:4:0:0:0:95：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- 剥离 [[File:]] [[文件:]] [[Category:]] 等，避免污染摘要文本&lt;br /&gt;
local function stripImages(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    text = text:gsub(&amp;quot;%[%[(文件|Image|图像):&amp;quot;, &amp;quot;[[File:&amp;quot;)&lt;br /&gt;
           :gsub(&amp;quot;%[%[(分类|Category):&amp;quot;, &amp;quot;[[Category:&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local out = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local len = #text&lt;br /&gt;
    &lt;br /&gt;
    while i &amp;lt;= len do&lt;br /&gt;
        if text:byte(i) == 91 and text:byte(i+1) == 91 then&lt;br /&gt;
            local chunk = text:sub(i, i+15)&lt;br /&gt;
            if chunk:match(&amp;quot;^%[%[File:&amp;quot;) or chunk:match(&amp;quot;^%[%[Category:&amp;quot;) then&lt;br /&gt;
                local depth = 1&lt;br /&gt;
                local j = i + 2&lt;br /&gt;
                while j &amp;lt;= len and depth &amp;gt; 0 do&lt;br /&gt;
                    if text:byte(j) == 91 and text:byte(j+1) == 91 then&lt;br /&gt;
                        depth = depth + 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    elseif text:byte(j) == 93 and text:byte(j+1) == 93 then&lt;br /&gt;
                        depth = depth - 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    else&lt;br /&gt;
                        j = j + 1&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                i = j&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(out, text:sub(i, i+1))  -- 保留普通 [[ ]]&lt;br /&gt;
                i = i + 2&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(out, text:sub(i, i))&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if i &amp;gt; 1200 then break end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 清理各种干扰元素&lt;br /&gt;
local function cleanFinal(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    text = text&lt;br /&gt;
        :gsub(&amp;quot;{{[^{}]*}}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;ref.-&amp;lt;/?ref[^&amp;gt;]*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;!%-%-.-%-%-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;\n==+[^=]+==+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;\n%s*[*#:;]+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;%s*\n%s*&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return mw.text.trim(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getSummaryAndImage(frame)&lt;br /&gt;
    local pageName = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    if pageName == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local title = mw.title.new(pageName)&lt;br /&gt;
    if not title or not title.exists then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local content = title:getContent()&lt;br /&gt;
    if not content or content == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 取前400字符，提高抓到图片的概率（中文页面首图常在前部）&lt;br /&gt;
    local rawExcerpt = mw.ustring.sub(content, 1, 400) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 提取第一张图片（多写法分开匹配 + 清理）&lt;br /&gt;
    local firstImage =&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[File:([^|%]]+)&amp;quot;) or&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[文件:([^|%]]+)&amp;quot;) or&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[Image:([^|%]]+)&amp;quot;) or&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[图像:([^|%]]+)&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    -- 备用：抓完整 [[...]] 并验证命名空间&lt;br /&gt;
    if not firstImage then&lt;br /&gt;
        local candidate = mw.ustring.match(rawExcerpt, &amp;quot;%[%[([^%]]+)%]%]&amp;quot;)&lt;br /&gt;
        if candidate then&lt;br /&gt;
            local ns, fname = mw.ustring.match(candidate, &amp;quot;^([^:]+):(.+)$&amp;quot;)&lt;br /&gt;
            if ns and (ns == &amp;quot;File&amp;quot; or ns == &amp;quot;文件&amp;quot; or ns == &amp;quot;Image&amp;quot; or ns == &amp;quot;图像&amp;quot;) then&lt;br /&gt;
                firstImage = ns .. &amp;quot;:&amp;quot; .. fname&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 清理文件名（去除隐藏字符、空格等）&lt;br /&gt;
    if firstImage then&lt;br /&gt;
        firstImage = mw.text.trim(firstImage)&lt;br /&gt;
        firstImage = mw.ustring.gsub(firstImage, &amp;quot;^[%s%z﻿]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        firstImage = mw.ustring.gsub(firstImage, &amp;quot;[%s%z﻿]+$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local step1     = stripImages(rawExcerpt) or &amp;quot;&amp;quot;&lt;br /&gt;
    local cleanText = cleanFinal(step1) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local targetLen = 120&lt;br /&gt;
    local summary   = cleanText:sub(1, targetLen * 2) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local ulen = mw.ustring.len(summary) or 0&lt;br /&gt;
    if ulen &amp;gt; targetLen then&lt;br /&gt;
        summary = mw.ustring.sub(summary, 1, targetLen) or &amp;quot;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        local rev = summary:reverse()&lt;br /&gt;
        local lastBreak = rev:find(&amp;quot;[ %s%p，。！？；：,…]&amp;quot;) or 1&lt;br /&gt;
        if lastBreak &amp;gt; 1 and lastBreak &amp;lt; 20 then&lt;br /&gt;
            summary = mw.ustring.sub(summary, 1, #summary - lastBreak + 1) or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        summary = mw.text.trim(summary) .. &amp;quot;...&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    summary = mw.text.trim(summary)&lt;br /&gt;
    &lt;br /&gt;
    -- HTML 构建&lt;br /&gt;
    local container = mw.html.create(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;25px&#039;)&lt;br /&gt;
        :css(&#039;display&#039;, &#039;flow-root&#039;)&lt;br /&gt;
    &lt;br /&gt;
    container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;1.3em&#039;)&lt;br /&gt;
        :css(&#039;font-weight&#039;, &#039;bold&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;6px&#039;)&lt;br /&gt;
        :css(&#039;border-bottom&#039;, &#039;1px solid #eee&#039;)&lt;br /&gt;
        :wikitext(&#039;[[&#039; .. pageName .. &#039;]]&#039;)&lt;br /&gt;
    &lt;br /&gt;
    local textDiv = container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;line-height&#039;, &#039;1.6&#039;)&lt;br /&gt;
        :css(&#039;color&#039;, &#039;#222&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;14px&#039;)&lt;br /&gt;
    &lt;br /&gt;
    if firstImage and firstImage ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local imgWikitext = &#039;[[&#039; .. firstImage .. &#039;|120px|right|link=&#039; .. pageName .. &#039;]]&#039;&lt;br /&gt;
        textDiv:wikitext(imgWikitext)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    textDiv:wikitext(summary)&lt;br /&gt;
    &lt;br /&gt;
    return tostring(container)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>240D:C010:18:4:0:0:0:95</name></author>
	</entry>
	<entry>
		<id>https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1037</id>
		<title>Module:PageSummary</title>
		<link rel="alternate" type="text/html" href="https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1037"/>
		<updated>2026-02-17T16:01:28Z</updated>

		<summary type="html">&lt;p&gt;240D:C010:18:4:0:0:0:95：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local function stripImages(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    text = text:gsub(&amp;quot;%[%[(文件|Image|图像):&amp;quot;, &amp;quot;[[File:&amp;quot;)&lt;br /&gt;
           :gsub(&amp;quot;%[%[(分类|Category):&amp;quot;, &amp;quot;[[Category:&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local out = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local len = #text&lt;br /&gt;
    &lt;br /&gt;
    while i &amp;lt;= len do&lt;br /&gt;
        if text:byte(i) == 91 and text:byte(i+1) == 91 then&lt;br /&gt;
            local chunk = text:sub(i, i+15)&lt;br /&gt;
            if chunk:match(&amp;quot;^%[%[File:&amp;quot;) or chunk:match(&amp;quot;^%[%[Category:&amp;quot;) then&lt;br /&gt;
                local depth = 1&lt;br /&gt;
                local j = i + 2&lt;br /&gt;
                while j &amp;lt;= len and depth &amp;gt; 0 do&lt;br /&gt;
                    if text:byte(j) == 91 and text:byte(j+1) == 91 then&lt;br /&gt;
                        depth = depth + 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    elseif text:byte(j) == 93 and text:byte(j+1) == 93 then&lt;br /&gt;
                        depth = depth - 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    else&lt;br /&gt;
                        j = j + 1&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                i = j&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(out, text:sub(i, i+1))&lt;br /&gt;
                i = i + 2&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(out, text:sub(i, i))&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if i &amp;gt; 1200 then break end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function cleanFinal(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    text = text&lt;br /&gt;
        :gsub(&amp;quot;{{[^{}]*}}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;ref.-&amp;lt;/?ref[^&amp;gt;]*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;!%-%-.-%-%-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;\n==+[^=]+==+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;\n%s*[*#:;]+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;%s*\n%s*&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return mw.text.trim(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getSummaryAndImage(frame)&lt;br /&gt;
    local pageName = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    if pageName == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local title = mw.title.new(pageName)&lt;br /&gt;
    if not title or not title.exists then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local content = title:getContent()&lt;br /&gt;
    if not content or content == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local rawExcerpt = mw.ustring.sub(content, 1, 400) or &amp;quot;&amp;quot;  -- 加大到400字符，提高抓图概率&lt;br /&gt;
    &lt;br /&gt;
    -- 改进：优先从 title 对象取页面关联图片（如果有代表图）&lt;br /&gt;
    local firstImage = title:getImage()  -- MediaWiki 1.35+ 支持，优先用这个&lt;br /&gt;
    &lt;br /&gt;
    if not firstImage or firstImage == &amp;quot;&amp;quot; then&lt;br /&gt;
        -- 后备：从文本匹配（分开匹配，避免捕获组中文问题）&lt;br /&gt;
        firstImage = mw.ustring.match(rawExcerpt, &amp;quot;%[%[File:([^|%]]+)&amp;quot;)&lt;br /&gt;
              or mw.ustring.match(rawExcerpt, &amp;quot;%[%[文件:([^|%]]+)&amp;quot;)&lt;br /&gt;
              or mw.ustring.match(rawExcerpt, &amp;quot;%[%[Image:([^|%]]+)&amp;quot;)&lt;br /&gt;
              or mw.ustring.match(rawExcerpt, &amp;quot;%[%[图像:([^|%]]+)&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        if not firstImage then&lt;br /&gt;
            local full = mw.ustring.match(rawExcerpt, &amp;quot;%[%[([^%]]+)%]%]&amp;quot;)&lt;br /&gt;
            if full then&lt;br /&gt;
                local ns, name = mw.ustring.match(full, &amp;quot;^(%a+):(.+)$&amp;quot;)&lt;br /&gt;
                if ns and (ns:lower() == &amp;quot;file&amp;quot; or ns == &amp;quot;文件&amp;quot; or ns:lower() == &amp;quot;image&amp;quot; or ns == &amp;quot;图像&amp;quot;) then&lt;br /&gt;
                    firstImage = ns .. &amp;quot;:&amp;quot; .. name&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if firstImage then&lt;br /&gt;
        firstImage = mw.text.trim(firstImage)&lt;br /&gt;
        firstImage = mw.ustring.gsub(firstImage, &amp;quot;[%z%s﻿]+&amp;quot;, &amp;quot;&amp;quot;)  -- 清理隐藏字符&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local step1 = stripImages(rawExcerpt) or &amp;quot;&amp;quot;&lt;br /&gt;
    local cleanText = cleanFinal(step1) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local targetLen = 120&lt;br /&gt;
    local summary = cleanText:sub(1, targetLen * 2) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local ulen = mw.ustring.len(summary) or 0&lt;br /&gt;
    if ulen &amp;gt; targetLen then&lt;br /&gt;
        summary = mw.ustring.sub(summary, 1, targetLen) or &amp;quot;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        local rev = summary:reverse()&lt;br /&gt;
        local lastBreak = rev:find(&amp;quot;[ %s%p，。！？；：,…]&amp;quot;) or 1&lt;br /&gt;
        if lastBreak &amp;gt; 1 and lastBreak &amp;lt; 20 then&lt;br /&gt;
            summary = mw.ustring.sub(summary, 1, #summary - lastBreak + 1) or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        summary = mw.text.trim(summary) .. &amp;quot;...&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    summary = mw.text.trim(summary)&lt;br /&gt;
    &lt;br /&gt;
    -- 输出容器&lt;br /&gt;
    local container = mw.html.create(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;25px&#039;)&lt;br /&gt;
        :css(&#039;display&#039;, &#039;flow-root&#039;)&lt;br /&gt;
    &lt;br /&gt;
    container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;1.3em&#039;)&lt;br /&gt;
        :css(&#039;font-weight&#039;, &#039;bold&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;6px&#039;)&lt;br /&gt;
        :css(&#039;border-bottom&#039;, &#039;1px solid #eee&#039;)&lt;br /&gt;
        :wikitext(&#039;[[&#039; .. pageName .. &#039;]]&#039;)&lt;br /&gt;
    &lt;br /&gt;
    local textDiv = container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;line-height&#039;, &#039;1.6&#039;)&lt;br /&gt;
        :css(&#039;color&#039;, &#039;#222&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;14px&#039;)&lt;br /&gt;
    &lt;br /&gt;
    -- 关键：如果有图，输出完整 wikitext；否则不输出图片部分&lt;br /&gt;
    if firstImage and firstImage ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        -- 限制大小 + right 浮动 + link 到页面&lt;br /&gt;
        local imgWikitext = &#039;[[&#039; .. firstImage .. &#039;|120px|right|link=&#039; .. pageName .. &#039;]]&#039;&lt;br /&gt;
        textDiv:wikitext(imgWikitext)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    textDiv:wikitext(summary)&lt;br /&gt;
    &lt;br /&gt;
    return tostring(container)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>240D:C010:18:4:0:0:0:95</name></author>
	</entry>
	<entry>
		<id>https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1036</id>
		<title>Module:PageSummary</title>
		<link rel="alternate" type="text/html" href="https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1036"/>
		<updated>2026-02-17T15:58:17Z</updated>

		<summary type="html">&lt;p&gt;240D:C010:18:4:0:0:0:95：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- 剥离 [[File:]] [[文件:]] [[Category:]] 等，防止出现在摘要文本中&lt;br /&gt;
local function stripImages(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 统一常见前缀写法，方便后续匹配&lt;br /&gt;
    text = text:gsub(&amp;quot;%[%[(文件|Image|图像):&amp;quot;, &amp;quot;[[File:&amp;quot;)&lt;br /&gt;
           :gsub(&amp;quot;%[%[(分类|Category):&amp;quot;, &amp;quot;[[Category:&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local out = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local len = #text&lt;br /&gt;
    &lt;br /&gt;
    while i &amp;lt;= len do&lt;br /&gt;
        if text:byte(i) == 91 and text:byte(i+1) == 91 then  -- [[&lt;br /&gt;
            local chunk = text:sub(i, i+15)&lt;br /&gt;
            if chunk:match(&amp;quot;^%[%[File:&amp;quot;) or chunk:match(&amp;quot;^%[%[Category:&amp;quot;) then&lt;br /&gt;
                local depth = 1&lt;br /&gt;
                local j = i + 2&lt;br /&gt;
                while j &amp;lt;= len and depth &amp;gt; 0 do&lt;br /&gt;
                    if text:byte(j) == 91 and text:byte(j+1) == 91 then&lt;br /&gt;
                        depth = depth + 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    elseif text:byte(j) == 93 and text:byte(j+1) == 93 then&lt;br /&gt;
                        depth = depth - 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    else&lt;br /&gt;
                        j = j + 1&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                i = j&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(out, &amp;quot;[[&amp;quot;)&lt;br /&gt;
                i = i + 2&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(out, text:sub(i, i))&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if i &amp;gt; 1200 then break end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 清理模板、引用、注释、标题、列表等&lt;br /&gt;
local function cleanFinal(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    text = text&lt;br /&gt;
        :gsub(&amp;quot;{{[^{}]*}}&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;ref.-&amp;lt;/?ref[^&amp;gt;]*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;!%-%-.-%-%-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;\n==+[^=]+==+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;\n%s*[*#:;]+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;%s*\n%s*&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
        :gsub(&amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    return mw.text.trim(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getSummaryAndImage(frame)&lt;br /&gt;
    local pageName = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    if pageName == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local title = mw.title.new(pageName)&lt;br /&gt;
    if not title or not title.exists then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local content = title:getContent()&lt;br /&gt;
    if not content or content == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local rawExcerpt = mw.ustring.sub(content, 1, 300) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- 提取第一张图片 - 分开匹配各种常见写法，减少编码问题&lt;br /&gt;
    local firstImage =&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[File:([^|%]]+)&amp;quot;) or&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[文件:([^|%]]+)&amp;quot;) or&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[Image:([^|%]]+)&amp;quot;) or&lt;br /&gt;
        mw.ustring.match(rawExcerpt, &amp;quot;%[%[图像:([^|%]]+)&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    -- 备用方案：抓完整链接再校验命名空间&lt;br /&gt;
    if not firstImage then&lt;br /&gt;
        local full = mw.ustring.match(rawExcerpt, &amp;quot;%[%[([^%]]+)%]%]&amp;quot;)&lt;br /&gt;
        if full then&lt;br /&gt;
            local ns, name = mw.ustring.match(full, &amp;quot;^([^:]+):(.+)$&amp;quot;)&lt;br /&gt;
            if ns and (ns == &amp;quot;File&amp;quot; or ns == &amp;quot;文件&amp;quot; or ns == &amp;quot;Image&amp;quot; or ns == &amp;quot;图像&amp;quot;) then&lt;br /&gt;
                firstImage = ns .. &amp;quot;:&amp;quot; .. name&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- 额外清理文件名（去除隐藏字符、两端空格等）&lt;br /&gt;
    if firstImage then&lt;br /&gt;
        firstImage = mw.text.trim(firstImage or &amp;quot;&amp;quot;)&lt;br /&gt;
        firstImage = mw.ustring.gsub(firstImage, &amp;quot;^[%z%s﻿]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
        firstImage = mw.ustring.gsub(firstImage, &amp;quot;[%z%s﻿]+$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local step1     = stripImages(rawExcerpt) or &amp;quot;&amp;quot;&lt;br /&gt;
    local cleanText = cleanFinal(step1) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local targetLen = 120&lt;br /&gt;
    local summary   = cleanText:sub(1, targetLen * 2) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local ulen = mw.ustring.len(summary) or 0&lt;br /&gt;
    if ulen &amp;gt; targetLen then&lt;br /&gt;
        summary = mw.ustring.sub(summary, 1, targetLen) or &amp;quot;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        local rev = summary:reverse()&lt;br /&gt;
        local lastBreak = rev:find(&amp;quot;[ %s%p，。！？；：,…]&amp;quot;) or 1&lt;br /&gt;
        if lastBreak &amp;gt; 1 and lastBreak &amp;lt; 20 then&lt;br /&gt;
            summary = mw.ustring.sub(summary, 1, #summary - lastBreak + 1) or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        summary = mw.text.trim(summary) .. &amp;quot;...&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    summary = mw.text.trim(summary)&lt;br /&gt;
    &lt;br /&gt;
    -- HTML 输出&lt;br /&gt;
    local container = mw.html.create(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;25px&#039;)&lt;br /&gt;
        :css(&#039;display&#039;, &#039;flow-root&#039;)&lt;br /&gt;
    &lt;br /&gt;
    container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;1.3em&#039;)&lt;br /&gt;
        :css(&#039;font-weight&#039;, &#039;bold&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;6px&#039;)&lt;br /&gt;
        :css(&#039;border-bottom&#039;, &#039;1px solid #eee&#039;)&lt;br /&gt;
        :wikitext(&#039;[[&#039; .. pageName .. &#039;]]&#039;)&lt;br /&gt;
    &lt;br /&gt;
    local textDiv = container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;line-height&#039;, &#039;1.6&#039;)&lt;br /&gt;
        :css(&#039;color&#039;, &#039;#222&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;14px&#039;)&lt;br /&gt;
    &lt;br /&gt;
    if firstImage and firstImage ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local imgWikitext = &#039;[[&#039; .. firstImage .. &#039;|120px|right|link=&#039; .. pageName .. &#039;]]&#039;&lt;br /&gt;
        textDiv:wikitext(imgWikitext)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    textDiv:wikitext(summary)&lt;br /&gt;
    &lt;br /&gt;
    return tostring(container)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>240D:C010:18:4:0:0:0:95</name></author>
	</entry>
	<entry>
		<id>https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1035</id>
		<title>Module:PageSummary</title>
		<link rel="alternate" type="text/html" href="https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1035"/>
		<updated>2026-02-17T15:54:56Z</updated>

		<summary type="html">&lt;p&gt;240D:C010:18:4:0:0:0:95：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- ────────────────────────────────────────────────&lt;br /&gt;
-- 剥离图片、分类等 [[File:…]] [[Category:…]] 结构，避免出现在摘要中&lt;br /&gt;
-- ────────────────────────────────────────────────&lt;br /&gt;
local function stripImages(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 统一常见命名空间写法，减少匹配分支&lt;br /&gt;
    text = text:gsub(&amp;quot;%[%[(文件|File|Image|图像):&amp;quot;, &amp;quot;[[File:&amp;quot;)&lt;br /&gt;
           :gsub(&amp;quot;%[%[(分类|Category):&amp;quot;, &amp;quot;[[Category:&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    local out = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local len = #text&lt;br /&gt;
    &lt;br /&gt;
    while i &amp;lt;= len do&lt;br /&gt;
        if text:byte(i) == 91 and text:byte(i+1) == 91 then  -- [[&lt;br /&gt;
            local chunk = text:sub(i, i+15)&lt;br /&gt;
            if chunk:match(&amp;quot;^%[%[File:&amp;quot;) or chunk:match(&amp;quot;^%[%[Category:&amp;quot;) then&lt;br /&gt;
                -- 跳过整段嵌套链接 [[ ... ]]&lt;br /&gt;
                local depth = 1&lt;br /&gt;
                local j = i + 2&lt;br /&gt;
                while j &amp;lt;= len and depth &amp;gt; 0 do&lt;br /&gt;
                    if text:byte(j) == 91 and text:byte(j+1) == 91 then&lt;br /&gt;
                        depth = depth + 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    elseif text:byte(j) == 93 and text:byte(j+1) == 93 then&lt;br /&gt;
                        depth = depth - 1&lt;br /&gt;
                        j = j + 2&lt;br /&gt;
                    else&lt;br /&gt;
                        j = j + 1&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                i = j  -- 跳到 ]] 之后或文本末尾&lt;br /&gt;
            else&lt;br /&gt;
                -- 普通内部链接，保留&lt;br /&gt;
                table.insert(out, &amp;quot;[[&amp;quot;)&lt;br /&gt;
                i = i + 2&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(out, text:sub(i,i))&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if i &amp;gt; 1200 then break end  -- 极端安全阀&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ────────────────────────────────────────────────&lt;br /&gt;
-- 清理模板、参考文献、标题、列表等，得到纯文本摘要&lt;br /&gt;
-- ────────────────────────────────────────────────&lt;br /&gt;
local function cleanFinal(text)&lt;br /&gt;
    if not text or text == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    text = text&lt;br /&gt;
        :gsub(&amp;quot;{{[^{}]*}}&amp;quot;, &amp;quot;&amp;quot;)                  -- 模板（简单版，够用）&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;ref.-&amp;lt;/?ref[^&amp;gt;]*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)          -- 参考文献&lt;br /&gt;
        :gsub(&amp;quot;&amp;lt;!%-%-.-%-%-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)               -- HTML 注释&lt;br /&gt;
        :gsub(&amp;quot;\n==+[^=]+==+&amp;quot;, &amp;quot; &amp;quot;)              -- 各级标题&lt;br /&gt;
        :gsub(&amp;quot;\n%s*[*#:;]+&amp;quot;, &amp;quot; &amp;quot;)               -- 列表、定义列表&lt;br /&gt;
        :gsub(&amp;quot;%s*\n%s*&amp;quot;, &amp;quot; &amp;quot;)                   -- 所有换行 → 单个空格&lt;br /&gt;
        :gsub(&amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)                        -- 压缩连续空格&lt;br /&gt;
    &lt;br /&gt;
    return mw.text.trim(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ────────────────────────────────────────────────&lt;br /&gt;
-- 主函数：生成带首图的简短摘要 + 标题&lt;br /&gt;
-- ────────────────────────────────────────────────&lt;br /&gt;
function p.getSummaryAndImage(frame)&lt;br /&gt;
    local pageName = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    if pageName == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local title = mw.title.new(pageName)&lt;br /&gt;
    if not title or not title.exists then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local content = title:getContent()&lt;br /&gt;
    if not content or content == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 安全取前 300 个 unicode 字符（避免字节截断中文）&lt;br /&gt;
    local rawExcerpt = mw.ustring.sub(content, 1, 300)&lt;br /&gt;
    &lt;br /&gt;
    -- 提取第一张图片（优先标准写法）&lt;br /&gt;
    local firstImage = mw.ustring.match(rawExcerpt, &amp;quot;%[%[(File|文件|Image|图像):([^|%]]+)&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    -- 备选：更宽松匹配，但只接受文件类&lt;br /&gt;
    if not firstImage then&lt;br /&gt;
        local candidate = mw.ustring.match(rawExcerpt, &amp;quot;%[%[([^|%]]+)%]&amp;quot;)&lt;br /&gt;
        if candidate then&lt;br /&gt;
            local ns = candidate:match(&amp;quot;^([^:]+):&amp;quot;)&lt;br /&gt;
            if ns and (ns:lower() == &amp;quot;file&amp;quot; or ns == &amp;quot;文件&amp;quot; or ns:lower() == &amp;quot;image&amp;quot; or ns == &amp;quot;图像&amp;quot;) then&lt;br /&gt;
                firstImage = candidate&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local step1     = stripImages(rawExcerpt) or &amp;quot;&amp;quot;&lt;br /&gt;
    local cleanText = cleanFinal(step1) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local targetLen = 120&lt;br /&gt;
    local summary   = cleanText:sub(1, targetLen * 2) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local ulen = mw.ustring.len(summary) or 0&lt;br /&gt;
    if ulen &amp;gt; targetLen then&lt;br /&gt;
        summary = mw.ustring.sub(summary, 1, targetLen) or &amp;quot;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        -- 尽量避免截在中文单词/句子中间&lt;br /&gt;
        local rev = summary:reverse()&lt;br /&gt;
        local lastBreak = rev:find(&amp;quot;[ %s%p，。！？；：,…]&amp;quot;) or 1&lt;br /&gt;
        if lastBreak &amp;gt; 1 and lastBreak &amp;lt; 20 then&lt;br /&gt;
            summary = mw.ustring.sub(summary, 1, #summary - lastBreak + 1) or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        summary = mw.text.trim(summary) .. &amp;quot;...&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    summary = mw.text.trim(summary)&lt;br /&gt;
    &lt;br /&gt;
    -- ── HTML 输出 ───────────────────────────────────&lt;br /&gt;
    local container = mw.html.create(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;25px&#039;)&lt;br /&gt;
        :css(&#039;display&#039;, &#039;flow-root&#039;)&lt;br /&gt;
    &lt;br /&gt;
    -- 标题&lt;br /&gt;
    container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;1.3em&#039;)&lt;br /&gt;
        :css(&#039;font-weight&#039;, &#039;bold&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;6px&#039;)&lt;br /&gt;
        :css(&#039;border-bottom&#039;, &#039;1px solid #eee&#039;)&lt;br /&gt;
        :wikitext(&#039;[[&#039; .. pageName .. &#039;]]&#039;)&lt;br /&gt;
    &lt;br /&gt;
    -- 内容区（右浮图 + 文字）&lt;br /&gt;
    local textDiv = container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;line-height&#039;, &#039;1.6&#039;)&lt;br /&gt;
        :css(&#039;color&#039;, &#039;#222&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;14px&#039;)&lt;br /&gt;
    &lt;br /&gt;
    if firstImage and firstImage ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        firstImage = mw.text.trim(firstImage)&lt;br /&gt;
        local img = &#039;[[&#039; .. firstImage .. &#039;|120px|right|link=&#039; .. pageName .. &#039;]]&#039;&lt;br /&gt;
        textDiv:wikitext(img)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    textDiv:wikitext(summary)&lt;br /&gt;
    &lt;br /&gt;
    return tostring(container)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>240D:C010:18:4:0:0:0:95</name></author>
	</entry>
	<entry>
		<id>https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1034</id>
		<title>Module:PageSummary</title>
		<link rel="alternate" type="text/html" href="https://wflswiki.zelda-110.link/index.php?title=Module:PageSummary&amp;diff=1034"/>
		<updated>2026-02-17T15:53:07Z</updated>

		<summary type="html">&lt;p&gt;240D:C010:18:4:0:0:0:95：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- stripImages 函数保持不变（已使用字节级，但对图片提取影响小）&lt;br /&gt;
&lt;br /&gt;
-- cleanFinal 函数保持不变&lt;br /&gt;
&lt;br /&gt;
function p.getSummaryAndImage(frame)&lt;br /&gt;
    local pageName = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    if pageName == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local title = mw.title.new(pageName)&lt;br /&gt;
    if not title or not title.exists then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    local content = title:getContent()&lt;br /&gt;
    if not content or content == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- 用 mw.ustring 安全截取（避免字节切割中文）&lt;br /&gt;
    local rawExcerpt = mw.ustring.sub(content, 1, 300)  -- 字符级 300 个字符，够用&lt;br /&gt;
    &lt;br /&gt;
    -- 改用 mw.ustring 的模式匹配，更安全处理中文文件名&lt;br /&gt;
    local firstImage&lt;br /&gt;
    -- 尝试匹配 File: 或 文件: 开头的&lt;br /&gt;
    firstImage = mw.ustring.match(rawExcerpt, &amp;quot;%[%[(File|文件|Image|图像):([^|%]]+)&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    -- 如果没匹配到，再试更宽松的（但优先上面）&lt;br /&gt;
    if not firstImage then&lt;br /&gt;
        firstImage = mw.ustring.match(rawExcerpt, &amp;quot;%[%[([^|%]]+)%]&amp;quot;)&lt;br /&gt;
        if firstImage and not (firstImage:find(&amp;quot;File:&amp;quot;) or firstImage:find(&amp;quot;文件:&amp;quot;) &lt;br /&gt;
            or firstImage:find(&amp;quot;Image:&amp;quot;) or firstImage:find(&amp;quot;图像:&amp;quot;)) then&lt;br /&gt;
            firstImage = nil  -- 不是文件就丢掉&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local step1     = stripImages(rawExcerpt) or &amp;quot;&amp;quot;&lt;br /&gt;
    local cleanText = cleanFinal(step1) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local targetLen = 120&lt;br /&gt;
    local summary = cleanText:sub(1, targetLen * 2) or &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    local ulen = mw.ustring.len(summary) or 0&lt;br /&gt;
    if ulen &amp;gt; targetLen then&lt;br /&gt;
        summary = mw.ustring.sub(summary, 1, targetLen) or &amp;quot;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        local rev = summary:reverse()&lt;br /&gt;
        local lastBreak = rev:find(&amp;quot;[ %s%p，。！？；：]&amp;quot;) or 1&lt;br /&gt;
        if lastBreak &amp;gt; 1 and lastBreak &amp;lt; 20 then&lt;br /&gt;
            summary = mw.ustring.sub(summary, 1, #summary - lastBreak + 1) or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        summary = mw.text.trim(summary) .. &amp;quot;...&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    summary = mw.text.trim(summary)&lt;br /&gt;
    &lt;br /&gt;
    -- HTML 构建&lt;br /&gt;
    local container = mw.html.create(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;25px&#039;)&lt;br /&gt;
        :css(&#039;display&#039;, &#039;flow-root&#039;)&lt;br /&gt;
    &lt;br /&gt;
    container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;1.3em&#039;)&lt;br /&gt;
        :css(&#039;font-weight&#039;, &#039;bold&#039;)&lt;br /&gt;
        :css(&#039;margin-bottom&#039;, &#039;6px&#039;)&lt;br /&gt;
        :css(&#039;border-bottom&#039;, &#039;1px solid #eee&#039;)&lt;br /&gt;
        :wikitext(&#039;[[&#039; .. pageName .. &#039;]]&#039;)&lt;br /&gt;
    &lt;br /&gt;
    local textDiv = container:tag(&#039;div&#039;)&lt;br /&gt;
        :css(&#039;line-height&#039;, &#039;1.6&#039;)&lt;br /&gt;
        :css(&#039;color&#039;, &#039;#222&#039;)&lt;br /&gt;
        :css(&#039;font-size&#039;, &#039;14px&#039;)&lt;br /&gt;
    &lt;br /&gt;
    -- 关键修复：如果有图片名，确保用 mw.ustring 处理&lt;br /&gt;
    if firstImage and firstImage ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        -- 额外清理：去掉可能的前后空格（虽然 match 已捕获干净）&lt;br /&gt;
        firstImage = mw.text.trim(firstImage)&lt;br /&gt;
        &lt;br /&gt;
        -- 用 [[File:xxx|...]] 格式，确保 MediaWiki 正确解析&lt;br /&gt;
        local imgWikitext = &#039;[[&#039; .. firstImage .. &#039;|120px|right|link=&#039; .. pageName .. &#039;]]&#039;&lt;br /&gt;
        textDiv:wikitext(imgWikitext)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    textDiv:wikitext(summary)&lt;br /&gt;
    &lt;br /&gt;
    return tostring(container)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>240D:C010:18:4:0:0:0:95</name></author>
	</entry>
</feed>