itemLink
itemLinks are returned by several functions, e.g. GetAuctionItemLink(), GetContainerItemLink(), GetInventoryItemLink(), etc.
In essence, they are itemStrings with additional formatting to make in-game text controls display them as clickable hyperlinks.
|cff9d9d9d|Hitem:7073::::::::80:|h[Broken Fang]|h|r
Broken up in its components:
"|cff9d9d9d"
– Colorizes the link with a medium grey color (hex color code)- The first two characters after pipe-c may be the alpha level, where
ff
is fully opaque. - The next three sets of two characters represent the red, green, and blue levels, just like HTML.
- The first two characters after pipe-c may be the alpha level, where
"|H"
– "Hyperlink link data starts here""item:7073:::::::::"
– An informational string for the item."|h"
– "End of link, text follows""[Broken Fang]"
– The actual text displayed"|h"
– "End of hyperlink""|r"
– Restores color to normal
You can extract the itemString from a given itemLink with the following function:
local itemString = string.match(itemLink, "item[%-?%d:]+")
Note: The information string will be an itemString for most items, but there are a few exceptions:
- battlepetString - Caged Battle Pets
- keystoneString - Mythic Keystones
- enchantString
- questString
- spellString
To obtain all the data within a hyperlink, you can use the following:
local _, _, Color, Ltype, Id, Enchant, Gem1, Gem2, Gem3, Gem4, Suffix, Unique, LinkLvl, reforging, Name = string.find(itemLink, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?")
Note that this will accept any hyperlink (item/spell/quest/talent/achievement/tradeskill/etc), it will take itemstrings alone, or even just a single number.
Note that linklevel was added in 3.0, and reforging stat was added in 4.0. Links stored from previous revisions may have problems being parsed with current code.
Printing links for debug
Printing out the contents of an item link is perhaps not so obvious; displaying it anywhere in-game will just show you a clickable link. Reformat it slightly to ruin the escape sequences and you'll see what it really looks like:
link = GetContainerItemLink(0, 1);
printable = gsub(link, "\124", "\124\124");
ChatFrame1:AddMessage("Here's what it really looks like: \"" .. printable .. "\"");
"124" is the ascii value of the "|" character. If you are writing this in a regular .lua file, feel free to go ahead and just use "|" and "||". However, if you're typing it in an in-game editor, it's better to use the ascii code escape to avoid problems.