Módulo:Sprite
Revisión del 09:34 8 jul 2014 de Xstela (discusión | contribuciones)
[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