Module:Item

local trim = mw.text.trim

local currentFrame

-- credit: http://richard.warburton.it -- this version is with trim. local function explode(div,str) if (div=='') then return false end local pos,arr = 0,{} -- for each divider found for st,sp in function return string.find(str,div,pos,true) end do		table.insert(arr,trim(string.sub(str,pos,st-1))) -- Attach chars left of current divider pos = sp + 1 -- Jump past current divider end table.insert(arr, trim(string.sub(str,pos))) -- Attach chars right of last divider return arr end

local function imagecode(image, link, text, size, scale, maxsize) local image_output = '[[File:' .. image .. '|link='.. link .. '|' .. text	if size or scale or maxsize then		local basescale, width, height		if size then			size, basescale = unpack(explode('*', size))			if basescale ==  then basescale = nil end			if size ~=  then				width, height = unpack(explode('x', string.gsub(size, 'px', )))				width, height = tonumber(width), tonumber(height)			end		end		if not width then			width = tonumber(currentFrame:callParserFunction( '#imgw', image))		end		if not height then			height = tonumber(currentFrame:callParserFunction( '#imgh', image))		end		scale = tonumber(scale or 1) * tonumber(basescale or 1)		if scale ~= 1 then			width, height = math.ceil(tonumber(width) * tonumber(scale)), math.ceil(tonumber(height) * tonumber(scale))		end		if maxsize then			local maxwidth, maxheight = unpack(explode('x', string.gsub(maxsize, 'px', )))			maxwidth, maxheight = tonumber(maxwidth), tonumber(maxheight)			if maxwidth and width > maxwidth then				width = maxwidth			end			if maxheight and height > maxheight then				height = maxheight			end		end

return image_output .. '|' .. width .. 'x' .. height .. 'px]]' else return image_output .. ']]'	end end

local image_for_cargo local function images(image, link, text, size, scale, maxsize) if not image:find('/') then image_for_cargo = image return imagecode(image, link, text, size, scale, maxsize) end

image = explode('/', image) local result = '' if size and size:find('/') then size = explode('/', size) for i, v in ipairs(image) do result = result .. imagecode(v, link, text, size[i], scale, maxsize) end else for i, v in ipairs(image) do result = result .. imagecode(v, link, text, size, scale, maxsize) end end return result end

