Module:Sprite

From Minecraft Discontinued Features Wiki
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