Jump to content

Module:MonsterPreview

From Apogea Wiki
Revision as of 19:25, 20 January 2026 by Dane (talk | contribs) (Add MonsterPreview module for webm/png preview (via create-page on MediaWiki MCP Server))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

local p = {}

function p.render(frame)
    local name = frame.args[1]
    local size = frame.args[2] or frame.args.size or '128'
    local mode = frame.args.mode or 'auto'  -- auto, image, video
    local file = frame.args.file  -- custom file override
    
    if not name and not file then return '' end
    
    -- Custom file specified
    if file then
        return p.renderFile(file, size, name or file)
    end
    
    -- Check for webm first (unless image-only mode)
    if mode ~= 'image' then
        local webm = mw.title.new('File:' .. name .. '.webm')
        if webm and webm.exists then
            return string.format(
                '<span class="monster-preview">[[File:%s.webm|%spx|loop|autoplay|muted]]</span>',
                name, size
            )
        end
    end
    
    -- Fall back to png (or check for numbered variants like sprites)
    local suffix = p.getHighestStack(name)
    local filename = name .. suffix .. '.png'
    
    return string.format(
        '<span class="monster-preview pixel-sprite">[[File:%s|%spx|link=|alt=%s]]</span>',
        filename, size, name
    )
end

function p.getHighestStack(name)
    for i = 20, 1, -1 do
        local file = mw.title.new('File:' .. name .. i .. '.png')
        if file and file.exists then
            return tostring(i)
        end
    end
    return ''
end

function p.renderFile(file, size, alt)
    local ext = file:match('%.([^%.]+)$') or ''
    if ext == 'webm' or ext == 'mp4' or ext == 'gif' then
        return string.format(
            '<span class="monster-preview">[[File:%s|%spx|loop|autoplay|muted]]</span>',
            file, size
        )
    else
        return string.format(
            '<span class="monster-preview pixel-sprite">[[File:%s|%spx|link=|alt=%s]]</span>',
            file, size, alt
        )
    end
end

return p