Module:CharacterToken

--[=[ Lua script replacement for wikitext template



Parameters: 1: Token = (character,token type,count) count is optional Separate multiple items with dollar sign "$" if the item is blank or "&", line break " " will be inserted instead. if the string "multi" is input then lists all tokens of rarity specified in parameter 2 2: Size in pixels (or token rarity in case of "multi") optional, defaults to 30 If equal to "N", includes the token Name Link also If equal to "L", includes the token Name Link only 3: Option For normal, if non-blank, will automatically insert line breaks " " after every 4 tokens. Any specified line breaks ("&") are ignored. For "multi", if non-blank, specifies the string to strip from the end of the token name. 4: Skip Name of the token to be skipped or removed from displayed list, on pages other than token pages.

The list of available tokens is kept in the module data

Unknown Token is returned if Token Type is not in data. --]=]

local p = {}

local util = require("Module:Utility") local COLL = require("Module:ItemCollection").getCollection local availableData = mw.loadData('Module:Available/data')

---[==[ For testing purposes local tokenData = mw.loadData('Module:CharacterToken/data') --[===[]==] local tokenData = { -- Toy Story -- ["ip-ts"] = { ["F"] = "ip-toy story", ["0"] = {"Pixar Ball", 0, 1} },   ["jessie"] = { ["2"] = {"Lasso", 2}, ["3"] = {"Jessie Ears Hat", 3} },   ["sarge"] = { ["2"] = {"Sarge's Bucket", 2}, ["3"] = {"Sarge Ears Hat", 3} },   ["woody"] = { ["2"] = {"Sheriff Star", 2}, ["3"] = {"Woody Ears Hat", 9, 5} },   ["the child"] = { ["2"] = {"Grogu Hover Pram", 104}, ["3"] = {"Grogu Ears Hat", 104} }, } --]===]

local rarityType = { ["collection"]		= 0, ["common"]			= 1, ["uncommon"]		= 2, ["rare"]			= 3, ["epic"]			= 4, ["legendary"]		= 5, ["fabric"]			= 6, ["blueprint"]		= 7, ["common relic"]	= 81, ["uncommon relic"]	= 82, ["rare relic"]		= 83, ["event"]			= 9, ["npc"]				= 10, }

-- Display Token Icon(s) local function tokenIcon(token, size, addbreaks, skip) local outType = ""

if not tonumber(size) then outType = size size = 30 if outType == "P-25" then outType = "P" end end

local autoBreaks = false if addbreaks and addbreaks ~= "" then autoBreaks = true end

token = mw.ustring.gsub(token, "^%s*(.-)%s*$", "%1") or ''

local tAll = {} local space = ""

-- get the current page/token name local pagename = mw.title.getCurrentTitle.text:match("(.+)%s+Token$") or "" -- use the name of token to skip if specified if skip then pagename = skip end -- count of icons on 1 row to insert line break local iconCount = 0

for tok in mw.text.gsplit(token, "%s*[!%$]%s*") do       if tok == "" or tok == "&" then if not autoBreaks then space = ' ' --			space = ' '		end else local addThis = false local tToken = {space, "", "", "", "", "", "", "t-", "", "",		   		"", ".png", "", "", "", "", "", "", ""		   	}

local cName, tokenType, count = mw.ustring.match(tok,                                "^([^,]-)%s*,%s*(%d+)%s*[,%#]*%s*([\/%d%?]*)$") if not cName then cName, count = mw.ustring.match(tok, "^([^,]-)%s*,%s*[,%#]*%s*([\/%d]*)$") end

if not cName then cName, count = mw.ustring.match(tok, "^([^,]-)%s*[,%#]%s*([\/%d]*)$") end

if not cName then cName = tok end

if not tokenType or tokenType == "" then tokenType = "0" end

local today = os.date("%Y/%m/%d %H:%M:%S") if autoBreaks then for cNames, v in pairs(availableData["Shop"]) do           	    for k in mw.text.gsplit(cNames, "%s*%$%s*") do if v[4] and k == cName and (v[1] .. util.dayStart) > today then return "" end end end end if tokenData[mw.ustring.lower(cName)] and tokenData[mw.ustring.lower(cName)][tokenType] then local tokName = tokenData[mw.ustring.lower(cName)][tokenType][1] addThis = true -- not current token so add to output if outType == "I" then tToken[20] = ": "				tToken[24] = tokName				tToken[25] = "" elseif outType == "N" then tToken[ 2] = ""				tToken[ 5] = tokName				tToken[ 6] = " Token ("				tToken[20] = ") " elseif outType == "L" then tToken[ 7] = ""				tToken[ 8] = tokName				tToken[12] = " Token" tToken[13] = "" tToken[14] = "" tToken[16] = "" tToken[18] = "" elseif outType == "S" then tToken[ 7] = ""					tToken[14] = tokName				else					tToken[13] = ""					tToken[14] = ""				end				tToken[16] = "" tToken[18] = "" elseif outType == "P" then tToken[21] = " "				tToken[22] = tokName				tToken[23] = " Token " end if outType ~= "L" and outType ~= "S" then tToken[ 9] = mw.ustring.gsub(tokenData[mw.ustring.lower(cName)].F or mw.ustring.lower(cName), " ", "_") if tokenType ~= "0" then tToken[10] = "-" tToken[11] = tokenType end tToken[15] = tokName tToken[17] = tokName end if outType == "T" then tToken = {space, tokName, " Token"} elseif outType == "R" then local nRarity = tokenData[mw.ustring.lower(cName)][tokenType][3] or tokenData[mw.ustring.lower(cName)][tokenType][2] or 999

