Feature

--

```
local lib = {}

function lib.json(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    local json = require('Module:JSON')

    data = args[1]

    return json.encode(mw.loadData('Module:' .. data))
end

function lib.mergeFrames(frame, parent)
    local args = {}
    if frame then
        for k,v in pairs(frame.args) do
            args[k] = v
        end
    end
    if parent then
        for k,v in pairs(parent.args) do
            args[k] = v
        end
    end
    return args
end

function lib.arguments(origArgs)
    local args = {}
    for k, v in pairs(origArgs) do
        if v ~= '' then
            args[k] = v
        end
    end
    return args
end

function lib.getSortedKeys(tab)
    local keys = {}
    for k,_ in pairs(tab) do
        keys[#keys+1] = k
    end
    table.sort(keys)
    return keys
end

function lib.groupedArguments(args, numeric)
    if numeric == nil then
        numeric = true
    end
    numeric = not not numeric

    local base = {}
    local groups = {}

    for k, v in pairs(args) do
        v = mw.text.trim(v) or ''
        if v ~= '' then
            if type(k) == 'string' then
                k = mw.text.trim(k) or ''
                if k ~= '' then
                    local splittable = lib.split(k, ':')
                    if #splittable == 1 then
                        base[k] = v
                    else
                        local group = mw.text.trim(splittable[1]) or ''
                        local key = mw.text.trim(table.concat(splittable, ':', 2)) or ''
                        if key ~= '' and group ~= '' then
                            if numeric then
                                group = tonumber(group)
                                if group ~= nil then
                                    if groups[group] == nil then
                                        groups[group] = {}
                                    end
                                    groups[group][key] = v
                                else
                                    base[k] = v
                                end
                            else
                                if groups[group] == nil then
                                    groups[group] = {}
                                end
                                groups[group][key] = v
                            end
                        else
                            base[k] = v
                        end
                    end
                end
            elseif v ~= '' then
                base[k] = v
            end
        end
    end
    return base, groups
end

function lib.ternary(cond, T, F)
    if cond then
        return T
    else
        return F
    end
end

function lib.tbl_concat(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end

    args["pre"] = args["pre"] or args["prepend"]   or ""
    args["app"] = args["app"] or args["append"]    or ""
    args["sep"] = args["sep"] or args["separator"] or ","
    args["tbl"] = args["tbl"] or args[1]

    local s = ""

    if args["index"] ~= nil then
        s = s .. args["pre"] .. args["tbl"][tonumber(args["index"])] .. args["app"]
    else
        local num = 0
        for i, v in ipairs(args["tbl"]) do
            if s ~= "" then
                s = s .. args["sep"]
            end
            s = s .. args["pre"] .. v .. args["app"]
            num = num + 1
        end
        local keys = {}
        for k in pairs(args["tbl"]) do
            table.insert(keys, k)
            num = num - 1
        end
        if num < 0 then
            table.sort(keys)
            for _, k in ipairs(keys) do
                if type(k) ~= 'number' then
                    if s ~= "" then
                        s = s .. args["sep"]
                    end
                    s = s .. args["pre"] .. args["tbl"][k] .. args["app"]
                end
            end
        end
    end

    return s
end

function lib.tbl_debug(tbl)
    return table.tostring(tbl)
end

function lib.validateName(_input)
    local championnames = {
    ["Nunu"]            = "Nunu & Willump",
    ["Willump"]         = "Nunu & Willump",
    ["Quinn & Valor"]   = "Quinn",
    ["Valor"]           = "Quinn",
    ["Shadow Assassin"] = "Kayn",
    ["Rhaast"]          = "Kayn",
    ["Lamb"]            = "Kindred",
    ["Wolf"]            = "Kindred",
    ["Book"]            = "Yuumi",
    }

    return championnames[_input] or _input
end

function lib.split(str, pattern)
    -- Splits string into a table
    --
    -- str: string to split
    -- pattern: pattern to use for splitting
    local out = {}
    local i = 1
    local split_start, split_end = string.find(str, pattern, i)
    while split_start do
        out[#out + 1] = string.sub(str, i, split_start - 1)
        i = split_end + 1
        split_start, split_end = string.find(str, pattern, i)
    end
    out[#out + 1] = string.sub(str, i)
    return out
end

-- Helper functions
function table.val_to_str(v)
    if "string" == type(v) then
        v = string.gsub(v, "\n", "\\n")
        if string.match(string.gsub(v, "[^'\"]", ""), '^"+$') then
            return "'" .. v .. "'"
        end
        return '"' .. string.gsub(v, '"', '\\"') .. '"'
    else
        return "table" == type(v) and table.tostring(v) or tostring(v)
    end
end

function table.key_to_str(k)
    if "string" == type(k) and string.match(k, "^[_%a][_%a%d]*$") then
        return k
    else
        return "[" .. table.val_to_str(k) .. "]"
    end
end

function table.tostring(tbl)
    local result, done = {}, {}
    for k, v in ipairs(tbl) do
        table.insert(result, table.val_to_str(v))
        done[k] = true
    end
    for k, v in pairs(tbl) do
        if not done[k] then
            table.insert(result, table.key_to_str(k) .. "=" .. table.val_to_str( v ))
        end
    end
    return "{" .. table.concat(result, ",") .. "}"
end

return lib
--
```

--