<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.cobblemon.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASlot</id>
	<title>Module:Slot - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cobblemon.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ASlot"/>
	<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Module:Slot&amp;action=history"/>
	<updated>2026-04-12T15:50:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Module:Slot&amp;diff=3381&amp;oldid=prev</id>
		<title>Blob: Created page with &quot;local p = {}  local i18n = { 	filename = &#039;Invicon $1&#039;, 	legacyFilename = &#039;Grid $1.png&#039;, 	modLink = &#039;$1/$2&#039;, 	moduleAliases = Module:Slot/Aliases, 	moduleInvData = Module:InvSprite, 	moduleModData = &#039;Module:InvSprite/$1&#039;, 	moduleRandom = Module:Random, 	moduleSprite = Module:Sprite, 	-- List of special prefixes which should be handled by 	-- other modules (such as being moved outside links) 	prefixes = { 		any = &#039;Any&#039;, 		matching = &#039;Matching&#039;, 		damaged =...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Module:Slot&amp;diff=3381&amp;oldid=prev"/>
		<updated>2023-10-28T00:46:33Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local i18n = { 	filename = &amp;#039;Invicon $1&amp;#039;, 	legacyFilename = &amp;#039;Grid $1.png&amp;#039;, 	modLink = &amp;#039;$1/$2&amp;#039;, 	moduleAliases = &lt;a href=&quot;/index.php?title=Module:Slot/Aliases&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Slot/Aliases (page does not exist)&quot;&gt;Module:Slot/Aliases&lt;/a&gt;, 	moduleInvData = &lt;a href=&quot;/index.php/Module:InvSprite&quot; title=&quot;Module:InvSprite&quot;&gt;Module:InvSprite&lt;/a&gt;, 	moduleModData = &amp;#039;Module:InvSprite/$1&amp;#039;, 	moduleRandom = &lt;a href=&quot;/index.php/Module:Random&quot; title=&quot;Module:Random&quot;&gt;Module:Random&lt;/a&gt;, 	moduleSprite = &lt;a href=&quot;/index.php/Module:Sprite&quot; title=&quot;Module:Sprite&quot;&gt;Module:Sprite&lt;/a&gt;, 	-- List of special prefixes which should be handled by 	-- other modules (such as being moved outside links) 	prefixes = { 		any = &amp;#039;Any&amp;#039;, 		matching = &amp;#039;Matching&amp;#039;, 		damaged =...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local i18n = {&lt;br /&gt;
	filename = &amp;#039;Invicon $1&amp;#039;,&lt;br /&gt;
	legacyFilename = &amp;#039;Grid $1.png&amp;#039;,&lt;br /&gt;
	modLink = &amp;#039;$1/$2&amp;#039;,&lt;br /&gt;
	moduleAliases = [[Module:Slot/Aliases]],&lt;br /&gt;
	moduleInvData = [[Module:InvSprite]],&lt;br /&gt;
	moduleModData = &amp;#039;Module:InvSprite/$1&amp;#039;,&lt;br /&gt;
	moduleRandom = [[Module:Random]],&lt;br /&gt;
	moduleSprite = [[Module:Sprite]],&lt;br /&gt;
	-- List of special prefixes which should be handled by&lt;br /&gt;
	-- other modules (such as being moved outside links)&lt;br /&gt;
	prefixes = {&lt;br /&gt;
		any = &amp;#039;Any&amp;#039;,&lt;br /&gt;
		matching = &amp;#039;Matching&amp;#039;,&lt;br /&gt;
		damaged = &amp;#039;Damaged&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
	suffixes = {&lt;br /&gt;
		be = &amp;#039;BE&amp;#039;,&lt;br /&gt;
		lce = &amp;#039;LCE&amp;#039;,&lt;br /&gt;
	},&lt;br /&gt;
	templateFileUrl = &amp;#039;FileUrl&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
p.i18n = i18n&lt;br /&gt;
&lt;br /&gt;
local random = require( i18n.moduleRandom ).random&lt;br /&gt;
local sprite = require( i18n.moduleSprite ).sprite&lt;br /&gt;
local aliases = mw.loadData( i18n.moduleAliases )&lt;br /&gt;
local ids = mw.loadData( i18n.moduleInvData ).ids&lt;br /&gt;
local modIds = {}&lt;br /&gt;
local pageName = mw.title.getCurrentTitle().text&lt;br /&gt;
&lt;br /&gt;
-- Performs a simple recursive clone of a table&amp;#039;s values&lt;br /&gt;
local function cloneTable( origTable )&lt;br /&gt;
	local newTable = {}&lt;br /&gt;
	for k, v in pairs( origTable ) do&lt;br /&gt;
		if type( v ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			v = cloneTable( v )&lt;br /&gt;
		end&lt;br /&gt;
		newTable[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return newTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Merges a list, or inserts a string&lt;br /&gt;
	or table into a table&lt;br /&gt;
--]]&lt;br /&gt;
local function mergeList( parentTable, content )&lt;br /&gt;
	local i = #parentTable + 1&lt;br /&gt;
	if content[1] then&lt;br /&gt;
		-- Merge list into table&lt;br /&gt;
		for _, v in ipairs( content ) do&lt;br /&gt;
			parentTable[i] = v&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Add strings or tables to table&lt;br /&gt;
		parentTable[i] = content&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates the HTML for an item&lt;br /&gt;
local function makeItem( frame, i, args )&lt;br /&gt;
	local item = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;invslot-item&amp;#039; )&lt;br /&gt;
	if args.imgclass then&lt;br /&gt;
		item:addClass( args.imgclass )&lt;br /&gt;
	end&lt;br /&gt;
	if frame.name == &amp;#039;&amp;#039; then&lt;br /&gt;
		return item&lt;br /&gt;
	end&lt;br /&gt;
	local category&lt;br /&gt;
	local title = frame.title or mw.text.trim( args.title or &amp;#039;&amp;#039; )&lt;br /&gt;
	local mod = frame.mod&lt;br /&gt;
	local name = frame.name or &amp;#039;&amp;#039;&lt;br /&gt;
	local num = frame.num&lt;br /&gt;
	local description = frame.text&lt;br /&gt;
	&lt;br /&gt;
	local img, idData&lt;br /&gt;
	local modPath = mod and i18n.moduleModData:gsub( &amp;#039;%$1&amp;#039;, mod ) or nil&lt;br /&gt;
	if mod then&lt;br /&gt;
		local modData = modIds[mod]&lt;br /&gt;
		if not modData then&lt;br /&gt;
			local calledData&lt;br /&gt;
			local success, err = pcall(function () calledData = mw.loadData( modPath ).ids end)&lt;br /&gt;
		    if success then&lt;br /&gt;
		    	modData = calledData&lt;br /&gt;
		        modIds[mod] = modData&lt;br /&gt;
		    end&lt;br /&gt;
		end&lt;br /&gt;
		if modData and modData[name] then&lt;br /&gt;
			idData = modData[name]&lt;br /&gt;
		elseif modData and modData[name:gsub( &amp;#039;[%s%+]&amp;#039;, &amp;#039;-&amp;#039; )] then&lt;br /&gt;
			idData = modData[name:gsub( &amp;#039;[%s%+]&amp;#039;, &amp;#039;-&amp;#039; )]&lt;br /&gt;
		else&lt;br /&gt;
			img = i18n.legacyFilename:gsub( &amp;#039;%$1&amp;#039;, name .. &amp;#039; (&amp;#039; .. mod .. &amp;#039;)&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
	elseif ids[name] then&lt;br /&gt;
		idData = ids[name]&lt;br /&gt;
	elseif not ids[name] and name:match( &amp;#039;\.gif$&amp;#039; ) then&lt;br /&gt;
		img = i18n.filename:gsub( &amp;#039;%$1&amp;#039;, name )&lt;br /&gt;
		name = name:sub( 0, -5 )&lt;br /&gt;
	elseif not ids[name] then&lt;br /&gt;
		img = i18n.legacyFilename:gsub( &amp;#039;%$1&amp;#039;, name )&lt;br /&gt;
		name = name&lt;br /&gt;
	elseif name:match( &amp;#039;\.png$&amp;#039; ) then&lt;br /&gt;
		img = i18n.filename:gsub( &amp;#039;%$1&amp;#039;, name )&lt;br /&gt;
		-- Remove file extension from name&lt;br /&gt;
		name = name:sub( 0, -5 )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local link = args.link or &amp;#039;&amp;#039;&lt;br /&gt;
	if link == &amp;#039;&amp;#039; then&lt;br /&gt;
		if mod then&lt;br /&gt;
			link = i18n.modLink:gsub( &amp;#039;%$1&amp;#039;, mod ):gsub( &amp;#039;%$2&amp;#039;, name )&lt;br /&gt;
		else&lt;br /&gt;
			link = name:gsub( &amp;#039;^&amp;#039; .. i18n.prefixes.damaged .. &amp;#039; &amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
			for _, suffix in pairs( i18n.suffixes ) do&lt;br /&gt;
				link = link:gsub( &amp;#039;[ %-]&amp;#039; .. suffix .. &amp;#039;$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif link:lower() == &amp;#039;none&amp;#039; then&lt;br /&gt;
		link = nil&lt;br /&gt;
	end&lt;br /&gt;
	if link == pageName then&lt;br /&gt;
		link = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
 	if not mod and mw.getCurrentFrame():callParserFunction(&amp;#039;PROTECTIONEXPIRY:edit&amp;#039;, name) == &amp;#039;&amp;#039; then&lt;br /&gt;
 		link = &amp;#039;mcw:&amp;#039; .. name .. &amp;#039;&amp;#039;&lt;br /&gt;
 	end&lt;br /&gt;
&lt;br /&gt;
	local formattedTitle&lt;br /&gt;
	local plainTitle&lt;br /&gt;
	if title == &amp;#039;&amp;#039; then&lt;br /&gt;
		plainTitle = name&lt;br /&gt;
	elseif title:lower() ~= &amp;#039;none&amp;#039; then&lt;br /&gt;
		plainTitle = title:gsub( &amp;#039;\\\\&amp;#039;, &amp;#039;&amp;amp;#92;&amp;#039; ):gsub( &amp;#039;\\&amp;amp;&amp;#039;, &amp;#039;&amp;amp;#38;&amp;#039; )&lt;br /&gt;
		&lt;br /&gt;
		local formatPattern = &amp;#039;&amp;amp;[0-9a-fk-or]&amp;#039;&lt;br /&gt;
		if plainTitle:match( formatPattern ) then&lt;br /&gt;
			formattedTitle = title&lt;br /&gt;
			plainTitle = plainTitle:gsub( formatPattern, &amp;#039;&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if plainTitle == &amp;#039;&amp;#039; then&lt;br /&gt;
			plainTitle = name&lt;br /&gt;
		else&lt;br /&gt;
			plainTitle = plainTitle:gsub( &amp;#039;&amp;amp;#92;&amp;#039;, &amp;#039;\\&amp;#039; ):gsub( &amp;#039;&amp;amp;#38;&amp;#039;, &amp;#039;&amp;amp;&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
	elseif link then&lt;br /&gt;
		if img then&lt;br /&gt;
			formattedTitle = &amp;#039;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			plainTitle = &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	item:attr{&lt;br /&gt;
		[&amp;#039;data-minetip-title&amp;#039;] = formattedTitle,&lt;br /&gt;
		[&amp;#039;data-minetip-text&amp;#039;] = description&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if img then&lt;br /&gt;
		-- &amp;amp; is re-escaped because mw.html treats attributes&lt;br /&gt;
		-- as plain text, but MediaWiki doesn&amp;#039;t&lt;br /&gt;
		local escapedTitle = ( plainTitle or &amp;#039;&amp;#039; ):gsub( &amp;#039;&amp;amp;&amp;#039;, &amp;#039;&amp;amp;#38;&amp;#039; )&lt;br /&gt;
		item:addClass( &amp;#039;invslot-item-image&amp;#039; )&lt;br /&gt;
			:wikitext( &amp;#039;[[File:&amp;#039;, img, &amp;#039;|32x32px|link=&amp;#039;, link or &amp;#039;&amp;#039;, &amp;#039;|&amp;#039;, escapedTitle, &amp;#039;]]&amp;#039; )&lt;br /&gt;
	else&lt;br /&gt;
		local image&lt;br /&gt;
		if mod then&lt;br /&gt;
			image = args.spritesheet or mod .. &amp;#039;Sprite.png&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		if link then&lt;br /&gt;
			item:wikitext( &amp;#039;[[&amp;#039;, link, &amp;#039;|&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
		local image, spriteCat = sprite{&lt;br /&gt;
			iddata = idData, title = plainTitle,&lt;br /&gt;
			image = image, data = (mod and modPath:sub(8) or &amp;#039;InvSprite&amp;#039;),&lt;br /&gt;
			nourl = args.nourl,&lt;br /&gt;
		}&lt;br /&gt;
		item:node( image )&lt;br /&gt;
		category = spriteCat&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if num and num &amp;gt; 1 and num &amp;lt; 1000 then&lt;br /&gt;
		if img and link then&lt;br /&gt;
			item:wikitext( &amp;#039;[[&amp;#039;, link, &amp;#039;|&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
		local number = item&lt;br /&gt;
			:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
				:addClass( &amp;#039;invslot-stacksize&amp;#039; )&lt;br /&gt;
				:attr{ title = plainTitle }&lt;br /&gt;
				:wikitext( num )&lt;br /&gt;
		if numStyle then&lt;br /&gt;
			number:cssText( numStyle )&lt;br /&gt;
		end&lt;br /&gt;
		if img and link then&lt;br /&gt;
			item:wikitext( &amp;#039;]]&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if idData and link then&lt;br /&gt;
		item:wikitext( &amp;#039;]]&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	item:wikitext( category )&lt;br /&gt;
	&lt;br /&gt;
	return item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main entry point&lt;br /&gt;
function p.slot( f )&lt;br /&gt;
	local args = f.args or f&lt;br /&gt;
	if f == mw.getCurrentFrame() and args[1] == nil then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not args.parsed then&lt;br /&gt;
		args[1] = mw.text.trim( args[1] or &amp;#039;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local modData = {&lt;br /&gt;
		aliases = args.modaliases or &amp;#039;&amp;#039;,&lt;br /&gt;
		default = args.mod&lt;br /&gt;
	}&lt;br /&gt;
	modData.aliases = modData.aliases ~= &amp;#039;&amp;#039; and mw.loadData( &amp;#039;Module:&amp;#039; .. modData.aliases ) or nil&lt;br /&gt;
	if args.mod == &amp;#039;&amp;#039; then&lt;br /&gt;
		modData.default = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local frames&lt;br /&gt;
	if args.parsed then&lt;br /&gt;
		frames = args[1]&lt;br /&gt;
	elseif args[1] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local randomise = args.class == &amp;#039;invslot-large&amp;#039; and &amp;#039;never&amp;#039; or nil&lt;br /&gt;
		frames = p.parseFrameText( args[1], randomise, false, modData )&lt;br /&gt;
	end&lt;br /&gt;
	local animated = frames and #frames &amp;gt; 1&lt;br /&gt;
	local imgClass = args.imgclass&lt;br /&gt;
	local numStyle = args.numstyle&lt;br /&gt;
	local body = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;invslot&amp;#039; ):css{ [&amp;#039;vertical-align&amp;#039;] = args.align }&lt;br /&gt;
	if animated then&lt;br /&gt;
		body:addClass( &amp;#039;animated&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if args.class then&lt;br /&gt;
		body:addClass( args.class )&lt;br /&gt;
	end&lt;br /&gt;
	if args.style then&lt;br /&gt;
		body:cssText( args.style )&lt;br /&gt;
	end&lt;br /&gt;
	if ( args.default or &amp;#039;&amp;#039; ) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		body:css( &amp;#039;background-image&amp;#039;, f:expandTemplate{ title = i18n.templateFileUrl, args = { args.default .. &amp;#039;.png&amp;#039; } } )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--mw.logObject( frames )&lt;br /&gt;
	if not frames then&lt;br /&gt;
		return tostring( body )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local activeFrame = frames.randomise == true and random( #frames ) or 1&lt;br /&gt;
	for i, frame in ipairs( frames ) do&lt;br /&gt;
		local item&lt;br /&gt;
		-- Table is a list, must contain subframes&lt;br /&gt;
		if frame[1] then&lt;br /&gt;
			item = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;animated-subframe&amp;#039; )&lt;br /&gt;
			local subActiveFrame = frame.randomise and random( #frame ) or 1&lt;br /&gt;
			for sI, sFrame in ipairs( frame ) do&lt;br /&gt;
				local sItem = makeItem( sFrame, sI, args )&lt;br /&gt;
				item:node( sItem )&lt;br /&gt;
				&lt;br /&gt;
				if sI == subActiveFrame then&lt;br /&gt;
					sItem:addClass( &amp;#039;animated-active&amp;#039; )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			item = makeItem( frame, i, args )&lt;br /&gt;
			body:node( item )&lt;br /&gt;
		end&lt;br /&gt;
		if i == activeFrame and animated then&lt;br /&gt;
			item:addClass( &amp;#039;animated-active&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring( body )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Parses the frame text into a table of frames and subframes,&lt;br /&gt;
	expanding aliases (and optionally retaining a reference), and&lt;br /&gt;
	deciding if the slot can be randomised&lt;br /&gt;
--]]&lt;br /&gt;
function p.parseFrameText( framesText, randomise, aliasReference, modData )&lt;br /&gt;
	local frames = { randomise = randomise }&lt;br /&gt;
	local subframes = {}&lt;br /&gt;
	local subframe&lt;br /&gt;
	local expandedAliases&lt;br /&gt;
	local splitFrames = mw.text.split( mw.text.trim( framesText ), &amp;#039;%s*;%s*&amp;#039; )&lt;br /&gt;
	for _, frameText in ipairs( splitFrames ) do&lt;br /&gt;
		frameText = frameText:gsub( &amp;#039;^%s*{%s*&amp;#039;, function()&lt;br /&gt;
			subframe = true&lt;br /&gt;
			return &amp;#039;&amp;#039;&lt;br /&gt;
		end )&lt;br /&gt;
		if subframe then&lt;br /&gt;
			frameText = frameText:gsub( &amp;#039;%s*}%s*$&amp;#039;, function()&lt;br /&gt;
				subframe = &amp;#039;last&amp;#039;&lt;br /&gt;
				return &amp;#039;&amp;#039;&lt;br /&gt;
			end )&lt;br /&gt;
		end&lt;br /&gt;
		local frame = p.makeFrame( frameText, modData and modData.default )&lt;br /&gt;
		local newFrame = frame&lt;br /&gt;
		if aliases or modData.aliases then&lt;br /&gt;
			local id = frame.name&lt;br /&gt;
			local alias = (modData and modData.aliases and modData.aliases[id]) or (aliases and aliases[id])&lt;br /&gt;
			if alias then&lt;br /&gt;
				if type(alias) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					alias = cloneTable( alias )&lt;br /&gt;
					alias.name = alias.name or nil&lt;br /&gt;
					alias.title = alias.title or nil&lt;br /&gt;
				end&lt;br /&gt;
				newFrame = p.getAlias( alias, frame )&lt;br /&gt;
				if aliasReference then&lt;br /&gt;
					local curFrame = #frames + 1&lt;br /&gt;
					local aliasData = { frame = frame, length = #newFrame }&lt;br /&gt;
					if subframe then&lt;br /&gt;
						subframes.aliasReference = subframes.aliasReference or {}&lt;br /&gt;
						subframes.aliasReference[#subframes + 1] = aliasData&lt;br /&gt;
					else&lt;br /&gt;
						expandedAliases = expandedAliases or {}&lt;br /&gt;
						expandedAliases[curFrame] = aliasData&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if subframe then&lt;br /&gt;
			mergeList( subframes, newFrame )&lt;br /&gt;
			-- Randomise starting frame for &amp;quot;Any *&amp;quot; aliases, as long as the alias is the only subframe&lt;br /&gt;
			subframes.randomise = frames.randomise ~= &amp;#039;never&amp;#039; and subframes.randomise == nil and frame.name:match( &amp;#039;^&amp;#039; .. i18n.prefixes.any .. &amp;#039; &amp;#039; ) and true or false&lt;br /&gt;
			if frames.randomise ~= &amp;#039;never&amp;#039; then&lt;br /&gt;
				frames.randomise = false&lt;br /&gt;
			end&lt;br /&gt;
			if subframe == &amp;#039;last&amp;#039; then&lt;br /&gt;
				-- No point having a subframe containing a single frame,&lt;br /&gt;
				-- or the subframe being the only frame&lt;br /&gt;
				local to_call = (#subframes == 1 or #splitFrames == i and #frames == 0) and mergeList or table.insert&lt;br /&gt;
				to_call( frames, subframes )&lt;br /&gt;
				subframes = {}&lt;br /&gt;
				subframe = nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Randomise starting frame for &amp;quot;Any *&amp;quot; aliases, as long as the alias is the only frame&lt;br /&gt;
			if frames.randomise == nil and frame.name:match( &amp;#039;^&amp;#039; .. i18n.prefixes.any .. &amp;#039; &amp;#039; ) then&lt;br /&gt;
				frames.randomise = true&lt;br /&gt;
			elseif frames.randomise ~= &amp;#039;never&amp;#039; then&lt;br /&gt;
				frames.randomise = false&lt;br /&gt;
			end&lt;br /&gt;
			mergeList( frames, newFrame )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	frames.aliasReference = expandedAliases&lt;br /&gt;
	&lt;br /&gt;
	return frames&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Returns a new table with the parts of the parent frame&lt;br /&gt;
	added to the alias&lt;br /&gt;
--]]&lt;br /&gt;
function p.getAlias( aliasFrames, parentFrame )&lt;br /&gt;
	-- If alias is just a name, return the parent frame with the new name&lt;br /&gt;
	if type( aliasFrames ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		local expandedFrame = mw.clone( parentFrame )&lt;br /&gt;
		expandedFrame.name = aliasFrames&lt;br /&gt;
		return { expandedFrame }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Single frame alias, put in list&lt;br /&gt;
	if aliasFrames.name then&lt;br /&gt;
		aliasFrames = { aliasFrames }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local expandedFrames = {}&lt;br /&gt;
	for i, aliasFrame in ipairs( aliasFrames ) do&lt;br /&gt;
		local expandedFrame&lt;br /&gt;
		expandedFrame = type( aliasFrame ) == &amp;#039;string&amp;#039; and { name = aliasFrame } or cloneTable( aliasFrame )&lt;br /&gt;
		expandedFrame.title = parentFrame.title or expandedFrame.title&lt;br /&gt;
		expandedFrame.mod = parentFrame.mod or expandedFrame.mod&lt;br /&gt;
		expandedFrame.num = parentFrame.num or expandedFrame.num&lt;br /&gt;
		expandedFrame.text = parentFrame.text or expandedFrame.text&lt;br /&gt;
		&lt;br /&gt;
		expandedFrames[i] = expandedFrame&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return expandedFrames&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.expandAlias( parentFrame, alias )&lt;br /&gt;
	return p.getAlias( alias, parentFrame )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.stringifyFrame( frame )&lt;br /&gt;
	if not frame.name then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&amp;#039;[%s]%s:%s,%s[%s]&amp;#039;,&lt;br /&gt;
		frame.title or &amp;#039;&amp;#039;,&lt;br /&gt;
		frame.mod or &amp;#039;Minecraft&amp;#039;,&lt;br /&gt;
		frame.name,&lt;br /&gt;
		frame.num or &amp;#039;&amp;#039;,&lt;br /&gt;
		frame.text or &amp;#039;&amp;#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.stringifyFrames( frames )&lt;br /&gt;
	for i, frame in ipairs( frames ) do&lt;br /&gt;
		frames[i] = p.stringifyFrame( frame )&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( frames, &amp;#039;;&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Splits up the frame text into its parts&lt;br /&gt;
function p.makeFrame( frameText, mod )&lt;br /&gt;
	-- Simple frame with no parts&lt;br /&gt;
	if not frameText:match( &amp;#039;[%[:,]&amp;#039; ) then&lt;br /&gt;
		return {&lt;br /&gt;
			mod = mod,&lt;br /&gt;
			name = mw.text.trim( frameText ),&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	frameText = frameText:gsub( &amp;#039;%s*([%[%]:,;])%s*&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local frame = {}&lt;br /&gt;
	frame.title = frameText:match( &amp;#039;^%[([^%]]+)%]&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	frame.mod = frameText:match( &amp;#039;([^:%]]+):&amp;#039; ) or mod&lt;br /&gt;
	local vanilla = { v = 1, vanilla = 1, mc = 1, minecraft = 1 }&lt;br /&gt;
	if frame.mod and vanilla[mw.ustring.lower( frame.mod )] or frame.mod == &amp;#039;&amp;#039; then&lt;br /&gt;
		frame.mod = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local nameStart = ( frameText:find( &amp;#039;:&amp;#039; ) or frameText:find( &amp;#039;%]&amp;#039; ) or 0 ) + 1&lt;br /&gt;
	nameStart = nameStart - 1 == #frameText and 1 or nameStart&lt;br /&gt;
	frame.name = frameText:sub( nameStart, ( frameText:find( &amp;#039;[,%[]&amp;#039;, nameStart ) or 0 ) - 1 )&lt;br /&gt;
	&lt;br /&gt;
	frame.num = math.floor( frameText:match( &amp;#039;,(%d+)&amp;#039; ) or 0 )&lt;br /&gt;
	if frame.num == 0 then&lt;br /&gt;
		frame.num = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	frame.text = frameText:match( &amp;#039;%[([^%]]+)%]$&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	return frame&lt;br /&gt;
end&lt;br /&gt;
function p.getParts( frameText, mod )&lt;br /&gt;
	return p.makeFrame( frameText, mod )&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Blob</name></author>
	</entry>
</feed>