이 모듈에 대한 설명문서는 모듈:TFTTraitData/설명문서에서 만들 수 있습니다

-- <pre>
local p         = {}
local lib       = require('Module:Feature')
local Md		= require('Module:Maintenance data')
local get		= require('Module:TFTTraitData/getter')
local getItem	= require("Module:TFTItemData/getter")

--Auxiliary function
function replace_final(string_char, search, replace)
    local reverse_ = string.reverse(string_char)
    local search_reverse = string.reverse(search)
    local replace_reverse = string.reverse(replace)

    -- Replaces only the first instance found (which is actually the last of the original string)
    local result_reverse = string.gsub(reverse_, search_reverse, replace_reverse, 1)

    -- Reverse the chain to obtain the final result
    return string.reverse(result_reverse)
end

function p.getset(frame)
	local args = lib.frameArguments(frame)
	args['item']     = args['item']     or args[1]
	args['set']      = args['set']		or args[2]
	local result = getItem['set'](args['item'], args['set'])
	if result == "Current" then
		return Md['main']{'TFTSet'}
	else
		return result
	end
end

function p.getItem(frame)
    local args = lib.frameArguments(frame)
    
    args['item']     = args['item']     or args[1]
    args['datatype'] = args['datatype'] or args[2]
    args['output']   = args['output']   or args[3] or nil
    
    args['set']	= p.getset{args['item'], args['set']}
    if tostring(args['set']) == tostring(Md['main']{'TFTSet'}) then args['set'] = "Current" end
	
	local result = getItem[args['datatype']](args['item'], args['set'], args['additionalparameter'] or "")
	
	if args['output'] ~= nil and type(result) == "table" then
        if(args["index"]) then
            local i = tonumber(args["index"])
            if(result[i]) then 
                return frame:preprocess(result[i])
            else
                return ""
            end
        end
        if args['output'] == "csv" then
            return lib.tbl_concat{result}
        elseif args['output'] == "custom" then 
            return frame:preprocess(lib.tbl_concat{result, prepend = args['prepend'], append = args['append'], separator = args['separator'], index = args["index"]})
        elseif args['output'] == "template" then 
            return frame:preprocess(lib.tbl_concat{result, prepend = "{{" .. (args['t_name'] or "TFT item") .. "|", append = "}}", separator = args['separator']})
        end
    elseif type(result) == "string" then
        return frame:preprocess(result)
    else
        return result
    end
end

function p.get(frame)
    local args = lib.frameArguments(frame)
    
    args['traitname'] = args['traitname']	or args[1]
    args['set']       = tonumber(args['set']) or tonumber(args[2])
    args['datatype']  = args['datatype']	or args[3]
    
    -- Fixing Tooltip/TFT/Trait issue due to the page always capturing the {{{1}}}} value as '<trait name> (Teamfight Tactics)'
    if args['traitname']:find(" %(Teamfight Tactics%)") then
    	args['traitname'] = args['traitname']:gsub(" %(Teamfight Tactics%)", "")
	end
    
    local result = get[args['datatype']](args['traitname'], args['set'])
    
    if (args['datatype'] == "innate" or args['datatype'] == "synergy") and result ~= nil then
        if args['datatype'] == "synergy" then
            result = result .. synergy(args['traitname'], args['set'])
        end
        
        return frame:preprocess(result)
    elseif result == nil then
        return ""
    else
        return result
    end
end

