Module:InfoboxImage

From Weezerpedia

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

-- Inputs:
--    image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link
--    page - page to display for multipage images (DjVu)
--    size - size to display the image
--    maxsize - maximum size for image
--    sizedefault - default size to display the image if size param is blank
--    alt - alt text for image
--    title - title text for image
--    border - set to yes if border
--    center - set to yes, if the image has to be centered
--    upright - upright image param
--    link - page to visit when clicking on image
--    class - HTML classes to add to the image
-- Outputs:
--    Formatted image.
-- More details available at the "Module:InfoboxImage/doc" page

local i = {};

local categories = {
    url_image_links = "[[Category:Pages using infoboxes with URL in image parameter]]",
    thumbnail_images = "[[Category:Pages using infoboxes with thumbnail images]]",
}

local function trackable()
    local ns = mw.title.getCurrentTitle().nsText:lower()
    return not (ns == 'user' or ns == 'user talk')
end

function i.InfoboxImage(frame)
    local image = frame.args["image"];

    -- If no image is provided, return an empty string (no image will be shown)
    if image == "" or image == nil then
        return "";
    end
    if image == " " then
        return image;
    end

    -- If the image has a URL, it should be handled here (error category or similar).
    if string.find(image, "^%[*https?:") then
        return trackable() and categories.url_image_links or ""
    end

    if mw.ustring.sub(image, 1, 2) == "[[" then
        -- If it's a thumbnail image, handle it and add it to tracking category if needed
        local cat = "";
        if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, "|%s*thumb%s*[|%]]") or mw.ustring.find(image, "|%s*thumbnail%s*[|%]]")) then
            cat = trackable() and categories.thumbnail_images or ""
        end
        return image .. cat;
    elseif mw.ustring.sub(image, 1, 2) == "{{" and mw.ustring.sub(image, 1, 3) ~= "{{{" then
        return image;
    elseif mw.ustring.sub(image, 1, 1) == "<" then
        return image;
    elseif mw.ustring.sub(image, 1, 8) == mw.ustring.char(127) .. "'\"`UNIQ" then
        -- Strip marker found, don't process further
        return image;
    else
        local result = "";
        local page = frame.args["page"];
        local size = frame.args["size"];
        local maxsize = frame.args["maxsize"];
        local sizedefault = frame.args["sizedefault"];
        local alt = frame.args["alt"];
        local link = frame.args["link"];
        local title = frame.args["title"];
        local border = frame.args["border"];
        local upright = frame.args["upright"] or "";
        local thumbtime = frame.args["thumbtime"] or "";
        local center = frame.args["center"];
        local class = frame.args["class"];
        
        -- Clean up image name by removing any namespace prefix
        local allNames = mw.site.namespaces[6].aliases
        allNames[#allNames + 1] = mw.site.namespaces[6].name
        allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName
        for i, name in ipairs(allNames) do
            if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. ":") then
                image = mw.ustring.sub(image, mw.ustring.len(name) + 2);
                break
            end
        end
        
        if maxsize ~= "" and maxsize ~= nil then
            if sizedefault == "" or sizedefault == nil then
                sizedefault = maxsize
            end
            if size ~= "" and size ~= nil then
                local sizenumber = tonumber(mw.ustring.match(size, "%d*")) or 0;
                local maxsizenumber = tonumber(mw.ustring.match(maxsize, "%d*")) or 0;
                if sizenumber > maxsizenumber and maxsizenumber > 0 then
                    size = maxsize;
                end
            end
        end

        -- Add px to size if it's just a number
        if (tonumber(size) or 0) > 0 then
            size = size .. "px";
        end
        if (tonumber(sizedefault) or 0) > 0 then
            sizedefault = sizedefault .. "px";
        end
        
        result = "[[File:" .. image;
        if page ~= "" and page ~= nil then
            result = result .. "|page=" .. page;
        end
        if size ~= "" and size ~= nil then
            result = result .. "|" .. size;
        elseif sizedefault ~= "" and sizedefault ~= nil then
            result = result .. "|" .. sizedefault;
        else
            result = result .. "|frameless";
        end
        if center == "yes" then
            result = result .. "|center"
        end
        if alt ~= "" and alt ~= nil then
            result = result .. "|alt=" .. alt;
        end
        if link ~= "" and link ~= nil then
            result = result .. "|link=" .. link;
        end
        if border == "yes" then
            result = result .. "|border";
        end
        if upright == "yes" then
            result = result .. "|upright";
        elseif upright ~= "" then
            result = result .. "|upright=" .. upright;
        end
        if thumbtime ~= "" then
            result = result .. "|thumbtime=" .. thumbtime;
        end
        if class ~= nil and class ~= "" then
            result = result .. "|class=" .. class;
        end

        -- Return the formatted image
        result = result .. "]]";
        return result;
    end
end

return i;