Module:Item

local getArgs = require('Module:Arguments').getArgs local string = require('Module:String') local setColor = require('Module:Color')._colorTemplates local addThousandSep = string._formatNum local yesno = require('Module:Yesno') local makeRarity = require('Module:RarityTier')._link local makeCurrency = require('Module:Currency')._currency local makeEnchant = require('Module:Link')._enchantmentsLink local lang = mw.getContentLanguage

local p = {} --- -- Template: Resource Display -- -- Displays item and its amount, alongside its image, drop chance, rarity, enchant, etc --- function p.resourceDisplay(frame) local args = getArgs(frame) local str = args[1] local img = yesno(args["image"] or args["img"] or args["i"], true) local nolink = yesno(args["nolink"] or args["nl"], false) local noErr = yesno(args["noerror"] or args["ne"], false) local ignoreOdds = yesno(args["ignoreodds"], false) return string.pcall(p._item, str, img, nolink, noErr, false, ignoreOdds) end --- -- Template: Item Display -- -- Displays only item, alongside its image, drop chance, rarity, enchant, etc --- function p.itemDisplay(frame) local args = getArgs(frame) local str = args[1] local img = yesno(args["image"] or args["img"] or args["i"], true) local nolink = yesno(args["nolink"] or args["nl"], false) local noErr = yesno(args["noerror"] or args["ne"], false) local ignoreOdds = yesno(args["ignoreodds"], false) return string.pcall(p._item, str, img, nolink, noErr, true, ignoreOdds) end --- -- Functions for use in other modules --- function p._resourceDisplay(str, img, nolink, noErr, ignoreOdds) return p._item(str, img ~= nil and img or true, nolink, noErr, false, ignoreOdds) end function p._itemDisplay(str, img, nolink, noErrm, ignoreOdds) return p._item(str, img ~= nil and img or true, nolink, noErr, true, ignoreOdds) end

--Module Access Point function p._item(str, img, nolink, noErr, ignoreAmount, ignoreOdds) local num = nil local num2 = nil --remove commas, they break stuff str = str:gsub(",", "") --determine whether or not the hover text should be displayed local no_hover = str:match('%d+%-+%d+') and true or false if str:match('%s*[^\\];%s*(.-)$') then str, after = str:match('^(.+)%s*;%s*(.-)$') end

--separate item and quantity + handle invalid syntax if not ignoreAmount then if str:match('([%d,%-%?]+%.?[%d,%-]*x? ?or ?[%d,%-%?]+%.?[%d,%-]*x?) (.*)') then num, item = str:match('([%d,%-%?]+%.?[%d,%-]*x? ?or ?[%d,%-%?]+%.?[%d,%-]*x?) (.*)') elseif str:match('([%d,%-%?]+%.?[%d,%-]*x?) (.*)') then num, item = str:match('([%d,%-%?]+%.?[%d,%-]*x?) (.*)') elseif noErr then return str else return string.error('Invalid Resource list syntax "%s"', str) end if num:match('or') then local tempStr = num num, num2 = tempStr:match('(.+) ?or ?(.+)') end --handle colors (green = standard, red = only when number is "?") text_color = "Green" if num:match("%?") or (num2 and num2:match('%?')) then no_hover = true text_color = "Red" end --remove unnecessary characters from number num = num:gsub('[x,]', '') if num2 then num2 = num2:gsub('[x,]', '')end else if str:match('^[%d,%-%?]+%.?[%d,%-]*x? ?or ?[%d,%-%?]+%.?[%d,%-]*x? (.*)') then item = str:match('^[%d,%-%?]+%.?[%d,%-]*x? ?or ?[%d,%-%?]+%.?[%d,%-]*x? (.*)') elseif str:match('^[%d,%-%?]+%.?[%d,%-]*x? (.*)') then item = str:match('^[%d,%-%?]+%.?[%d,%-]*x? (.*)') else item = str end end --remove unnecessary characters from item item = item:gsub('[%[%]]', '') --unpack and process aliases local aliases = require('Module:Item/Aliases') item = ' '..item..' ' for pattern, replace in pairs(aliases) do		if item:match(pattern) then item = item:gsub(pattern, replace) end end item = mw.text.trim(item)

local alt = item -- if item:match('s$') or item:match("[Bb]locks") then -- 	alt = item -- 	item = item:gsub('s$', ''):gsub("[Bb]locks", "Block") -- end if item:match("[Bb]locks") then alt = item item = item:gsub("[Bb]locks", "Block") end --generate alternate text if item:match('%|') then item, alt = item:match('(.*)%|(.*)') elseif item:match('[^%%]%!') then item, alt = item:match('(.*)%!(.*)') end --determine whether or not odds should be displayed local odds = nil if item:match(" %%.+%%") then item, odds = item:match("(.*)%s%%(.+)%%") end if alt:match(" %%.+%%") then alt, odds = alt:match("(.*)%s%%(.+)%%") end --determine whether or not enchant should be displayed local enchant = nil if item:match(" &.+&") then item, enchant = item:match("(.*)%s&(.+)&") end if alt:match(" &.+&") then alt, enchant = alt:match("(.*)%s&(.+)&") end --change the $rarity$ to actual rarity template alt = alt:gsub(		"(.*)$(.+)$(.*)", 		function(a, b, c) 			return table.concat{				a, 				makeRarity(b, nil, nil, true), 				c,			} 		end	) item = item:gsub("(.*)%s?$.+$%s?(.*)", "%1%2")

