<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_Music</id>
	<title>Module:Infobox Music - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_Music"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Music&amp;action=history"/>
	<updated>2026-04-30T21:28:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Infobox_Music&amp;diff=34169&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-- &lt;pre&gt; -- This will likely be expanded when other infoboxes are converted to Lua -- For now, it will just be a categories handler  local p = {}  local onmain = require(&#039;Module:Mainonly&#039;).on_main local yesno = require(&#039;Module:Yesno&#039;) local empty = require(&#039;Module:Paramtest&#039;).is_empty  local composers = { 	[&#039;ian t&#039;] = &#039;Ian Taylor&#039;, 	[&#039;grace d&#039;] = &#039;Grace Docksey&#039;, 	[&#039;adam b&#039;] = &#039;Adam Bond&#039;, 	[&#039;stephen l&#039;] = &#039;Stephen Lord&#039;, 	[&#039;jed s&#039;] = &#039;Jed Sanderson&#039;, 	[&#039;adam r&#039;] = &#039;Adam...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Music&amp;diff=34169&amp;oldid=prev"/>
		<updated>2024-10-15T23:15:04Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;pre&amp;gt; -- This will likely be expanded when other infoboxes are converted to Lua -- For now, it will just be a categories handler  local p = {}  local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main local yesno = require(&amp;#039;Module:Yesno&amp;#039;) local empty = require(&amp;#039;Module:Paramtest&amp;#039;).is_empty  local composers = { 	[&amp;#039;ian t&amp;#039;] = &amp;#039;Ian Taylor&amp;#039;, 	[&amp;#039;grace d&amp;#039;] = &amp;#039;Grace Docksey&amp;#039;, 	[&amp;#039;adam b&amp;#039;] = &amp;#039;Adam Bond&amp;#039;, 	[&amp;#039;stephen l&amp;#039;] = &amp;#039;Stephen Lord&amp;#039;, 	[&amp;#039;jed s&amp;#039;] = &amp;#039;Jed Sanderson&amp;#039;, 	[&amp;#039;adam r&amp;#039;] = &amp;#039;Adam...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;pre&amp;gt;&lt;br /&gt;
-- This will likely be expanded when other infoboxes are converted to Lua&lt;br /&gt;
-- For now, it will just be a categories handler&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local empty = require(&amp;#039;Module:Paramtest&amp;#039;).is_empty&lt;br /&gt;
&lt;br /&gt;
local composers = {&lt;br /&gt;
	[&amp;#039;ian t&amp;#039;] = &amp;#039;Ian Taylor&amp;#039;,&lt;br /&gt;
	[&amp;#039;grace d&amp;#039;] = &amp;#039;Grace Docksey&amp;#039;,&lt;br /&gt;
	[&amp;#039;adam b&amp;#039;] = &amp;#039;Adam Bond&amp;#039;,&lt;br /&gt;
	[&amp;#039;stephen l&amp;#039;] = &amp;#039;Stephen Lord&amp;#039;,&lt;br /&gt;
	[&amp;#039;jed s&amp;#039;] = &amp;#039;Jed Sanderson&amp;#039;,&lt;br /&gt;
	[&amp;#039;adam r&amp;#039;] = &amp;#039;Adam Ritchie&amp;#039;,&lt;br /&gt;
	[&amp;#039;michael m&amp;#039;] = &amp;#039;Michael Manning&amp;#039;,&lt;br /&gt;
	[&amp;#039;ian h&amp;#039;] = &amp;#039;Iain Hetherington&amp;#039;,&lt;br /&gt;
	[&amp;#039;iain h&amp;#039;] = &amp;#039;Iain Hetherington&amp;#039;,&lt;br /&gt;
	[&amp;#039;chris j&amp;#039;] = &amp;#039;Chris Jolley&amp;#039;,&lt;br /&gt;
	[&amp;#039;dan a&amp;#039;] = &amp;#039;Dan Atkinson&amp;#039;,&lt;br /&gt;
	[&amp;#039;james h&amp;#039;] = &amp;#039;James Hannigan&amp;#039;,&lt;br /&gt;
	[&amp;#039;sam j&amp;#039;] = &amp;#039;Sam Jones&amp;#039;,&lt;br /&gt;
	[&amp;#039;ashleigh b&amp;#039;] = &amp;#039;Ashleigh Bridges&amp;#039;,&lt;br /&gt;
	[&amp;#039;abbie d&amp;#039;] = &amp;#039;Abbie Day&amp;#039;,&lt;br /&gt;
	[&amp;#039;julian s&amp;#039;] = &amp;#039;Julian Surma&amp;#039;,&lt;br /&gt;
	[&amp;#039;ashton m&amp;#039;] = &amp;#039;Ashton Mills&amp;#039;,&lt;br /&gt;
	[&amp;#039;sebastian b&amp;#039;] = &amp;#039;Sebastian Boulton&amp;#039;,&lt;br /&gt;
	[&amp;#039;ed p&amp;#039;] = &amp;#039;Ed Pilkington&amp;#039;,&lt;br /&gt;
	[&amp;#039;mod jodgers&amp;#039;] = &amp;#039;James Rodgers&amp;#039;,&lt;br /&gt;
	[&amp;#039;j rodgers&amp;#039;] = &amp;#039;James Rodgers&amp;#039;,&lt;br /&gt;
	[&amp;#039;j rogers&amp;#039;] = &amp;#039;James Rodgers&amp;#039;,&lt;br /&gt;
	[&amp;#039;o nixon&amp;#039;] = &amp;#039;Oliver Nixon&amp;#039;,&lt;br /&gt;
	[&amp;#039;artur b&amp;#039;] = &amp;#039;Artur Baryshev&amp;#039;,&lt;br /&gt;
	[&amp;#039;james downie&amp;#039;] = &amp;#039;James Downie &amp;#039;,&lt;br /&gt;
	[&amp;#039;james d&amp;#039;] = &amp;#039;James Downie &amp;#039;,&lt;br /&gt;
	[&amp;#039;mod rainbow&amp;#039;] = &amp;#039;Mod Rainbow&amp;#039;,&lt;br /&gt;
	[&amp;#039;mod arismel&amp;#039;] = &amp;#039;Mod Arismel&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.cats(frame)&lt;br /&gt;
	if not onmain() then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	return p.categories {&lt;br /&gt;
			number = args.number,&lt;br /&gt;
			file = args.file,&lt;br /&gt;
			release = args.release,&lt;br /&gt;
			update = args.update,&lt;br /&gt;
			members = args.members,&lt;br /&gt;
			location = args.location,&lt;br /&gt;
			hint = args.hint,&lt;br /&gt;
			vocals = args.vocals,&lt;br /&gt;
			instruments = args.instruments,&lt;br /&gt;
			duration = args.duration,&lt;br /&gt;
			composer = args.composer,&lt;br /&gt;
			map = args.map&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function that can perform case-insensitive replaces&lt;br /&gt;
function replace_i(s, search, replace)&lt;br /&gt;
	local i, j = s:lower():find(search:lower())&lt;br /&gt;
	return s:sub(0, i-1) .. replace .. s:sub(j+1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.composers(frame)&lt;br /&gt;
	if not onmain() then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local ret = args.composer&lt;br /&gt;
	local ctgy = &amp;#039;&amp;#039;&lt;br /&gt;
	local complist = string.lower(args.composer)&lt;br /&gt;
	local compcount = 0&lt;br /&gt;
	for name, cat in pairs(composers) do&lt;br /&gt;
		if complist:find(name) then&lt;br /&gt;
			ctgy = ctgy .. &amp;#039;[[Category:Music composed by &amp;#039; .. cat .. &amp;#039;]]&amp;#039;&lt;br /&gt;
			ret = replace_i(ret, name ..&amp;#039;%a*&amp;#039;, &amp;#039;[[Composed by::&amp;#039; .. cat .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
			compcount = compcount + 1&lt;br /&gt;
		elseif complist:find(string.lower(cat)) then&lt;br /&gt;
			ctgy = ctgy .. &amp;#039;[[Category:Music composed by &amp;#039; .. cat .. &amp;#039;]]&amp;#039;&lt;br /&gt;
			ret = &amp;#039;[[Composed by::&amp;#039; .. cat .. &amp;#039;]]&amp;#039;&lt;br /&gt;
			compcount = compcount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if compcount == 0 then&lt;br /&gt;
		ctgy = ctgy .. &amp;#039;[[Category:Invalid composer]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if compcount &amp;gt; 1 then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Tracks with multiple composers]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret .. ctgy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.categories(...)&lt;br /&gt;
	local args = ...&lt;br /&gt;
	local ctgy = &amp;#039;&amp;lt;div class=&amp;quot;infobox-smw-data&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;[[Category:Music tracks]]&amp;#039;&lt;br /&gt;
	local members = yesno(args.members)&lt;br /&gt;
	if members == true then&lt;br /&gt;
    	ctgy = ctgy .. &amp;quot;[[Category:Members&amp;#039; music]]&amp;quot;&lt;br /&gt;
	elseif members == false then&lt;br /&gt;
		ctgy = ctgy .. &amp;#039;[[Category:Free-to-play music]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if yesno(args.vocals) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Music tracks with vocals]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if args.hint == &amp;quot;Not unlockable&amp;quot; then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Unlisted music tracks]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.number) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Missing track number]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.file) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs audio added]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Music track::&amp;#039;..string.gsub(args.file, &amp;#039;[%[%]]&amp;#039;, &amp;#039;&amp;#039;)..&amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.release) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs release date]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		local release = string.gsub(args.release, &amp;#039;[%[%]]&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		local pattern = &amp;quot;(%d%d?)%s*-%s*(%d%d?)%s+(%a+)%s+(%d%d%d%d)&amp;quot;&lt;br /&gt;
		day1, day2, month, year = string.match(release, pattern)&lt;br /&gt;
		if day2 then&lt;br /&gt;
			local fmt = &amp;#039;[[Release date::%s %s %s]][[Release date::%s %s %s]]&amp;#039;&lt;br /&gt;
			ctgy = ctgy .. string.format(fmt, day1, month, year, day2, month, year)&lt;br /&gt;
		else&lt;br /&gt;
			ctgy = ctgy..&amp;#039;[[Release date::&amp;#039;..release..&amp;#039;]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.update) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs update added]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.members) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs members status]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.location) then&lt;br /&gt;
	    ctgy = ctgy..&amp;#039;[[Category:Missing track location]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.hint) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Missing unlock hint]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Unlock hint::&amp;#039;..string.gsub(args.hint, &amp;#039;[%[%]]&amp;#039;, &amp;#039;&amp;#039;)..&amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.instruments) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs instruments]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.duration) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs track duration added]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.map) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs map]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if empty(args.composer) then&lt;br /&gt;
		ctgy = ctgy..&amp;#039;[[Category:Needs composer added]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	ctgy = ctgy .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	return ctgy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>