<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mineinabyss.com/w/Module:Sprite/history?feed=atom</id>
	<title>Module:Sprite - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mineinabyss.com/w/Module:Sprite/history?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://wiki.mineinabyss.com/w/Module:Sprite/history"/>
	<updated>2026-04-09T01:31:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki.mineinabyss.com/index.php?title=Module:Sprite&amp;diff=487&amp;oldid=prev</id>
		<title>Scyu: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineinabyss.com/index.php?title=Module:Sprite&amp;diff=487&amp;oldid=prev"/>
		<updated>2024-10-11T13:28:19Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&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: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:28, 11 October 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&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;!-- diff cache key my_wiki:diff:1.41:old-486:rev-487 --&gt;
&lt;/table&gt;</summary>
		<author><name>Scyu</name></author>
	</entry>
	<entry>
		<id>https://wiki.mineinabyss.com/index.php?title=Module:Sprite&amp;diff=486&amp;oldid=prev</id>
		<title>minecraft&gt;Cook Me Plox: rebase dev changes onto prod</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineinabyss.com/index.php?title=Module:Sprite&amp;diff=486&amp;oldid=prev"/>
		<updated>2023-09-24T16:26:29Z</updated>

		<summary type="html">&lt;p&gt;rebase dev changes onto prod&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( &amp;#039;Module:ProcessArgs&amp;#039; ).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( &amp;#039;Module:&amp;#039; .. 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 = &amp;#039;text-top&amp;#039;&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( &amp;#039;span&amp;#039; ):addClass( &amp;#039;sprite&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	-- mw.html&amp;#039;s css method performs very slow escaping, which doubles the time it takes&lt;br /&gt;
	-- to run, so we&amp;#039;ll construct the styles manually, and put them in the cssText&lt;br /&gt;
	-- method, which only does html escaping (which isn&amp;#039;t slow)&lt;br /&gt;
	local styles = {}&lt;br /&gt;
	&lt;br /&gt;
	-- for tint&lt;br /&gt;
	local classname = setting( &amp;#039;classname&amp;#039; ) or mw.ustring.lower( setting( &amp;#039;name&amp;#039; ):gsub( &amp;#039; &amp;#039;, &amp;#039;-&amp;#039; ) ) .. &amp;#039;-sprite&amp;#039;&lt;br /&gt;
	local css_image = &amp;quot;background&amp;quot;&lt;br /&gt;
	if setting( &amp;#039;formask&amp;#039; ) then&lt;br /&gt;
		classname = classname .. &amp;#039;-mask&amp;#039;&lt;br /&gt;
		css_image = &amp;quot;mask&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	sprite:addClass( classname )&lt;br /&gt;
	local class = setting( &amp;#039;class&amp;#039; )&lt;br /&gt;
	if class then&lt;br /&gt;
		sprite:addClass( class )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local width = setting( &amp;#039;width&amp;#039; ) or setting( &amp;#039;size&amp;#039; )&lt;br /&gt;
	local height = setting( &amp;#039;height&amp;#039; ) or setting( &amp;#039;size&amp;#039; )&lt;br /&gt;
	local sheetWidth = setting( &amp;#039;sheetsize&amp;#039; )&lt;br /&gt;
	local tiles = sheetWidth / width&lt;br /&gt;
	local pos = setting( &amp;#039;pos&amp;#039; ) - 1&lt;br /&gt;
	local scale = setting( &amp;#039;scale&amp;#039; )&lt;br /&gt;
	local autoScale = setting( &amp;#039;autoscale&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	if pos then&lt;br /&gt;
		local left = pos % tiles * width * scale&lt;br /&gt;
		local top = math.floor( pos / tiles ) * height * scale&lt;br /&gt;
		if css_image == &amp;#039;mask&amp;#039; then&lt;br /&gt;
			styles[#styles + 1] = &amp;#039;-webkit-mask-position:-&amp;#039; .. left .. &amp;#039;px -&amp;#039; .. top .. &amp;#039;px&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		styles[#styles + 1] = css_image .. &amp;#039;-position:-&amp;#039; .. left .. &amp;#039;px -&amp;#039; .. top .. &amp;#039;px&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not autoScale and scale ~= defaultStyle.scale then&lt;br /&gt;
		if css_image == &amp;#039;mask&amp;#039; then&lt;br /&gt;
			styles[#styles + 1] = &amp;#039;-webkit-mask-size:&amp;#039; .. sheetWidth * scale .. &amp;#039;px auto&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		styles[#styles + 1] = css_image .. &amp;#039;-size:&amp;#039; .. sheetWidth * scale .. &amp;#039;px auto&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if height ~= defaultStyle.size or width ~= defaultStyle.size or ( not autoScale and scale ~= defaultStyle.scale ) then&lt;br /&gt;
		styles[#styles + 1] = &amp;#039;height:&amp;#039; .. height * scale .. &amp;#039;px&amp;#039;&lt;br /&gt;
		styles[#styles + 1] = &amp;#039;width:&amp;#039; .. width * scale .. &amp;#039;px&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local align = setting( &amp;#039;align&amp;#039; )&lt;br /&gt;
	if align ~= defaultStyle.align then&lt;br /&gt;
		styles[#styles + 1] = &amp;#039;vertical-align:&amp;#039; .. align&lt;br /&gt;
	end&lt;br /&gt;
	styles[#styles + 1] = setting( &amp;#039;css&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	sprite:cssText( table.concat( styles, &amp;#039;;&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	local text = setting( &amp;#039;text&amp;#039; )&lt;br /&gt;
	local root&lt;br /&gt;
	local spriteText&lt;br /&gt;
	if text then&lt;br /&gt;
		if not args[&amp;#039;wrap&amp;#039;] then&lt;br /&gt;
			root = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;nowrap&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
		spriteText = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;sprite-text&amp;#039; ):wikitext( text )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local title = setting( &amp;#039;title&amp;#039; )&lt;br /&gt;
	if title then&lt;br /&gt;
		( root or sprite ):attr( &amp;#039;title&amp;#039;, title )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not root then&lt;br /&gt;
		root = mw.html.create( &amp;#039;&amp;#039; )&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( &amp;#039;link&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
	if link ~= &amp;#039;&amp;#039; and mw.ustring.lower( link ) ~= &amp;#039;none&amp;#039; then&lt;br /&gt;
		-- External link&lt;br /&gt;
		if link:find( &amp;#039;//&amp;#039; ) then&lt;br /&gt;
			return &amp;#039;[&amp;#039; .. link .. &amp;#039; &amp;#039; .. tostring( root ) .. &amp;#039;]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Internal link&lt;br /&gt;
		local linkPrefix = setting( &amp;#039;linkprefix&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
		return &amp;#039;[[&amp;#039; .. linkPrefix .. link .. &amp;#039;|&amp;#039; .. tostring( root ) .. &amp;#039;]]&amp;#039;&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( &amp;#039;Module:ProcessArgs&amp;#039; ).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( &amp;#039;Module:&amp;#039; .. 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 &amp;#039;&amp;#039; ) )&lt;br /&gt;
		idData = data.ids[id] or data.ids[mw.ustring.lower( id ):gsub( &amp;#039;[%s%+]&amp;#039;, &amp;#039;-&amp;#039; )]&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( &amp;#039;^User&amp;#039; )&lt;br /&gt;
	if idData then&lt;br /&gt;
		if idData.deprecated then&lt;br /&gt;
			args.class = ( args.class or &amp;#039;&amp;#039; ) .. &amp;#039; sprite-deprecated&amp;#039;&lt;br /&gt;
			if not disallowCats then&lt;br /&gt;
				categories[#categories + 1] = f:expandTemplate{ title = &amp;#039;Translation category&amp;#039;, args = { &amp;#039;Pages using deprecated sprite names&amp;#039;, 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 = &amp;#039;Translation category&amp;#039;, args = { &amp;#039;Pages with missing sprites&amp;#039;, 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( &amp;#039;Module:ProcessArgs&amp;#039; ).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( &amp;#039;^(.-)%+&amp;#039; ) 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.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( &amp;#039;Module:&amp;#039; .. dataPage )&lt;br /&gt;
	&lt;br /&gt;
	local getProtection = function( title, action, extra )&lt;br /&gt;
		local protections = { &amp;#039;edit&amp;#039; }&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 == &amp;#039;autoconfirmed&amp;#039; then&lt;br /&gt;
				protection = &amp;#039;editsemiprotected&amp;#039;&lt;br /&gt;
			elseif protection == &amp;#039;sysop&amp;#039; then&lt;br /&gt;
				protection = &amp;#039;editprotected&amp;#039;&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] = &amp;#039;protect&amp;#039;&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, &amp;#039;,&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local spriteStyle = &amp;#039;&amp;#039;&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( &amp;#039;Module:&amp;#039; .. dataPage )&lt;br /&gt;
	-- Temporary until this is updated&lt;br /&gt;
	local spritesheet = data.settings.image or data.settings.name .. &amp;#039;Sprite.png&amp;#039;&lt;br /&gt;
	local spriteTitle = mw.title.new( &amp;#039;File:&amp;#039; .. spritesheet )&lt;br /&gt;
	local dataProtection = getProtection( dataTitle, &amp;#039;edit&amp;#039; )&lt;br /&gt;
	local spriteProtection = getProtection( spriteTitle, &amp;#039;upload&amp;#039;, &amp;#039;upload,reupload&amp;#039; )&lt;br /&gt;
	local body = mw.html.create( &amp;#039;div&amp;#039; ):attr( {&lt;br /&gt;
		id = &amp;#039;spritedoc&amp;#039;,&lt;br /&gt;
		[&amp;#039;data-dataprotection&amp;#039;] = dataProtection,&lt;br /&gt;
		[&amp;#039;data-datatimestamp&amp;#039;] = f:callParserFunction( &amp;#039;REVISIONTIMESTAMP&amp;#039;, &amp;#039;Module:&amp;#039; .. dataPage ),&lt;br /&gt;
		[&amp;#039;data-datapage&amp;#039;] = &amp;#039;Module:&amp;#039; .. dataPage,&lt;br /&gt;
		[&amp;#039;data-spritesheet&amp;#039;] = spritesheet,&lt;br /&gt;
		[&amp;#039;data-spriteprotection&amp;#039;] = spriteProtection,&lt;br /&gt;
		[&amp;#039;data-refreshtext&amp;#039;] = mw.text.nowiki( &amp;#039;{{#invoke:sprite|doc|&amp;#039; .. dataPage .. &amp;#039;|refresh=1}}&amp;#039; ),&lt;br /&gt;
		[&amp;#039;data-settings&amp;#039;] = 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 = &amp;#039;Uncategorized&amp;#039; } ) do&lt;br /&gt;
		local sectionTag = body:tag( &amp;#039;div&amp;#039; ):addClass( &amp;#039;spritedoc-section&amp;#039; ):attr( &amp;#039;data-section-id&amp;#039;, sectionData.id )&lt;br /&gt;
		sectionTag:tag( &amp;#039;h3&amp;#039; ):wikitext( sectionData.name )&lt;br /&gt;
		sections[sectionData.id] = { boxes = sectionTag:tag( &amp;#039;ul&amp;#039; ):addClass( &amp;#039;spritedoc-boxes&amp;#039; ) }&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( &amp;#039;li&amp;#039; ):addClass( &amp;#039;spritedoc-box&amp;#039; ):attr( &amp;#039;data-pos&amp;#039;, pos )&lt;br /&gt;
			box:tag( &amp;#039;div&amp;#039; ):addClass( &amp;#039;spritedoc-image&amp;#039; )&lt;br /&gt;
				:wikitext( p.base{ pos = pos, data = dataPage, nourl = spriteStyle ~= &amp;#039;&amp;#039; } )&lt;br /&gt;
			&lt;br /&gt;
			names = box:tag( &amp;#039;ul&amp;#039; ):addClass( &amp;#039;spritedoc-names&amp;#039; )&lt;br /&gt;
			section[pos] = names&lt;br /&gt;
		end&lt;br /&gt;
		local nameElem = mw.html.create( &amp;#039;li&amp;#039; ):addClass( &amp;#039;spritedoc-name&amp;#039; )&lt;br /&gt;
		local codeElem = nameElem:tag( &amp;#039;code&amp;#039; ):wikitext( data.name )&lt;br /&gt;
		&lt;br /&gt;
		if idData.deprecated then&lt;br /&gt;
			codeElem:addClass( &amp;#039;spritedoc-deprecated&amp;#039; )&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 &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, tostring( body )&lt;br /&gt;
	end&lt;br /&gt;
	local styles = f:extensionTag( &amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, { src = &amp;#039;Sprite/doc.css&amp;#039; } )&lt;br /&gt;
	return styles, spriteStyle, tostring( body )&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>minecraft&gt;Cook Me Plox</name></author>
	</entry>
</feed>