if math.floor(nRarity/100) == 1 then nRarity = math.mod(nRarity, 100) end if nRarity == 1 or nRarity == 2 or nRarity == 3 or nRarity == 4 or nRarity == 5 then for rar, numb in pairs(rarityType) do						if numb == nRarity then tToken = {space, rar} end end else tToken = {space, "unknown"} end elseif outType == "C" then local tType = tokenData[mw.ustring.lower(cName)][tokenType][2] or 999

if mw.ustring.lower(cName):match("^ip%-") then tToken = {COLL({mw.ustring.lower(cName):match("^ip%-(.+)$"), 40})} elseif tType == 6 then tToken = {' '} elseif tType == 10 then tToken = {' '} elseif tokenType ~= "0" then tToken = {' '} elseif tType == 999 then tToken = {''} end end if autoBreaks and pagename == tokName then addThis = false tToken = {space, ""} end else if outType == "R" then tToken = {space, "Unknown"} end addThis = true tToken[ 8] = "" tToken[ 9] = "work_in_progress" tToken[15] = cName tToken[17] = "Work In Progress" end if count and count ~= "" then tToken[20] = count end

if addThis then if autoBreaks and iconCount >= 3 then tToken[ 1] = ' ' --					tToken[ 1] = ' '					iconCount = 0 end iconCount = iconCount + 1

table.insert(tAll, table.concat(tToken)) if outType == "P" then space = ' '				elseif outType == "I" then space = ' '				elseif outType == "N" or outType == "L" or (count and count ~= "" and size ~= "50") then space = ", " else space = " " end end end end return table.concat(tAll) end

-- Dislplay list if token links local function tokenList(rarity, stripend) local nRarity = tonumber(rarity) if not nRarity then if rarityType[string.lower(rarity or "")] then nRarity = rarityType[string.lower(rarity)] end end

local tAll = {}

for _, data in pairs(tokenData) do		for _, tok in pairs(data) do			if type(tok) == "table" then if not nRarity or (tok[2] and nRarity == math.mod(tok[2], 100)) then local sortkey = tok[1]:lower:gsub("[\"']", "")					table.insert(tAll, {sortkey, tok[1], tok[2]})				end			end		end	end

table.sort(tAll, function(a,b) return a[1] < b[1] end)

local tOut = {} local space = ""

for _, data in ipairs(tAll) do		local limited = "" if data[3] and math.floor(data[3]/100) == 1 then limited = "''" end tLink = {space, limited, "", "", "", limited} tLink[4] = data[2] local name = data[2] for strip in mw.text.gsplit(stripend, "%s*%$%s*") do name = name:gsub(" ".. strip .. "$", "") end tLink[7] = name table.insert(tOut, table.concat(tLink)) space = " · " end return table.concat(tOut) end

-- External Invokable Functions function p.getToken(frame) local tArgs = util.getArgs(frame)

local token = tArgs[1] or "" -- size is rarity for multi token list local size = tArgs[2] -- for multi token list the string to strip from end of name -- otherwise, if present then automatically add line breaks local stripend = tArgs[3] or "" -- Name of token to remove on non-token pages local skip = tArgs[4]

if token:lower:match("^multi") then return tokenList(size, stripend) else return tokenIcon(token, size, stripend, skip) end end

function p.tokenType(frame) local tArgs = util.getArgs(frame) local token = tArgs[1] or mw.title.getCurrentTitle.prefixedText token = token:gsub(" Token$", "") local nRarity = nil

for name, data in pairs(tokenData) do		for _, tok in pairs(data) do			if type(tok) == "table" and not tokenData[name]["X"] then if tok[1] == token then if tArgs[2] and tok[2] then nRarity = tok[2] else nRarity = tok[3] or tok[2] end end end end end if nRarity and math.floor(nRarity/100) == 1 then nRarity = math.mod(nRarity, 100) end for rar, numb in pairs(rarityType) do		if numb == nRarity then if (rar:match("relic") or rar == "blueprint") and tArgs[2] and tArgs[2] == "S" then return "ae" else return rar end end end return "Unknown" end

function p.CharacterTokens(frame) local tArgs = util.getArgs(frame) local character = tArgs[1] or mw.title.getCurrentTitle.prefixedText local tTok = {} local tOut = "IP-" .. COLL({character, "S"}) character = character:lower local space = ""

if not tokenData[character] then return "" end

for tNumb, tok in pairs(tokenData[character]) do		if not tokenData[character]["X"] then if tNumb == "1" then table.insert(tTok, {"999", ("$" .. character .. "," .. tNumb)}) else table.insert(tTok, {tNumb, ("$" .. character .. "," .. tNumb)}) end end end table.sort(tTok, function(a,b) return a[1] < b[1] end) for _, item in pairs(tTok) do tOut = tOut .. item[2] end return p.getToken({tOut, "I"}) end

return p