-- wrapper template Template:Teamfight_Tactics/Champions
function p.getTraits(frame)
    local args = lib.frameArguments(frame)
    
    local IL         = require('Module:ImageLink')
    local datatable  = require('Module:TFTTraitData/data')
    local cmd        = require('Module:Maintenance data')
    local traittable = {}
    local result     = ""
    
    args['type'] = args['type']          or args[1] 
    args['set']  = tonumber(args['set']) or tonumber(args[2]) or tonumber(cmd.main{'TFTSet'})
    
    for trait in pairs(datatable) do
        if datatable[trait][args['set']] and datatable[trait][args['set']]['type'] == args['type'] then
            table.insert(traittable, trait)
        end
    end
    table.sort(traittable)
    
    for _, trait in pairs(traittable) do
    	local temp = {
            ['trait']    = trait,
            ['set']      = args['set'],
            ['image']	 = get['icon'](args[trait], args['set']),
            ['size']     = 46,
            ['text']     = '*none*',
            ['display']  = 'inline-block',
            ['border']   = 'false'
        }
        if get['icon'](datatable[trait][args['set']]['icon'], args['set']) ~= nil then
        	temp['image'] = get['icon'](datatable[trait][args['set']]['icon'], args['set'])
    	elseif datatable[trait][args['set']]['icon'] ~= nil then temp['image'] = datatable[trait][args['set']]['icon']
    	end
        result = result .. tostring(IL.TFTtrait(temp))
    end
    
    return result
end

-- wrapper template Template:TFT_champion_synergy
function p.championSynergy(frame)
    local args		= lib.frameArguments(frame)
    
    local TU		= require('Module:TFTUnitData')
    local s			= ''
    
    args['champion'] = args['champion']      or args[1]
    args['set']      = tonumber(args['set']) or tonumber(args[2])
    
    local origintable = TU.get{args['champion'], args['set'], "origin"}
    local classtable  = TU.get{args['champion'], args['set'], "class"}
    
    for _, originname in pairs(origintable) do
        s = s .. p.championSynergyTable{["traitname"] = originname, ["set"] = args['set'], ["champion"] = args['champion']}
    end
    
    for _, classname in pairs(classtable) do
        s = s .. p.championSynergyTable{["traitname"] = classname, ["set"] = args['set'], ["champion"] = args['champion']}
    end
    
    return s
end
-- wrapper template Template:TFT_synergy_only
function p.synergyOnly(frame)
    local args      = lib.mergeArguments(frame)
    local builder   = require("Module:SimpleHTMLBuilder")
    local datatable = require('Module:TFTTraitData/data')
    local IL		= require('Module:ImageLink')
    
    local list = builder.create('table')
    
    args['set']  = tonumber(args['set']) or tonumber(args[1])
    args['type'] = args['type']          or args[2]
    
    list
        :addClass('sortable article-table sticky-header')
        :css('width', '100%')
        :css('text-align', 'left')
        :newline()
        
        --TABLE HEADER    
        :tag('tr')
            :tag('th')
                :wikitext(args['type'])
            :done()
            :tag('th')
                :wikitext('Effect')
                :addClass('unsortable')
            :done()
        :done()
        :newline()
        
        -- TABLE ENTRIES
        local traittable = {}
        
        for traitname in pairs(datatable) do
            if datatable[traitname][args['set']] ~= nil and datatable[traitname][args['set']]['type'] == args['type'] then
                table.insert(traittable, traitname)
            end
        end
        table.sort(traittable)
        
        for _, traitname in pairs(traittable) do
            local listentry = builder.create('tr')
            
            -- Trait
            listentry
                :tag('td')
                    :attr('data-sort-value', traitname)
                    :wikitext(tostring(IL.TFTtrait{
                        ['trait']	= traitname,
                        ['set']		= args['set'] or tonumber(args[1]),
                        ['image']	= get['icon'](traitname, args['set']) or get['icon'](traitname, tonumber(args[1])),
                        ['border']	= 'false',
                    }))
                :done()
            
            -- Effect
            listentry
                :tag('td')
                    :wikitext(datatable[traitname][args['set']]['synergy'] .. synergy(traitname, args['set']))
                :done()
            
            list
                :node(listentry)
                :newline()
        end
        -- TABLE END
    
    list:allDone()
    return frame:preprocess(tostring(list))
