Search code examples
mediawiki

tooltip for pdf size (automatically found)


I have tables listing various pdf documents in my wiki. I use [[Image:Pdficon.png|16px|link={{filepath:MyFileName.pdf}}]] in the wiki table to display a small icon (Pdficon.png) that when clicked opens the pdf file.

enter image description here

I want to get a popup showing the size of the pdf file when I mouse over the icon. I know I can do it "manually" with the RegularTooltips extension like this: {{#inline-tooltip: | 350 kB}}.

However, I would like to have some wiki code that finds the filesize (e.g. 350 kB) and populates that popup for me automatically.

Is there anything remotely close to this already available?


Solution

  • If you have Scribunto installed, you can use the file attribute of the mw.title object by defining Module:File data:

    -- Convert a property to custom unit of measurement:
    local bit32 = require 'bit32'
    local conversions = {
        size = function (bytes, unit)
            local shifts = { b = 0, kb = 10, mb = 20, gb = 30 }
            return bit32.rshift (bytes, shifts [(unit or 'b'):lower()] or 0)
        end
    }
    
    -- Function that returns a function returning certain file attribute:
    local function attribute_function (attr)
        return function (frame)
            local text = frame.args [1]
            local title = mw.title.new (text, 6) -- 6 is File:.
            local attrs = title.file
            if not attrs.exists then
                return nil
            end
            -- Take multi-page files into account (| page = n):
            if frame.args.page and attrs.pages then
                attrs = attrs.pages[tonumber (frame.args.page) or 1]
            end
            local value = attrs [attr]
            -- Process optional parameters if defined for this property:
            if conversions [attr] then
                -- Normal table methods do not work on frame.args:
                local optional = {}
                for key, arg in ipairs (frame.args) do
                    if key ~= 1 then
                        optional [key - 1] = arg
                    end
                end
                value = conversions [attr] (value, unpack (optional))
            end
            return value
        end
    end
    
    local module = {}
    
    for _, property in ipairs {
        'width',
        'height',
        'size',
        'mimeType',
        'length'
    } do
        module [property] = attribute_function (property)
    end
    
    return module
    

    Get the file size by adding to wikitext:

    • {{#invoke:File data|size|MyFileName.pdf}} or
    • {{#invoke:File data|size|MyFileName.pdf|KB}}