Die Dokumentation für dieses Modul kann unter Modul:ChampionData/Doku erstellt werden

-- <pre>
local p = {}
 
local lib       = require('Module:Feature')
local json      = require('Module:JSON')
local userError = require('Dev:User error')
local FN        = require('Module:Filename')

local statsdata = {
    ["hp_base"]      = "hp",
    ["hp_lvl"]       = "hpperlevel",
    ["res_base"]     = "res",
    ["res_lvl"]      = "resperlevel",
    ["ms"]           = "movespeed",
    ["armor_base"]   = "armor",
    ["armor_lvl"]    = "armorperlevel",
    ["mr_base"]      = "spellblock",
    ["mr_lvl"]       = "spellblockperlevel",
    ["range"]        = "attackrange",
    ["hp5_base"]     = "hpregen",
    ["hp5_lvl"]      = "hpregenperlevel",
    ["res5_base"]    = "resregen",
    ["res5_lvl"]     = "resregenperlevel",
    ["ad_base"]      = "attackdamage",
    ["ad_lvl"]       = "attackdamageperlevel",
    ["as_lvl"]       = "attackspeedperlevel",
    ["as_lvl1"]      = "attackspeed"
}

function p.get(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    local get       = require ('Module:ChampionData/getter')
    local champname = args['champname'] or args[1]
    local datatype  = args['datatype']  or args[2]
    local output    = args['output']    or args[3] or nil
    local result
    
    if champname == "anzahl_champions" or datatype == "anzahl_champions" then
        return get.anzahl_champions()
    end
    
    champname = lib.validateName(champname) --corrects for acceptable misspellings (e.g. Nunu -> Nunu & Willump)
    
    if champname == "Rhaast" or champname == "Schattenassassine" then
        result = (get[datatype](champname) or get[datatype]("Kayn"))
    elseif champname == "Mega-Gnar" then
        result = get[datatype](champname) or get[datatype]("Gnar")
    else
        result = get[datatype](champname)
    end
    
    if output ~= nil and type(result) == "table" then
        if output == "csv" then
            return lib.tbl_concat{result}
        elseif output == "custom" then 
            return frame:preprocess(lib.tbl_concat{result, prepend = args['prepend'], append = args['append'], separator = args['separator'], index = args["index"]})
        elseif output == "template" then 
            return frame:preprocess(lib.tbl_concat{result, prepend = "{{" .. args['t_name'] .. "|", append = "}}", separator = args['separator']})
        end
    elseif result == nil then
        return ""
    else
        return result
    end
end

function p.getRoster()
    local lolData  = mw.loadData('Module:ChampionData/data')
    --local tftData  = require('Module:TFTUnitData')
    local lolTable = {}
    local s        = {}
    
    for champname in pairs(lolData) do
        if  
            lolData[champname]["date"] == ("Kommend" or "N/A" or "Verworfen" or "")
            or 
            champname == "Mega-Gnar" or champname == "Rhaast" or champname == "Schattenassassine" or champname == "Kled & Skaarl"
            then
            --ignore champion
        else
            table.insert(lolTable, champname)
        end
            
    end
    table.sort(lolTable)
    
    for key, champion in pairs(lolTable) do
        
        --custom searches
        local search = champion
        
        if lolData[champion]["title"]    then search = search .. "," .. lolData[champion]["title"]    end
        if lolData[champion]["fullname"] then search = search .. "," .. lolData[champion]["fullname"] end
        if lolData[champion]["nickname"] then search = search .. "," .. lolData[champion]["nickname"] end
        
        --game titles
        local games = "LOL" 
        
        --if tftData.checkRoster{champion} then 
          --  games = games .. ",TFT," .. tftData.getTooltipSets{champion}
        --end
        
        --champion roles
        local role = p.mainrole{champname=champion} .. "," .. p.get{champion, "role", "csv"}
        local rangetype = lolData[champion]["rangetype"]
        s[key] = mw.ustring.format('<span class="grid-icon character-icon" data-character="%s" data-search="%s" data-game="%s" data-role="%s" data-type="%s">[[File:%s|56px|alt=%s|link=%s]]</span>',
        	champion, search, games, role, rangetype, FN.championcircle{champion}, champion, champion)
    end
    
    return table.concat(s)
end

function p.statTable(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    local _stat     = args[1]
    local lolData   = mw.loadData('Modul:ChampionData/data')
    local lolTable  = require('Modul:ChampionData/getter').sortedList()
    local tablenode = mw.html.create('table')
    
    local convert   = {
        ["Health"]          = "hp",
        ["Health regen"]    = "hp5",
        ["Mana"]            = "res",
        ["Mana regen"]      = "res5",
        ["Armor"]           = "armor",
        ["Magic resist"]    = "mr",
        ["Attack damage"]   = "ad",
        ["Move speed"]      = "ms",
        ["Attack speed"]    = "as"
    }
    if _stat == "Base" then
        tablenode
            :addClass('sortable wikitable sticky-header')
            :css('width', '100%')
            :css('text-align', 'right')
            :css('white-space', 'nowrap')
            :newline()
    elseif _stat == "Base 18" then
        tablenode
            :addClass('sortable wikitable sticky-header')
            :css('width', '100%')
            :css('text-align', 'center')
            :css('white-space', 'nowrap')
            :tag('caption')
                :wikitext('Championgrundwerte auf Stufe 18')
            :done()
            :newline()
    elseif _stat == "Manalos" then
        tablenode
            :addClass('sortable wikitable')
            :css('width', '90%')
            :css('text-align', 'center')
            :css('white-space', 'nowrap')
            :css('margin-left', '5%')
            :newline()
    elseif _stat == "Bewertungen" then
        tablenode
            :addClass('sortable article-table sticky-header')
            :css('width', '100%')
            :css('text-align', 'center')
            :css('white-space', 'nowrap')
            :newline()
    else
    tablenode
        :addClass('sortable article-table sticky-header')
        :css('width', '100%')
        :css('text-align', 'center')
        :newline()
    end
    if _stat == "Attack speed" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Grundwert')
                :done()
                :tag('th')
                    :wikitext('Skalierung')
                :done()
                :tag('th')
                    :wikitext('Bonus-AS auf Stufe 1')
                :done()
                :tag('th')
                    :wikitext('Bonus-Wachstums-Koeffizient')
                :done()
                :tag('th')
                    :wikitext('Bonus auf Stufe 18')
                :done()
                :tag('th')
                    :wikitext('Wert auf Stufe 18')
                :done()
                :tag('th')
                    :wikitext('Zusätzliches AS benötigt, um Deckel auf Stufe 18 zu erreichen')
                :done()
            :done()
            :newline()
    elseif _stat == "Basic attack" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Angriffsreichweite')
                :done()
                :tag('th')
                    :wikitext('Reichweitentyp')
                :done()
                :tag('th')
                    :wikitext('Projektilgeschwindigkeit')
                :done()
                :tag('th')
                    :wikitext('Aufbauzeit')
                :done()
                :tag('th')
                    :wikitext('Aufbauzeit-Modifizierung')
                :done()
            :done()
            :newline()
    elseif _stat == "Hitbox" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Gameplayradius')
                :done()
                :tag('th')
                    :wikitext('Auswahlradius')
                :done()
                :tag('th')
                    :wikitext('Navigationsradius')
                :done()
                :tag('th')
                    :wikitext('Akquisitionsradius')
                :done()
            :done()
            :newline()
    elseif _stat == "Base" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('[[Champion]]s')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Leben|HP]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('HP+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Lebensregeneration|HP5]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('HP5+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Mana|MP]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('MP+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Manaregeneration|MP5]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('MP5+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Angriffsschaden|AD]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('AD+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Angriffstempo|AS]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('AS+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Rüstung|AR]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('AR+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Magieresistenz|MR]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('MR+')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Lauftempo|MS]]')
                    :css('width', '4em')
                :done()
                :tag('th')
                    :attr('data-sort-key', 'number')
                    :wikitext('[[Reichweite]]')
                    :css('width', '4em')
                :done()
            :done()
            :newline()
    elseif _stat == "Base 18" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('color', 'black')
                    :css('background-color', 'white')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('HP')
                    :css('color', 'black')
                    :css('background-color', 'lightgreen')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('HP5')
                    :css('color', 'black')
                    :css('background-color', 'lightgreen')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('MP')
                    :css('color', 'black')
                    :css('background-color', 'lightblue')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('MP5')
                    :css('color', 'black')
                    :css('background-color', 'lightblue')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('AD')
                    :css('color', 'black')
                    :css('background-color', '#ffaaaa')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('AS')
                    :css('color', 'black')
                    :css('background-color', '#ffaaaa')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('AR')
                    :css('color', 'black')
                    :css('background-color', '#ffffaa')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('MR')
                    :css('color', 'black')
                    :css('background-color', '#ffffaa')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('Reichweite')
                :done()
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('MS')
                :done()
            :done()
            :newline()
    elseif _stat == "Manalos" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                :done()
                :tag('th')
                    :wikitext('Sekundäre Ressource')
                :done()
            :done()
            :newline()
    elseif _stat == "Bewertungen" then
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                :done()
                :tag('th')
                    :wikitext('Primär')
                :done()
                :tag('th')
                    :wikitext('Sekundär')
                :done()
                :tag('th')
                    :wikitext('[[File:Damage rating.png|15px|link=]]')
                :done()
                :tag('th')
                    :wikitext('[[File:Toughness rating.png|15px|link=]]')
                :done()
                :tag('th')
                    :wikitext('[[File:Control rating.png|15px|link=]]')
                :done()
                :tag('th')
                    :wikitext('[[File:Mobility rating.png|15px|link=]]')
                :done()
                :tag('th')
                    :wikitext('[[File:Utility rating.png|15px|link=]]')
                :done()
                :tag('th')
                    :wikitext('Stil')
                :done()
                :tag('th')
                    :wikitext(frame:expandTemplate{title='tip', args={'Adaptiver Schaden',icononly='true'}})
                :done()
                :tag('th')
                    :wikitext('Schwierigkeit')
                :done()
            :done()
            :newline()
    else
        tablenode
            :tag('tr')
                :tag('th')
                    :wikitext('Champion')
                    :css('width', '180px')
                :done()
                :tag('th')
                    :wikitext('Grundwert')
                :done()
                :tag('th')
                    :wikitext('Zuwachs pro Stufe')
                :done()
                :tag('th')
                    :wikitext('Wert auf Stufe 18')
                :done()
            :done()
            :newline()
    end
    
    for _, champion in ipairs(lolTable) do
        local t         = lolData[champion]["stats"]
        local tablerow  = mw.html.create('tr')
        
        if _stat == "Attack speed" then
            local FD        = require('Module:Fd')
            
            local as_base   = t["as_base"]
            local as_ratio  = t["as_ratio"]
            local bonus_lvl = t["as_lvl"]
            local bonus_18  = 0 + bonus_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1))
            local variation = string.format("%.f", as_base / as_ratio * 100 - 100, 3)
            
            if variation == "-0" then
                variation = "0"
            end
            
            local disp_name = champion
            if champion == "Mega-Gnar" then disp_name = "Gnar (Mega)" end
            
            if champion == "Jhin" then
                tablerow
                    :tag('td')
                        :attr('data-sort-value', disp_name)
                        :css('text-align', 'left')
                        :wikitext(mw.ustring.format(
                "[[File:%s|20px|alt=%s|link=%s]] [[%s]] <span title='Jhin&#39;s Wachstum steigt mit seinem Grundwert für Angriffstempo. Er erhält kein zusätzliches Angriffstempo.'><sup>Hinweis</sup></span>",
                        	FN.championcircle{champion}, champion, champion, champion))
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base, 3))
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_ratio, 3))
                    :done()
                    :tag('td')
                        :wikitext("N/A")
                    :done()
                    :tag('td')
                        :attr('data-sort-value', tostring(bonus_lvl):gsub('%.', ','))
                        :wikitext(bonus_lvl .. "%")
                    :done()
                    :tag('td')
                        :attr('data-sort-value', tostring(bonus_18):gsub('%.', ','))
                        :wikitext(bonus_18 .. "%")
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base + as_base * (bonus_18 / 100), 3))
                    :done()
                    :tag('td')
                        :attr('data-sort-value', "9999%")
                        :wikitext(string.format("%0.0f", (2.5 / as_ratio - 1) * 100 - bonus_18, 3) .. "%")
                    :done()
                :done()
            else
                tablerow
                    :tag('td')
                        :attr('data-sort-value', disp_name)
                        :css('text-align', 'left')
                        :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base, 3))
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_ratio, 3))
                    :done()
                    :tag('td')
                        :wikitext(variation .. "%")
                    :done()
                    :tag('td')
                        :attr('data-sort-value', tostring(bonus_lvl):gsub('%.', ','))
                        :wikitext(bonus_lvl .. "%")
                    :done()
                    :tag('td')
                        :attr('data-sort-value', tostring(bonus_18):gsub('%.', ','))
                        :wikitext(bonus_18 .. "%")
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.3f", as_base + as_ratio * (bonus_18 / 100), 3))
                    :done()
                    :tag('td')
                        :wikitext(string.format("%0.0f", (2.5 / as_ratio - 1) * 100 - bonus_18 - (as_base / as_ratio - 1) * 100, 3) .. "%")
                    :done()
                :done()
            end
        elseif _stat == "Basic attack" then
            local windup
            if (t["attack_cast_time"] and t["attack_total_time"]) then
                windup = t["attack_cast_time"] / t["attack_total_time"]
            else
                windup = 0.3 + (t["attack_delay_offset"] or 0)
            end
            
            local windup_mod
            if t["windup_modifier"] == nil then
                windup_mod = "N/A"
            else
                windup_mod = math.floor(t["windup_modifier"] * 1000 + 0.5) / 1000
            end
            
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :wikitext(t["range"])
                :done()
                :tag('td')
                    :wikitext(lolData[champion]["rangetype"])
                :done()
                :tag('td')
                    :wikitext(t["missile_speed"] or "N/A")
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring((math.floor(math.floor(windup*100*1000+0.5)/1000*100+0.5)/100) .. "%"):gsub('%.', ','))
                    :wikitext((math.floor(math.floor(windup*100*1000+0.5)/1000*100+0.5)/100) .. "%")
                :done()
                :tag('td')
                    :wikitext(windup_mod)
                :done()
            :done()
        elseif _stat == "Hitbox" then
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :wikitext(math.floor(t["gameplay_radius"] or 65 + 0.5))
                :done()
                :tag('td')
                    :wikitext(math.floor(t["selection_radius"] or 0 + 0.5))
                :done()
                :tag('td')
                    :wikitext(math.floor(t["pathing_radius"] or 0 + 0.5))
                :done()
                :tag('td')
                    :wikitext(math.floor(t["acquisition_radius"] or 750 + 0.5))
                :done()
            :done()
        elseif _stat == "Base" then
            local FD        = require('Module:Fd')
            
            local hp_base = FD.get{["args"]={tostring(t["hp_base"])}}
            local hp_lvl  = FD.get{["args"]={tostring(t["hp_lvl"])}}
            local hp5_base = FD.get{["args"]={tostring(t["hp5_base"])}}
            local hp5_lvl  = FD.get{["args"]={tostring(t["hp5_lvl"])}}
            local res_base = FD.get{["args"]={tostring(t["res_base"])}}
            local res_lvl  = FD.get{["args"]={tostring(t["res_lvl"])}}
            local res5_base = FD.get{["args"]={tostring(t["res5_base"])}}
            local res5_lvl  = FD.get{["args"]={tostring(t["res5_lvl"])}}
            local ad_base = FD.get{["args"]={tostring(t["ad_base"])}}
            local ad_lvl  = FD.get{["args"]={tostring(t["ad_lvl"])}}
            local as_base = FD.get{["args"]={tostring(t["as_base"])}}
            local as_lvl  = FD.get{["args"]={tostring(t["as_lvl"])}}
            local armor_base = FD.get{["args"]={tostring(t["armor_base"])}}
            local armor_lvl  = FD.get{["args"]={tostring(t["armor_lvl"])}}
            local mr_base = FD.get{["args"]={tostring(t["mr_base"])}}
            local mr_lvl  = FD.get{["args"]={tostring(t["mr_lvl"])}}
            local ms  = FD.get{["args"]={tostring(t["ms"])}}
            local range = FD.get{["args"]={tostring(t["range"])}}
            
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["hp_base"]):gsub('%.', ','))
                    :wikitext(hp_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["hp_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. hp_lvl)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["hp5_base"]):gsub('%.', ','))
                    :wikitext(hp5_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["hp5_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. hp5_lvl)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["res_base"]):gsub('%.', ','))
                    :wikitext(res_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["res_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. res_lvl)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["res5_base"]):gsub('%.', ','))
                    :wikitext(res5_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["res5_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. res5_lvl)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["ad_base"]):gsub('%.', ','))
                    :wikitext(ad_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["ad_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. ad_lvl)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["as_base"]):gsub('%.', ','))
                    :wikitext(as_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["as_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. as_lvl .. '%')
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["armor_base"]):gsub('%.', ','))
                    :wikitext(armor_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["armor_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. armor_lvl)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["mr_base"]):gsub('%.', ','))
                    :wikitext(mr_base)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["mr_lvl"]):gsub('%.', ','))
                    :wikitext('+' .. mr_lvl)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["ms"]):gsub('%.', ','))
                    :wikitext(ms)
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(t["range"]):gsub('%.', ','))
                    :wikitext(range)
                :done()
            :done()
        elseif _stat == "Base 18" then
            local FD        = require('Module:Fd')
            
            local hp_base = tonumber(t["hp_base"])
            local hp_lvl  = tonumber(t["hp_lvl"])
            local hp_18 = FD.get{["args"]={tostring(hp_base + hp_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
            local hp5_base = tonumber(t["hp5_base"])
            local hp5_lvl  = tonumber(t["hp5_lvl"])
			local hp5_18 = FD.get{["args"]={tostring(hp5_base + hp5_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
            local res_base = tonumber(t["res_base"])
            local res_lvl  = tonumber(t["res_lvl"])
			local res_18 = FD.get{["args"]={tostring(res_base + res_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
            local res5_base = tonumber(t["res5_base"])
            local res5_lvl  = tonumber(t["res5_lvl"])
			local res5_18 = FD.get{["args"]={tostring(res5_base + res5_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
            local ad_base = tonumber(t["ad_base"])
            local ad_lvl  = tonumber(t["ad_lvl"])
			local ad_18 = FD.get{["args"]={tostring(ad_base + ad_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
            local as_base = tonumber(t["as_base"])
            local as_ratio  = tonumber(t["as_ratio"])
            local as_lvl  = tonumber(t["as_lvl"])
            local bonus_as_18  = 0 + as_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1))
            local as_18 = string.format("%0.3f", as_base + as_ratio * (bonus_as_18 / 100), 3)
            if champion == "Jhin" then as_18 = string.format("%0.3f", as_base + as_base * (bonus_as_18 / 100), 3) end
            as_18 = FD.get{["args"]={as_18}}
            
            local armor_base = tonumber(t["armor_base"])
            local armor_lvl  = tonumber(t["armor_lvl"])
			local armor_18 = FD.get{["args"]={tostring(armor_base + armor_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
            local mr_base = tonumber(t["mr_base"])
            local mr_lvl  = tonumber(t["mr_lvl"])
			local mr_18 = FD.get{["args"]={tostring(mr_base + mr_lvl * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))}}
            local range = FD.get{["args"]={tostring(t["range"])}}
            local ms  = FD.get{["args"]={tostring(t["ms"])}}
            
            
            
            local resource = lolData[champion]["resource"]
            if resource == "Wut"
            or resource == "Hitze"
            or resource == "Streitlust"
            or resource == "Zorn"
            or resource == "Schild"
            or resource == "Blutdurst"
            or resource == "Mut"
            or resource == "Leben"
            or resource == "Fluss"
            or resource == "Wildheit"
            or resource == "Energie"
            or resource == "Keine" then
                res_18 = '-'
                res5_18 = '-'
            end
                
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :attr('data-sort-value', hp_18:gsub('%.', ','))
                    :wikitext(hp_18)
                    :css('color', 'lightgreen')
                :done()
                :tag('td')
                    :attr('data-sort-value', hp5_18:gsub('%.', ','))
                    :wikitext(hp5_18)
                    :css('color', 'lightgreen')
                :done()
                :tag('td')
                    :attr('data-sort-value', res_18:gsub('%.', ','))
                    :wikitext(res_18)
                    :css('color', 'lightblue')
                :done()
                :tag('td')
                    :attr('data-sort-value', res5_18:gsub('%.', ','))
                    :wikitext(res5_18)
                    :css('color', 'lightblue')
                :done()
                :tag('td')
                    :attr('data-sort-value', ad_18:gsub('%.', ','))
                    :wikitext(ad_18)
                    :css('color', '#ffaaaa')
                :done()
                :tag('td')
                    :wikitext(as_18)
                    :css('color', '#ffaaaa')
                :done()
                :tag('td')
                    :attr('data-sort-value', armor_18:gsub('%.', ','))
                    :wikitext(armor_18)
                    :css('color', '#ffffaa')
                :done()
                :tag('td')
                    :attr('data-sort-value', mr_18:gsub('%.', ','))
                    :wikitext(mr_18)
                    :css('color', '#ffffaa')
                :done()
                :tag('td')
                    :attr('data-sort-value', range:gsub('%.', ','))
                    :wikitext(range)
                    :css('color', '#ffffff')
                :done()
                :tag('td')
                    :attr('data-sort-value', ms:gsub('%.', ','))
                    :wikitext(ms)
                    :css('color', '#ffffff')
                :done()
            :done()
        elseif _stat == "Manalos" then
--        Wut,Hitze,Streitlust,Zorn,Mana,Schild,Blutdurst,Mut,Leben,Fluss,Wildheit,Energie,Keine -- as of 1/25/2020
            local resource = lolData[champion]["resource"]
            if resource ~= "Mana" then
                local resource_msg
                if resource == nil then resource = "Keine" end
                if resource == "Fluss" 
                or resource == "Keine" then
                    resource_msg = "''[[Manalos]]er Champion (benutzt '''keine sekundäre Ressource''')''"
                elseif resource == "Blutdurst" then
                    resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#Leben|Leben]]''', '''[[Manalos#Zorn|" .. resource .. "]]''')''"
                elseif resource == "Streitlust" then
                    resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#Zorn|" .. resource .. "]]''')''"
                elseif resource == "Energie" then
                    resource_msg = "''[[Manalos]]er Champion (benutzt '''[[" .. resource .. "]]''')''"
                elseif resource == "Schild"then
                    resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#Fluss|" .. resource .. "]]''')''"
                else
                    resource_msg = "''[[Manalos]]er Champion (benutzt '''[[Manalos#" .. resource .. "|" .. resource .. "]]''')''"
                end
                tablerow
                    :tag('td')
                        :attr('data-sort-value', champion)
                        :css('text-align', 'left')
                        :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                    :done()
                    :tag('td')
                        :wikitext(resource_msg)
                    :done()
            else
                tablerow = nil
            end
        elseif _stat == "Bewertungen" then
            local role = lolData[champion]['role']
            local primary = role[1]
            local secondary = role[2]
            local damage = lolData[champion]['damage']
            local toughness = lolData[champion]['toughness']
            local control = lolData[champion]['control']
            local mobility = lolData[champion]['mobility']
            local utility = lolData[champion]['utility']
            local style = lolData[champion]['style']
            local adaptivetype = mw.ustring.lower(lolData[champion]['adaptivetype'])
            local difficulty = lolData[champion]['difficulty']
            
            local primary_msg = ''
            if primary ~= nil then
               primary_msg = frame:expandTemplate{title="tip", args={primary}}
            else 
                primary = ''
            end
            local secondary_msg = ''
            if secondary ~= nil then
                secondary_msg = frame:expandTemplate{title="tip", args={secondary}}
            else
                secondary = ''
            end
            local damage_msg = damage
            local toughness_msg = toughness
            local control_msg = control
            local mobility_msg = mobility
            local utility_msg = utility
            local style_msg = frame:expandTemplate{title="Champion style", args={style, size="100px"}}
            local adaptivetype_msg;
            if adaptivetype == "magisch" then
                adaptivetype_msg = "Magisch"
            elseif adaptivetype == "normal" then
                adaptivetype_msg = "Normal"
            else
                -- adaptivetype_msg = frame:expandTemplate{title="pending for test"} .. " " .. frame:expandTemplate{title="edit", args={"Module:ChampionData/data"}}
                adaptivetype_msg = "Normal" -- default physical
            end
            local difficulty_msg = difficulty

            
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :css('padding', '1px')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :wikitext(primary_msg)
                    :attr('data-sort-value', primary)
                    :css('text-align', 'left')
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(secondary_msg)
                    :attr('data-sort-value', secondary)
                    :css('text-align', 'left')
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(damage_msg)
                    :attr('bgcolor', '#420300')
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(toughness_msg)
                    :attr('bgcolor', '#102E00')
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(control_msg)
                    :attr('bgcolor', '#30004C')
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(mobility_msg)
                    :attr('bgcolor', '#000A4C')
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(utility_msg)
                    :attr('bgcolor', '#5d4407')
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(style_msg)
                    :attr('data-sort-value', style)
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(adaptivetype_msg)
                    :attr('data-sort-value', adaptivetype)
                    :css('padding', '1px')
                :done()
                :tag('td')
                    :wikitext(difficulty_msg)
                    :css('padding', '1px')
                :done()
        else
            local FD = require('Module:Fd')
            local _base = tonumber(t[convert[_stat] .. "_base"])
            local _lvl  = tonumber(t[convert[_stat] .. "_lvl"])
            local _eighteen = tonumber((_base or 0) + (_lvl or 0) * (18 - 1) * (0.7025 + 0.0175 * (18 - 1)))
            
            tablerow
                :tag('td')
                    :attr('data-sort-value', champion)
                    :css('text-align', 'left')
                    :wikitext('[[File:' .. FN.championcircle{champion} .. '|20px|alt=' .. champion .. '|link=' .. champion .. ']] [[' .. champion .. ']]')
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(_base):gsub('%.', ','))
                    :wikitext(FD.get{["args"]={tostring(_base)}})
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(_lvl):gsub('%.', ','))                
                    :wikitext(FD.get{["args"]={tostring(_lvl)}})
                :done()
                :tag('td')
                    :attr('data-sort-value', tostring(_eighteen):gsub('%.', ','))
                    :wikitext(FD.get{["args"]={tostring(_eighteen)}})
                :done()
            :done()
        end
        
        -- Add row to table
        if tablerow ~= nil then
            tablenode
                :node(tablerow)
                :newline()
        end
    end
    
    tablenode:allDone()
    
    return tostring(tablenode)
end


function p.groupedStatTable(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else 
        if frame:getParent().args ~= nil then args = lib.arguments(lib.mergeFrames(frame, frame:getParent())) else args = lib.arguments(frame.args) end
    end
    
    local _stat             = args['datatype'] or args[1]
    local _statDisplayName  = args['label'] or args[2]
    local _filter           = args[3]
    local lolData   = mw.loadData('Module:ChampionData/data')
    local get       = require('Module:ChampionData/getter')
    local IL        = require('Module:ImageLink')
    
    local threshold3col = tonumber(args['3col']) or 12
    local threshold2col = tonumber(args['2col']) or 8
    
    local statTable = {}
    -- standard entries with note
    for champion in pairs(lolData) do
        -- filter
        local releasedate = get["date"](champion)
        if  releasedate== "Kommend" or 
            releasedate == "N/A" or
            releasedate == "Verworfen" or
            releasedate == "" then
            --ignore champion
        elseif _stat == 'range' and get['rangetype'](champion) ~= _filter then -- do nothing
        elseif args[champion .. '_o'] then -- do nothing 
        else
            local v = get[_stat](champion)
            if v == nil then
            else
                if statTable[v] == nil then statTable[v] = {} end
                local displaystring = tostring(IL.champion{
                    ["champion"] = champion,
                    -- ["circle"] = "true",
                })
                if args[champion .. '_m'] then
                    displaystring = displaystring .. ' ' .. args[champion .. '_m']
                end
                if args[champion .. '_n'] then
                    displaystring = displaystring .. ' <span title="'.. args[champion .. '_n'] .. '"><sup>note</sup></span>'
                end
                statTable[v][champion] = displaystring
            end
        end
    end
    -- custom/manual entries
    local function customparams_iter(t)
        local i = 0
        local n = 0
        for i, _ in pairs(t) do
            n = n + 1
        end
        return function ()
            i = i + 1
            if i <= n and (t['c' .. i .. 'c'] or t['c' .. i .. 'm']) and t['c' .. i .. 'v'] then
                return t['c' .. i .. 'c'] or '', t['c' .. i .. 'm'] or '', t['c' .. i ..'n'] or '', t['c' .. i .. 'v']
            else
                return nil
            end
        end
    end
    for champion, modifier, note, value in customparams_iter(args) do
        local v = tonumber(value)
        local displaystring = ''
        if champion ~= '' then
            displaystring = displaystring .. tostring(IL.champion{
                ["champion"] = champion,
                -- ["circle"] = "true",
            })
        end
        if modifier ~= '' then
            displaystring = displaystring .. ' ' .. modifier
        end
        if note ~= '' then
            displaystring = displaystring .. '  <span title="'.. note .. '"><sup>note</sup></span>'
        end
        if statTable[v] == nil then statTable[v] = {} end
        if champion ~= '' then 
            statTable[v][champion] = displaystring
        else
            statTable[v][modifier] = displaystring
        end
    end
    
    -- table header row
    local tablenode = mw.html.create('table')
    tablenode
        :addClass('wikitable')
        :css('width', '100%')
        :newline()
    tablenode
        :tag('tr')
            :tag('th')
                :wikitext(_statDisplayName or _stat)
            :done()
            :tag('th')
                :wikitext('Champion')
            :done()
            -- :tag('th')
            --     :wikitext('Notes')
            -- :done()
        :done()
        :newline()
    
    -- sorting and table rows
    local optionTable = {}
    for option in pairs(statTable) do
        table.insert(optionTable, option)
    end
    table.sort(optionTable, function(a,b) return a > b end)
    for _, option in ipairs(optionTable) do
        local tablerow = mw.html.create('tr')
        local champcell = tablerow
            :tag('td')
                :css('text-align', 'center')
        if option == tonumber('inf') then
            champcell:wikitext('∞')
        else
            champcell:wikitext(option)
        end
        champcell = champcell
            :done()
            :newline()
            :tag('td')
                :tag('div')
                    :addClass('columntemplate')
                    :css('margin','0.4em 0 0.4em 0')
        local championTable = {}
        for champion in pairs(statTable[option]) do
            table.insert(championTable, champion)
        end
        table.sort(championTable)
        if table.getn(championTable) >= threshold3col then
            champcell
                :css('column-count', 3)
                :css('-webkit-column-count', 3)
                :css('-moz-column-count', 3)
        elseif table.getn(championTable) >= threshold2col then
            champcell
                :css('column-count', 2)
                :css('-webkit-column-count', 2)
                :css('-moz-column-count', 2)
        end
        champcell = champcell
                    :tag('ul')
        for _, champion in ipairs(championTable) do
            champcell
                :tag('li')
                    :wikitext(statTable[option][champion])
                    :newline()
        end
        tablenode
            :node(tablerow)
            :newline()
    end
    
    return tostring(tablenode)
end


-- JSON to Lua function for data from
-- http://ddragon.leagueoflegends.com/cdn/<patchversion>/data/en_US/champion.json

-- TODO: Durch Bot-Funktion ersetzen!

function p.jsontolua()
    local titleobject  = mw.title.new("Jsontemp")
    local o            = json.decode(titleobject:getContent())
    --local o2           = mw.loadData('Module:ChampionData/data')
    local s            = ""
    local championdata = {}
 
    for jsonchampname in pairs(o['data']) do
        table.insert(championdata, {jsonchampname, o['data'][jsonchampname]['name']})
    end
    table.sort(championdata, function(a, b) return a[2] < b[2] end)
    
    -- ============================
    -- = Generate lua data output =
    -- ============================
    
    s = s .. '-- <pre>\n'
    s = s .. '-- Champion data for patch version: ' .. o['version'] .. '\n'
    s = s .. '\n'
    s = s .. 'return {\n'

    
    for i, champname in pairs(championdata) do
        local t = o['data'][champname[1]]
        
        s = s .. '  ["' .. t['name'] .. '"] = {\n'
        s = s .. '    ["id"]         = '  .. t['key']                            .. ',\n'
        s = s .. '    ["apiname"]    = "' .. t['id']                            .. '",\n'
        s = s .. '    ["title"]      = "' .. t['title']                         .. '",\n'
        
        s = s .. '    ["attack"]     = '  .. t['info']['attack']                 .. ',\n'
        s = s .. '    ["defense"]    = '  .. t['info']['defense']                .. ',\n'
        s = s .. '    ["magic"]      = '  .. t['info']['magic']                  .. ',\n'
        s = s .. '    ["difficulty"] = '  .. t['info']['difficulty']             .. ',\n'
        
        s = s .. '    ["herotype"]   = "'  .. t['tags'][1]                      .. '",\n'
        if t['tags'][2] ~= nil then
            s = s .. '    ["alttype"]    = "'  .. t['tags'][2]                  .. '",\n'
        end
        
        s = s .. '    ["resource"]   = "'  .. t['partype']                      .. '",\n'
        s = s .. '    ["stats"] = {\n'
        s = s .. '      ["hp_base"]             = ' .. t['stats']['hp']                        .. ',\n'
        s = s .. '      ["hp_lvl"]              = ' .. t['stats']['hpperlevel']                .. ',\n'
        s = s .. '      ["res_base"]            = ' .. t['stats']['res']                       .. ',\n'
        s = s .. '      ["res_lvl"]             = ' .. t['stats']['resperlevel']               .. ',\n'
        s = s .. '      ["armor_base"]          = ' .. t['stats']['armor']                     .. ',\n'
        s = s .. '      ["armor_lvl"]           = ' .. t['stats']['armorperlevel']             .. ',\n'
        s = s .. '      ["mr_base"]             = ' .. t['stats']['spellblock']                .. ',\n'
        s = s .. '      ["mr_lvl"]              = ' .. t['stats']['spellblockperlevel']        .. ',\n'
        s = s .. '      ["hp5_base"]            = ' .. t['stats']['hpregen']                   .. ',\n'
        s = s .. '      ["hp5_lvl"]             = ' .. t['stats']['hpregenperlevel']           .. ',\n'
        s = s .. '      ["res5_base"]           = ' .. t['stats']['resregen']                  .. ',\n'
        s = s .. '      ["res5_lvl"]            = ' .. t['stats']['resregenperlevel']          .. ',\n'
        s = s .. '      ["ad_base"]             = ' .. t['stats']['attackdamage']              .. ',\n'
        s = s .. '      ["ad_lvl"]              = ' .. t['stats']['attackdamageperlevel']      .. ',\n'
        s = s .. '      ["as_base"]             = ' .. t['stats']['attackspeed']               .. ',\n'
        s = s .. '      ["as_lvl"]              = ' .. t['stats']['attackspeedperlevel']       .. ',\n'
        s = s .. '      ["range"]               = ' .. t['stats']['attackrange']               .. ',\n'
        s = s .. '      ["ms"]                  = ' .. t['stats']['movespeed']                 .. ',\n'
        s = s .. '      ["acquisition_radius"]  = ' .. p.get{t['name'], "acquisition_radius"}  .. ',\n'
        s = s .. '      ["selection_radius"]    = ' .. p.get{t['name'], "selection_radius"}    .. ',\n'
        s = s .. '      ["pathing_radius"]      = ' .. p.get{t['name'], "pathing_radius"}      .. ',\n'
        s = s .. '      ["gameplay_radius"]     = ' .. p.get{t['name'], "gameplay_radius"}     .. ',\n'
        s = s .. '      ["crit_base"]           = ' .. p.get{t['name'], "crit_base"}           .. ',\n'
        s = s .. '      ["crit_mod"]            = ' .. p.get{t['name'], "crit_mod"}            .. ',\n'
        s = s .. '      ["as_ratio"]            = ' .. p.get{t['name'], "as_ratio"}            .. ',\n'
        s = s .. '      ["windup_modifier"]     = ' .. p.get{t['name'], "windup_modifier"}     .. ',\n'
        s = s .. '      ["missile_speed"]       = ' .. p.get{t['name'], "missile_speed"}       .. ',\n'
        s = s .. '      ["attack_cast_time"]    = ' .. p.get{t['name'], "attack_cast_time"}    .. ',\n'
        s = s .. '      ["attack_total_time"]   = ' .. p.get{t['name'], "attack_total_time"}   .. ',\n'
        s = s .. '      ["attack_delay_offset"] = ' .. p.get{t['name'], "attack_delay_offset"} .. ',\n'
        s = s .. '      ["windup"]              = ' .. p.get{t['name'], "windup"}              .. ',\n'
        s = s .. '      ["aram_dmg_dealt"]      = ' .. p.get{t['name'], "aram_dmg_dealt"}      .. ',\n'
        s = s .. '      ["aram_dmg_taken"]      = ' .. p.get{t['name'], "aram_dmg_taken"}      .. ',\n'
        s = s .. '      ["aram_healing"]        = ' .. p.get{t['name'], "aram_healing"}        .. ',\n'
        s = s .. '      ["aram_shielding"]      = ' .. p.get{t['name'], "aram_shielding"}      .. ',\n'
        s = s .. '      ["urf_dmg_dealt"]       = ' .. p.get{t['name'], "urf_dmg_dealt"}       .. ',\n'
        s = s .. '      ["urf_dmg_taken"]       = ' .. p.get{t['name'], "urf_dmg_taken"}       .. ',\n'
        s = s .. '      ["urf_healing"]         = ' .. p.get{t['name'], "urf_healing"}         .. ',\n'
        s = s .. '      ["urf_shielding"]       = ' .. p.get{t['name'], "urf_shielding"}       .. '\n'
        s = s .. '    }\n'
        s = s .. '  }' .. lib.ternary(i ~= #championdata, ',\n','\n')
    end

    s = s .. '}\n'
    s = s .. '-- </' .. 'pre>\n' -- pre needs to be splitted with .. cause of Lua/Mediawiki weirdness

    s = s .. '-- [[Category:StatTable data]]'
    
    return 'Copy & paste data below to [[Module:StatTable/data/' .. o['version'] ..  ']]<pre>' .. s .. '</pre>Copy & paste data above to [[Module:StatTable/data/' .. o['version'] .. ']]'
end

function p.mainrole(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    local parentroletable = {
        ["Unterbrecher"]     = "Beherrscher",
        ["Verzauberer"]      = "Beherrscher",
        ["Moloch"]           = "Kämpfer",
        ["Stürmer"]          = "Kämpfer",
        ["Kampfmagier"]      = "Magier",
        ["Burst"]            = "Magier",
        ["Artillerie"]       = "Magier",
        ["Assassine"]        = "Schlächter",
        ["Plänkler"]         = "Schlächter",
        ["Vorkämpfer"]       = "Tank",
        ["Wächter"]          = "Tank",
        ["Schütze"]          = "",
        ["Spezialist"]       = "",
    }
    
    local champname = args[1] or args['champname'] 
    local get       = require ('Module:ChampionData/getter')
    local item      = get.role(champname)
    local s         = ""
    
    for i, subrole in pairs(item) do
        if i ~= 1 then
            s = s .. ","
        end
        s = s .. parentroletable[subrole]
    end
    
    return s
end

function p.positioncategory(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    local category  = {
        ["Oben"]     = "[[Category:" .. "Oben Champion]]",
        ["Dschungel"]  = "[[Category:" .. "Dschungel Champion]]",
        ["Mitte"]  = "[[Category:" .. "Mitte Champion]]",
        ["Unten"]  = "[[Category:" .. "Unten Champion]]",
        ["Unterstützer"] = "[[Category:" .. "Unterstützer Champion]]"
    }
    
    args['champname'] = args['champname'] or args[1]
    local get         = require ('Module:ChampionData/getter')
    local riot_pos    = get.positions(lib.validateName(args['champname']))
    local op_pos      = get.op_positions(lib.validateName(args['champname']))
    local s           = ""
    
    for i, subpos in pairs(riot_pos) do
        s = s .. category[subpos]
    end
    
    for i, subpos in pairs(op_pos) do
        s = s .. category[subpos]
    end
    
    return s
end

function p.minmaxstattable() -- work in progress
    local o            = mw.loadData('Module:ChampionData/data')
    local stat         = 'hp5_lvl'
    local stattable    = {}
    
    for champion in pairs(o) do
        -- mw.log(champion, o[champion].stats.hp5_base)
        table.insert(stattable, {champion, o[champion].stats.hp5_base, o[champion].stats.hp5_lvl, o[champion].stats.hp5_base + o[champion].stats.hp5_lvl * (18-1) * (0.7025 + 0.0175 * (18 - 1))})
    end
    table.sort(stattable, function(a, b) return a[2] > b[2] end)
    -- mw.log(lib.tbl(stattable))
    
    result ={}
    size = 0
    for i, t in ipairs(stattable) do
        if i == 1 then
            table.insert(result, t)
            size = size + 1
        elseif result[i-1][2] ~= t[2] then
            table.insert(result, t)
            size = size + 1
        elseif size <= 5 then
            table.insert(result, t)
        else
            break
        end
    end
    
        -- if i == 1 then
        --     table.insert(result, t)
        --     size = size + 1
        -- elseif size < 5 then
        --     if result[i-1][2] ~= t[2] then
        --         table.insert(result, t)
        --         size = size + 1
        --     end
        -- else
        --     break
        -- end
    
    
    table.sort(result, function(a, b) return a[2] < b[2] end)
    mw.log(lib.tbl(result))
end

function p.do_for_every_champion(frame)
    local args
    if frame[1] then
        args = lib.arguments(frame)
    elseif frame.args[1] then
        args = lib.arguments(frame.args)
    elseif frame:getParent() and frame:getParent().args[1] then
        args = lib.arguments(frame:getParent().args)
    end
    if not args then return "No arguments provided" end

    local get = require ('Module:ChampionData/getter')
    local res = {}
    local templateArgs = {}
    if args["p1n"] then templateArgs[args["p1n"]] = args["p1v"] end
    if args["p2n"] then templateArgs[args["p2n"]] = args["p2v"] end
    if args["p3n"] then templateArgs[args["p3n"]] = args["p3v"] end
    if args["p4n"] then templateArgs[args["p4n"]] = args["p4v"] end
    if args["p5n"] then templateArgs[args["p5n"]] = args["p5v"] end
    if args["p6n"] then templateArgs[args["p6n"]] = args["p6v"] end
    if args["p7n"] then templateArgs[args["p7n"]] = args["p7v"] end
    if args["p8n"] then templateArgs[args["p8n"]] = args["p8v"] end
    if args["p9n"] then templateArgs[args["p9n"]] = args["p9v"] end
    if args["p10n"] then templateArgs[args["p10n"]] = args["p10v"] end

    for k,champ in ipairs(get.sortedList()) do
        templateArgs[args["cha"] or 1] = champ
        res[k] = frame:expandTemplate{title = args[1], args = templateArgs}
    end
    
    return mw.text.listToText(res, args[2] or '', args[2] or '')
end

--
-- local funtions
-- 

function strtoluadata(str, sep)
    x = lib.split(str, sep)
    i = 1
    s = '"' .. mw.text.trim(x[i]) .. '"'
    i = i + 1
    while i <= #x do
        s = s .. ', "' .. mw.text.trim(x[i]) .. '"'
        i = i + 1
    end
    return s
end

function strtoluadatai(str, sep)
    x = lib.split(str, sep)
    i = 1
    s = '[' .. i .. '] = "' .. mw.text.trim(x[i]) .. '"'
    i = i + 1
    while i <= #x do
        s = s .. ', [' .. i .. '] = "' .. mw.text.trim(x[i]) .. '"'
        i = i + 1
    end
    return s
end

function pst2(champion, stat)
    local frame = mw.getCurrentFrame()
 
    return frame:expandTemplate{
        title = 'Data ' .. champion, args = {'pst2', stat}
    }
end

function loadData(patchid)
    if exists('Module:StatTable/data/' .. patchid) then
        return mw.loadData('Module:StatTable/data/' .. patchid)
    end
 
    return nil
end
 
function exists(page)
    local sPage = page
 
    if sPage then 
        local _, val = pcall(package.loaders[2], sPage)
 
        if type(val) == "function" or type(val) == "string" then
           return true
        end
    end
 
    return false
end

return p
-- </pre>
-- [[Kategorie:Module]]
Nutzung von Community-Inhalten gemäß CC-BY-SA, sofern nicht anders angegeben.