end
-- wrapper template Template:TFT_Group
function p.championSynergyTable(frame)
    local args = lib.frameArguments(frame)
        
    local datatable  = require('Module:TFTTraitData/data')
    local IL         = require('Module:ImageLink')
    local builder    = require("Module:SimpleHTMLBuilder")
    local TU         = require('Module:TFTUnitData')
    local lang       = mw.language.new("en")
    local table      = builder.create('table')
    
    args['traitname'] = args['traitname']     or args[1]
    args['set']       = tonumber(args['set']) or tonumber(args[2])
    
    -- TABLE START
    table
        :addClass('article-table')
        :css('width', '50%')
        :css('text-align', 'center')
        :newline()
    
    -- TABLE HEAD
    table
        :tag('th')
            :attr('colspan', '2')
            :css('text-align', 'center')
            :wikitext(tostring(IL.TFTtrait{
                ['trait']   = args['traitname'],
                ['set']     = args['set'] or tonumber(args[2]),
                ['image']	= get['icon'](args['traitname'], args['set']) or get['icon'](args[1], tonumber(args[2])),
                ['border']  = 'false',
            }))
        :done()
    
    -- TABLE ENTRY
    local tableEntry = builder.create('tr')
    local roster  = TU.getGroup({
        ['synergy'] = args['traitname'],
        ['set'] = args['set'],
        ['count'] = 'true',
        ['display'] = 'inline-block',
        ['champion'] = args['champion']
    })
    
    if datatable[args['traitname']] and datatable[args['traitname']][args['set']]['item'] then
        tableEntry
            :tag('td')
                :wikitext(roster)
            :done()
            :tag('td')
                :css('width', '10%')
                :wikitext(tostring(IL.TFTitem{
                    ['item']	= datatable[args['traitname']][args['set']]['item'],
                    ['set']		= args['set'] or tonumber(args[2]),
                    ['image']	= getItem['icon'](get['item'](args['traitname'], tonumber(args['set'])), tostring(args['set'])) or getItem['icon'](get['item'](args[1], tonumber(args[2])), tostring(args[2])),
                    ['size']	= 46,
                    ['text']	= "*none*"
                }))
            :done()
    else
        tableEntry
            :tag('td')
                :attr('colspan', '2')
                :wikitext(roster)
            :done()
    end
    table
        :node(tableEntry)
        :newline()
    
    -- TABLE END
    table:allDone()
    
    return tostring(table)
end

-- wrapper template Template:TFT_synergy_list
function p.synergyList(frame)
    local args		= lib.mergeArguments(frame)
    local lang		= mw.language.new("en")
    local IL		= require('Module:ImageLink')
    local builder	= require("Module:SimpleHTMLBuilder")
    local TU		= require('Module:TFTUnitData')
    
    local list = builder.create('table')
    
    args['set']  = tonumber(args['set']) or tonumber(args[1])
    args['type'] = args['type']          or args[2]
    
    list
        :addClass('sortable article-table sticky-header')
        :css('width', '100%')
        :css('text-align', 'left')
        :newline()
        
        --TABLE HEADER    
        :tag('tr')
            :tag('th')
                :wikitext(args['type'])
            :done()
            :tag('th')
                :wikitext('Effect')
                :addClass('unsortable')
            :done()
            :tag('th')
                :css('width', '146px')
                :wikitext('Champions')
            :done()
            :tag('th')
                :wikitext('Items')
            :done()
        :done()
        :newline()
        
        
        -- TABLE ENTRIES
        local datatable  = require('Module:TFTTraitData/data')
        local traittable = {}
        
        for traitname in pairs(datatable) do
            if datatable[traitname][args['set']] ~= nil and datatable[traitname][args['set']]['type'] == args['type'] then
                table.insert(traittable, traitname)
            end
        end
        table.sort(traittable)
        
        for _, traitname in pairs(traittable) do
            local listentry = builder.create('tr')
            
            -- Trait
            listentry
                :tag('td')
                    :attr('data-sort-value', traitname)
                    :wikitext(tostring(IL.TFTtrait{
                        ['trait']	= traitname,
                        ['set']		= args['set'] or tonumber(args[1]),
                        ['image']	= get['icon'](traitname, args['set']) or get['icon'](traitname, tonumber(args[1])),
                        ['border']	= 'false',
                    }))
                :done()
            
            -- Effect
            listentry
                :tag('td')
                    :wikitext(datatable[traitname][args['set']]['synergy'] .. synergy(traitname, args['set']))
                :done()
            
            -- Champions
            local roster, count = TU.getGroup({
                        ['synergy'] = traitname,
                        ['set']     = args['set'],
                        ['count']   = 'true',
                        ['display'] = 'inline-block'
                    })
            listentry
                :tag('td')
                    :attr('data-sort-value', count)
                    :wikitext(roster)
                :done()
            
            -- Items

            if datatable[traitname][args['set']]['item'] then 
                listentry
                    :tag('td')
                        :attr('data-sort-value', datatable[traitname][args['set']]['item'])
                        :wikitext(tostring(IL.TFTitem{
                            ['item']	= datatable[traitname][args['set']]['item'],
                            ['set']		= args['set'] or Md['main']{'TFTSet'},
                            ['image']	= getItem['icon'](get['item'](traitname, tonumber(args['set'])), tostring(args['set'])) or getItem['icon'](get['item'](traitname, tonumber(args[1])), tostring(args[1])),
                            ['size']	= 46,
                            ['text']	= "*none*"
                        }))
                    :done()
            else
                listentry
                    :tag('td')
                    :done()
            end
            
            list
                :node(listentry)
                :newline()
        end
        -- TABLE END
    
    list:allDone()
    return frame:preprocess(tostring(list))
