Module:Sprite

--- The purpose of this module is to show pieces of an image file instead of the whole image. --- One intended use is within other templates, such as a template to return flags of many --- countries, so that you need to load only ONE image to produce all the flags on the page --- This should produce - but is not actually known to - some increase in performance. --- It might also be useful for pulling out entries from very large tables of graphics, such --- as one character from a font.

--- This module accepts a filename, and uses Template:Sprite/filename (or parameter spritedefs) --- to identify sprites within the image at filename. --- it locates a given name for a sprite within the file and scales it to the desired width

local p={}

function spritedraw(left,right,top,bottom,name,imagewidth,spritewidth,scalewidth,float) if (left==nil or right==nil or top==nil or bottom==nil or name==nil or imagewidth==nil or spritewidth==nil or scalewidth==nil) then return tostring(left) .. tostring(right)..tostring(top)..tostring(bottom)..tostring(name)..tostring(imagewidth)..tostring(spritewidth)..tostring(scalewidth) end if float then float="float:"..float..";" else float="" end local scale=scalewidth/spritewidth top=math.floor(top*scale) bottom=math.floor(bottom*scale) left=math.floor(left*scale) right=math.floor(right*scale) local scalestring="" if scalewidth~=spritewidth then scalestring=math.floor(imagewidth*scale)..'px|' end output=' ' return output end

function p.sprite(frame) local args=frame.args local parent=frame.getParent(frame) local pargs=parent.args local imagewidth=args.imagewidth or pargs.imagewidth or 360 local spritewidth=args.spritewidth or pargs.spritewidth or 120 local scalewidth=args.width or pargs.width or 120 local leftcol=0;local midcol=120;local rightcol=240 local filename=args.filename or pargs.filename or "" if filename=="" then return "error: Sprite needs filename= parameter" end local spritedefs=args.spritedefs or pargs.spritedefs or ("Module:Sprite/"..filename) local sfile=mw.loadData(spritedefs) local name=args[1] or pargs[1] or "0" local top,bottom,left,right local count=-4;debuglog="" local float=args.float or pargs.float --string like "left", "right", or nil=no float repeat count=count+5 local n=sfile[count];local l=sfile[count+1];local r=sfile[count+2];local t=sfile[count+3];local b=sfile[count+4] debuglog="n"..tostring(n).."l="..tostring(l).."r=" ..tostring(r).."t="..tostring(t).."b="..tostring(b) if not(n and l and r and t and b) then return "error: sprite not found"..debuglog end if n==name or count==tonumber(name) then top=tonumber(t);bottom=tonumber(b);left=tonumber(l);right=tonumber(r);break end until false if args.nowiki or pargs.nowiki then return frame:preprocess(" "..spritedraw(left,right,top,bottom,name,imagewidth,spritewidth,scalewidth,float).." ") end return spritedraw(left,right,top,bottom,name,imagewidth,spritewidth,scalewidth,float) end

return p