Módulo:Sprite

De WikiMinecraft
Saltar a: navegación, buscar

Esta es la página de documentación, debería ser transcluida a la página de plantilla principal. Véase Plantilla:Documentation para más información.

Este módulo implementa {{sprite}}. Por lo general, debería ser invocado directamente en las páginas de plantilla, en lugar de utilizar la plantilla de sprites.

Los argumentos padres se fusionan automáticamente con argumentos que se pasan directamente (esto últimos sobrescriben a los anteriores) y todos los argumentos se normalizan para recortar espacios en blanco y establecidos como argumentos vacíos con nil.

Dependencias

Véase también




local p = {}
function p.base( f )
	local args = f
	if f == mw.getCurrentFrame() then 
		args = require( 'Module:ProcessArgs' ).merge( true )
	end
	
	-- Default settings
	local default = {
		scale = 1,
		sheetsize = 256,
		size = 16,
		pos = 1,
		link = '',
		align = 'text-top',
		class = '',
		text = '',
		title = ''
	}
	
	local defaultStyle = mw.clone( default )
	if args.settings then
		local settings = mw.loadData( 'Module:' .. args.settings )
		for k, v in pairs( settings ) do
			default[k] = v
			if settings.stylesheet then
				defaultStyle[k] = v
			end
		end
	end
	
	local name = args.name or default.name
	local scale = args.scale or default.scale
	local autoScale = args.autoscale or default.autoscale
	local sheetWidth = args.sheetsize or default.sheetsize
	local size = args.size or default.size
	local pos = math.abs( args.pos or default.pos ) - 1
	local link = args.link or default.link
	local align = args.align or default.align
	local class = args.class or default.class
	local text = args.text or default.text
	local title = args.title or default.title
	local css = args.css or default.css
	local className = args.classname or default.classname

	local tiles = sheetWidth / size
	local left = pos % tiles * size
	local top = math.floor( pos / tiles ) * size
	
	local styles = {}
	if args.stylesheet or default.stylesheet then
		class = ( className or mw.ustring.lower( name:gsub( ' ', '-' ) ) .. '-sprite ' ) .. class
	else
		table.insert( styles, 'background-image:{{FileUrl|' .. ( args.image or default.image or name .. 'Sprite.png' ) .. '}}' )
	end
	if left > 0 or top > 0 then
		table.insert( styles, 'background-position:-' .. left * scale .. 'px -' .. top * scale .. 'px' )
	end
	if not autoScale and scale ~= defaultStyle.scale then
		table.insert( styles, 'background-size:' .. sheetWidth * scale .. 'px auto' )
	end
	if size ~= defaultStyle.size or ( not autoScale and scale ~= defaultStyle.scale ) then
		table.insert( styles, 'height:' .. size * scale .. 'px;width:' .. size * scale .. 'px' )
	end
	if align ~= defaultStyle.align then
		table.insert( styles, 'vertical-align:' .. align )
	end
	if css then
		table.insert( styles, css )
	end
	if title ~= '' then
		title = ' title="' .. title .. '"'
	end
	
	local sprite = table.concat( {
		'<span',
			'class="sprite ' .. class .. '"',
			'style="' .. table.concat( styles, ';' ) .. '"',
			title,
		'><br></span>'
	}, ' ' )
	sprite = sprite:gsub( '%s+([">])', '%1' )
	
	if text ~= '' then
		text = '<span class="sprite-text nowrap"' .. title .. '>' .. text .. '</span>'
	end
	
	if link ~= '' then
		if link:find( '//' ) then
			-- External link
			return '[' .. link .. ' ' .. sprite .. text .. ']'
		else
			-- Internal link
			local linkPrefix = args.linkprefix or default.linkprefix or ''
			return '[[' .. linkPrefix .. 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( true )
	end
	
	local category = ''
	if tonumber( args[1] ) then
		args.pos = args[1]
	else
		local default = {}
		if args.settings then
			default = mw.loadData( 'Module:' .. args.settings )
		end
		
		local name = args.name or default.name
		local ids = mw.loadData( 'Module:' .. ( args.ids or default.ids or 'Sprite/' .. name ) )
		local id = mw.text.trim( args[1] or '' )
		local pos = ids[id] or ids[mw.ustring.lower( id ):gsub( '[%s%+]', '-' )]
		if not pos and not mw.title.getCurrentTitle().isSubpage then
			category = '[[Category:Pages with missing sprites]]'
		end
		args.pos = pos
	end
	
	return p.base( args ) .. category
end

function p.link( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require( 'Module:ProcessArgs' ).merge( true )
	end
	
	local link = args[1]
	if args[1] and not args.id then
		link = args[1]:match( '^(.-)%+' ) or args[1]
	end
	local text = args.text or args[2] or link
	
	args[1] = args.id or args[1]
	args.link = link
	args.text = text
	
	return p.sprite( args )
end

function p.doc( f )
	local settings = mw.loadData( 'Module:' .. f.args[1] )
	local idTable = mw.title.new( 'Module:' .. ( settings.ids or 'Sprite/' .. settings.name ) ):getContent()
	idTable = idTable:gsub( '(\n%s*%-%-%s*.-%s*%-%-%s*\n)', '%1,' ):gsub( '^return {', '' ):gsub( '}$', '' )
	
	local html = {}
	local ids = {}
	local posKeys = {}
	local section = ''
	for line in mw.text.gsplit( idTable, ',' ) do
		line = mw.text.trim( line )
		id = line:match( '^%[[\'"](.+)[\'"]%]' ) or line:match( '^%w+' ) or ''
		pos = line:match( '=%s*(%d+)%s*,?$' ) or ''
		section = line:match( '^%-%-%s*(.+)%s*%-%-$' ) or section
		
		if id ~= '' and pos ~= '' then
			if ids[pos] then
				if type( ids[pos].id ) == 'table' then
					table.insert( ids[pos].id, id )
				else
					ids[pos].id = { ids[pos].id, id }
				end
			else
				ids[pos] = { id = id, section = section }
				table.insert( posKeys, pos )
			end
		end
	end
		
	local list = {}
	local listHead = '<ul class="spritedoc-multicolumn">'
	local listFoot = '</ul>'
	local lastSection = ''
	for i, pos in ipairs( posKeys ) do
		local id = ids[pos].id
		local newSection = mw.text.trim( ids[pos].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-pos="' .. pos .. '">' )
		if type( id ) == 'table' then
			for i, id2 in ipairs( id ) do
				if i == 1 then
					table.insert( list, p.sprite{ id2, settings = f.args[1] } .. '</td><td><div class="sprite-id"><code>' .. id2 .. '</code></div>' )
				else
					table.insert( list, '<div class="sprite-id"><code>' .. id2 .. '</code></div>' )
				end
			end
		else
			table.insert( list, p.sprite{ id, settings = f.args[1] } .. '</td><td><div class="sprite-id"><code>' .. id .. '</code></div>' )
		end
		table.insert( list, '</td></tr></table></li>' )
		
		if i == #posKeys then
			table.insert( list, listFoot )
		end
	end
	
	local out = table.concat( list )
	if not f.args.refresh then
		out = f:preprocess( '{{#widget:stylesheet|page=Sprite doc}}' ) .. '<div id="sprite-doc" data-settings="' .. f.args[1] .. '">' .. out .. '</div>'
	end
	
	return out
end
return p