end

-- LOCAL FUNCTONS
function synergy(traitname, set)
    local result = ''
    local levels = get['levels'](traitname, set)
    
    if levels ~= nil then
        local sortedlevels = lib.getSortedKeys(levels)
        
        local levelcount = 0;
        local levelicons = {}
        
        for level in pairs(levels) do
            levelcount = levelcount + 1
        end

        local diamondtrait = get['diamondtrait'](traitname, set)
        
        if levelcount == 1 then
        	if (traitname == "Supers" and (set == 8 or set == 8.5)) then
        		levelicons = {'gold'}
        	end
        elseif levelcount >= 2 then
            if levelcount == 2 then
                if diamondtrait then
                	if set == 11.1 then
                    	levelicons = {'bronze', 'diamond'}
                    else
                		levelicons = {'gold', 'diamond'}
            		end
                elseif (traitname == "Exalted" and set == 11) then
                	levelicons = {'silver', 'gold'}
                else
                    levelicons = {'bronze', 'gold'}
                end
            elseif levelcount == 3 then
                if ((traitname == "Cloud" or traitname == "Steel") and set == 2) or (traitname == "Abomination" and set == 5) then
                    levelicons = {'silver', 'gold', 'diamond'}
                elseif diamondtrait then
                    levelicons = {'bronze', 'gold', 'diamond'}
                else
                    levelicons = {'bronze', 'silver', 'gold'}
                end
            elseif (levelcount == 5 and ((traitname == "Dragon") and set == 7.5)) then
            	-- Dragons Set 7.5
                levelicons = {'bronze', 'silver', 'silver', 'silver', 'gold'}
            elseif (levelcount == 5 and ((traitname == "Slayer") and set == 9)) then
            	-- Slayer Set 9
                levelicons = {'bronze', 'silver', 'gold', 'gold', 'diamond'}
            elseif (levelcount == 5 and ((traitname == "Cavalier") and set == 7.5)) then
            	-- Cavalier Set 7.5
            	if diamondtrait then
                	levelicons = {'bronze', 'silver', 'silver', 'gold', 'diamond'}
            	else
                    levelicons = {'bronze', 'silver', 'silver', 'gold', 'gold'}
                end
            elseif levelcount == 6 then
            	-- Guild Set 7 and Heavenly Set 11
            	levelicons = {'bronze', 'bronze', 'silver', 'silver', 'gold', 'diamond'}

            elseif levelcount == 8 then
            	-- Guild Set 7.5
            	levelicons = {'bronze', 'bronze', 'bronze', 'silver', 'silver', 'silver', 'gold', 'diamond'}
            else
                levelicons = {'bronze', 'silver', 'gold', 'diamond'}
            end
            
            result = result .. '<ul>'
            local levelunique = get['levelunique'](traitname, set)
            local pluraltrait = get['pluraltrait'](traitname, set)
            
            for index, level in pairs(sortedlevels) do
                local traittext = ''
                local levelcontent = levels[index]
                local levelindex = sortedlevels[index]
                if levelunique then
                    traittext = 'Exactly ' .. levelindex .. ' type'
                    if levelindex >= 2 then
                        traittext = traittext .. 's'
                    end
                    traittext = traittext .. ' of ' .. traitname
                else 
					traittext = levelindex .. ' '
					if pluraltrait ~= nil and levelindex >= 2 then
						traittext = traittext .. pluraltrait
					elseif levelindex >= 2 then
                		if string.sub(traitname, -2) == "ss" or string.sub(traitname, -1) == "x" or string.sub(traitname, -2) == "ch" or string.sub(traitname, -2) == "sh" then
                        	traittext = traittext .. traitname .. 'es'
                    	elseif string.sub(traitname, -1) == "y" and not (string.sub(traitname, -2) == "ay" or string.sub(traitname, -2) == "ey" or string.sub(traitname, -2) == "iy" or string.sub(traitname, -2) == "oy" or string.sub(traitname, -2) == "uy") then
                        	traittext = traittext .. replace_final(traitname, "y", "ies")
                    	elseif string.sub(traitname, -2) == "ay" or string.sub(traitname, -2) == "ey" or string.sub(traitname, -2) == "iy" or string.sub(traitname, -2) == "oy" or string.sub(traitname, -2) == "uy" then
                    		traittext = traittext .. traitname .. 's'
                    	elseif string.sub(traitname, -2) == "ao" or string.sub(traitname, -2) == "eo" or string.sub(traitname, -2) == "io" or string.sub(traitname, -2) == "oo" or string.sub(traitname, -2) == "uo" then
                    		traittext = traittext .. traitname .. 's'
                    	elseif (string.sub(traitname, -1) == "o" or string.sub(traitname, -3) == "ato") and not (string.sub(traitname, -2) == "ao" or string.sub(traitname, -2) == "eo" or string.sub(traitname, -2) == "io" or string.sub(traitname, -2) == "oo" or string.sub(traitname, -2) == "uo" or string.sub(traitname, -2) == "no" or string.sub(traitname, -2) == "co" or string.sub(traitname, -2) == "to") then
                    		traittext = traittext .. traitname .. 'es'
                    	elseif string.sub(traitname, -2) == "ff" then
                    		traittext = traittext .. traitname .. 's'
                    	elseif string.sub(traitname, -2) == "fe" then
                    		traittext = traittext .. replace_final(traitname, "fe", "ves")
                		elseif (string.sub(traitname, -2) == "af" or string.sub(traitname, -2) == "ef" or string.sub(traitname, -2) == "if" or string.sub(traitname, -2) == "of" or string.sub(traitname, -2) == "uf") and not (traitname == "chef") then
                    		traittext = traittext .. replace_final(traitname, "f", "ves")
                        else
                    		traittext = traittext .. traitname .. 's'
                    	end
                    else
                    	if pluraltrait ~= nil and string.sub(pluraltrait, -2) == 'es' then
							traittext = traittext .. replace_final(pluraltrait, "es", "")
                    	elseif (pluraltrait ~= nil and string.sub(pluraltrait, -1) == 's') and not (pluraltrait == "The Boss") then
							traittext = traittext .. replace_final(pluraltrait, "s", "")
                    	elseif pluraltrait ~= nil and pluraltrait == "The Boss" then
							traittext = traittext .. pluraltrait
						else
                    		traittext = traittext .. traitname
						end
                	end
            	end
                
                result = result .. '<li>[[File:' .. traitname .. ' TFT ' .. levelicons[index] .. ' icon.png|20px|link=]] ' .. traittext .. ': ' .. levels[levelindex] .. '</li>'
            end
            
            result = result .. '</ul>'
        end
    end  
    
    return result
end

return p

-- </pre>
-- [[Category:Lua]]