<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://kingwarzcharts.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASongType</id>
	<title>Module:SongType - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://kingwarzcharts.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASongType"/>
	<link rel="alternate" type="text/html" href="https://kingwarzcharts.com/index.php?title=Module:SongType&amp;action=history"/>
	<updated>2026-07-21T12:08:39Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://kingwarzcharts.com/index.php?title=Module:SongType&amp;diff=3229&amp;oldid=prev</id>
		<title>Kingwarz at 01:22, 20 October 2025</title>
		<link rel="alternate" type="text/html" href="https://kingwarzcharts.com/index.php?title=Module:SongType&amp;diff=3229&amp;oldid=prev"/>
		<updated>2025-10-20T01:22:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module:SongType (fixed)&lt;br /&gt;
-- Infers (and optionally links) a song &amp;quot;Type&amp;quot; from |peak=.&lt;br /&gt;
-- Honors a manual override via |type= (or |override=).&lt;br /&gt;
-- Use |link=no when you need plain text.&lt;br /&gt;
local p = {}&lt;br /&gt;
local super_to_norm = {&lt;br /&gt;
    [&amp;quot;⁰&amp;quot;]=&amp;quot;0&amp;quot;, [&amp;quot;¹&amp;quot;]=&amp;quot;1&amp;quot;, [&amp;quot;²&amp;quot;]=&amp;quot;2&amp;quot;, [&amp;quot;³&amp;quot;]=&amp;quot;3&amp;quot;, [&amp;quot;⁴&amp;quot;]=&amp;quot;4&amp;quot;,&lt;br /&gt;
    [&amp;quot;⁵&amp;quot;]=&amp;quot;5&amp;quot;, [&amp;quot;⁶&amp;quot;]=&amp;quot;6&amp;quot;, [&amp;quot;⁷&amp;quot;]=&amp;quot;7&amp;quot;, [&amp;quot;⁸&amp;quot;]=&amp;quot;8&amp;quot;, [&amp;quot;⁹&amp;quot;]=&amp;quot;9&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
local function trim(s)&lt;br /&gt;
    return (tostring(s or &amp;quot;&amp;quot;):gsub(&amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;%s+$&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
local function superscripts_to_number(sup)&lt;br /&gt;
    local norm = {}&lt;br /&gt;
    for uchar in mw.ustring.gmatch(sup or &amp;quot;&amp;quot;, &amp;quot;.&amp;quot;) do&lt;br /&gt;
        local d = super_to_norm[uchar]&lt;br /&gt;
        if not d then return nil end&lt;br /&gt;
        table.insert(norm, d)&lt;br /&gt;
    end&lt;br /&gt;
    return tonumber(table.concat(norm))&lt;br /&gt;
end&lt;br /&gt;
local function unlink(text)&lt;br /&gt;
    text = trim(text or &amp;quot;&amp;quot;)&lt;br /&gt;
    text = mw.ustring.gsub(text, &amp;quot;^%s*%[%[&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    text = mw.ustring.gsub(text, &amp;quot;%]%]%s*$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    local pipe = mw.ustring.find(text, &amp;quot;|&amp;quot;, 1, true)&lt;br /&gt;
    if pipe then text = mw.ustring.sub(text, 1, pipe - 1) end&lt;br /&gt;
    return trim(text)&lt;br /&gt;
end&lt;br /&gt;
local function linkify(label, want_link)&lt;br /&gt;
    label = trim(label or &amp;quot;&amp;quot;)&lt;br /&gt;
    if label == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    if want_link == false then return label end&lt;br /&gt;
    return string.format(&amp;quot;[[%s]]&amp;quot;, label)&lt;br /&gt;
end&lt;br /&gt;
local function infer_from_peak(peak_raw, want_link)&lt;br /&gt;
    local peak = trim(peak_raw)&lt;br /&gt;
    if peak == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
&lt;br /&gt;
    -- Extract leading numeric part&lt;br /&gt;
    local position_str, rest = peak:match(&amp;quot;^(%d+)(.*)$&amp;quot;)&lt;br /&gt;
    if not position_str then return nil end&lt;br /&gt;
    local position = tonumber(position_str)&lt;br /&gt;
&lt;br /&gt;
    if position == 1 then&lt;br /&gt;
        if rest == &amp;quot;&amp;quot; then&lt;br /&gt;
            return linkify(&amp;quot;No.1 Hit Song&amp;quot;, want_link)&lt;br /&gt;
        end&lt;br /&gt;
        local super_only = true&lt;br /&gt;
        for uchar in mw.ustring.gmatch(rest, &amp;quot;.&amp;quot;) do&lt;br /&gt;
            if not super_to_norm[uchar] then super_only = false; break end&lt;br /&gt;
        end&lt;br /&gt;
        if super_only then&lt;br /&gt;
            local expn = superscripts_to_number(rest)&lt;br /&gt;
            if expn then&lt;br /&gt;
                return (expn &amp;gt;= 5) and linkify(&amp;quot;Major Hit Song&amp;quot;, want_link)&lt;br /&gt;
                                   or  linkify(&amp;quot;No.1 Hit Song&amp;quot;, want_link)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        local caret_num = peak:match(&amp;quot;^1%^%s*(%d+)$&amp;quot;)&lt;br /&gt;
        if caret_num then&lt;br /&gt;
            local expn = tonumber(caret_num)&lt;br /&gt;
            if expn then&lt;br /&gt;
                return (expn &amp;gt;= 5) and linkify(&amp;quot;Major Hit Song&amp;quot;, want_link)&lt;br /&gt;
                                   or  linkify(&amp;quot;No.1 Hit Song&amp;quot;, want_link)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif position &amp;gt;= 2 and position &amp;lt;= 60 then&lt;br /&gt;
        -- For non-1, ignore rest (superscripts), use position&lt;br /&gt;
        if position &amp;lt;= 5 then&lt;br /&gt;
            return linkify(&amp;quot;Top 5 Hit Song&amp;quot;, want_link)&lt;br /&gt;
        elseif position &amp;lt;= 10 then&lt;br /&gt;
            return linkify(&amp;quot;Top 10 Hit Song&amp;quot;, want_link)&lt;br /&gt;
        elseif position &amp;lt;= 20 then&lt;br /&gt;
            return linkify(&amp;quot;Top 20 Hit Song&amp;quot;, want_link)&lt;br /&gt;
        else&lt;br /&gt;
            return linkify(&amp;quot;Charted Song&amp;quot;, want_link)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
function p.inferType(frame)&lt;br /&gt;
    -- IMPORTANT: prefer module-call args first, then fall back to parent&lt;br /&gt;
    local margs = frame.args or {}&lt;br /&gt;
    local pargs = (frame:getParent() and frame:getParent().args) or {}&lt;br /&gt;
    local peak  = margs.peak or pargs.peak or margs[&amp;quot;peak&amp;quot;] or pargs[&amp;quot;peak&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
    local link  = margs.link or pargs.link&lt;br /&gt;
    local want  = not (link == &amp;quot;no&amp;quot; or link == &amp;quot;false&amp;quot; or link == &amp;quot;0&amp;quot;)&lt;br /&gt;
    -- Manual override (|type= or |override=), from either scope&lt;br /&gt;
    local override = margs.override or pargs.override or margs.type or pargs.type&lt;br /&gt;
    override = trim(override or &amp;quot;&amp;quot;)&lt;br /&gt;
    if override ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local clean = unlink(override)&lt;br /&gt;
        return linkify(clean, want)&lt;br /&gt;
    end&lt;br /&gt;
    local t = infer_from_peak(peak, want)&lt;br /&gt;
    return t or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Kingwarz</name></author>
	</entry>
</feed>