Fallout Wiki
Advertisement
Fallout Wiki

A library of functions for displaying icons on pages or within other templates. For best performance, a chain of icons (sit in a row with nothing between) should be done with a single call.

Functions[]

This module relies on the exists() and trim() contained within Module:Util. All function calls from this module are prefixed with util e.g. util.exists().

_generate()[]

This function is internal only and the main workhorse for p.Icons() and p.innerIcon(). This function builds the function list. The first task is determining the size of the icons.

    if util.exists(iconSetting)  then 
    	iconSetting = util.trim(iconSetting)
        if util.exists(iconSize[iconSetting]) then
            iconSetting = iconSize[iconSetting]
        end
    else
        iconSetting = iconSize["medium"]
    end
    -- This is for calls from other Lua modules as the above will result in nil
    if util.exists(iconSetting) == false then
    	if util.exists(iconSize) then
			iconSetting = iconSize
		else
			iconSetting = iconSize["medium"]
		end
    end

In wikitext mark up the rough equivalent would be:

{{#ifeq:{{{iconSetting}}}|medium|{{#switch:{{{iconSetting}}}|a = x14px |b = 16px| c= 20px|...|#default = {{{iconSize|x14px}}}}}}}

The next step is to break the comma separated lists into a table:

    if util.exists(iconLinks) then
        iconLinks = mw.text.split(iconLinks, ",")
    end
        
    if util.exists(tipOverride) then
        tipOverride = mw.text.split(tipOverride, ",")
    end
    
    if util.exists(iconClass)then
    	iconClass = "|class=" .. tostring(iconClass);
    else
    	iconClass = ""
    end

This would be the equivalent of using multiple {{#explode:}} functions and variables to store each item as its own.

Once the data has been pre-processed a loop is used to run through each item in the list to generate the icon collection:

    for k, v in ipairs(iconList) do
        newIcon = iconData[util.trim(v)]
        if util.exists(newIcon) then
            currentIcon = newIcon.icon
            if util.exists(tipOverride, k) then
                currentTip = tipOverride[k]
            else
                if util.exists(iconLinks, k) then
                    currentTip = iconLinks[k]
                else
                    currentTip = newIcon.tip
                end
            end
        else
            currentIcon = "Icon question.png"
            currentTip = "Unrecognized icon name"
            result = result .. "[[Category:Modules with invalid parameters]]"
        end
        
        --Create wikitext icon
		dataLine = '[[File:' .. currentIcon .. '|' .. iconSetting
        if util.exists(iconLinks, k) then
            dataLine = dataLine .. '|link=' .. iconLinks[k]
        else
            dataLine = dataLine .. '|link='
        end
        if currentTip ~= nil then
            dataLine = dataLine .. '|' .. currentTip
        end

        dataLine = dataLine .. iconClass .. ']]'

		createTip = mw.html.create('span')
        	createTip:addClass( 'va-icon' )
        	:attr('title', currentTip)
        	:wikitext(dataLine)
        result = result .. tostring(createTip)
        
        if k < table.getn(iconList) then
        	result = result .. " "
        end
    end

Line 2 checks the data list at Module:Icons/data for the data relating to the icon short code and returns a result or nil (does not exist) Depending on if a result was found the code continues, if there is no match a dummy icon is supplied at lines 14/15 and a maintenance category added at line 16.

If a match is found, the next task is to check if the tooltip is being overwritten, if it isn't being overwrite, it will then check if an page alternative link has been supplied, otherwise fall back to the default tooltip.

The wikitext equivalent would be

{{{tipOverride|{{{iconLinks|default}}}}}}

Now the correct icon, tooltip and link have been obtained, lines 21-31 build the image file in the format [[File:<icon>|<size>|link=<link>|<tooltip>|class=<class>]].

Lines 33-37 create the <span /> which contains the icon and inserts the icon inside. When rendered this will appear as <nowik><span class="va-icon" title="<tooltip>">icon</nowiki>.

Finally lines 39-41 check if the item being created is the last in the list to be created. If not it will add a space at the end of the string so there is space between the icons on the page once completed.

Invocation parameters[]

The invocation parameters are passed through from p.Icons(frame) or p.innerIcon(iconList, iconSetting, iconLinks, tipOverride, iconClass, iconSize). The variables align between these three functions and the below should be taken as an explanation for all three.

Label Parameter Variable Description Required Example
Icons 1 iconList A string list of icon short code(s) passed through to the module. For multiple codes being passed these should be split by a comma (,). Yes fo76,ww
Icon Size 2 iconSetting The image size to be passed to all icons in the list. A custom size can be set (e.g. x26px) or one of the standard sizes can be applied:
  • small = x10px
  • medium = x14px
  • normal = x14px
  • big = x20px

To ensure all icons are consistent in size, it is recommended to control on the height (e.g. x14px) rather than the width (e.g. 14px)

No - Defaults are built in
Link 3 iconLinks The page(s) the icon(s) links to. For multiple pages, article names are split with a comma (,) No Fallout 76,Wild Wasteland
Tooltip 4 tipOverride The tooltip(s) shown when hovering over the icon(s), for multiple icons, the tooltips can be split with a comma (') No - Defaults are built in Fire, EMP
CSS Class 4 iconClass CSS classes to be applied to the icons. If this is set it will apply to all icons in the group. Classes are written without the class= component. No va-icon va-icon-blue

p.Icons() and p.innerIcon()[]

These two functions are pass through functions to _generate(). Before passing through the list of icons supplied is split.

The differences between the functions is where they should be used and that p.innerIcon() doesn't pass through a table of icon sizes, just a predetermined size and can only be called from other lua modules. p.Icons() is for all other namespaces and cannot be called from another module.

Invocation parameters[]

Due to the close nature of these two functions and _generate() the invocation parameters are the same as listed above.

p.platforms()[]

p.platforms() uses the same data set as the other functions, but only returns results for icons that have been marked as being a platform in the data set. In addition to this, it also uses Semantic Mediawiki so the data returned can be queried in Special:Ask.

Once the function has confirmed the icon in the list is a valid platform, it will create a hidden <span /> holding the semantic tag advising of the platform assigned from the default tooltip [[Has platform::<platform>]]. The code then largely follows that of _generate() to create the icon, with a blank link attribute. The two spans are then joined together before checking for the next platform.

If no platforms are found the code will return <sup>[Platforms needed]</sup>[[Category:Platforms needed]].

Invocation parameters[]

The only parameter taken by this function is the iconList parameter, holding the string of short codes.

p.documentation()[]

p.documentation() is self generating documentation to display the icon produced by each short code. It first takes all the datasets available and sorts them into alphabetical order and creates a table header allowing for 3 icons in a row. For each short code it will put the short code in the first, third or fifth column and the icon in the second, fourth or sixth column based on where in the sorted dataset it resides.

Due to the ever expanding icon list, this function does run the risk of becoming oversized with time. If the character size is exceeded it may need splitting into two functions.

Invocation parameters[]

As a self contained function, there are not parameters that can be passed through.

Available icons[]

prefix Icon prefix Icon prefix Icon
2D20 Gametitle-2D20 ability Icon ability ac Icon shield bronze
acid Icon acid action Icon action agi FO76 A
alcohol FO76 Alcohol Icon amber Icon amber ammo Icon ammo
ammo2 Icon ammo01 android Icon android ap Icon ap
apple Icon appleios ar Gametitle-AR armorwb Fo4 Armor Work Icon
atom FO76 Atom Currency 2 attack Icon attack axed Fire axe icon color
big gun Icon heavy weapon bigger gun Icon big gun blade Icon blade
bleed Icon bleed blunt Icon blunt bonus effect Icon bonus effect
boss FoS Boss brain Brain icon bronze Bronze
bugged unav Bugintro bullion Fo76 Icon Gold Bullion camp FO76 ui extra team
caps Caps caps2 FO76 Caps icon custom 1 caravan Icon cards
cards Icon cards cd Icon combat dice chance FO76 ui roleplay team
chance fo76 FO76 ui roleplay team check Icon check check1 Icon CheckYellowShadowed
checkbrown Icon check temp chems FO76 Chems Icon chemst Fo4 Chem Work Icon
chr FO76 C companion NW icon ally confidence Icon confidence
cookst Fo4 Cook Work Icon craft Icon crafting credit Credits icon
crippled leg Crippled Leg crit Icon critical damage crit effect Icon crit effect
cross Icon cross crosshair Icon attack cryo Icon cryo
cut Icon cut d20 Gametitle-D20 dailyops FO76 ui dailyops team
damage Icon damage dap Icon dap dead Icon dead
defense Icon shield silver detect Icon eye detection Icon eye
dial Icon dialogue dialogue Icon dialogue disease Icon disease
dislike Dislike distance Icon range doctor Icon doctor
dps Icon dps dr Icon shield silver drink FO76 Drink Icon
dt Icon shield gold dur Icon limitedtime effect Icon effect
electrical Icon electrical emp Icon EMP end FO76 E
energy Icon electrical enslave Icon cage essential Icon essential
event FO76 icon map event eventmutated FO76MI icon map mutated event eventpublic FO76 icon map public event
experience Icon XP explmill Icon fo4cw builder explosion Icon explosion
eye Icon eye facebook FacebookIcon fb Gametitle-FB
fbg Gametitle-FBG fbgagenda FBG Agenda icon fbgaggressive FBG Aggressive icon
fbgagility FBG A icon fbgapparel FBG Apparel icon fbgarmor FBG Armor icon
fbgasset FBG Asset icon fbgcharisma FBG C icon fbgcompanion FBG Companion icon
fbgcritter FBG Critter icon fbgdangerous FBG Dangerous icon fbgdeadly FBG Deadly icon
fbgdieablhits FBG Die ABL Hits fbgendurance FBG E icon fbgfreedom FBG Freedom icon
fbghit FBG Hit icon fbghuman FBG Human icon fbgintelligence FBG I icon
fbgloot FBG Loot icon fbgluck FBG L icon fbgmonster FBG Monster icon
fbgnc Gametitle-FBGNC fbgperception FBG P icon fbgquest FBG Quest objective
fbgradiation FBG Radiation icon fbgranged FBG Ranged icon fbgretreat FBG Retreat icon
fbgrobot FBG Robot icon fbgsecurity FBG Defender icon fbgsettlement FBG Settlement icon
fbgstrength FBG S icon fbgsupermutant FBG Super Mutant icon fbgvault109 FBG Vault 109 icon
fbgvault84 FBG Vault 84 icon fbgwasteland FBG Wasteland icon fbgweapon FBG Weapon icon
fbgww Gametitle-FBGWW female Female-gender-sign film Film
fire Icon fire firerate FO76 UI icon Ammo custom fist Icon fist
fnv Gametitle-FNV fnvcs Gametitle-FNV CS fnvdm Gametitle-FNV DM
fnvgra Gametitle-FNV GRA fnvhh Gametitle-FNV HH fnvlr Gametitle-FNV LR
fnvowb Gametitle-FNV OWB fnvww Icon wildwasteland fo Gametitle-FO1
fo1 Gametitle-FO1 fo1st FO1st fo2 Gametitle-FO2
fo3 Gametitle-FO3 fo3bs Gametitle-FO3 BS fo3mz Gametitle-FO3 MZ
fo3oa Gametitle-FO3 OA fo3pl Gametitle-FO3 PL fo3tp Gametitle-FO3 TP
fo4 Gametitle-FO4 fo4aut Gametitle-FO4 AUT fo4cc Gametitle-FO4 CC
fo4chain01 Icon Fo4 chain01 fo4chain02 Icon Fo4 chain02 fo4chain03 Icon Fo4 chain03
fo4cw Gametitle-FO4 CW fo4fh Gametitle-FO4 FH fo4gencard Icon Fo4 gen keycard
fo4holo Icon Fo4 holotape fo4key01 Icon Fo4 key01 fo4key02 Icon Fo4 key02
fo4key03 Icon Fo4 key03 fo4note Icon Fo4 note fo4nw Gametitle-FO4 NW
fo4vaultid Icon Fo4 vaultid fo4vr Gametitle-FO4VR fo4vw Gametitle-FO4 VW
fo4ww Gametitle-FO4 WW fo76 Gametitle-FO76 fo76ac Gametitle-FO76 AC
fo76fw Gametitle-FO76 FW fo76ib Gametitle-FO76 IB fo76ll Gametitle-FO76 Locked n Loaded
fo76lr Gametitle-FO76 LR fo76mi Gametitle-FO76MI fo76mz Gametitle-FO76
fo76nm Gametitle-FO76 NM fo76nt Gametitle-FO76 NT fo76nw Gametitle-FO76 NW
fo76ob Gametitle-FO76 OB fo76ow Gametitle-FO76 One Wasteland fo76sd Gametitle-FO76 Steel Dawn
fo76sr Gametitle-FO76 Steel Reign fo76sv Gametitle-FO76 SV fo76tm Gametitle-FO76 TM
fo76tp Gametitle-FO76 TP fo76wa Gametitle-FO76 WA fo76wl Gametitle-FO76 WL
fobos Gametitle-FOBOS fobos2 Gametitle-FOBOS2 fof Gametitle-FOF
food Fallout 76 Food Icon foodpr Icon fo4cw builder fool PV13
forpg Gametitle-2D20 forpgwoa Gametitle-2D20 fos Gametitle-FOS
foso Gametitle-FOSO fot Gametitle-FOT fot2 Gametitle-FOT2
fotv Title icon Fallout TV fow Gametitle-FOW foww Gametitle-FWW
fox Gametitle-FOX fpb Gametitle-FPB free ATX FREE
frost Icon effect fsbg Gametitle-FBG fww Gametitle-FWW
fwwrpg Gametitle-FWWRPG game FO76 ui roleplay team gamerscore Gamerscore
gas Icon gas gold Gold gold bullion Fo76 Icon Gold Bullion
green Icon green grenade FO76 iconwheel grenade group Icon group
gun Icon gun hate Hate healing Icon healing
healing rate Icon healing health Icon heart heart Icon heart
hp Icon heart image Icon image info Icon info
instagram Instagram icon int FO76 I ios Icon appleios
jes Gametitle-JES jury FO76 vaultboy licensedplumber 01 laser Icon laser
lck FO76 L legendary Icon legendary legendperk FO76 Perk coin
level Icon level lh Gametitle-LH like Like
limited YOU SHOULD BUY THIS limitedtime Icon limitedtime linkedin Linkedin icon
loc FO76 ui exploration team love Love lunchbox FO76 Lunchbox Icon
mac Icon mac macclassic Icon mac mag Icon mag
male Male-gender-sign melee Icon melee mentioned Icon mentioned
merchant FO76 ui trading team mine FO76 iconwheel minefrag mod Icon plus
mutate FO76 vaultboy dna mutation FO76 Mutation Icon myspace Myspace icon
neutral Icon neutral neutralface Neutral new ATX NEW
no Icon cross note Icon Fo4 note notrade Icon NoTrade
nukamix Icon Nuka-mixer station nw FO76NW Vault 51 icon optional Icon optional
pa Penny Arcade pail Icon FO76 mole miner pail parmorst Fo4 Power Work Icon
pbgame Fo4 Pip-Boy game pc Icon pc per FO76 P
percent FO76 ui roleplay team pistol FO76 iconwheel pistol plan FO76 Plan equipment
plasma Icon plasma platinum Plat poison Icon poison
poison2 Poison Icon possum FO76 Possum badge blue possum dark FO76 Possum badge
present FO76 Present Icon ps3 Icon ps3 ps3 dark Icon ps3 inverted
ps4 Icon ps4 publicworkshop Icon Public Workshop pv13 PV13
pve FO76 ui casual team pvp FO76 ui workshopraid team quest FO76 ui icon quest
question Icon question radiation Icon radiation radingestion FO76 Radiation icon custom
random FO76 ui roleplay team range Icon range rarity Icon rarity
ratio Icon ratio red Icon red repair FO76 ui workshop team
repeat Icon repeat required Icon required rifle Icon rifle
robotwb Icon robot workbench score FO76 scoresprite seasons scout FO76 Pioneer Scouts
scrip FO76 Scrip season FO76 scoresprite seasons seasonal FO76 Quest Old Man Winter
semi Icon semi-required semi-required Icon semi-required sequence Icon sequence
shieldbronze Icon shield bronze shieldgold Icon shield gold shieldsilver Icon shield silver
shotgun Icon shotgun sic Icon sic silver Silver
smg Icon smg soda FO76 Soda Icon sound Icon sound
spawn Icon spawn spooky FO76 candyBowl MapIcon spread Icon spread
stamp SCORE Currency Stamps star Icon legendary stimpak FO76 Stimpak Icon
str FO76 S survival FO76 icon roadmap survival switch Nintendo Switch icon
tadpole FO76 Tadpole badge blue tadpole dark FO76 Tadpole badge tar Gametitle-TAR
tea FO76 Drink Tea Icon temp Icon check temp text Icon text
ticket Icon tickets torn Gametitle-TORN tumblr Tumblr Icon
twitch Twitch icon twitter Twitter icon unarmed Icon unarmed
unlock FO76 icon unlock unused Icon unused upcoming Mbox upcoming
v76 FO76 Vault 76 icon vaultraid Vault Raids vaulttec Icon vaulttec
vb Gametitle-VB vt Icon vaulttec weapwb Fo4 Weapon Work Icon
weight FO76 icon weight wiki Gametitle-Wiki wild wasteland Icon wildwasteland
windows Icon windows workshop Icon workshop ww Icon wildwasteland
xbox360 Icon xbox360 xboxone Icon xboxone xp Icon XP
yes Icon check

In addition, all abbreviations supported by {{Abb}} can be used to produce an icon for the corresponding game.


local p = {}
local util = require( 'Module:Util' )
--[[
	Icon data is now stored on the sub page /data to seperate functional code
	for the dataset users will often need to update. This reduces the risk of
	breaking the code by entering data in the wrong place and makes it easier to
	manage the code itself by not having to pass through the large dataset at 
	the top.
]]

require( 'Module:Icons/data' ) 

local iconSize = {
    --[[
        All sizes are controlled on the height to ensure a string of icons maintain 
        a consistent line height
    ]]
    ["small"]           = "x10px",
    ["medium"]          = "x14px",
    ["normal"]          = "x14px",
    ["big"]             = "x20px",
}

--[[ 28/Oct/2021 Added class control table to array as to handle light/dark 
	themes. This was originally put into the frontend template, when class
	handling should be back end. Adding the ['class'] = 'light' or 
	['class'] = 'dark' parameter to a icon's dataset on /data will enable it to
	access a class if needed.
	]]

--[[ 08/Nov/2021 Remove the class definition as to be able to just pass straight through
local class = {
	['light'] = 'lighticon',
	['dark'] = 'darkicon',
	['general'] = 'generalicon'
}
]]

function _generate(iconList, iconSetting, iconLinks, tipOverride, iconClass, iconSize)
    if util.exists(iconSetting)  then 
    	iconSetting = util.trim(iconSetting)
        if util.exists(iconSize[iconSetting]) then
            iconSetting = iconSize[iconSetting]
        end
    else
        iconSetting = iconSize["medium"]
    end
    -- This is for calls from other Lua modules as the above will result in nil
    if util.exists(iconSetting) == false then
    	if util.exists(iconSize) then
			iconSetting = iconSize
		else
			iconSetting = 'x14px'
		end
    end
    
    if util.exists(iconLinks) then
        iconLinks = mw.text.split(iconLinks, ",")
    end
        
    if util.exists(tipOverride) then
        tipOverride = mw.text.split(tipOverride, ",")
    end
    
    if util.exists(iconClass)then
    	iconClass = "|class=" .. tostring(iconClass);
    else
    	iconClass = ""
    end

    local result = ""

    for k, v in ipairs(iconList) do
        newIcon = iconData[util.trim(v)]
        if util.exists(newIcon) then
            currentIcon = newIcon.icon
            if util.exists(tipOverride, k) then
                currentTip = tipOverride[k]
            else
                if util.exists(iconLinks, k) then
                    currentTip = iconLinks[k]
                else
                    currentTip = newIcon.tip
                end
            end
        else
            currentIcon = "Icon question.png"
            currentTip = "Unrecognized icon name"
            result = result .. "[[Category:Modules with invalid parameters]]"
        end
        
        --Create wikitext icon
		dataLine = '[[File:' .. currentIcon .. '|' .. iconSetting
        if util.exists(iconLinks, k) then
            dataLine = dataLine .. '|link=' .. iconLinks[k]
        else
            dataLine = dataLine .. '|link='
        end
        if currentTip ~= nil then
            dataLine = dataLine .. '|' .. currentTip
        end

        dataLine = dataLine .. iconClass .. ']]'

		createTip = mw.html.create('span')
        	createTip:addClass( 'va-icon' )
        	:attr('title', currentTip)
        	:wikitext(dataLine)
        result = result .. tostring(createTip)
        
        if k < table.getn(iconList) then
        	result = result .. " "
        end
    end
    
    return result
end

-- Calls from other modules
function p.innerIcon(iconList, iconSetting, iconLinks, tipOverride, iconClass, iconSize)
	iconList = mw.text.split(iconList, ',')
	return _generate(iconList, iconSetting, iconLinks, tipOverride, iconClass, iconSize)
end

function p.Icons(frame) 
	--[[All icons are now lower case to reduce script errors from 
	incorrectly entering the icon code in a different case to the list]]
    local iconList = mw.text.split(string.lower(frame.args[1]), ",")
    local iconSetting = frame.args[2]
    local iconLinks = frame.args[3]
    local tipOverride = frame.args[4]
    local iconClass = frame.args[5]	
	local iconSize = {
    	--[[
    	    All sizes are controlled on the height to ensure a string of icons maintain 
	        a consistent line height
    	]]
    	["small"]           = "x10px",
    	["medium"]          = "x14px",
    	["normal"]          = "x14px",
    	["big"]             = "x20px"
	}
    return _generate(iconList, iconSetting, iconLinks, tipOverride, iconClass, iconSize)    
end

function p.platforms(frame)
	--[[All icons are now lower case to reduce script errors from 
	incorrectly entering the icon code in a different case to the list]]
    local icons = mw.text.split(string.lower(frame.args[1]), ",")
    local result = ""
    
    for k, v in ipairs(icons) do
        currentIcon = iconData[util.trim(v)]
        
        if util.exists(currentIcon, 'platform') == true then
        	
            createSM = mw.html.create('span')
            	createSM:css('display', 'none')
            	:wikitext('[[Has platform::' .. currentIcon.tip .. ']]')
            	:allDone()
            createPlatform = mw.html.create('span')
            	if (util.exists(currentIcon.class)) then
			    	iconClass = "|class=" .. tostring(currentIcon.class);
			    else
			    	iconClass = ""
			    end
            	createPlatform:addClass('va-icon')
            		:attr('title', currentIcon.tip)
            		:wikitext('[[File:' 
            			.. currentIcon.icon 
            			.. '|alt='
            			.. currentIcon.tip
            			.. '|x14px|link='
            			.. iconClass..']]')
            		:allDone()
            if (util.exists(iconData[util.trim(v)..' dark'])) then
            	currentDarkIcon = iconData[util.trim(v)..' dark']
            	createPlatformDark = mw.html.create('span')
            	if (util.exists(currentDarkIcon.class)) then
			    	iconClass = "|class=" .. tostring(currentDarkIcon.class);
			    else
			    	iconClass = ""
			    end
            	createPlatformDark:addClass('va-icon')
            		:attr('title', currentDarkIcon.tip)
            		:wikitext('[[File:' 
            			.. currentDarkIcon.icon 
            			.. '|alt='
            			.. currentDarkIcon.tip
            			.. '|x14px|link='
            			.. iconClass..']]')
            		:allDone()
            	createPlatform = tostring(createPlatform)..tostring(createPlatformDark)
            end
            	--[[ Uncommenting tostring(createSM) below will enable 
            	Semantic Mediawiki data tracking]]
            	result = result .. tostring(createSM) 
            			.. tostring(createPlatform)
            if k < table.getn(icons) then
                result = result .. " "
            end
        end
    end
    if result == '' then
        result = '<sup>[Platforms needed]</sup>[[Category:Platforms needed]]'
    end
    
    return result
end    

function p.documentation()
    keys = {}
    for k in pairs(iconData) do
        table.insert(keys, k)
    end
 
    table.sort(keys)
    result = '{| class="va-table va-table-full"\n|-\n !prefix!!Icon!!prefix!!Icon!!prefix!!Icon\n|-\n'
    set = 1
    for k,v in ipairs(keys) do
		i = iconData[v]
        result = result .. "||'''" .. v .. "'''"
        if util.exists(i) == true and i.class ~= nil then
        	newFile = mw.html.create(span)
        		--:addClass(class[i.class])
        		:wikitext('[[File:' .. iconData[v].icon .. '|25px]]')
        else
        	newFile = mw.html.create(span)
        		:wikitext('[[File:' .. iconData[v].icon .. '|25px]]')
        end
        result = result .. '||' .. tostring(newFile)
 
        if set == 3 then
            result = result .. '\n|-\n'
        end
 
        if set < 3 then
            set = set + 1
        else
            set = 1
        end
    end
 
    result = result .. '\n|}'
 
    return result
end

function p.Test(frame) 
	--Please empty when done debugging so other users know it is free to use

end

return p
Advertisement