<?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%3ASprite</id>
	<title>Module:Sprite - 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%3ASprite"/>
	<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Sprite&amp;action=history"/>
	<updated>2026-05-10T16:29:13Z</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:Sprite&amp;diff=323&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:Sprite&amp;diff=323&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;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&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;!-- diff cache key wikidb:diff::1.12:old-322:rev-323 --&gt;
&lt;/table&gt;</summary>
		<author><name>BoxWiki</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.boxofrocks.net/index.php?title=Module:Sprite&amp;diff=322&amp;oldid=prev</id>
		<title>CraftingTable&gt;Dhranios: Undo revision 1891074 by Dhranios (talk) didn't work</title>
		<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Sprite&amp;diff=322&amp;oldid=prev"/>
		<updated>2021-03-24T17:37:33Z</updated>

		<summary type="html">&lt;p&gt;Undo revision 1891074 by &lt;a href=&quot;/Special:Contributions/Dhranios&quot; title=&quot;Special:Contributions/Dhranios&quot;&gt;Dhranios&lt;/a&gt; (&lt;a href=&quot;/index.php?title=User_talk:Dhranios&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Dhranios (page does not exist)&quot;&gt;talk&lt;/a&gt;) didn&amp;#039;t work&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;
function p.base( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then &lt;br /&gt;
		args = require( 'Module:ProcessArgs' ).merge( true )&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = args.data and mw.loadData( 'Module:' .. args.data ) or {}&lt;br /&gt;
	local settings = data.settings&lt;br /&gt;
	&lt;br /&gt;
	-- Default settings&lt;br /&gt;
	local default = {&lt;br /&gt;
		scale = 1,&lt;br /&gt;
		sheetsize = 256,&lt;br /&gt;
		size = 16,&lt;br /&gt;
		pos = 1,&lt;br /&gt;
		align = 'text-top'&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local defaultStyle = default&lt;br /&gt;
	if settings then&lt;br /&gt;
		if not settings.stylesheet then&lt;br /&gt;
			-- Make a separate clone of the current default settings&lt;br /&gt;
			defaultStyle = mw.clone( default )&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( settings ) do&lt;br /&gt;
			default[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local setting = function( arg )&lt;br /&gt;
		return args[arg] or default[arg]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local sprite = mw.html.create( 'span' ):addClass( 'sprite' )&lt;br /&gt;
	&lt;br /&gt;
	-- mw.html's css method performs very slow escaping, which doubles the time it takes&lt;br /&gt;
	-- to run, so we'll construct the styles manually, and put them in the cssText&lt;br /&gt;
	-- method, which only does html escaping (which isn't slow)&lt;br /&gt;
	local styles = {}&lt;br /&gt;
	&lt;br /&gt;
	if not setting( 'nourl' ) and setting( 'url' ) then&lt;br /&gt;
		styles[#styles + 1] = 'background-image:' .. ( setting( 'url' ).url or setting( 'url' ) )&lt;br /&gt;
	end&lt;br /&gt;
	if setting( 'stylesheet' ) then&lt;br /&gt;
		sprite:addClass(&lt;br /&gt;
			setting( 'classname' ) or&lt;br /&gt;
			mw.ustring.lower( setting( 'name' ):gsub( ' ', '-' ) ) .. '-sprite'&lt;br /&gt;
		)&lt;br /&gt;
	elseif not setting( 'url' ) then&lt;br /&gt;
		styles[#styles + 1] = 'background-image:' .. p.getUrl(&lt;br /&gt;
			setting( 'image' ) or setting( 'name' ) .. 'Sprite.png'&lt;br /&gt;
		).url&lt;br /&gt;
	end&lt;br /&gt;
	local class = setting( 'class' )&lt;br /&gt;
	if class then&lt;br /&gt;
		sprite:addClass( class )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local size = setting( 'size' )&lt;br /&gt;
	local sheetWidth = setting( 'sheetsize' )&lt;br /&gt;
	local tiles = sheetWidth / size&lt;br /&gt;
	local pos = setting( 'pos' ) - 1&lt;br /&gt;
	local scale = setting( 'scale' )&lt;br /&gt;
	local autoScale = setting( 'autoscale' )&lt;br /&gt;
	&lt;br /&gt;
	if pos then&lt;br /&gt;
		local left = pos % tiles * size * scale&lt;br /&gt;
		local top = math.floor( pos / tiles ) * size * scale&lt;br /&gt;
		styles[#styles + 1] = 'background-position:-' .. left .. 'px -' .. top .. 'px'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not autoScale and scale ~= defaultStyle.scale then&lt;br /&gt;
		styles[#styles + 1] = 'background-size:' .. sheetWidth * scale .. 'px auto'&lt;br /&gt;
	end&lt;br /&gt;
	if size ~= defaultStyle.size or ( not autoScale and scale ~= defaultStyle.scale ) then&lt;br /&gt;
		styles[#styles + 1] = 'height:' .. size * scale .. 'px'&lt;br /&gt;
		styles[#styles + 1] = 'width:' .. size * scale .. 'px'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local align = setting( 'align' )&lt;br /&gt;
	if align ~= defaultStyle.align then&lt;br /&gt;
		styles[#styles + 1] = 'vertical-align:' .. align&lt;br /&gt;
	end&lt;br /&gt;
	styles[#styles + 1] = setting( 'css' )&lt;br /&gt;
	&lt;br /&gt;
	sprite:cssText( table.concat( styles, ';' ) )&lt;br /&gt;
	&lt;br /&gt;
	local text = setting( 'text' )&lt;br /&gt;
	local root&lt;br /&gt;
	local spriteText&lt;br /&gt;
	if text then&lt;br /&gt;
		if not args['wrap'] then&lt;br /&gt;
			root = mw.html.create( 'span' ):addClass( 'nowrap' )&lt;br /&gt;
		end&lt;br /&gt;
		spriteText = mw.html.create( 'span' ):addClass( 'sprite-text' ):wikitext( text )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local title = setting( 'title' )&lt;br /&gt;
	if title then&lt;br /&gt;
		( root or sprite ):attr( 'title', title )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not root then&lt;br /&gt;
		root = mw.html.create( '' )&lt;br /&gt;
	end&lt;br /&gt;
	root:node( sprite )&lt;br /&gt;
	if spriteText then&lt;br /&gt;
		root:node( spriteText )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local link = setting( 'link' ) or ''&lt;br /&gt;
	if link ~= '' and mw.ustring.lower( link ) ~= 'none' then&lt;br /&gt;
		-- External link&lt;br /&gt;
		if link:find( '//' ) then&lt;br /&gt;
			return '[' .. link .. ' ' .. tostring( root ) .. ']'&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Internal link&lt;br /&gt;
		local linkPrefix = setting( 'linkprefix' ) or ''&lt;br /&gt;
		return '[[' .. linkPrefix .. link .. '|' .. tostring( root ) .. ']]'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring( root )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sprite( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = require( 'Module:ProcessArgs' ).merge( true )&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = args.data and mw.loadData( 'Module:' .. args.data ) or {}&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	local idData = args.iddata&lt;br /&gt;
	if not idData then&lt;br /&gt;
		local name = args.name or data.settings.name&lt;br /&gt;
		local id = mw.text.trim( tostring( args[1] or '' ) )&lt;br /&gt;
		idData = data.ids[id] or data.ids[mw.ustring.lower( id ):gsub( '[%s%+]', '-' )]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	-- Remove categories on language pages, talk pages, and in User/UserWiki/UserProfile namespaces&lt;br /&gt;
	local disallowCats = args.nocat or title.isTalkPage or title.nsText:find( '^User' )&lt;br /&gt;
	if idData then&lt;br /&gt;
		if idData.deprecated then&lt;br /&gt;
			args.class = ( args.class or '' ) .. ' sprite-deprecated'&lt;br /&gt;
			if not disallowCats then&lt;br /&gt;
				categories[#categories + 1] = f:expandTemplate{ title = 'Translation category', args = { 'Pages using deprecated sprite names', project = 0 } }&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		args.pos = idData.pos&lt;br /&gt;
	elseif not disallowCats then&lt;br /&gt;
		categories[#categories + 1] = f:expandTemplate{ title = 'Translation category', args = { 'Pages with missing sprites', project = 0 } }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p.base( args ), table.concat( categories )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.link( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = require( 'Module:ProcessArgs' ).merge( true )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local link = args[1]&lt;br /&gt;
	if args[1] and not args.id then&lt;br /&gt;
		link = args[1]:match( '^(.-)%+' ) or args[1]&lt;br /&gt;
	end&lt;br /&gt;
	local text&lt;br /&gt;
	if not args.notext then&lt;br /&gt;
		text = args.text or args[2] or link&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	args[1] = args.id or args[1]&lt;br /&gt;
	args.link = args.link or link&lt;br /&gt;
	args.text = text&lt;br /&gt;
	&lt;br /&gt;
	return p.sprite( args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getUrl( image, query, classname )&lt;br /&gt;
	local f = mw.getCurrentFrame()&lt;br /&gt;
	local t = {&lt;br /&gt;
		url = f:expandTemplate{&lt;br /&gt;
			title = 'FileUrl',&lt;br /&gt;
			args = { image, query = query }&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
	if classname and classname ~= '' then&lt;br /&gt;
		t.style = f:expandTemplate{&lt;br /&gt;
			title = 'FileUrlStyle',&lt;br /&gt;
			args = { classname, image, query = query }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getParsedUrlStyle( f )&lt;br /&gt;
	local args = f:getParent().args&lt;br /&gt;
	local module = args[1]&lt;br /&gt;
	return require( 'Module:' .. module ).settings.url.style&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.doc( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f.args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	local dataPage = mw.text.trim( args[1] )&lt;br /&gt;
	local data = mw.loadData( 'Module:' .. dataPage )&lt;br /&gt;
	&lt;br /&gt;
	local getProtection = function( title, action, extra )&lt;br /&gt;
		local protections = { 'edit' }&lt;br /&gt;
		if extra then&lt;br /&gt;
			protections[#protections + 1] = extra&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local addProtection = function( protection )&lt;br /&gt;
			if protection == 'autoconfirmed' then&lt;br /&gt;
				protection = 'editsemiprotected'&lt;br /&gt;
			elseif protection == 'sysop' then&lt;br /&gt;
				protection = 'editprotected'&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			protections[#protections + 1] = protection&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local direct = title.protectionLevels[action] or {}&lt;br /&gt;
		for _, protection in ipairs( direct ) do&lt;br /&gt;
			addProtection( protection )&lt;br /&gt;
		end&lt;br /&gt;
		local cascading = title.cascadingProtection.restrictions[action] or {}&lt;br /&gt;
		if #cascading &amp;gt; 0 then&lt;br /&gt;
			protections[#protections + 1] = 'protect'&lt;br /&gt;
		end&lt;br /&gt;
		for _, protection in ipairs( cascading ) do&lt;br /&gt;
			addProtection( protection )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return table.concat( protections, ',' )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local spriteStyle = ''&lt;br /&gt;
	if data.settings.url and data.settings.url.style then&lt;br /&gt;
		spriteStyle = data.settings.url.style&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local dataTitle = mw.title.new( 'Module:' .. dataPage )&lt;br /&gt;
	-- Temporary until this is updated&lt;br /&gt;
	local classname = ''&lt;br /&gt;
	if data.settings.stylesheet then&lt;br /&gt;
		classname = data.settings.classname or&lt;br /&gt;
			mw.ustring.lower( data.settings.name:gsub( ' ', '-' ) ) .. '-sprite'&lt;br /&gt;
	end&lt;br /&gt;
	local spritesheet = data.settings.image or data.settings.name .. 'Sprite.png'&lt;br /&gt;
	local spriteTitle = mw.title.new( 'File:' .. spritesheet )&lt;br /&gt;
	local dataProtection = getProtection( dataTitle, 'edit' )&lt;br /&gt;
	local spriteProtection = getProtection( spriteTitle, 'upload', 'upload,reupload' )&lt;br /&gt;
	local body = mw.html.create( 'div' ):attr( {&lt;br /&gt;
		id = 'spritedoc',&lt;br /&gt;
		['data-dataprotection'] = dataProtection,&lt;br /&gt;
		['data-datatimestamp'] = f:callParserFunction( 'REVISIONTIMESTAMP', 'Module:' .. dataPage ),&lt;br /&gt;
		['data-datapage'] = 'Module:' .. dataPage,&lt;br /&gt;
		['data-spritesheet'] = spritesheet,&lt;br /&gt;
		['data-spriteprotection'] = spriteProtection,&lt;br /&gt;
		['data-urlfunc'] = &amp;quot;require( [[Module:Sprite]] ).getUrl( '&amp;quot; .. spritesheet .. &amp;quot;', '$1', '&amp;quot; .. classname .. &amp;quot;' )&amp;quot;,&lt;br /&gt;
		['data-refreshtext'] = mw.text.nowiki( '{{#invoke:sprite|doc|' .. dataPage .. '|refresh=1}}' ),&lt;br /&gt;
		['data-settings'] = mw.text.jsonEncode( data.settings ),&lt;br /&gt;
	} )&lt;br /&gt;
	&lt;br /&gt;
	local sections = {}&lt;br /&gt;
	for _, sectionData in ipairs( data.sections or { name = 'Uncategorized' } ) do&lt;br /&gt;
		local sectionTag = body:tag( 'div' ):addClass( 'spritedoc-section' ):attr( 'data-section-id', sectionData.id )&lt;br /&gt;
		sectionTag:tag( 'h3' ):wikitext( sectionData.name )&lt;br /&gt;
		sections[sectionData.id] = { boxes = sectionTag:tag( 'ul' ):addClass( 'spritedoc-boxes' ) }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local keyedData = {}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	for name, idData in pairs( data.ids ) do&lt;br /&gt;
		keyedData[i] = {&lt;br /&gt;
			sortKey = mw.ustring.lower( name ),&lt;br /&gt;
			name = name,&lt;br /&gt;
			data = idData&lt;br /&gt;
		}&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	table.sort( keyedData, function( a, b )&lt;br /&gt;
		return a.sortKey &amp;lt; b.sortKey&lt;br /&gt;
	end )&lt;br /&gt;
	&lt;br /&gt;
	for _, data in ipairs( keyedData ) do&lt;br /&gt;
		local idData = data.data&lt;br /&gt;
		local pos = idData.pos&lt;br /&gt;
		local section = sections[idData.section]&lt;br /&gt;
		local names = section[pos]&lt;br /&gt;
		if not names then&lt;br /&gt;
			local box = section.boxes:tag( 'li' ):addClass( 'spritedoc-box' ):attr( 'data-pos', pos )&lt;br /&gt;
			box:tag( 'div' ):addClass( 'spritedoc-image' )&lt;br /&gt;
				:wikitext( p.base{ pos = pos, data = dataPage, nourl = spriteStyle ~= '' } )&lt;br /&gt;
			&lt;br /&gt;
			names = box:tag( 'ul' ):addClass( 'spritedoc-names' )&lt;br /&gt;
			section[pos] = names&lt;br /&gt;
		end&lt;br /&gt;
		local nameElem = mw.html.create( 'li' ):addClass( 'spritedoc-name' )&lt;br /&gt;
		local codeElem = nameElem:tag( 'code' ):wikitext( data.name )&lt;br /&gt;
		&lt;br /&gt;
		if idData.deprecated then&lt;br /&gt;
			codeElem:addClass( 'spritedoc-deprecated' )&lt;br /&gt;
		end&lt;br /&gt;
		names:wikitext( tostring( nameElem ) )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.refresh then&lt;br /&gt;
		return '', '', tostring( body )&lt;br /&gt;
	end&lt;br /&gt;
	local styles = f:callParserFunction( '#widget:SpriteDoc.css' )&lt;br /&gt;
	return styles, spriteStyle, tostring( body )&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>CraftingTable&gt;Dhranios</name></author>
		
	</entry>
</feed>