Module:Sprite
Jump to navigation
Jump to search
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
Used In
{{BiomeSprite}}
local p = {}
function p.base(setting, defaultStyle)
local height = setting('height') or setting('size')
local width = setting('width') or setting('size')
local sheetsize = setting('sheetsize')
local tiles = sheetsize/width
local pos = setting('pos')
local scale = setting('scale')
local autoscale = setting('autoscale')
local name = setting('name')
local tint = setting('tint')
local styles = {}
if scale ~= defaultStyle.scale then
local bg_size = sheetsize * scale .. 'px auto'
styles[#styles + 1] = 'background-size:' .. bg_size
if tint then
styles[#styles + 1] = 'mask-size:' .. bg_size
styles[#styles + 1] = '-webkit-mask-size:' .. bg_size
end
end
if pos then
local x = pos % tiles * width * scale
local y = math.floor( pos / tiles ) * height * scale
local bg_pos = '-' .. x .. 'px -' .. y .. 'px'
styles[#styles + 1] = 'background-position:' .. bg_pos
if tint then
styles[#styles + 1] = 'background-color:'.. tint
styles[#styles + 1] = 'mask-position:' .. bg_pos
styles[#styles + 1] = '-webkit-mask-position:' .. bg_pos
end
end
if not tint then
styles[#styles + 1] = 'mask:none'
styles[#styles + 1] = '-webkit-mask:none'
end
local sprite = mw.html.create('span')
sprite:cssText(table.concat(styles, ';')):addClass('sprite-image'):addClass(name .. '-sprite')
return sprite
end
function p.sprite(f)
local args = f
if f == mw.getCurrentFrame() then
args = require( 'Module:ProcessArgs' ).merge( true )
else
f = mw.getCurrentFrame()
end
local default = {
scale = 1,
sheetsize = 256,
size = 16,
pos = 1,
align = 'text-top'
}
local data = args.data and mw.loadData( 'Module:' .. args.data ) or {}
local settings = data.settings
if settings then
if not settings.stylesheet then
-- Make a separate clone of the current default settings
defaultStyle = mw.clone( default )
end
for k, v in pairs( settings ) do
default[k] = v
end
end
local setting = function( arg )
return args[arg] or default[arg]
end
local idData = args.iddata
if not idData then
local name = args.name or data.settings.name
local id = mw.text.trim( tostring( args[1] or '' ) )
idData = data.ids[id] or data.ids[mw.ustring.lower( id ):gsub( '[%s%+]', '-' )]
end
if idData then
args.pos = idData.pos
if not args.tint then
args.tint = idData.tint
end
end
local wrapper = mw.html.create('span'):addClass('sprite')
wrapper:node(p.base(setting, defaultStyle))
if idData and idData.overlay then
args.pos = idData.overlay.pos
args.tint = args['overlay-tint'] or idData.overlay.tint
wrapper:node(p.base(setting, defaultStyle))
elseif args['overlay-pos'] then
args.pos = args['overlay-pos']
args.tint = args['overlay-tint']
wrapper:node(p.base(setting, defaultStyle))
end
local height = setting('height') or setting('size')
local width = setting('width') or setting('size')
local scale = setting('scale')
if height ~= defaultStyle.size or width ~= defaultStyle.size or scale ~= defaultStyle.scale then
wrapper:cssText('height:' .. height * scale .. 'px;width:' .. width * scale .. 'px')
end
local text = setting('text') or setting('link')
local root = mw.html.create( '' )
root:node(wrapper)
if text then
spriteText = mw.html.create( 'span' ):addClass( 'sprite-text' ):wikitext( text )
root:node(spriteText)
end
local link = setting( 'link' ) or ''
if link ~= '' and mw.ustring.lower( link ) ~= 'none' then
-- External link
if link:find( '//' ) then
return '[' .. link .. ' ' .. tostring( root ) .. ']'
end
-- Internal link
local linkPrefix = setting( 'linkprefix' ) or ''
return '[[' .. linkPrefix .. link .. '|' .. tostring( root ) .. ']]'
end
return root
end
return p