<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.runsafe.no/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.runsafe.no/index.php?action=history&amp;feed=atom&amp;title=Module%3ASprite"/>
	<link rel="alternate" type="text/html" href="https://wiki.runsafe.no/index.php?title=Module:Sprite&amp;action=history"/>
	<updated>2026-05-27T20:22:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wiki.runsafe.no/index.php?title=Module:Sprite&amp;diff=4638&amp;oldid=prev</id>
		<title>Kruithne: Created page with &quot;local p = {} function p.base( f ) 	local args = f 	if f == mw.getCurrentFrame() then  		args = require( &#039;Module:ProcessArgs&#039; ).merge( true ) 	end 	 	-- Default settings 	local...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runsafe.no/index.php?title=Module:Sprite&amp;diff=4638&amp;oldid=prev"/>
		<updated>2014-07-05T21:40:40Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} function p.base( f ) 	local args = f 	if f == mw.getCurrentFrame() then  		args = require( &amp;#039;Module:ProcessArgs&amp;#039; ).merge( true ) 	end 	 	-- Default settings 	local...&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;
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;
	end&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;
		link = &amp;#039;&amp;#039;,&lt;br /&gt;
		align = &amp;#039;text-top&amp;#039;,&lt;br /&gt;
		class = &amp;#039;&amp;#039;,&lt;br /&gt;
		text = &amp;#039;&amp;#039;,&lt;br /&gt;
		title = &amp;#039;&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local defaultStyle = mw.clone( default )&lt;br /&gt;
	if args.settings then&lt;br /&gt;
		local settings = mw.loadData( &amp;#039;Module:&amp;#039; .. args.settings )&lt;br /&gt;
		for k, v in pairs( settings ) do&lt;br /&gt;
			default[k] = v&lt;br /&gt;
			if settings.stylesheet then&lt;br /&gt;
				defaultStyle[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local name = args.name or default.name&lt;br /&gt;
	local scale = args.scale or default.scale&lt;br /&gt;
	local autoScale = args.autoscale or default.autoscale&lt;br /&gt;
	local sheetWidth = args.sheetsize or default.sheetsize&lt;br /&gt;
	local size = args.size or default.size&lt;br /&gt;
	local pos = math.abs( args.pos or default.pos ) - 1&lt;br /&gt;
	local link = args.link or default.link&lt;br /&gt;
	local align = args.align or default.align&lt;br /&gt;
	local class = args.class or default.class&lt;br /&gt;
	local text = args.text or default.text&lt;br /&gt;
	local title = args.title or default.title&lt;br /&gt;
	local css = args.css or default.css&lt;br /&gt;
	local className = args.classname or default.classname&lt;br /&gt;
&lt;br /&gt;
	local tiles = sheetWidth / size&lt;br /&gt;
	local left = pos % tiles * size&lt;br /&gt;
	local top = math.floor( pos / tiles ) * size&lt;br /&gt;
	&lt;br /&gt;
	local styles = {}&lt;br /&gt;
	if args.stylesheet or default.stylesheet then&lt;br /&gt;
		class = ( className or mw.ustring.lower( name:gsub( &amp;#039; &amp;#039;, &amp;#039;-&amp;#039; ) ) .. &amp;#039;-sprite &amp;#039; ) .. class&lt;br /&gt;
	else&lt;br /&gt;
		table.insert( styles, &amp;#039;background-image:{{FileUrl|&amp;#039; .. ( args.image or default.image or name .. &amp;#039;Sprite.png&amp;#039; ) .. &amp;#039;}}&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if left &amp;gt; 0 or top &amp;gt; 0 then&lt;br /&gt;
		table.insert( styles, &amp;#039;background-position:-&amp;#039; .. left * scale .. &amp;#039;px -&amp;#039; .. top * scale .. &amp;#039;px&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if not autoScale and scale ~= defaultStyle.scale then&lt;br /&gt;
		table.insert( styles, &amp;#039;background-size:&amp;#039; .. sheetWidth * scale .. &amp;#039;px auto&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if size ~= defaultStyle.size or ( not autoScale and scale ~= defaultStyle.scale ) then&lt;br /&gt;
		table.insert( styles, &amp;#039;height:&amp;#039; .. size * scale .. &amp;#039;px;width:&amp;#039; .. size * scale .. &amp;#039;px&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if align ~= defaultStyle.align then&lt;br /&gt;
		table.insert( styles, &amp;#039;vertical-align:&amp;#039; .. align )&lt;br /&gt;
	end&lt;br /&gt;
	if css then&lt;br /&gt;
		table.insert( styles, css )&lt;br /&gt;
	end&lt;br /&gt;
	if title ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		title = &amp;#039; title=&amp;quot;&amp;#039; .. title .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local sprite = table.concat( {&lt;br /&gt;
		&amp;#039;&amp;lt;span&amp;#039;,&lt;br /&gt;
			&amp;#039;class=&amp;quot;sprite &amp;#039; .. class .. &amp;#039;&amp;quot;&amp;#039;,&lt;br /&gt;
			&amp;#039;style=&amp;quot;&amp;#039; .. table.concat( styles, &amp;#039;;&amp;#039; ) .. &amp;#039;&amp;quot;&amp;#039;,&lt;br /&gt;
			title,&lt;br /&gt;
		&amp;#039;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	}, &amp;#039; &amp;#039; )&lt;br /&gt;
	sprite = sprite:gsub( &amp;#039;%s+([&amp;quot;&amp;gt;])&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	if text ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		text = &amp;#039;&amp;lt;span class=&amp;quot;sprite-text nowrap&amp;quot;&amp;#039; .. title .. &amp;#039;&amp;gt;&amp;#039; .. text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if link ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		if link:find( &amp;#039;//&amp;#039; ) then&lt;br /&gt;
			-- External link&lt;br /&gt;
			return &amp;#039;[&amp;#039; .. link .. &amp;#039; &amp;#039; .. sprite .. text .. &amp;#039;]&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			-- Internal link&lt;br /&gt;
			local linkPrefix = args.linkprefix or default.linkprefix or &amp;#039;&amp;#039;&lt;br /&gt;
			return &amp;#039;[[&amp;#039; .. linkPrefix .. link .. &amp;#039;|&amp;#039; .. sprite .. text .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return sprite .. text&lt;br /&gt;
	end&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;
	end&lt;br /&gt;
	&lt;br /&gt;
	local category = &amp;#039;&amp;#039;&lt;br /&gt;
	if tonumber( args[1] ) then&lt;br /&gt;
		args.pos = args[1]&lt;br /&gt;
	else&lt;br /&gt;
		local default = {}&lt;br /&gt;
		if args.settings then&lt;br /&gt;
			default = mw.loadData( &amp;#039;Module:&amp;#039; .. args.settings )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local name = args.name or default.name&lt;br /&gt;
		local ids = mw.loadData( &amp;#039;Module:&amp;#039; .. ( args.ids or default.ids or &amp;#039;Sprite/&amp;#039; .. name ) )&lt;br /&gt;
		local id = mw.text.trim( args[1] or &amp;#039;&amp;#039; )&lt;br /&gt;
		local pos = ids[id] or ids[mw.ustring.lower( id ):gsub( &amp;#039;[%s%+]&amp;#039;, &amp;#039;-&amp;#039; )]&lt;br /&gt;
		if not pos and not mw.title.getCurrentTitle().isSubpage then&lt;br /&gt;
			category = &amp;#039;[[Category:Pages with missing sprites]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		args.pos = pos&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p.base( args ) .. category&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 = args.text or args[2] or link&lt;br /&gt;
	&lt;br /&gt;
	args[1] = args.id or args[1]&lt;br /&gt;
	args.link = 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 settings = mw.loadData( &amp;#039;Module:&amp;#039; .. f.args[1] )&lt;br /&gt;
	local idTable = mw.title.new( &amp;#039;Module:&amp;#039; .. ( settings.ids or &amp;#039;Sprite/&amp;#039; .. settings.name ) ):getContent()&lt;br /&gt;
	idTable = idTable:gsub( &amp;#039;(\n%s*%-%-%s*.-%s*%-%-%s*\n)&amp;#039;, &amp;#039;%1,&amp;#039; ):gsub( &amp;#039;^return {&amp;#039;, &amp;#039;&amp;#039; ):gsub( &amp;#039;}$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local html = {}&lt;br /&gt;
	local ids = {}&lt;br /&gt;
	local posKeys = {}&lt;br /&gt;
	local section = &amp;#039;&amp;#039;&lt;br /&gt;
	for line in mw.text.gsplit( idTable, &amp;#039;,&amp;#039; ) do&lt;br /&gt;
		line = mw.text.trim( line )&lt;br /&gt;
		id = line:match( &amp;#039;^%[[\&amp;#039;&amp;quot;](.+)[\&amp;#039;&amp;quot;]%]&amp;#039; ) or line:match( &amp;#039;^%w+&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
		pos = line:match( &amp;#039;=%s*(%d+)%s*,?$&amp;#039; ) or &amp;#039;&amp;#039;&lt;br /&gt;
		section = line:match( &amp;#039;^%-%-%s*(.+)%s*%-%-$&amp;#039; ) or section&lt;br /&gt;
		&lt;br /&gt;
		if id ~= &amp;#039;&amp;#039; and pos ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			if ids[pos] then&lt;br /&gt;
				if type( ids[pos].id ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
					table.insert( ids[pos].id, id )&lt;br /&gt;
				else&lt;br /&gt;
					ids[pos].id = { ids[pos].id, id }&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				ids[pos] = { id = id, section = section }&lt;br /&gt;
				table.insert( posKeys, pos )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	local list = {}&lt;br /&gt;
	local listHead = &amp;#039;&amp;lt;ul class=&amp;quot;spritedoc-multicolumn&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	local listFoot = &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;&lt;br /&gt;
	local lastSection = &amp;#039;&amp;#039;&lt;br /&gt;
	for i, pos in ipairs( posKeys ) do&lt;br /&gt;
		local id = ids[pos].id&lt;br /&gt;
		local newSection = mw.text.trim( ids[pos].section )&lt;br /&gt;
		&lt;br /&gt;
		if newSection ~= lastSection or i == 1 then&lt;br /&gt;
			if newSection ~= lastSection then&lt;br /&gt;
				if lastSection ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					table.insert( list, listFoot )&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				table.insert( list, &amp;#039;\n===&amp;#039; .. newSection .. &amp;#039;===\n&amp;#039; )&lt;br /&gt;
				lastSection = newSection&lt;br /&gt;
			end&lt;br /&gt;
			table.insert( list, listHead )&lt;br /&gt;
		end&lt;br /&gt;
		table.insert( list, &amp;#039;&amp;lt;li&amp;gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td data-pos=&amp;quot;&amp;#039; .. pos .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; )&lt;br /&gt;
		if type( id ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			for i, id2 in ipairs( id ) do&lt;br /&gt;
				if i == 1 then&lt;br /&gt;
					table.insert( list, p.sprite{ id2, settings = f.args[1] } .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;sprite-id&amp;quot;&amp;gt;&amp;lt;code&amp;gt;&amp;#039; .. id2 .. &amp;#039;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				else&lt;br /&gt;
					table.insert( list, &amp;#039;&amp;lt;div class=&amp;quot;sprite-id&amp;quot;&amp;gt;&amp;lt;code&amp;gt;&amp;#039; .. id2 .. &amp;#039;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert( list, p.sprite{ id, settings = f.args[1] } .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;sprite-id&amp;quot;&amp;gt;&amp;lt;code&amp;gt;&amp;#039; .. id .. &amp;#039;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
		table.insert( list, &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; )&lt;br /&gt;
		&lt;br /&gt;
		if i == #posKeys then&lt;br /&gt;
			table.insert( list, listFoot )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local out = table.concat( list )&lt;br /&gt;
	if not f.args.refresh then&lt;br /&gt;
		out = f:preprocess( &amp;#039;{{#widget:stylesheet|page=Sprite doc}}&amp;#039; ) .. &amp;#039;&amp;lt;div id=&amp;quot;sprite-doc&amp;quot; data-settings=&amp;quot;&amp;#039; .. f.args[1] .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. out .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Kruithne</name></author>
	</entry>
</feed>