FANDOM


local Categories = {}
 
local getArgs = require('Dev:Arguments').getArgs
 
local lists = {}
 
-- Klasa
lists['class'] = {
    ['inicjator'] = {
        category = {'Inicjatorzy', 'Obrońcy'},
        link = 'Kategoria:Inicjatorzy',
    },
    ['strażnik'] = {
        category = {'Strażnicy', 'Obrońcy'},
        link = 'Kategoria:Strażnicy',
    },
 
    ['moloch'] = {
        category = {'Molochy', 'Wojownicy'},
        link = 'Kategoria:Molochy',
    },
    ['szturmowiec'] = {
        category = {'Szturmowcy', 'Wojownicy'},
        link = 'Kategoria:Szturmowcy',
    },
 
    ['zabójca'] = {
        category = {'Zabójcy', 'Pogromcy'},
        link = 'Kategoria:Zabójcy',
    },
    ['zwadźca'] = {
        category = {'Zwadźcy', 'Pogromcy'},
        link = 'Kategoria:Zwadźcy',
    },
 
    ['mag eksplozywny'] = {
        category = {'Magowie eksplozywni', 'Magowie'},
        link = 'Kategoria:Magowie eksplozywni',
    },
    ['mag bitewny'] = {
        category = {'Magowie bitewni', 'Magowie'},
        link = 'Kategoria:Magowie bitewni',
    },
    ['mag dalekosiężny'] = {
        category = {'Magowie dalekosiężni', 'Magowie'},
        link = 'Kategoria:Magowie dalekosiężni',
    },
 
    ['zaklinacz'] = {
        category = {'Zaklinacze', 'Kreatorzy'},
        link = 'Kategoria:Zaklinacze',
    },
    ['łapacz'] = {
        category = {'Łapacze', 'Kreatorzy'},
        link = 'Kategoria:Łapacze',
    },
 
    ['strzelec'] = {
        category = 'Strzelcy',
        link = 'Kategoria:Strzelcy',
    },
 
    ['specjalista'] = {
        category = 'Specjaliści',
        link = 'Kategoria:Specjaliści',
    },
}
-- Rodzaj ataku
lists['range'] = {
    ['wręcz'] = {
        category = 'Bohaterowie walczący wręcz',
        link = 'Kategoria:Bohaterowie walczący wręcz',
    },
 
    ['dystansowy'] = {
        category = 'Bohaterowie walczący z dystansu',
        link = 'Kategoria:Bohaterowie walczący z dystansu',
    },
}
lists['range']['dystans'] = lists['range']['dystansowy'] -- alias
-- Płeć
lists['gender'] = {
    ['mężczyzna'] = {
        category = 'Mężczyźni',
        link = 'Kategoria:Mężczyźni',
    },
 
    ['kobieta'] = {
        category = 'Kobiety',
        link = 'Kategoria:Kobiety',
    },
}
-- Atrybuty
lists['attributes'] = {
    ['ślizg'] = {
        link = 'Ślizg',
    },
}
-- Obrażenia
lists['damage'] = {
    ['fizyczne'] = {
        link = 'Obrażenia fizyczne',
    },
    ['magiczne'] = {
        link = 'Obrażenia magiczne',
    },
    ['mieszane'] = {},
}
--- Zasób
lists['resource'] = {
    ['mana'] = {
        category = 'Bohaterowie używający many',
        link = 'Mana',
    },
    ['energia'] = {
        category = 'Bohaterowie używający energii',
        link = 'Energia',
    },
    ['furia'] = {
        link = 'Furia (zasób)',
    },
    ['nagrzanie'] = {
        link = 'Nagrzanie',
    },
    ['zaciekłość'] = {
        link = 'Zaciekłość',
    },
    ['gniew'] = {
        link = 'Gniew',
    },
    ['zdrowie'] = {
        link = 'Zdrowie',
    },
    ['odwaga'] = {
        link = 'Odwaga',
    },
    ['płynność'] = {
        link = 'Płynność',
    },
    ['brak'] = {
        category = 'Bohaterowie nieposiadający zasobu',
        link = 'Czas odnowienia',
    },
}
-- PZ
lists['ip'] = function(args)
    local v = tonumber(args['ip'])
    if v and v > 0 then
        return mw.ustring.format('Bohaterowie za %d NE', v)
    end
end
-- RP
lists['rp'] = function(args)
    local v = tonumber(args['rp'])
    if v and v > 0 then
        return mw.ustring.format('Bohaterowie za %d RP', v)
    end
end
-- Data wydania
lists['date'] = function(args)
    local ts = tonumber(args['date'])
    if ts then
        if os.time() >= ts then
            return os.date('Bohaterowie wydani w roku %Y', ts)
        else
            return 'Nadchodzący bohaterowie'
        end
    end
    if args['upcoming'] then
        return 'Nadchodzący bohaterowie'
    end
end
 
 
 
-- Utility
local function split(text)
    if text == nil then return {} end
    text = mw.ustring.gsub(text, '%s*,[%s,]*', ',')
    text = mw.ustring.gsub(text, '^,', '')
    text = mw.ustring.gsub(text, ',$', '')
 
    local list = mw.text.split(mw.text.trim(text), ',')
    if #list and list[1] == '' then return {} end
    return list
