13 Articles
Project Nakagami

Module:ItemIcon: Difference between revisions

No edit summary
No edit summary
 
(12 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {} --package
local p = {} --package
-- returns HTML, name, defaultLink
function p.AddSpriteInternal(icon, size, additionalCssText)
    local SHEET_ICON_SIZE = 64 -- how large icons are in the spritesheet
    local SHEET_SIZE_X = 2048 -- how wide the spritesheet image is
    local SHEET_SIZE_Y = 23040 -- how tall the spritesheet image is
    local SPAN_CLASS = 'item-icon' -- the class attribute on the image span element
    local DataTable = mw.loadData('Module:ItemIconData')
    if not DataTable then DataTable = {} end
    local DataFromTable = DataTable.Locations[icon]
    if not DataFromTable then DataFromTable = { X = 0, Y = 0, N = 'NONE', L = nil } end
    local SpriteX = DataFromTable.X
    local SpriteY = DataFromTable.Y
    local IconScale = size / SHEET_ICON_SIZE
    local ImageXOffset = SpriteX * SHEET_ICON_SIZE * IconScale * -1
    local ImageYOffset = SpriteY * SHEET_ICON_SIZE * IconScale * -1
    local ScaledSheetSizeX = SHEET_SIZE_X * IconScale
    local ScaledSheetSizeY = SHEET_SIZE_Y * IconScale
    local SpriteHTML = mw.html.create('span');
    SpriteHTML:addClass(SPAN_CLASS)
   
    local StyleItems = {}
    StyleItems[#StyleItems + 1] = 'height:' .. size .. 'px'
    StyleItems[#StyleItems + 1] = 'width:' .. size .. 'px'
    StyleItems[#StyleItems + 1] = 'background-size:' .. ScaledSheetSizeX .. 'px ' .. ScaledSheetSizeY .. 'px'
    StyleItems[#StyleItems + 1] = 'background-position:' .. ImageXOffset .. 'px ' .. ImageYOffset .. 'px'
    SpriteHTML:cssText(table.concat(StyleItems, ';') .. ';' .. additionalCssText)
    return tostring(SpriteHTML), (DataFromTable.N or 'NONE'), DataFromTable.L
end


-- Allowed Arguments:
-- Allowed Arguments:
Line 6: Line 42:
-- link: The page to link to if the icon is clicked
-- link: The page to link to if the icon is clicked
function p.AddSprite(frame)
function p.AddSprite(frame)
     local DEFAULT_ICON_SIZE = 16 -- how big icons should be on the page if not specifically sized
     local DEFAULT_ICON_SIZE = 32 -- how big icons should be on the page if not specifically sized
     local SHEET_ICON_SIZE = 16 -- how large icons are in the spritesheet
      
    local SHEET_SIZE = 256 -- how wide the spritesheet image is
    local SPAN_CLASS = 'item-icon' -- the class attribute on the image span element
    local DATA_MODULE = 'ItemIconData' -- the Module page containing the data table
 
    local DataTable = mw.loadData('Module:' .. DATA_MODULE)
    if not DataTable then DataTable = {} end
 
     local IconName = frame:getArgument('icon'):expand()
     local IconName = frame:getArgument('icon'):expand()
     if not IconName then IconName = 'NONE' end
     if not IconName then IconName = 'none' end


     local IconSize = tonumber(frame:getArgument('size'):expand())
     local IconSize = tonumber(frame:getArgument('size'):expand())
     if not IconSize then IconSize = DEFAULT_ICON_SIZE end
     if not IconSize then IconSize = DEFAULT_ICON_SIZE end
    mw.logObject(IconSize)


     local LinkDest = frame:getArgument('link'):expand()
     local LinkDest = frame:getArgument('link'):expand()
     if not LinkDest then LinkDest = '' end
     if not LinkDest then LinkDest = '' end


     local LocationFromTable = DataTable.Locations[IconName]
     local IconHTML, ItemName, DefaultLink = p.AddSpriteInternal(IconName, IconSize, '')
    if not LocationFromTable then LocationFromTable = { X = 0, Y = 0 } end


     local SpriteX = LocationFromTable.X
     local UsedLink = link or DefaultLink
    local SpriteY = LocationFromTable.Y


     local IconScale = IconSize / SHEET_ICON_SIZE
     if UsedLink and UsedLink ~= '' and UsedLink ~= 'none' then
     local ImageXOffset = SpriteX * SHEET_ICON_SIZE * IconScale * -1
        if UsedLink:find('//') then -- External Link
    local ImageYOffset = SpriteY * SHEET_ICON_SIZE * IconScale * -1
            return '[' .. UsedLink .. ' ' .. IconHTML .. ']'
     local ScaledSheetSize = SHEET_SIZE * IconScale
        else -- Internal Link
            return '[[' .. UsedLink .. '|' .. IconHTML .. ']]'
        end
    else
        return IconHTML
    end
end
 
function p.AddSpritePredef(frame)
     local FORMATS = {
        ['inline'] = { Size=32, Link=true, Newline=false, Name=true },
        ['itemtable'] = { Size=64, Link=true, Newline=true, Name=true },
        ['icon'] = { Size=32, Link=true, Newline=false, Name=false },
        ['nolink'] = { Size=32, Link=false, Newline=false, Name=true }
     }


     local SpriteHTML = mw.html.create('span');
     TemplateCall = frame:getParent();
    SpriteHTML:addClass(SPAN_CLASS)
      
      
     local StyleItems = {}
     local ItemRef = TemplateCall:getArgument('item'):expand()
     StyleItems[#StyleItems + 1] = 'height:' .. IconSize .. 'px'
     if not ItemRef then ItemRef = TemplateCall.args[1] end
     StyleItems[#StyleItems + 1] = 'width:' .. IconSize .. 'px'
    if not ItemRef then ItemRef = 'none' end
     StyleItems[#StyleItems + 1] = 'background-size:' .. ScaledSheetSize .. 'px auto'
 
     StyleItems[#StyleItems + 1] = 'background-position:' .. ImageXOffset .. 'px ' .. ImageYOffset .. 'px'
    local FormatName = TemplateCall:getArgument('format'):expand()
     if not FormatName then FormatName = TemplateCall.args[2] end
     if (not FormatName) or (not FORMATS[FormatName]) then FormatName = 'inline' end
 
     local Format = FORMATS[FormatName]
 
    local IconHTML, ItemName, DefaultLink = p.AddSpriteInternal(ItemRef, Format.Size, '')


     SpriteHTML:cssText(table.concat(StyleItems, ';'))
     local Link = TemplateCall:getArgument('link'):expand() or DefaultLink or ItemName
   
    local Formatted = IconHTML .. (Format.Newline and '<br />' or '') .. (Format.Name and ((Format.Newline and '' or ' ') .. ItemName) or '')


     if LinkDest ~= '' then
     if Format.Link and Link then
         if LinkDest:find('//') then -- External Link
         if Link:find('//') then -- External Link
             return '[' .. LinkDest .. ' ' .. tostring(SpriteHTML) .. ']'
             return '[' .. Link .. ' ' .. Formatted .. ']'
         else -- Internal Link
         else -- Internal Link
             return '[[' .. LinkDest .. '|' .. tostring(SpriteHTML) .. ']]'
             return '[[' .. Link .. '|' .. Formatted .. ']]'
         end
         end
     else
     else
         return tostring(SpriteHTML)
         return Formatted
     end
     end
end
end


return p
return p

Latest revision as of 05:30, 16 August 2024

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

local p = {} --package

-- returns HTML, name, defaultLink
function p.AddSpriteInternal(icon, size, additionalCssText)
    local SHEET_ICON_SIZE = 64 -- how large icons are in the spritesheet
    local SHEET_SIZE_X = 2048 -- how wide the spritesheet image is
    local SHEET_SIZE_Y = 23040 -- how tall the spritesheet image is
    local SPAN_CLASS = 'item-icon' -- the class attribute on the image span element

    local DataTable = mw.loadData('Module:ItemIconData')
    if not DataTable then DataTable = {} end

    local DataFromTable = DataTable.Locations[icon]
    if not DataFromTable then DataFromTable = { X = 0, Y = 0, N = 'NONE', L = nil } end

    local SpriteX = DataFromTable.X
    local SpriteY = DataFromTable.Y

    local IconScale = size / SHEET_ICON_SIZE
    local ImageXOffset = SpriteX * SHEET_ICON_SIZE * IconScale * -1
    local ImageYOffset = SpriteY * SHEET_ICON_SIZE * IconScale * -1
    local ScaledSheetSizeX = SHEET_SIZE_X * IconScale
    local ScaledSheetSizeY = SHEET_SIZE_Y * IconScale

    local SpriteHTML = mw.html.create('span');
    SpriteHTML:addClass(SPAN_CLASS)
    
    local StyleItems = {}
    StyleItems[#StyleItems + 1] = 'height:' .. size .. 'px'
    StyleItems[#StyleItems + 1] = 'width:' .. size .. 'px'
    StyleItems[#StyleItems + 1] = 'background-size:' .. ScaledSheetSizeX .. 'px ' .. ScaledSheetSizeY .. 'px'
    StyleItems[#StyleItems + 1] = 'background-position:' .. ImageXOffset .. 'px ' .. ImageYOffset .. 'px'

    SpriteHTML:cssText(table.concat(StyleItems, ';') .. ';' .. additionalCssText)

    return tostring(SpriteHTML), (DataFromTable.N or 'NONE'), DataFromTable.L
end

-- Allowed Arguments:
-- icon: The name of the icon to show, defined in the image index.
-- size: The size, in pixels, to use for the icon on the page.
-- link: The page to link to if the icon is clicked
function p.AddSprite(frame)
    local DEFAULT_ICON_SIZE = 32 -- how big icons should be on the page if not specifically sized
    
    local IconName = frame:getArgument('icon'):expand()
    if not IconName then IconName = 'none' end

    local IconSize = tonumber(frame:getArgument('size'):expand())
    if not IconSize then IconSize = DEFAULT_ICON_SIZE end

    local LinkDest = frame:getArgument('link'):expand()
    if not LinkDest then LinkDest = '' end

    local IconHTML, ItemName, DefaultLink = p.AddSpriteInternal(IconName, IconSize, '')

    local UsedLink = link or DefaultLink

    if UsedLink and UsedLink ~= '' and UsedLink ~= 'none' then
        if UsedLink:find('//') then -- External Link
            return '[' .. UsedLink .. ' ' .. IconHTML .. ']'
        else -- Internal Link
            return '[[' .. UsedLink .. '|' .. IconHTML .. ']]'
        end
    else
        return IconHTML
    end
end

function p.AddSpritePredef(frame)
    local FORMATS = {
        ['inline'] = { Size=32, Link=true, Newline=false, Name=true },
        ['itemtable'] = { Size=64, Link=true, Newline=true, Name=true },
        ['icon'] = { Size=32, Link=true, Newline=false, Name=false },
        ['nolink'] = { Size=32, Link=false, Newline=false, Name=true }
    }

    TemplateCall = frame:getParent();
    
    local ItemRef = TemplateCall:getArgument('item'):expand()
    if not ItemRef then ItemRef = TemplateCall.args[1] end
    if not ItemRef then ItemRef = 'none' end

    local FormatName = TemplateCall:getArgument('format'):expand()
    if not FormatName then FormatName = TemplateCall.args[2] end
    if (not FormatName) or (not FORMATS[FormatName]) then FormatName = 'inline' end

    local Format = FORMATS[FormatName]

    local IconHTML, ItemName, DefaultLink = p.AddSpriteInternal(ItemRef, Format.Size, '')

    local Link = TemplateCall:getArgument('link'):expand() or DefaultLink or ItemName
    
    local Formatted = IconHTML .. (Format.Newline and '<br />' or '') .. (Format.Name and ((Format.Newline and '' or ' ') .. ItemName) or '')

    if Format.Link and Link then
        if Link:find('//') then -- External Link
            return '[' .. Link .. ' ' .. Formatted .. ']'
        else -- Internal Link
            return '[[' .. Link .. '|' .. Formatted .. ']]'
        end
    else
        return Formatted
    end
end

return p