<?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%3ASongColor</id>
	<title>Module:SongColor - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://kingwarzcharts.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASongColor"/>
	<link rel="alternate" type="text/html" href="https://kingwarzcharts.com/index.php?title=Module:SongColor&amp;action=history"/>
	<updated>2026-07-21T15:19:37Z</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:SongColor&amp;diff=3227&amp;oldid=prev</id>
		<title>Kingwarz at 01:21, 20 October 2025</title>
		<link rel="alternate" type="text/html" href="https://kingwarzcharts.com/index.php?title=Module:SongColor&amp;diff=3227&amp;oldid=prev"/>
		<updated>2025-10-20T01:21:27Z</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:SongColor (fixed)&lt;br /&gt;
-- Uses named |type= when provided; otherwise infers type from |peak=.&lt;br /&gt;
-- The FIRST unnamed argument is treated as the default color (e.g., &amp;quot;#E6E8FA&amp;quot;).&lt;br /&gt;
local p = {}&lt;br /&gt;
local map = {&lt;br /&gt;
  [&amp;quot;no.1 hit song&amp;quot;] = &amp;quot;khaki&amp;quot;,&lt;br /&gt;
  [&amp;quot;major hit song&amp;quot;] = &amp;quot;#ffce1b&amp;quot;,&lt;br /&gt;
  [&amp;quot;top 5 hit song&amp;quot;] = &amp;quot;#ffd27f&amp;quot;,&lt;br /&gt;
  [&amp;quot;top 10 hit song&amp;quot;] = &amp;quot;#E6E8FA&amp;quot;,&lt;br /&gt;
  [&amp;quot;top 20 hit song&amp;quot;] = &amp;quot;#dfefff&amp;quot;,&lt;br /&gt;
  [&amp;quot;charted song&amp;quot;]   = &amp;quot;#f0f0f0&amp;quot;,&lt;br /&gt;
}&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_collapse_lower(s)&lt;br /&gt;
  s = tostring(s or &amp;quot;&amp;quot;)&lt;br /&gt;
  s = mw.ustring.gsub(s, &amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
  s = mw.ustring.gsub(s, &amp;quot;%s+$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
  s = mw.ustring.gsub(s, &amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
  s = mw.ustring.lower(s)&lt;br /&gt;
  return s&lt;br /&gt;
end&lt;br /&gt;
local function unlink(text)&lt;br /&gt;
  text = tostring(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 text&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 type_from_peak(peak_raw)&lt;br /&gt;
  local peak = tostring(peak_raw or &amp;quot;&amp;quot;)&lt;br /&gt;
  peak = mw.ustring.gsub(peak, &amp;quot;^%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
  peak = mw.ustring.gsub(peak, &amp;quot;%s+$&amp;quot;, &amp;quot;&amp;quot;)&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 &amp;quot;no.1 hit song&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    -- superscripts?&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&lt;br /&gt;
        super_only = false; break&lt;br /&gt;
      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;
        if expn &amp;gt;= 5 then return &amp;quot;major hit song&amp;quot; else return &amp;quot;no.1 hit song&amp;quot; end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    -- caret form 1^N&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 &amp;quot;major hit song&amp;quot; or &amp;quot;no.1 hit song&amp;quot;&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 &amp;quot;top 5 hit song&amp;quot;&lt;br /&gt;
    elseif position &amp;lt;= 10 then&lt;br /&gt;
      return &amp;quot;top 10 hit song&amp;quot;&lt;br /&gt;
    elseif position &amp;lt;= 20 then&lt;br /&gt;
      return &amp;quot;top 20 hit song&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      return &amp;quot;charted song&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return nil&lt;br /&gt;
end&lt;br /&gt;
local function color_for_type(raw_type, default_color)&lt;br /&gt;
  if not raw_type or raw_type == &amp;quot;&amp;quot; then return default_color end&lt;br /&gt;
  local key = trim_collapse_lower(unlink(raw_type))&lt;br /&gt;
  return map[key] or default_color&lt;br /&gt;
end&lt;br /&gt;
function p.color(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;
  -- FIRST unnamed arg is the default color; or use |default=&lt;br /&gt;
  local default_color = margs[1] or pargs[1] or margs.default or pargs.default or &amp;quot;#E6E8FA&amp;quot;&lt;br /&gt;
  -- Only accept named |type= (avoid collision with default color)&lt;br /&gt;
  local typ  = margs.type or pargs.type or &amp;quot;&amp;quot;&lt;br /&gt;
  local peak = margs.peak or pargs.peak&lt;br /&gt;
  if typ ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    return color_for_type(typ, default_color)&lt;br /&gt;
  end&lt;br /&gt;
  local inferred = type_from_peak(peak)&lt;br /&gt;
  if inferred then&lt;br /&gt;
    return color_for_type(inferred, default_color)&lt;br /&gt;
  end&lt;br /&gt;
  return default_color&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Kingwarz</name></author>
	</entry>
</feed>