end
function insert(tab, ...)
    for i=1, #arg do
        if arg[i] then
            if type(arg[i]) == 'table' then
                insert(tab, unpack(arg[i]))
            else
                table.insert(tab, arg[i])
            end
        end
    end
    return tab
end
function union(...)
    local res, check = {}, {}
    for i=1, #arg do
        if arg[i] then
            for _, v in ipairs(arg[i]) do
                if check[v] == nil then
                   check[v] = true
                   table.insert(res, v)
                end
            end
        end
    end
    return res
end
function intersect(a, ...)
    if a == nil then return nil end
    if #arg == 0 then return a end
 
    local res = {}
    for _, v1 in ipairs(a) do
        local f = 0
        for i=1, #arg do
            if arg[i] then
                for _, v2 in ipairs(arg[i]) do
                    if v1 == v2 then
                        f = f + 1
                        break
                    end
                end
                if f ~=  i then break end
            else
                f = f + 1
            end
        end
        if f == #arg then table.insert(res, v1) end
    end
    return res
end
function diff(a, ...)
    if a == nil then return nil end
    if #arg == 0 then return a end
 
    local res = {}
    for _, v1 in ipairs(a) do
        local f = true
        for i=1, #arg do
            if arg[i] then
                for _, v2 in ipairs(arg[i]) do
                    if v1 == v2 then
                        f = false
                        break
                    end
                end
                if f == false then break end
            end
        end
        if f then table.insert(res, v1) end
    end
    return res
end
function reverse(tab)
  for i=1, math.floor(#tab / 2) do
    tab[i], tab[#tab - i + 1] = tab[#tab - i + 1], tab[i]
  end
end
function keys(t)
    local res = {}
    for k, _ in pairs(t) do table.insert(res, k) end
    return res
end
 
-- Invokes
function Categories.categorize(frame)
    local args = getArgs(frame, {trim = true, frameOnly = true})
 
    local order = split(mw.ustring.lower(args['order'] or ''))
    local keys = keys(lists)
    order = union(order, keys)
 
    local cats = {}
    for _, list in ipairs(order) do
        if type(lists[list]) == 'function' then
            local res = lists[list](args)
            if res then
                if type(res) ~= 'table' then res = {res} end
                insert(cats, res)
            end
        else
            local l = split(mw.ustring.lower(args[list] or ''))
            for _, v in ipairs(l) do
                local tag = lists[list][v]
                if tag and tag.category then
                    if type(tag.category) == 'table' then
                        insert(cats, tag.category)
                    else
                        table.insert(cats, tag.category)
                    end
                end
            end
        end
    end
    mw.log(table.concat(cats, '\n'))
    for i, v in ipairs(cats) do
        cats[i] = mw.ustring.format('['..'[%s:%s]]', mw.site.namespaces[14].name, v)
    end
    reverse(cats)
    cats = union(cats)
    reverse(cats)
    return table.concat(cats, '\n')
end
function Categories.links(frame)
    local args = getArgs(frame, {trim = true, frameOnly = true})
 
    local list = lists[mw.ustring.lower(args[1])]
    local ipt = split(args[2])
    local filter = args['filter'] and true or false
    local cats = args['cats'] and true or false
 
    local res = {}
    for _, v in ipairs(ipt) do
        local a = mw.ustring.lower(v)
        if list[a] then
            local link = list[a][cats and 'category' or 'link']
            if link then
                if cats then
                    if type(link) == 'table' then
                        v = mw.ustring.format('['..'[:%s|%s]]', mw.site.namespaces[14].name .. ':' .. link[1], v)
                        if #link > 1 then
                            local r = {}
                            for i=2, #link do
                                table.insert(r, mw.ustring.format('['..'[:%s|%s]]', mw.site.namespaces[14].name .. ':' .. link[i], i))
                            end
                            v = v .. ' (' .. table.concat(r, ', ') .. ')'
                        end
                    else
                        v = mw.ustring.format('['..'[:%s|%s]]', mw.site.namespaces[14].name .. ':' .. link, v)
                    end
                else
                    v = mw.ustring.format('['..'[:%s|%s]]', link, v)
                end
            end
            table.insert(res, v)
        elseif not filter then
            table.insert(res, v)
        end
    end
 
    if args['pretty'] then
        return mw.text.listToText(res, ', ', ' ' .. args['pretty'] .. ' ')
    end
    return table.concat(res, ', ')
end
function Categories.list(frame)
    local args = getArgs(frame, {trim = true, frameOnly = true})
 
    local list = lists[mw.ustring.lower(args[1])]
    local keys = keys(list)
 
    local first = intersect(split(args['first']), keys)
    local last = intersect(diff(split(args['last']), first), keys)
    keys = diff(keys, last)
    table.sort(keys)
 
    local res = union(first, keys, last)
 
    if args['format'] then
        for i, v in ipairs(res) do
            res[i] = mw.ustring.format(args['format'], v)
        end
    end
    if args['pretty'] then
        return mw.text.listToText(res, ', ', ' ' .. args['pretty'] .. ' ')
    end
    return table.concat(res, ', ')
end
 
return Categories
Treści społeczności są dostępne na podstawie licencji CC-BY-SA , o ile nie zaznaczono inaczej.