item = mw.text.trim(item) --convert armor piece string to functional string, pick the proper image (helmet) local item_img = item if item:match('(.*) [Pp][Ii][Ee][Cc][Ee]') then item = item:match('(.*) [Pp][Ii][Ee][Cc][Ee]') if item:match('(.*) [Aa][Rr][Mm][Oo][Rr]') then item_img = item:match('(.*) [Aa][Rr][Mm][Oo][Rr]')..' Helmet' else item_img = item..' Helmet' end elseif item:match('(.+) [Aa][Rr][Mm][Oo][Rr]') then item = item:match('(.+) [Aa][Rr][Mm][Oo][Rr]') item_img = item..' Helmet' end --convert minion string to functional string, pick the proper image (tier I minion head) if item:match('Minion [IVXivx]+') then item = item:gsub('(Minion )[IVXivx]+', '%1') elseif item:match('Minion') then item_img = item..' I'	end

local title, title2 --handle the calculations performed on the number, then format it	if not ignoreAmount then if not no_hover then --get amount of stacks and items stacks = math.floor(tonumber(num) / 64) items = tonumber(num) % 64 --add thousand separator to the quantity num = addThousandSep(num) end title = nil if not no_hover then --add hover info about amount in stacks and items if stacks + items * 0.01 > 1 then local str_stacks = lang:plural( stacks, 'stack', 'stacks' ) local str_items = lang:plural( items, 'item', 'items' ) if items > 0 then title = table.concat{ addThousandSep(stacks), ' ',						str_stacks, ' and ', items, ' ',						str_items, ' (',						num,						' items total).', }				else title = table.concat{ addThousandSep(stacks), ' ', 						str_stacks, ' (',						num,						' items total).', }				end end end --same thing as above, but for second number if not no_hover and num2 then --get amount of stacks and items stacks2 = math.floor(tonumber(num2) / 64) items2 = tonumber(num2) % 64 --add thousand separator to the quantity num2 = addThousandSep(num2) end title2 = nil if not no_hover and num2 then --add hover info about amount in stacks and items if stacks2 + items2 * 0.01 > 1 then local str_stacks = lang:plural(stacks2, 'stack', 'stacks') local str_items = lang:plural(items2, 'item', 'items') if items2 > 0 then title2 = table.concat{ addThousandSep(stacks2), ' ',						str_stacks, ' and ', items2, ' ',						str_items, ' (',						num2,						' items total).', }				else title2 = table.concat{ addThousandSep(stacks2), ' ',						str_stacks, ' (',						num2,						' items total).', }				end end end end

--apply formatting local ret = {} if ignoreAmount then ret = { (img and string.makeImage(item_img, { size=21, link=nolink and nil or item })..' ' or ''), nolink and (alt and alt or item) or string.makeLink(item, alt), (enchant and table.concat{				" (", makeEnchant(enchant), ")"			} or ''), ((odds and not ignoreOdds) and table.concat{				"(", odds, ")"			} or ''), after and ' '..after or '', }	elseif item:lower:find('^%s*coins?%s*$') then ret = { tostring(makeCurrency(ignoreAmount and nil or num, nil, false, false, img, nolink, true, nil, 'coins')) }	elseif item:lower:find('^%s*bits?%s*$') then ret = { tostring(makeCurrency(ignoreAmount and nil or num, nil, false, false, img, nolink, true, nil, 'bits')) }	elseif item:lower:find('^%s*gems?%s*$') then ret = { tostring(makeCurrency(ignoreAmount and nil or num, nil, false, false, img, nolink, true, nil, 'gems')) }	elseif num2 then ret = { img and string.makeImage(					item_img, 					{ size=21, link=nolink and nil or item }				)..' ' or '', string.makeTitle(				setColor(text_color, num), 				title, 				{ ignoreTitleNil = true }			), --returns first param if title is nil ' ', setColor(text_color, 'or'), ' ', string.makeTitle(setColor(text_color, num2..'x'), title2, {ignoreTitleNil = true}), --returns first param if title2 is nil ' ',			nolink and (alt and alt or item) or string.makeLink(item, alt), enchant and table.concat{ " (", makeEnchant(enchant), ")" } or '', (odds and not ignoreOdds) and table.concat{ "(", odds, ")" } 			or '', after and ' '..after or '', }	else ret = { (img and string.makeImage(item_img, { size=21, link=nolink and nil or item }) or ''), ' ',			string.makeTitle(setColor(text_color, num..'x'), title, {ignoreTitleNil = true}), --returns first param if title is nil ' ',			nolink and (alt and alt or item) or string.makeLink(item, alt), (enchant and table.concat{				" (", makeEnchant(enchant), ")"			} or ''), ((odds and not ignoreOdds) and table.concat{				"(", odds, ")"			} or ''), after and ' '..after or '', }	end return (table.concat(ret):gsub('%%([^%%])', '%1')) end

--Finish Module return p