<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.boxofrocks.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AInventory_slot</id>
	<title>Module:Inventory slot - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.boxofrocks.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AInventory_slot"/>
	<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Inventory_slot&amp;action=history"/>
	<updated>2026-05-31T02:05:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://wiki.boxofrocks.net/index.php?title=Module:Inventory_slot&amp;diff=315&amp;oldid=prev</id>
		<title>BoxWiki: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Inventory_slot&amp;diff=315&amp;oldid=prev"/>
		<updated>2021-05-13T15:52:07Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 15:52, 13 May 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>BoxWiki</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.boxofrocks.net/index.php?title=Module:Inventory_slot&amp;diff=314&amp;oldid=prev</id>
		<title>CraftingTable&gt;Nixinova: Remove the &quot;else use grid image&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Inventory_slot&amp;diff=314&amp;oldid=prev"/>
		<updated>2020-04-15T21:16:30Z</updated>

		<summary type="html">&lt;p&gt;Remove the &amp;quot;else use grid image&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 = 'Invicon $1',&lt;br /&gt;
	legacyFilename = 'Grid $1.png',&lt;br /&gt;
	modLink = 'Mods/$1/$2',&lt;br /&gt;
	moduleAliases = [[Module:Inventory slot/Aliases]],&lt;br /&gt;
	moduleInvData = [[Module:InvSprite]],&lt;br /&gt;
	moduleModData = 'Module:InvSprite/Mods/$1',&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 = 'Any',&lt;br /&gt;
		matching = 'Matching',&lt;br /&gt;
		damaged = 'Damaged',&lt;br /&gt;
	},&lt;br /&gt;
	suffixes = {&lt;br /&gt;
		be = 'BE',&lt;br /&gt;
		lce = 'LCE',&lt;br /&gt;
	},&lt;br /&gt;
	templateFileUrl = 'FileUrl',&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'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 ) == 'table' 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( 'span' ):addClass( 'invslot-item' )&lt;br /&gt;
	if args.imgclass then&lt;br /&gt;
		item:addClass( args.imgclass )&lt;br /&gt;
	end&lt;br /&gt;
	if frame.name == '' 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 '' )&lt;br /&gt;
	local mod = frame.mod&lt;br /&gt;
	local name = frame.name or ''&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;
	if mod then&lt;br /&gt;
		local modData = modIds[mod]&lt;br /&gt;
		if not modData and mw.title.new( i18n.moduleModData:gsub( '%$1', mod ) ).exists then&lt;br /&gt;
			modData = mw.loadData( i18n.moduleModData:gsub( '%$1', mod ) )&lt;br /&gt;
			modIds[mod] = modData&lt;br /&gt;
		end&lt;br /&gt;
		if modData and modData[name] then&lt;br /&gt;
			idData = modData[name]&lt;br /&gt;
		else&lt;br /&gt;
			img = i18n.legacyFilename:gsub( '%$1', name .. ' (' .. mod .. ')' )&lt;br /&gt;
		end&lt;br /&gt;
	elseif ids[name] then&lt;br /&gt;
		idData = ids[name]&lt;br /&gt;
	elseif name:match( '\.gif$' ) or name:match( '\.png$' ) then&lt;br /&gt;
		img = i18n.filename:gsub( '%$1', 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 ''&lt;br /&gt;
	if link == '' then&lt;br /&gt;
		if mod then&lt;br /&gt;
			link = i18n.modLink:gsub( '%$1', mod ):gsub( '%$2', name )&lt;br /&gt;
		else&lt;br /&gt;
			link = name:gsub( '^' .. i18n.prefixes.damaged .. ' ', '' )&lt;br /&gt;
			for _, suffix in pairs( i18n.suffixes ) do&lt;br /&gt;
				link = link:gsub( ' ' .. suffix .. '$', '' )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif link:lower() == 'none' 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;
	local formattedTitle&lt;br /&gt;
	local plainTitle&lt;br /&gt;
	if title == '' then&lt;br /&gt;
		plainTitle = name&lt;br /&gt;
	elseif title:lower() ~= 'none' then&lt;br /&gt;
		plainTitle = title:gsub( '\\\\', '&amp;amp;#92;' ):gsub( '\\&amp;amp;', '&amp;amp;#38;' )&lt;br /&gt;
		&lt;br /&gt;
		local formatPattern = '&amp;amp;[0-9a-fk-or]'&lt;br /&gt;
		if plainTitle:match( formatPattern ) then&lt;br /&gt;
			formattedTitle = title&lt;br /&gt;
			plainTitle = plainTitle:gsub( formatPattern, '' )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if plainTitle == '' then&lt;br /&gt;
			plainTitle = name&lt;br /&gt;
		else&lt;br /&gt;
			plainTitle = plainTitle:gsub( '&amp;amp;#92;', '\\' ):gsub( '&amp;amp;#38;', '&amp;amp;' )&lt;br /&gt;
		end&lt;br /&gt;
	elseif link then&lt;br /&gt;
		if img then&lt;br /&gt;
			formattedTitle = ''&lt;br /&gt;
		else&lt;br /&gt;
			plainTitle = ''&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	item:attr{&lt;br /&gt;
		['data-minetip-title'] = formattedTitle,&lt;br /&gt;
		['data-minetip-text'] = 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't&lt;br /&gt;
		local escapedTitle = ( plainTitle or '' ):gsub( '&amp;amp;', '&amp;amp;#38;' )&lt;br /&gt;
		item:addClass( 'invslot-item-image' )&lt;br /&gt;
			:wikitext( '[[File:', img, '|32x32px|link=', link or '', '|', escapedTitle, ']]' )&lt;br /&gt;
	else&lt;br /&gt;
		local image&lt;br /&gt;
		if mod then&lt;br /&gt;
			image = args.spritesheet or mod .. 'Sprite.png'&lt;br /&gt;
		end&lt;br /&gt;
		if link then&lt;br /&gt;
			item:wikitext( '[[', link, '|' )&lt;br /&gt;
		end&lt;br /&gt;
		local image, spriteCat = sprite{&lt;br /&gt;
			iddata = idData, title = plainTitle,&lt;br /&gt;
			image = image, data = 'InvSprite',&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( '[[', link, '|' )&lt;br /&gt;
		end&lt;br /&gt;
		local number = item&lt;br /&gt;
			:tag( 'span' )&lt;br /&gt;
				:addClass( 'invslot-stacksize' )&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( ']]' )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if idData and link then&lt;br /&gt;
		item:wikitext( ']]' )&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 '' )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local modData = {&lt;br /&gt;
		aliases = args.modaliases or '',&lt;br /&gt;
		default = args.mod&lt;br /&gt;
	}&lt;br /&gt;
	if modData.aliases ~= '' then&lt;br /&gt;
		modData.aliases = mw.loadData( 'Module:' .. modData.aliases )&lt;br /&gt;
	else&lt;br /&gt;
		modData.aliases = nil&lt;br /&gt;
	end&lt;br /&gt;
	if args.mod == '' 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] ~= '' then&lt;br /&gt;
		local randomise = args.class == 'invslot-large' and 'never' 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( 'span' ):addClass( 'invslot' ):css{ ['vertical-align'] = args.align }&lt;br /&gt;
	if animated then&lt;br /&gt;
		body:addClass( 'animated' )&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 '' ) ~= '' then&lt;br /&gt;
		body:css( 'background-image', f:expandTemplate{ title = i18n.templateFileUrl, args = { args.default .. '.png' } } )&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( 'span' ):addClass( 'animated-subframe' )&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( 'animated-active' )&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( 'animated-active' )&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 ), '%s*;%s*' )&lt;br /&gt;
	for _, frameText in ipairs( splitFrames ) do&lt;br /&gt;
		frameText = frameText:gsub( '^%s*{%s*', function()&lt;br /&gt;
			subframe = true&lt;br /&gt;
			return ''&lt;br /&gt;
		end )&lt;br /&gt;
		if subframe then&lt;br /&gt;
			frameText = frameText:gsub( '%s*}%s*$', function()&lt;br /&gt;
				subframe = 'last'&lt;br /&gt;
				return ''&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;
			if frame.mod then&lt;br /&gt;
				id = frame.mod .. ':' .. id&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			local alias = modData and modData.aliases and modData.aliases[id] or&lt;br /&gt;
				aliases and aliases[id]&lt;br /&gt;
			if alias then&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;
						if not subframes.aliasReference then&lt;br /&gt;
							subframes.aliasReference = {}&lt;br /&gt;
						end&lt;br /&gt;
						subframes.aliasReference[#subframes + 1] = aliasData&lt;br /&gt;
					else&lt;br /&gt;
						if not expandedAliases then&lt;br /&gt;
							expandedAliases = {}&lt;br /&gt;
						end&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;
			if frames.randomise ~= 'never' and subframes.randomise == nil and&lt;br /&gt;
				frame.name:match( '^' .. i18n.prefixes.any .. ' ' ) then&lt;br /&gt;
				subframes.randomise = true&lt;br /&gt;
			else&lt;br /&gt;
				subframes.randomise = false&lt;br /&gt;
			end&lt;br /&gt;
			if frames.randomise ~= 'never' then&lt;br /&gt;
				frames.randomise = false&lt;br /&gt;
			end&lt;br /&gt;
			if subframe == 'last' 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;
				if #subframes == 1 or #splitFrames == i and #frames == 0 then&lt;br /&gt;
					mergeList( frames, subframes )&lt;br /&gt;
				else&lt;br /&gt;
					table.insert( frames, subframes )&lt;br /&gt;
				end&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( '^' .. i18n.prefixes.any .. ' ' ) then&lt;br /&gt;
				frames.randomise = true&lt;br /&gt;
			elseif frames.randomise ~= 'never' 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 ) == 'string' 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;
		if type( aliasFrame ) == 'string' then&lt;br /&gt;
			expandedFrame = { name = aliasFrame }&lt;br /&gt;
		else&lt;br /&gt;
			expandedFrame = cloneTable( aliasFrame )&lt;br /&gt;
		end&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 ''&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		'[%s]%s:%s,%s[%s]',&lt;br /&gt;
		frame.title or '',&lt;br /&gt;
		frame.mod or 'Minecraft',&lt;br /&gt;
		frame.name,&lt;br /&gt;
		frame.num or '',&lt;br /&gt;
		frame.text or ''&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, ';' )&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( '[%[:,]' ) 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( '%s*([%[%]:,;])%s*', '%1' )&lt;br /&gt;
	&lt;br /&gt;
	local frame = {}&lt;br /&gt;
	frame.title = frameText:match( '^%[([^%]]+)%]' )&lt;br /&gt;
	&lt;br /&gt;
	frame.mod = frameText:match( '([^:%]]+):' ) 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 == '' then&lt;br /&gt;
		frame.mod = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local nameStart = ( frameText:find( ':' ) or frameText:find( '%]' ) or 0 ) + 1&lt;br /&gt;
	if nameStart - 1 == #frameText then&lt;br /&gt;
		nameStart = 1&lt;br /&gt;
	end&lt;br /&gt;
	frame.name = frameText:sub( nameStart, ( frameText:find( '[,%[]', nameStart ) or 0 ) - 1 )&lt;br /&gt;
	&lt;br /&gt;
	frame.num = math.floor( frameText:match( ',(%d+)' ) 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( '%[([^%]]+)%]$' )&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>CraftingTable&gt;Nixinova</name></author>
		
	</entry>
</feed>