<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.statsape.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AHatnote</id>
	<title>模块:Hatnote - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.statsape.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AHatnote"/>
	<link rel="alternate" type="text/html" href="https://wiki.statsape.com/index.php?title=%E6%A8%A1%E5%9D%97:Hatnote&amp;action=history"/>
	<updated>2026-04-03T22:57:09Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.statsape.com/index.php?title=%E6%A8%A1%E5%9D%97:Hatnote&amp;diff=1544&amp;oldid=prev</id>
		<title>2023年8月9日 (三) 16:13 Zeroclanzhang</title>
		<link rel="alternate" type="text/html" href="https://wiki.statsape.com/index.php?title=%E6%A8%A1%E5%9D%97:Hatnote&amp;diff=1544&amp;oldid=prev"/>
		<updated>2023-08-09T16:13:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                              Module:Hatnote                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module produces hatnote links and links to related articles. It       --&lt;br /&gt;
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --&lt;br /&gt;
-- helper functions for other Lua hatnote modules.                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local mArguments -- lazily initialise [[Module:Arguments]]&lt;br /&gt;
local yesno -- lazily initialise [[Module:Yesno]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getArgs(frame)&lt;br /&gt;
    -- Fetches the arguments from the parent frame. Whitespace is trimmed and&lt;br /&gt;
    -- blanks are removed.&lt;br /&gt;
    mArguments = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
    return mArguments.getArgs(frame, {parentOnly = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removeInitialColon(s)&lt;br /&gt;
    -- Removes the initial colon from a string, if present.&lt;br /&gt;
    return s:match(&amp;#039;^:?(.*)&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.defaultClasses(inline)&lt;br /&gt;
    -- Provides the default hatnote classes as a space-separated string; useful&lt;br /&gt;
    -- for hatnote-manipulation modules like [[Module:Hatnote group]].&lt;br /&gt;
    return&lt;br /&gt;
    (inline == 1 and &amp;#039;hatnote-inline&amp;#039; or &amp;#039;hatnote&amp;#039;) .. &amp;#039; &amp;#039; ..&lt;br /&gt;
            &amp;#039;navigation-not-searchable&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.disambiguate(page, disambiguator)&lt;br /&gt;
    -- Formats a page title with a disambiguation parenthetical,&lt;br /&gt;
    -- i.e. &amp;quot;Example&amp;quot; → &amp;quot;Example (disambiguation)&amp;quot;.&lt;br /&gt;
    checkType(&amp;#039;disambiguate&amp;#039;, 1, page, &amp;#039;string&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;disambiguate&amp;#039;, 2, disambiguator, &amp;#039;string&amp;#039;, true)&lt;br /&gt;
    disambiguator = disambiguator or &amp;#039;disambiguation&amp;#039;&lt;br /&gt;
    return mw.ustring.format(&amp;#039;%s (%s)&amp;#039;, page, disambiguator)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.findNamespaceId(link, removeColon)&lt;br /&gt;
    -- Finds the namespace id (namespace number) of a link or a pagename. This&lt;br /&gt;
    -- function will not work if the link is enclosed in double brackets. Colons&lt;br /&gt;
    -- are trimmed from the start of the link by default. To skip colon&lt;br /&gt;
    -- trimming, set the removeColon parameter to false.&lt;br /&gt;
    checkType(&amp;#039;findNamespaceId&amp;#039;, 1, link, &amp;#039;string&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;findNamespaceId&amp;#039;, 2, removeColon, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
    if removeColon ~= false then&lt;br /&gt;
        link = removeInitialColon(link)&lt;br /&gt;
    end&lt;br /&gt;
    local namespace = link:match(&amp;#039;^(.-):&amp;#039;)&lt;br /&gt;
    if namespace then&lt;br /&gt;
        local nsTable = mw.site.namespaces[namespace]&lt;br /&gt;
        if nsTable then&lt;br /&gt;
            return nsTable.id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)&lt;br /&gt;
    -- Formats an error message to be returned to wikitext. If&lt;br /&gt;
    -- addTrackingCategory is not false after being returned from&lt;br /&gt;
    -- [[Module:Yesno]], and if we are not on a talk page, a tracking category&lt;br /&gt;
    -- is added.&lt;br /&gt;
    checkType(&amp;#039;makeWikitextError&amp;#039;, 1, msg, &amp;#039;string&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;makeWikitextError&amp;#039;, 2, helpLink, &amp;#039;string&amp;#039;, true)&lt;br /&gt;
    yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
    title = title or mw.title.getCurrentTitle()&lt;br /&gt;
    -- Make the help link text.&lt;br /&gt;
    local helpText&lt;br /&gt;
    if helpLink then&lt;br /&gt;
        helpText = &amp;#039; ([[&amp;#039; .. helpLink .. &amp;#039;|help]])&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        helpText = &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    -- Make the category text.&lt;br /&gt;
    local category&lt;br /&gt;
    if not title.isTalkPage -- Don&amp;#039;t categorise talk pages&lt;br /&gt;
            and title.namespace ~= 2 -- Don&amp;#039;t categorise userspace&lt;br /&gt;
            and yesno(addTrackingCategory) ~= false -- Allow opting out&lt;br /&gt;
    then&lt;br /&gt;
        category = &amp;#039;Hatnote templates with errors&amp;#039;&lt;br /&gt;
        category = mw.ustring.format(&lt;br /&gt;
                &amp;#039;[[%s:%s]]&amp;#039;,&lt;br /&gt;
                mw.site.namespaces[14].name,&lt;br /&gt;
                category&lt;br /&gt;
        )&lt;br /&gt;
    else&lt;br /&gt;
        category = &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.format(&lt;br /&gt;
            &amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error: %s%s.&amp;lt;/strong&amp;gt;%s&amp;#039;,&lt;br /&gt;
            msg,&lt;br /&gt;
            helpText,&lt;br /&gt;
            category&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local curNs = mw.title.getCurrentTitle().namespace&lt;br /&gt;
p.missingTargetCat =&lt;br /&gt;
--Default missing target category, exported for use in related modules&lt;br /&gt;
((curNs ==  0) or (curNs == 14)) and&lt;br /&gt;
        &amp;#039;Articles with hatnote templates targeting a nonexistent page&amp;#039; or nil&lt;br /&gt;
&lt;br /&gt;
function p.quote(title)&lt;br /&gt;
    --Wraps titles in quotation marks. If the title starts/ends with a quotation&lt;br /&gt;
    --mark, kerns that side as with {{-&amp;#039;}}&lt;br /&gt;
    local quotationMarks = {&lt;br /&gt;
        [&amp;quot;&amp;#039;&amp;quot;]=true, [&amp;#039;&amp;quot;&amp;#039;]=true, [&amp;#039;“&amp;#039;]=true, [&amp;quot;‘&amp;quot;]=true, [&amp;#039;”&amp;#039;]=true, [&amp;quot;’&amp;quot;]=true&lt;br /&gt;
    }&lt;br /&gt;
    local quoteLeft, quoteRight = -- Test if start/end are quotation marks&lt;br /&gt;
    quotationMarks[string.sub(title,  1,  1)],&lt;br /&gt;
    quotationMarks[string.sub(title, -1, -1)]&lt;br /&gt;
    if quoteLeft or quoteRight then&lt;br /&gt;
        title = mw.html.create(&amp;quot;span&amp;quot;):wikitext(title)&lt;br /&gt;
    end&lt;br /&gt;
    if quoteLeft  then title:css(&amp;quot;padding-left&amp;quot;,  &amp;quot;0.15em&amp;quot;) end&lt;br /&gt;
    if quoteRight then title:css(&amp;quot;padding-right&amp;quot;, &amp;quot;0.15em&amp;quot;) end&lt;br /&gt;
    return &amp;#039;&amp;quot;&amp;#039; .. tostring(title) .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Hatnote&lt;br /&gt;
--&lt;br /&gt;
-- Produces standard hatnote text. Implements the {{hatnote}} template.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function decorateHatnote(hatnote, options)&lt;br /&gt;
    local function getIcon(filename)&lt;br /&gt;
        local html = &amp;#039;&amp;#039;&lt;br /&gt;
        if type(filename) == &amp;#039;string&amp;#039; then&lt;br /&gt;
            local icon = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
            icon&lt;br /&gt;
                    :addClass(&amp;#039;hatnote-icon&amp;#039;)&lt;br /&gt;
                    :addClass(&amp;#039;metadata&amp;#039;)&lt;br /&gt;
                    :wikitext(&amp;#039;[[File:&amp;#039; .. filename .. &amp;#039;|14px|link=]]&amp;#039;)&lt;br /&gt;
                    :done()&lt;br /&gt;
            html = tostring(icon)&lt;br /&gt;
        end&lt;br /&gt;
        return html&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local container = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
    container&lt;br /&gt;
            :addClass(&amp;#039;hatnote-container&amp;#039;)&lt;br /&gt;
            :wikitext(getIcon(options.icon))&lt;br /&gt;
            :wikitext(tostring(hatnote))&lt;br /&gt;
            :done()&lt;br /&gt;
    return container&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.hatnote(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    local s = args[1]&lt;br /&gt;
    if not s then&lt;br /&gt;
        return p.makeWikitextError(&lt;br /&gt;
                &amp;#039;no text specified&amp;#039;,&lt;br /&gt;
                &amp;#039;Template:Hatnote#Errors&amp;#039;,&lt;br /&gt;
                args.category&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    return p._hatnote(s, {&lt;br /&gt;
        extraclasses = args.extraclasses,&lt;br /&gt;
        selfref = args.selfref&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._hatnote(s, options)&lt;br /&gt;
    checkType(&amp;#039;_hatnote&amp;#039;, 1, s, &amp;#039;string&amp;#039;)&lt;br /&gt;
    checkType(&amp;#039;_hatnote&amp;#039;, 2, options, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
    options = options or {}&lt;br /&gt;
    local inline = options.inline&lt;br /&gt;
    local hatnote = mw.html.create(inline == 1 and &amp;#039;span&amp;#039; or &amp;#039;div&amp;#039;)&lt;br /&gt;
    local extraclasses&lt;br /&gt;
    if type(options.extraclasses) == &amp;#039;string&amp;#039; then&lt;br /&gt;
        extraclasses = options.extraclasses&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    hatnote&lt;br /&gt;
            :attr(&amp;#039;role&amp;#039;, &amp;#039;note&amp;#039;)&lt;br /&gt;
            :addClass(p.defaultClasses(inline))&lt;br /&gt;
            :addClass(extraclasses)&lt;br /&gt;
            :addClass(options.selfref and &amp;#039;selfref&amp;#039; or nil)&lt;br /&gt;
            :wikitext(s)&lt;br /&gt;
&lt;br /&gt;
    -- Decorate WP hatnote to SCW standard&lt;br /&gt;
    hatnote = decorateHatnote(hatnote, options)&lt;br /&gt;
&lt;br /&gt;
    return mw.getCurrentFrame():extensionTag{&lt;br /&gt;
        name = &amp;#039;templatestyles&amp;#039;, args = { src = &amp;#039;Module:Hatnote/styles.css&amp;#039; }&lt;br /&gt;
    } .. tostring(hatnote)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zeroclanzhang</name></author>
	</entry>
</feed>