This module implements {{sprite}}. It should generally be invoked directly on template pages, rather than using the sprite template.
Parent arguments are automatically merged with directly passed arguments (the latter overwriting the former) and all arguments are normalised to trim whitespace and set empty arguments to nil.
Dependencies
See also
- Minecraft
{{BiomeSprite}}{{BlockSprite}}{{EffectSprite}}{{EntitySprite}}{{EnvSprite}}{{ItemSprite}}{{InvSprite}}{{SchematicSprite}}{{SlotSprite}}{{AchievementSprite}}{{NewAchievementSprite}}
- Minecraft (legacy)
{{LegacyBlockSprite}}{{LegacyEntitySprite}}
- Minecraft Dungeons
{{DungeonsLevelSprite}}{{DungeonsEnchantmentSprite}}{{DungeonsEffectSprite}}{{DungeonsEntitySprite}}{{DungeonsItemSprite}}{{DungeonsAchievementSprite}}{{DungeonsMiscellaneousSprite}}
- Other
{{Sprite}}{{Sprite grid}}{{Layered blueprint}}{{Schematic}}{{CommentSprite}}{{FrontPageSprite}}{{ProgressSprite}}- Module:Sprite
[view | edit | history | purge]The above documentation is transcluded from Module:Sprite/doc.
local p = {}
function p.base( f )
local args = f
if f == mw.getCurrentFrame() then
args = require( 'Module:ProcessArgs' ).merge()
end
local name = args.name
local image = args.image
local scale = args.scale or 1
local sheetWidth = ( args.sheetsize or 256 ) * scale
local size = ( args.size or 16 ) * scale
local defaultPos = args.defaultpos or 1
local pos = math.abs( args.pos or defaultPos ) - 1
local link = args.link or ''
local align = args.align or 'text-top'
local tiles = sheetWidth / size
local class = args.class or ''
local left = pos % tiles * size
local top = math.floor( pos / tiles ) * size
local text = args.text or ''
local css = args.css or ''
local styles = {}
local imgClasses = {
Block = 1,
Entity = 1,
Item = 1,
Schematic = 1
}
if not imgClasses[name] then
table.insert( styles, 'background-image:{{FileUrl|' .. ( image or name .. 'Sprite.png' ) .. '}}' )
end
if left > 0 or top > 0 then
table.insert( styles, 'background-position:-' .. left .. 'px -' .. top .. 'px' )
end
if scale ~= 1 then
table.insert( styles, 'background-size:' .. sheetWidth .. 'px auto' )
end
if size ~= 16 then
table.insert( styles, 'height:' .. size .. 'px;width:' .. size .. 'px' )
end
if align ~= 'text-top' then
table.insert( styles, 'vertical-align:' .. align )
end
if css ~= '' then
table.insert( styles, css )
end
local sprite = table.concat( {
'<span',
'class="sprite2 ' .. name:lower() .. '-sprite ' .. class .. '"',
'style="' .. table.concat( styles, ';' ) .. '"',
'><br></span>'
}, ' ' )
sprite = sprite:gsub( '%s([">])', '%1' )
if text ~= '' then
text = '<span class="nowrap" style="padding-left:0.3em">' .. text .. '</span>'
end
if link ~= '' then
if link:find( '//' ) then
-- External link
return '[' .. link .. ' ' .. sprite .. text .. ']'
else
-- Internal link
return '[[' .. link .. '|' .. sprite .. text .. ']]'
end
else
return sprite .. text
end
end
function p.sprite( f )
local args = f
if f == mw.getCurrentFrame() then
args = require( 'Module:ProcessArgs' ).merge()
end
if tonumber( args[1] ) then
args.pos = args[1]
else
local ids = mw.loadData( 'Module:Sprite/' .. args.name )
local name = mw.text.trim( args[1] or '' )
args.pos = ids[name] or ids[name:lower():gsub( '%s', '-' )]
end
return p.base( args )
end
function p.link( f )
local args = f
if f == mw.getCurrentFrame() then
args = require( 'Module:ProcessArgs' ).merge()
end
local link = mw.text.split( args[1] or '', '%-' )[1]
local text = args[2] or link
args[1] = args.id or args[1] or ''
args.link = link
args.text = text
return p.sprite( args )
end
function p.doc( f )
local args = f.args
args.name = args.name or 'Block'
local idTable = mw.title.new( 'Module:Sprite/' .. args.name ):getContent()
idTable = idTable:gsub( '(\n%s*%-%-%s*.-%s*%-%-%s*\n)', '%1,' ):gsub( '^return {', '' ):gsub( '}$', '' )
local html = {}
local names = {}
local idKeys = {}
local section = ''
for line in mw.text.gsplit( idTable, ',' ) do
line = mw.text.trim( line )
name = line:match( '^%[[\'"](.+)[\'"]%]' ) or line:match( '^%w+' ) or ''
id = line:match( '=%s*(%d+)%s*,?$' ) or ''
section = line:match( '^%-%-%s*(.+)%s*%-%-$' ) or section
if name ~= '' and id ~= '' then
if names[id] then
if type( names[id].names ) == 'table' then
table.insert( names[id].names, name )
else
names[id].names = { names[id].names, name }
end
else
names[id] = { names = name, section = section }
table.insert( idKeys, id )
end
end
end
local list = {}
local listHead = '<ul class="spritedoc-multicolumn">'
local listFoot = '</ul>'
local lastSection = ''
for i, id in ipairs( idKeys ) do
local name = names[id].names
local newSection = mw.text.trim( names[id].section )
if newSection ~= lastSection or i == 1 then
if newSection ~= lastSection then
if lastSection ~= '' then
table.insert( list, listFoot )
end
table.insert( list, '\n===' .. newSection .. '===\n' )
lastSection = newSection
end
table.insert( list, listHead )
end
table.insert( list, '<li><table><tr><td data-id="' .. id .. '">' )
if type( name ) == 'table' then
for i, name2 in ipairs( name ) do
if i == 1 then
args[1] = name2
table.insert( list, p.sprite( args ) .. '</td><td><div class="sprite-name"><code>' .. name2 .. '</code></div>' )
else
table.insert( list, '<div class="sprite-name"><code>' .. name2 .. '</code></div>' )
end
end
else
args[1] = name
table.insert( list, p.sprite( args ) .. '</td><td><div class="sprite-name"><code>' .. name .. '</code></div>' )
end
table.insert( list, '</td></tr></table></li>' )
if i == #idKeys then
table.insert( list, listFoot )
end
end
return f:preprocess( '{{#widget:stylesheet|page=Sprite doc}}' ) .. '<div id="sprite-doc" data-details=\'{"name":"' .. args.name .. '","size":' .. ( args.size or 16 ) .. '}\'>' .. table.concat( list ) .. '</div>'
end
return p