Documentation for this module may be created at Module:SpriteFile/doc

-- Please forgive any dust, I've never touched Lua or anything related before

local p = {}

local function isExternalLink(str)
	return str:find('://', 1, true) ~= nil
end

function p.sprite( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require("Module:ProcessArgs").merge( true )
	else
		f = mw.getCurrentFrame()
	end
	
	-- Default settings
	local default = {
		scale = 1,
		size = 16,
		align = "text-top",
		ext = "png",
		modid = "minecraft"
	}
	
	local id = mw.text.trim(tostring(args[1] or ""))
	local ext = (args.ext or default.ext):gsub("^%.", "")
	local name = args.modid or default.modid
	local file = (id == "" and "Grid Unknown.png") or (name .. " " .. id .. "." .. ext)
	
	if name == "minecraft" then
		file = ("Invicon " .. id .. "." .. ext)
	end
	
	local link = ( args.link or "")
	local modPrefix = args.modid or default.modid
	
	if link ~= "" and not isExternalLink(link) then
		link = modPrefix .. ":" .. link
	end
	
	
	local scale = args.scale or default.scale
	local height = ( args.height or args.size or default.size ) * scale
	local width = ( args.width or args.size or default.size ) * scale
	local size = width .. "x" .. height .. "px"
	
	local styles = {}
	if height ~= default.size then
		styles[#styles + 1] = "height:" .. height .. "px"
	end
	if width ~= default.size then
		styles[#styles + 1] = "width:" .. width .. "px"
	end
	
	local altText = file .. ": Sprite image for " .. id
	if link ~= '' then altText = altText .. " linking to " .. link end
	if id == '' then altText = "Unknown sprite image" end

	local sprite = mw.html.create("span"):addClass("sprite-file")
	local img    = string.format("[[File:%s|%s|link=%s|alt=%s|class=pixel-image|%s]]",
		file, size, link, altText, args.title or '')
	sprite:node(img)

	local align = args.align or default.align
	if align ~= default.align then styles[#styles+1] = "--vertical-align:" .. align end
	if args.css then styles[#styles+1] = args.css end
	sprite:cssText(table.concat(styles, ";"))
	
	local root = mw.html.create("")
	local haveText = args.text or args["wrap"] == nil
	local spriteText = nil
	
	if haveText then
		spriteText = mw.html.create("span"):addClass("sprite-text"):wikitext(args.text or "")
		if args.title then spriteText:attr("title", args.title) end
		
		if link ~= "" then
			if isExternalLink(link) then
				spriteText = "[" .. link .. " " .. tostring(spriteText) .. "]"
			else
				spriteText = "[[" .. link .. "|" .. tostring(spriteText) .. "]]"
			end
		end
	end

	root:node(sprite)
	if spriteText then root:node(spriteText) end

	return tostring(root)
end

function p.link(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = require("Module:ProcessArgs").merge(true)
	end

	local raw = args[1] or ""

	if not args.notext then
		args.text = args.text or args[2] or raw
	end

	args[1]  = args.id or raw
	args.link = args.link or raw
	return p.sprite(args)
end

return p