Módulo:Sprite
[purge]
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
- {{BlockSprite}}
- {{EnvSprite}}
- {{ItemSprite}}
- {{MobSprite}}
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