Documentation The documentation below is transcluded from Module:Item/doc. (edit | history)
This module is intended to provide functionality to the item template.
local function explode(div,str) -- credit: http://richard.warburton.it
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,string.sub(str,pos,st-1)) -- Attach chars left of current divider
pos = sp + 1 -- Jump past current divider
end
table.insert(arr,string.sub(str,pos)) -- Attach chars right of last divider
return arr
end
local function parseSize(size)
if not size then return end
local width, height
if size ~= '' then
width, height = unpack(explode('x', string.gsub(size, 'px', '')))
width, height = tonumber(width), tonumber(height)
if width == 0 then width = nil end
if height == 0 then height = nil end
end
return width, height
end
local function parseMaxSize(maxsize)
if not maxsize then return end
local maxwidth, maxheight = unpack(explode('x', string.gsub(maxsize, 'px', '')))
maxwidth, maxheight = tonumber(maxwidth), tonumber(maxheight)
if maxwidth == 0 then maxwidth = nil end
if maxheight == 0 then maxheight = nil end
return maxwidth, maxheight
end
local function getImageSize(image, width, height, maxwidth, maxheight)
-- apply maxwidth/maxheight.
if maxwidth then
if width then
if width > maxwidth then width = maxwidth end
else
if height then width = maxwidth end
end
end
if maxheight then
if height then
if height > maxheight then height = maxheight end
else
if width then height = maxheight end
end
end
-- rounding
if width then width = math.ceil(width) end
if height then height = math.ceil(height) end
return width, height
end
local function imagecode(image, link, text, size, maxsize)
local image_output = '[[File:' .. image .. '|link='.. link .. '|' .. text
if size or maxsize then
local width, height = parseSize(size) -- width,height: number or nil
local maxwidth, maxheight = parseMaxSize(maxsize)
width, height = getImageSize(image, width, height, maxwidth, maxheight) -- can be 0
if width or height then
return image_output .. '|' .. (width or '') .. 'x' .. (height or '') .. 'px]]'
else
return image_output .. ']]'
end
else
return image_output .. ']]'
end
end
local image_for_cargo
local function images(image, link, text, size, maxsize)
if not image:find('/') then
image_for_cargo = image
return imagecode(image, link, text, size, maxsize)
end
image = explode('/', image)
local result = ''
if size and size:find('/') then
size = explode('/', size)
for k, v in pairs(image) do
result = result .. imagecode(v, link, text, size[k], maxsize)
end
else
for k, v in pairs(image) do
result = result .. imagecode(v, link, text, size, maxsize)
end
end
return result
end
-- main return object
return { go = function(frame)
local getArg = function(key)
local value = frame.args[key]
if not value then
return nil
end
value = mw.text.trim(value)
if value == '' then
return nil
else
return value
end
end
local _arg1 = getArg(1) or ''
local _link = mw.text.trim(frame.args['link']) -- keep '' input
local _arg2 = getArg(2)
local text
if _arg2 then
if _arg2 == 's' or _arg2 == 'es' then
text = _arg1 .. _arg2
elseif _arg2 == 'ies' then
text = _arg1:sub(0, -2) .. _arg2
elseif _arg2 == 'ves' then
text = _arg1:sub(0, -3) .. _arg2
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('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
text = '[['.._link..'|'..text..']]'
end
local content = mw.text.tag('span', nil, text)
if _wrap then
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 _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 IDs|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 IDs|Tile ID]]: '
elseif _type == 'wall' then
id_text = 'Internal [[Wall IDs|Wall ID]]: '
elseif _type == 'npc' then
id_text = 'Internal [[NPC IDs|NPC ID]]: '
elseif _type == 'mount' then
id_text = 'Internal [[Mount IDs|Mount ID]]: '
elseif _type == 'buff' or _type == 'debuff' then
id_text = 'Internal [[Buff IDs|Buff ID]]: '
elseif _type == 'projectile' then
id_text = 'Internal [[Projectile IDs|Projectile ID]]: '
elseif _type == 'armor' then
id_text = 'Internal [[Armor IDs|Armor ID]]: '
else
id_text = 'Internal [[Item IDs|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 }