Module:Cost

From Inkipedia, the Splatoon wiki
Revision as of 08:58, 24 January 2024 by SuperHamster (talk | contribs) (Set alt text when icon is standalone)

Displays an inline currency icon with a text link.

Usage

{{Cost|<game>|<price>|<currency>|<size>|<link>|<textwidth>}}

game Unnamed, required The game that the cost belongs to. Must be one of the following:
  • S for Splatoon
  • S2 for Splatoon 2
  • S3 for Splatoon 3
price Unnamed, required (may be empty) The quantity to show as the cost.
If set empty, the template will show the icon only.
Note that this template also accepts space (' ') which handles differently to empty.
Use 0 or Free for free items.
currency Unnamed, optional The currency to use.
The default value is cash.
Must be one of the following: S S2 S3
cash Cash Cash Cash
pe Power Egg Power Egg Power Egg
sss Super Sea Snail Super Sea Snail Super Sea Snail
ge Golden Egg
sard Sardinium Shadow
ac Ability chunk
cqp CQ-80#CQ Points
sl Sheldon License
gsl Sheldon License
bs Fish scale
ss Fish scale
gs Fish scale
mb Cash
pl Cash
size Unnamed, optional The icon size for the currency icon. The default is 24.
link Unnamed, optional If present, the amount text will be a link to the currency's page.
textwidth Unnamed, optional Requries size and link to both be present.
If specified, the label will be set inside a right-aligned rectangle of the specified width

Markup

*{{Cost|S|200}}
*{{Cost|S2|200}}
*{{Cost|S3|200}}
*{{Cost|S|}}
*{{Cost|S|1|sss}}
*{{Cost|S2||ac}}
*{{Cost|S3|160|bs}}
*{{Cost|S|200|cash|48}}
*{{Cost|S|200|cash|link}}
*{{Cost|S|200|cash|48|link}}
*{{Cost|S|200|cash|24|link|60}}
*{{Cost|S|200|cash|24| |60}}

Output

  •  200
  •  200
  •  200
  • Cash
  •  1
  • Ability chunk
  •  160
  •  200
  •  200
  •  200
  •  200
  •  200

local p = {}

-- Main for Cost module with the wiki template args
function p.main(frame)
    local args = frame:getParent().args
    return p.getCost(args)
end

-- Get the full name of a currency type from its abbreviation.
-- Remember in Lua you do not have to specify all parameters.
-- If default is not specified then 'nil' is used and returned if not found.
function p.getNameFromAbbreviation(abbreviation, default)
    local currencyTypes = {
        cash = "Cash",
        pe = "Power Egg",
        sss = "Super Sea Snail",

        ge = "Golden Egg",
        sard = "Sardinium Shadow",

        ac = "Ability Chunk Generic",
        cqp = "CQ Points",

        sl = "Sheldon License",
        gsl = "Gold Sheldon License",

        bs = "Bronze Fish Scale",
        ss = "Silver Fish Scale",
        gs = "Gold Fish Scale"
    }

    return currencyTypes[abbreviation] or default
end

-- Get the link text of a currency type from its abbreviation.
-- If default is not specified then 'nil' is used and returned if not found.
function p.getLinkFromAbbreviation(abbreviation, default)
    local currencyTypes = {
        cash = "Cash",
        pe = "Power Egg",
        sss = "Super Sea Snail",

        ge = "Golden Egg",
        sard = "Sardinium Shadow",

        ac = "Ability chunk",
        cqp = "CQ-80#CQ Points",

        sl = "Sheldon License",
        gsl = "Sheldon License",

        bs = "Fish scale",
        ss = "Fish scale",
        gs = "Fish scale"
    }

    return currencyTypes[abbreviation] or default
end

function p.getCost(args)
    local game = args[1] or 'S'
    local quantity = args[2]
    local currencyType = args[3] or args['currency'] or 'cash'
    local size = tonumber(args[4]) or 24
    local linkDisplay = args[5] or args[4] or ''
    local widthStyle = args[6] and ("width:" .. args[6] .. "px;") or ''

    local currencyIconName = nil

    -- Special cases for currency names based on game type
    if currencyType == 'pe' and game == 'S3' then
        currencyIconName = "Power Egg Alterna"
    elseif currencyType == 'sard' and game == 'S2' then
        currencyIconName = "Sardinium Shadow"
    else
        currencyIconName = p.getNameFromAbbreviation(currencyType, "Cash")
    end

    -- Constructing file name and link
    local fileName = string.format("%s Icon %s.png", game, currencyIconName)
    local fileSize = string.format("%dx%dpx", size, size)
    local fileLink = p.getLinkFromAbbreviation(currencyType, "Cash")

    -- Now let's construct the display name.

    -- Dirty hack, for ac, remove 'Generic'
    if currencyType == 'ac' then currencyIconName = "Ability Chunk" end

    -- Append 's' for plural forms for the display name if quantity is not '1'
    -- Exclude sardinium, cqp, and cash
    if quantity ~= '1' and (currencyType ~= 'sard' and currencyType ~= 'cqp' and currencyIconName ~= 'Cash') then
        currencyIconName = currencyIconName .. "s"
    end

    -- Construct the image link
    local alt = string.len(quantity) > 0 and '' or fileLink
    local imageLink = string.format('[[File:%s|%s|%s|link=%s|alt=%s]]', fileName,
                                    fileSize, currencyIconName, fileLink, alt)

    -- Constructing output with additional span for quantity if provided
    if quantity and quantity ~= '' then
        local spanTag = mw.html.create('span')
        spanTag:css('display', 'inline-block'):css('text-align', 'right')

        if widthStyle and widthStyle ~= '' then
            spanTag:cssText(widthStyle)
        end

        local quantityLink = linkDisplay == 'link' and string.format('[[%s|%s]]', fileLink, quantity) or quantity
        spanTag:wikitext('&nbsp;' .. quantityLink)

        return imageLink .. tostring(spanTag)
    else
        return imageLink
    end
end

return p