Module:Icons: Difference between revisions
From Melvor Idle
(Overrides for convenience of linking to Xon) |
No edit summary |
||
(36 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
local Shared = require("Module:Shared") | local Shared = require("Module:Shared") | ||
local Num = require('Module:Number') | |||
local Overrides = require('Module:Icons/Overrides') | |||
-- Locally index some functions for performance | -- Locally index some functions for performance | ||
local sgsub, fixPagename, formatnum, tostring, type = string.gsub, Shared.fixPagename, | local sgsub, fixPagename, formatnum, tostring, type = string.gsub, Shared.fixPagename, Num.formatnum, tostring, type | ||
local p = {} | local p = {} | ||
--Extension overrides for items that have non-png images | --Extension overrides for items that have non-png images | ||
--Name level overrides take precedence over type level overrides | --Name level overrides take precedence over type level overrides | ||
local extOverrides = | local extOverrides = Overrides.extOverrides() | ||
--Some overrides only apply for a specific type | --Some overrides only apply for a specific type | ||
local typeExtOverrides = | local typeExtOverrides = Overrides.typeExtOverrides() | ||
--When calling for an icon of type Key, instead use type Value | --When calling for an icon of type Key, instead use type Value | ||
local typeOverrides = | local typeOverrides = Overrides.typeOverrides() | ||
--When calling for an icon for Key, replace with image Value, and optionally override type also | --When calling for an icon for Key, replace with image Value, and optionally override type also | ||
local imgOverrides = | local imgOverrides = Overrides.imgOverrides() | ||
--When calling for an icon for Key + Type, replace with image Value, and optionally override type also | --When calling for an icon for Key + Type, replace with image Value, and optionally override type also | ||
local typeImgOverrides = | local typeImgOverrides = Overrides.typeImgOverrides() | ||
--When calling for an icon for Key, the link goes to Value | --When calling for an icon for Key, the link goes to Value | ||
local linkOverrides = | local linkOverrides = Overrides.linkOverrides() | ||
--When calling for an icon for Key + Type, the link goes to Value | --When calling for an icon for Key + Type, the link goes to Value | ||
local typeLinkOverrides = | local typeLinkOverrides = Overrides.typeLinkOverrides() | ||
-- If no other text override was specified for the given link, use these | -- If no other text override was specified for the given link, use these | ||
local txtOverrides = | local txtOverrides = Overrides.txtOverrides() | ||
-- Ambiguous overrides section | -- Ambiguous overrides section | ||
local ambiguousOverrides = | local ambiguousOverrides = Overrides.ambiguousOverrides() | ||
-- For ambiguous overrides, determines the type text to be used in the page link | -- For ambiguous overrides, determines the type text to be used in the page link | ||
local ambiguousTypeMap = | local ambiguousTypeMap = Overrides.ambiguousTypeMap() | ||
local currencyFormatDefn = Overrides.currencyFormatDefn() | |||
-- Defines icon types for which a section or anchor on a static page should be linked to, rather | -- Defines icon types for which a section or anchor on a static page should be linked to, rather | ||
-- than the usual page linking | -- than the usual page linking | ||
local sectionLinks = | local sectionLinks = Overrides.sectionLinks() | ||
function p.Icon(frame) | function p.Icon(frame) | ||
Line 1,000: | Line 108: | ||
end | end | ||
end | end | ||
-- Type & extension overrides must be after adjustments have been made | -- Type & extension overrides must be after adjustments have been made | ||
-- for any image overrides | -- for any image overrides | ||
Line 1,031: | Line 139: | ||
iconType = ovrType | iconType = ovrType | ||
end | end | ||
-- There are a couple specific double overrides to be included that don't fit in the above lists | -- There are a couple specific double overrides to be included that don't fit in the above lists | ||
Line 1,089: | Line 195: | ||
end | end | ||
-- | -- Returns a skill icon based on the realm. | ||
function p. | function p._SkillRealmIcon(skill, realmID, size) | ||
local | local realm = realmID or 'melvorD:Melvor' | ||
local link = fixPagename(skill) | |||
local ext = typeExtOverrides['skill'][skill] or extOverrides.type['skill'] | |||
local img = mw.html.create('span') | |||
local | if realm == 'melvorItA:Abyssal' then | ||
img:addClass('abyss-icon') | |||
end | |||
size = size or 25 | |||
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).'):wikitext(ext) | |||
return | :wikitext('|'):wikitext(size):wikitext('x'):wikitext(size):wikitext('px') | ||
:wikitext('|link='):wikitext(link):wikitext(']]') | |||
return tostring(img) | |||
end | end | ||
function p. | function p.SkillRealmIcon(frame) | ||
local args = frame.args ~= nil and frame.args or frame | local args = frame.args ~= nil and frame.args or frame | ||
local skill = args[1] | local skill = args[1] | ||
local | local realmID = args.realm | ||
local | local size = tonumber(args.size) | ||
return p. | return p._SkillRealmIcon(skill, realmID, size) | ||
end | end | ||
function p. | function p._SkillReq(skill, level, showText, realmID) | ||
local realm = realmID or 'melvorD:Melvor' | |||
local link = fixPagename(skill) | |||
local ext = typeExtOverrides['skill'][skill] or extOverrides.type['skill'] | |||
local altText = (showText and '') or skill | local altText = (showText and '') or skill | ||
if level == nil then | |||
if level == nil then level = 'Unknown [[Category:Pages with script errors]]' | level = 'Unknown [[Category:Pages with script errors]]' | ||
end | |||
-- Create skill image. | |||
local img = mw.html.create() | |||
end | |||
if realm == 'melvorItA:Abyssal' then | |||
img = img:tag('span') | |||
:addClass('abyss-icon') | |||
local | end | ||
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).'):wikitext(ext) | |||
return | :wikitext('|25x25px|link='):wikitext(link) | ||
:wikitext('|alt='):wikitext(altText) | |||
:wikitext(']]') | |||
-- Create text and add image. | |||
local text = mw.html.create('span') | |||
:addClass('img-text') | |||
:node(img) | |||
if showText == true then | |||
text:wikitext(' [[' .. link .. ']]') | |||
end | |||
--28/06/2024. Commented this out to try out red icons for abyssal levels | |||
-- as opposed to the text below. Remove entire section if still commented out after | |||
-- a week or two. | |||
--if realm == 'melvorItA:Abyssal' then | |||
-- text:wikitext(" Abyssal Level ") | |||
--else | |||
text:wikitext(" Level ") | |||
--end | |||
text:wikitext(level) | |||
return tostring(text) | |||
end | end | ||
function p._MasteryReq(itemName, level, showText) | function p._MasteryReq(itemName, level, showText) | ||
Line 1,145: | Line 278: | ||
local altTextMastery = (showText and '') or ' Mastery' | local altTextMastery = (showText and '') or ' Mastery' | ||
local result = mw.html.create('span') | |||
result | |||
:addClass('img-text') | |||
:wikitext('Level ' .. level .. ' ') | |||
:node(p.Icon({linkname, img=iconname, type='item', notext=true, nospan=true, alt=altTextItem})) | |||
:node('[[File:Mastery.svg|25x25px|alt=' .. altTextMastery .. ']]') | |||
if showText then | |||
result | |||
:wikitext('[[' .. linkname .. ']] ') | |||
:wikitext('[[Mastery]]') | |||
end | |||
return tostring(result) | |||
end | end | ||
Line 1,266: | Line 365: | ||
--Adding a shortcut function for this | --Adding a shortcut function for this | ||
function p.TotH() | function p.TotH() | ||
return | return '<span class="img-text">[[File:TotH.svg|25x25px|link=Throne of the Herald Expansion]]</span>' | ||
end | end | ||
function p.AoD() | function p.AoD() | ||
return | return '<span class="img-text">[[File:AoD.png|25x25px|link=Atlas of Discovery Expansion]]</span>' | ||
end | end | ||
function p.ItA() | function p.ItA() | ||
return | return '<span class="img-text">[[File:ItA.png|25x25px|link=Into the Abyss Expansion]]</span>' | ||
end | end | ||
function p.Melvor() | function p.Melvor() | ||
return | return '<span class="img-text">[[File:Melvor_Logo.svg|25x25px|link=Full Version]]</span>' | ||
end | end | ||
Latest revision as of 20:22, 6 July 2024
Documentation for this module may be created at Module:Icons/doc
local Shared = require("Module:Shared")
local Num = require('Module:Number')
local Overrides = require('Module:Icons/Overrides')
-- Locally index some functions for performance
local sgsub, fixPagename, formatnum, tostring, type = string.gsub, Shared.fixPagename, Num.formatnum, tostring, type
local p = {}
--Extension overrides for items that have non-png images
--Name level overrides take precedence over type level overrides
local extOverrides = Overrides.extOverrides()
--Some overrides only apply for a specific type
local typeExtOverrides = Overrides.typeExtOverrides()
--When calling for an icon of type Key, instead use type Value
local typeOverrides = Overrides.typeOverrides()
--When calling for an icon for Key, replace with image Value, and optionally override type also
local imgOverrides = Overrides.imgOverrides()
--When calling for an icon for Key + Type, replace with image Value, and optionally override type also
local typeImgOverrides = Overrides.typeImgOverrides()
--When calling for an icon for Key, the link goes to Value
local linkOverrides = Overrides.linkOverrides()
--When calling for an icon for Key + Type, the link goes to Value
local typeLinkOverrides = Overrides.typeLinkOverrides()
-- If no other text override was specified for the given link, use these
local txtOverrides = Overrides.txtOverrides()
-- Ambiguous overrides section
local ambiguousOverrides = Overrides.ambiguousOverrides()
-- For ambiguous overrides, determines the type text to be used in the page link
local ambiguousTypeMap = Overrides.ambiguousTypeMap()
local currencyFormatDefn = Overrides.currencyFormatDefn()
-- Defines icon types for which a section or anchor on a static page should be linked to, rather
-- than the usual page linking
local sectionLinks = Overrides.sectionLinks()
function p.Icon(frame)
local args = frame.args ~= nil and frame.args or frame
local link = args[1]
local text = args[2]
local iconType = args.type
local ext = args.ext ~= nil and args.ext ~= '' and args.ext or 'png'
local notext = args.notext ~= nil and args.notext ~= ''
local nolink = args.nolink ~= nil and args.nolink ~= ''
local noicon = args.noicon ~= nil and args.noicon ~= ''
local nospan = args.nospan ~= nil and args.nospan
local menu = args.menu ~= nil and args.menu ~= ''
local imgSize = args.size ~= nil and args.size or 25
local qty = args.qty
local img = args.img ~= nil and args.img ~= '' and args.img or link
local class = args.class ~= nil and args.class ~= '' and args.class or ''
local altText = args.alt ~= nil and args.alt or (notext and (text or link)) or ''
local linkSection = args.section
local expIcon = args.expicon ~= nil and args.expicon or ''
link = fixPagename(link)
img = fixPagename(img)
img = sgsub(img, '#', '')
img = sgsub(img, '/Training', '')
img = sgsub(img, '/Guide', '')
img = sgsub(img, '/Boosts', '')
-- Remove '#' from links to facilitate linking to things with hashes in
-- their names (e.g. item 'Birthday Cake Piece #1'). Links to sections
-- of a page should instead be performed using the 'section' parameter.
link = sgsub(link, '#', '')
-- Handle types for which links should be to a section of a static page
local sl = sectionLinks[iconType]
if sl ~= nil and not sl.exclude[link] then
if text == nil or text == '' then
text = link
end
linkSection = string.gsub(link, ' ', '')
-- Link overwriting must occur after text & linkSection have been set
link = sl.link
if sl.img ~= nil then
img = sl.img[1]
if sl.img[2] ~= nil then
iconType = sl.img[2]
end
end
end
--MANUAL OVERRIDES
local origType = iconType
local ovrImg = imgOverrides[link]
local ovrTypeImg = typeImgOverrides[iconType]
if ovrTypeImg ~= nil then
ovrImg = ovrTypeImg ~= nil and ovrTypeImg[img] or ovrImg
end
local ovrTxt = txtOverrides[link]
local ovrLink = linkOverrides[link]
local ovrTypeLink = typeLinkOverrides[iconType]
if ovrTypeLink ~= nil and ovrTypeLink[img] ~= nil then
if ovrTypeLink[img] == '' then
nolink = true
else
ovrLink = ovrTypeLink[img]
end
end
local hasText = (text ~= nil and text ~= '')
if ovrImg ~= nil and img == link then
if type(ovrImg) == 'string' then
img = ovrImg
elseif type(ovrImg) == 'table' then
img = ovrImg[1]
if ovrImg[2] ~= nil then iconType = ovrImg[2] end
end
end
-- Type & extension overrides must be after adjustments have been made
-- for any image overrides
local ovrTypeExt, ovrTypeExtTable = nil, typeExtOverrides[iconType]
if ovrTypeExtTable ~= nil then
ovrTypeExt = ovrTypeExtTable[img]
end
local ovrType = typeOverrides[iconType]
local ovrExt = extOverrides.name[img]
if ovrExt == nil then
ovrExt = extOverrides.type[ovrType or iconType]
end
if not hasText and ovrTxt ~= nil then
text = ovrTxt
hasText = true
end
if ovrLink ~= nil then
if not hasText then
text = link
hasText = true
end
link = ovrLink
end
if ovrTypeExt ~= nil then
ext = ovrTypeExt
elseif ovrExt ~= nil then
ext = ovrExt
end
if ovrType ~= nil then
iconType = ovrType
end
-- There are a couple specific double overrides to be included that don't fit in the above lists
-- If the link requires disambiguation or a section, the modify the link accordingly
-- while preserving the displayed text
local isAmbig, hasSection = ambiguousOverrides[link], linkSection ~= nil and linkSection ~= ''
if isAmbig or hasSection then
if not hasText then
text = link
hasText = true
end
if isAmbig then
link = link .. ' (' .. (ambiguousTypeMap[origType] or origType) .. ')'
end
if hasSection then
link = link .. '#' .. linkSection
end
end
local resultText = ''
if not noicon then
-- Image size
local txtSize = tostring(imgSize)
-- Extension and type if one is set
local txtImg = (iconType ~= nil and iconType ~= '' and img .. '_(' .. iconType .. ')' or img) .. '.' .. ext
-- Include a link unless no link -and- no text was requested
local txtLink = '|link=' .. (nolink and '' or link)
resultText = '[[File:' .. txtImg .. '|' .. txtSize .. 'x' .. txtSize .. 'px|alt=' .. altText .. txtLink .. ']]'
if class ~= nil and class ~= '' then
resultText = '<span class="'..class..'">'..resultText..'</span>'
end
end
if not notext then
if nolink then
resultText = resultText .. (noicon and '' or ' ') .. (hasText and text or link)
else
resultText = resultText .. (noicon and '' or ' ') .. '[[' .. link .. (hasText and text ~= link and '|' .. text or '') .. ']]'
end
end
-- Add Quantity to the front if requested
--local resultQty = (qty ~= nil and qty ~= '' and formatnum(qty) .. ' ' or '')
if qty ~= nil and qty ~= '' then
resultText = formatnum(qty) .. ' ' .. resultText
end
if menu then
return '{| class="articletable img-text" style="vertical-align:middle;"\r\n|-\r\n|' .. expIcon .. resultText .. '\r\n|}'
elseif not noicon and not nospan then
return '<span class="img-text">' .. expIcon .. resultText .. '</span>'
else
return resultText
end
end
-- Returns a skill icon based on the realm.
function p._SkillRealmIcon(skill, realmID, size)
local realm = realmID or 'melvorD:Melvor'
local link = fixPagename(skill)
local ext = typeExtOverrides['skill'][skill] or extOverrides.type['skill']
local img = mw.html.create('span')
if realm == 'melvorItA:Abyssal' then
img:addClass('abyss-icon')
end
size = size or 25
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).'):wikitext(ext)
:wikitext('|'):wikitext(size):wikitext('x'):wikitext(size):wikitext('px')
:wikitext('|link='):wikitext(link):wikitext(']]')
return tostring(img)
end
function p.SkillRealmIcon(frame)
local args = frame.args ~= nil and frame.args or frame
local skill = args[1]
local realmID = args.realm
local size = tonumber(args.size)
return p._SkillRealmIcon(skill, realmID, size)
end
function p._SkillReq(skill, level, showText, realmID)
local realm = realmID or 'melvorD:Melvor'
local link = fixPagename(skill)
local ext = typeExtOverrides['skill'][skill] or extOverrides.type['skill']
local altText = (showText and '') or skill
if level == nil then
level = 'Unknown [[Category:Pages with script errors]]'
end
-- Create skill image.
local img = mw.html.create()
if realm == 'melvorItA:Abyssal' then
img = img:tag('span')
:addClass('abyss-icon')
end
img :wikitext('[[File:'):wikitext(link):wikitext('_(skill).'):wikitext(ext)
:wikitext('|25x25px|link='):wikitext(link)
:wikitext('|alt='):wikitext(altText)
:wikitext(']]')
-- Create text and add image.
local text = mw.html.create('span')
:addClass('img-text')
:node(img)
if showText == true then
text:wikitext(' [[' .. link .. ']]')
end
--28/06/2024. Commented this out to try out red icons for abyssal levels
-- as opposed to the text below. Remove entire section if still commented out after
-- a week or two.
--if realm == 'melvorItA:Abyssal' then
-- text:wikitext(" Abyssal Level ")
--else
text:wikitext(" Level ")
--end
text:wikitext(level)
return tostring(text)
end
function p._MasteryReq(itemName, level, showText)
local iconname = itemName
local linkname = itemName
--First, go with the lowest tier of potions if a potion is mentioned
local s, e = string.find(itemName, 'Potion')
if e ~= nil then
linkname = string.sub(itemName, 1, e)
iconname = linkname..' I'
end
local altTextItem = (showText and '') or linkname
local altTextMastery = (showText and '') or ' Mastery'
local result = mw.html.create('span')
result
:addClass('img-text')
:wikitext('Level ' .. level .. ' ')
:node(p.Icon({linkname, img=iconname, type='item', notext=true, nospan=true, alt=altTextItem}))
:node('[[File:Mastery.svg|25x25px|alt=' .. altTextMastery .. ']]')
if showText then
result
:wikitext('[[' .. linkname .. ']] ')
:wikitext('[[Mastery]]')
end
return tostring(result)
end
function p._Currency(currencyID, amount, maxAmount)
local currencyDefn = currencyFormatDefn[currencyID]
if currencyDefn == nil then
error('Invalid currency ID: ' .. currencyID, 2)
end
local fileName, link, altText = currencyDefn.img, currencyDefn.name, currencyDefn.abbr
local function numColour(amount)
if tonumber(amount) < 0 then
return mw.html.create('span')
:css('color', 'red')
:wikitext(formatnum(amount))
:done()
else
return formatnum(amount)
end
end
local html = mw.html.create('span')
:addClass('img-text')
-- Currency amounts
if tonumber(amount) ~= nil then
local text = mw.html.create('span')
:css('margin-right', '0.2em')
:node(numColour(amount))
if (tonumber(maxAmount) ~= nil and maxAmount > amount) then
text:wikitext(' - ' .. numColour(maxAmount))
end
html:node(text:done())
end
-- Currency icon
if fileName ~= nil then
html:wikitext('[[File:'):wikitext(fileName):wikitext('|25px')
if link ~= nil then
html:wikitext('|link='):wikitext(link)
end
html:wikitext('|alt=')
:wikitext(((altText == nil and '') or altText))
:wikitext(']]')
end
html:done()
if ((amount ~= nil and tonumber(amount) == nil)
or (maxAmount ~= nil and tonumber(maxAmount) == nil)) then
html:wikitext('[[Category:Pages with non-numeric currency arguments]]')
end
return tostring(html)
end
-- p.Currency() is called by various currency templates:
-- [[Template:GP]], [[Template:SC]], [[Template:RC]]
function p.Currency(frame)
local args = frame.args ~= nil and frame.args or frame
local currID, minVal, maxVal, _
currID = args[1]
if args[2] ~= nil and args[2] ~= '' then
minVal, _ = string.gsub(args[2], ',', '')
end
if args[3] ~= nil and args[3] ~= '' then
maxVal, _ = string.gsub(args[3], ',', '')
end
return p._Currency((currID or 'nil'), minVal, maxVal)
end
--Adding a shortcut function for this
function p.TotH()
return '<span class="img-text">[[File:TotH.svg|25x25px|link=Throne of the Herald Expansion]]</span>'
end
function p.AoD()
return '<span class="img-text">[[File:AoD.png|25x25px|link=Atlas of Discovery Expansion]]</span>'
end
function p.ItA()
return '<span class="img-text">[[File:ItA.png|25x25px|link=Into the Abyss Expansion]]</span>'
end
function p.Melvor()
return '<span class="img-text">[[File:Melvor_Logo.svg|25x25px|link=Full Version]]</span>'
end
-- Function to retrieve the DLC id used for sorting columns that contain a DLC icon.
-- Passthrough from shared so that caller doesn't have to include Shared Module
function p.getExpansionID(id)
return Shared.getLocalID(id)
end
function p.getExpansionIcon(id)
local ns, _ = Shared.getLocalID(id)
if ns == 'melvorTotH' then
return p.TotH()..' '
elseif ns == 'melvorAoD' then
return p.AoD()..' '
elseif ns == 'melvorItA' then
return p.ItA()..' '
else
return ''
end
end
-- Special function that returns a Melvor idle icon
-- Specifically used for a "DLC" column on tables.
-- Avoids every item from receiving the "base game icon"
function p.getDLCColumnIcon(id)
local icon = p.getExpansionIcon(id)
if icon == '' then
icon = p.Melvor() .. ' '
end
return icon
end
return p