Module:GuyPerfect

From Inkipedia, the Splatoon wiki
Revision as of 13:52, 16 April 2021 by GuyPerfect (talk | contribs)

Documentation for this module may be created at Module:GuyPerfect/doc

------------------------------ Helper Functions -------------------------------

-- Mapping of game codes to full game names
local GAMES = {
    S  = "Splatoon",
    S2 = "Splatoon 2"
}

-- Common infobox opener
function OpenInfobox(color, title)
    -- Outer container
    local ret = "<div style=\"border: 1px solid rgb(" .. color ..
        "); border-width: 8px 1px; border-radius: 8px; " ..
        "background: #ffffff; display: inline-block; width: 300px;\">"

    -- Inner client area
    ret = ret .. "<div style=\"background: rgba(" .. color .. ", 0.25); " ..
        "box-shadow: 0 0 16px #ffffff inset; padding: 8px;\">"

    -- Title
    ret = ret .. "<div style=\"border: 1px solid rgb(" .. color .. ", 0.5); " ..
        "border-width: 1px 4px; border-radius: 4px; " ..
        "background: rgba(" .. color .. ", 0.25); text-align: center; " ..
        "font-size: 20px; font-weight: bold; padding: 8px;\">" ..
        title .. "</div>"

    return ret
end

-- Common parameters opener
function OpenParams()
    return "<div style=\"display: grid; " ..
        "grid-template-columns: max-content auto; grid-gap: 4px; " ..
        "align-items: center;\">"
end

-- Common infobox and parameters closer
function CloseAll()
    return "</div></div></div>"
end

-- Produce a parameter row for an infobox
function ParamRow(color, label, content)

    -- Outer label container, styles the left vertical edge
    local ret = "<div style=\"border: 1px solid rgba(" .. color .. ", 0.5); " ..
        "border-width: 0 0 0 4px; border-radius: 4px;\">"

    -- Inner label container, styles the horizontal edges and background
    ret = ret .. "<div style=\"border: 1px solid red; " ..
        "border-width: 1px 0 1px 0; font-weight: bold; " ..
        "padding: 4px 8px 4px 4px; " ..
        "background: linear-gradient(90deg, rgba(" .. color .. ", 0.5), " ..
        "rgba(" .. color .. ", 0)); " ..
        "border-image: linear-gradient(90deg, rgb(" .. color .. ", 0.5), " ..
        "rgba(" .. color .. ", 0)) 1;\">"

    -- Parameter contents
    return ret .. label .. "</div></div><div>" .. content .. "</div>"
end

-- Produce an image and a link for a parameter row
function ParamImageLink(filename, link, opacity)
    local img = "[[File:" .. filename .. "|x24px|link=" .. link .. "|" ..
        link .. "]]"
    if opacity then
        img = "<span style=\"opacity: " .. opacity .. ";\">" .. img .. "</span>"
    end
    return img .. " [[" .. link .. "]]"
end

---------------------------------- Infoboxes ----------------------------------

-- Gear
function Gear(frame)
    local color = frame:expandTemplate
        { title = "SiteColor", args = { GAMES[frame.args.game] } }
    local ret = OpenInfobox(color, frame.args.name)

    -- Image
    ret = ret .. "<div style=\"display: flex; align-items: center; " ..
        "justify-content: center;\">[[File:" .. frame.args.game .. 
        "_Gear_" .. frame.args.category .. "_" .. frame.args.name .. 
        ".png|128x128px]]</div>"

    -- Parameters
    ret = ret .. OpenParams()

    -- Category row
    if frame.args.category then
        ret = ret .. ParamRow(color, "Category", ParamImageLink(
            "S2_Icon_" .. frame.args.category .. ".png",
            frame.args.category,
        0.5))
    end

    -- Brand row
    if frame.args.brand then
        ret = ret .. ParamRow(color, "Brand", ParamImageLink(
            frame.args.game .. "_Brand_" .. frame.args.brand .. ".png",
            frame.args.brand
        ))
    end

    -- Ability row
    if frame.args.ability then
        ret = ret .. ParamRow(color, "Ability", ParamImageLink(
            frame.args.game .. "_Ability_" .. frame.args.ability .. ".png",
            frame.args.ability
        ))
    end

    -- Cost row
    if frame.args.cost then
        ret = ret .. ParamRow(color, "Cost", frame:expandTemplate
            { title = "Cost", args = {
                frame.args.game, frame.args.cost, "cash", "link"
            } }
        )
    end

    -- SplatNet 2 row
    if frame.args.splatnet2 then
        ret = ret .. ParamRow(color, "SplatNet 2", frame:expandTemplate
            { title = "Cost", args = {
                frame.args.game, frame.args.splatnet2, "cash", "link"
            } }
        )
    end

    -- Rarity row
    if frame.args.rarity then
        ret = ret .. ParamRow(color, "Rarity", frame:expandTemplate
            { title = "Rarity", args = { frame.args.rarity } }
        )
    end

    ret = ret .. CloseAll()
    if frame.args.nowiki ~= nil then
        ret = ret:gsub("%<", "&lt;"):gsub("%[", "[<i></i>")
    end
    return ret
end

-- Module
return {
    gear = Gear
}