-- main return object return { go = function(frame, args) currentFrame = frame -- cache if args then for k, v in pairs(args) do			if v == '' then args[k] = nil end end if args['nolink'] then args['link'] = '' else if not args['link'] then args['link'] = args[1] end end end

local getArg = function(key) if args then return args[key] else local value = frame.args[key] if not value then return nil end value = trim(value) if value == '' then return nil else return value end end end

local _arg1 = getArg(1) or '' local _link = trim(frame.args['link'] or args['link'] or ) -- keep  input

local _arg2 = getArg(2) local text if _arg2 then -- intuitive pluralism -- The comparisons are performed in order, so putting the more common ones in front gives the best performance. if _arg2 == 's' then local suffix1 = _arg1:sub(-1) -- cache for better performance. local suffix2 = _arg1:sub(-2) -- cache for better performance. if suffix1 == 'y' then if suffix2 == 'ay' or suffix2 == 'ey' or suffix2 == 'iy' or suffix2 == 'oy' or suffix2 == 'uy' then text = _arg1 .. 's'                -- eg. ray->rays else text = _arg1:sub(1, -2) .. 'ies'   -- eg. firefly->fireflies end elseif suffix2 == 'fe' and string.lower(_arg1) ~= 'safe' then text = _arg1:sub(1, -3) .. 'ves'       -- eg. knife->knives elseif suffix1 == 'f' and suffix2 ~= 'ff' then text = _arg1:sub(1, -2) .. 'ves'       -- eg. wolf->wolves, leaf->leaves, but buff->buffs else text = _arg1 .. 's'			end elseif _arg2 == 'es' then text = _arg1 .. 'es' elseif _arg2 == 'ies' then text = _arg1:sub(1, -2) .. 'ies' elseif _arg2 == 'ves' then if _arg1:sub(-2) == 'fe' then text = _arg1:sub(1, -3) .. 'ves'   --replace last 2 letters, e.g. knife->knives elseif _arg1:sub(-1) == 'f' or _arg1:sub(-2) ~= 'ff' then text = _arg1:sub(1, -2) .. 'ves'   --replace last letter, e.g. wolf-wolves, leaf->leaves, but buff->buffs end else text = _arg2 end else text = _arg1 end

local class = 'item-link'

local _mode = getArg('mode')

local output_image, output_text, output_table = true, true, false if _mode then if _mode == 'image' or _mode == 'imageonly' or _mode =='onlyimage' then output_text = false elseif _mode == 'text' or _mode == 'noimage' then output_image = false elseif _mode == 'table' or _mode == '2-cell' then output_table = true end end

local image_output = '' if output_image then image_output = images(getArg('image') or (_arg1 .. '.' .. (getArg('ext') or 'png')), _link, text, getArg('size'), getArg('scale'), getArg('maxsize')) end

local text_output = '' if output_text then local _note = getArg('note') local _note2 = getArg('note2') local _id = getArg('id')

local _wrap if _id or _note2 then _wrap = false else _wrap = getArg('wrap') end

if _link ~= '' then if text == _link then text = ..text.. else text = ..text.. end end

local _icon = getArg('icons') local icon = '' if not (_icon == 'n' or _icon == 'no' or _icon == 'off') then -- eicons should base on link first. local t			if _link ~= '' then t = _link else t = _arg1 end local args = {t} if _id or _note2 or _wrap or getArg('small') then args['small'] = 'y'			end icon = frame:expandTemplate{ title = 'eicons', args = args } end

local content = mw.text.tag('span', nil, text) if _wrap then if icon ~= '' then class = 'item-link -w' content = content .. icon end if _note then class = 'item-link -w' content = content .. mw.text.tag('span',{class='note'}, _note) end else if _note then content = content .. mw.text.tag('span',{class='note'}, _note) end if icon ~= '' then content = content .. icon end if _note2 then class = 'item-link -w' content = content .. mw.text.tag('div',{class='note'}, _note2) end if _id then class = 'item-link -w' local _type = getArg('type') or 'item' _type = _type:lower local id_text if _type == 'item' then -- a shortcut for faster id_text = 'Internal Item ID: ' if output_image and image_for_cargo then frame:expandTemplate{ title = 'Item/cargo', args = {name=_arg1, image=image_for_cargo, id=_id} } end elseif _type == 'tile' then id_text = 'Internal Tile ID: ' elseif _type == 'wall' then id_text = 'Internal Wall ID: ' elseif _type == 'npc' then id_text = 'Internal NPC ID: ' elseif _type == 'mount' then id_text = 'Internal Mount ID: ' elseif _type == 'buff' or _type == 'debuff' then id_text = 'Internal Buff ID: ' elseif _type == 'projectile' then id_text = 'Internal Projectile ID: ' elseif _type == 'armor' then id_text = 'Internal Armor ID: ' else id_text = 'Internal Item ID: ' if output_image and image_for_cargo then frame:expandTemplate{ title = 'Item/cargo', args = {name=_arg1, image=image_for_cargo, id=_id} } end end content = content .. mw.text.tag('div', {class='id'}, id_text .. _id) end end text_output = mw.text.tag{name='span', content=content} end

local _class = getArg('class') local _css = getArg('css')

if _class then class = class .. ' ' .. _class end local attr = {class = class} if _css then attr.style = _css end local anchor = '' if getArg('anchor') then anchor = mw.text.tag('div', {id=frame:callParserFunction('anchorencode', _arg1), class='anchor'}, '') end if output_table then attr.class = class .. ' block aligncenter' local result = mw.text.tag('span', attr, image_output) .. '||'		attr.class = class .. ' block alignleft' return result .. mw.text.tag('span', attr, text_output .. anchor) else return mw.text.tag('span', attr, image_output .. text_output .. anchor) end end }