Module:File: Difference between revisions
From Neodyland Wiki
More actions
fix variety of errors identified through unit testing, retire functions to be called from other lua modules as most of the functions are quite trivial |
Add webp to list of supported file types |
||
| (2 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
-- Module for handling Media files (Origin: Wikimedia Commons) | -- Module for handling Media files (Origin: Wikimedia Commons) | ||
require(' | require('strict') | ||
-- ================================================== | -- ================================================== | ||
| Line 25: | Line 25: | ||
TIFF = 'image/tiff', | TIFF = 'image/tiff', | ||
WEBM = 'video/webm', | WEBM = 'video/webm', | ||
WEBP = 'image/webp', | |||
WAV = 'audio/x-wav', | WAV = 'audio/x-wav', | ||
XCF = 'image/xcf', | XCF = 'image/xcf', | ||
Latest revision as of 15:32, 29 October 2024
This documentation is transcluded from Module:File/doc.
Scope
editFile title and file information. If the code here grows beyond a border line, this should be converted to an interface and the processing code should be outsourced.[Please clarify – October 2024]
Usage
editNote that an error is thrown if the title can't be constructed (e.g. a title containing invalid characters is supplied) or metadata isn't available (e.g. due to missing file or extraction error). It is your responsibility to catch them; in Lua through pcall(); from Wikitext as {{#iferror: {{#invoke:File|function|file=File:P%bar]baz.qqq}} | meaningful message}}.
From Wikitext
editExamples:
{{#invoke:File|woExtension|file=File:Test.C.JpeG}}→File:Test.C{{#invoke:File|extension|file=File:Test.C.JpeG}}→jpeg{{#invoke:File|csExtension|file=File:Test.C.JpeG}}→JpeG{{#invoke:File|mime|file=File:DOESNOTEXIST-0a8de8c83.Png}}→image/pngdeprecated (but works even if the file does not exist and has no metadata){{#invoke:File|mimeType|file=File:DOESNOTEXIST-0a8de8c83.Png}}→preferred (but will not work if the file does not exist to parse its metadata){{#invoke:File|fileExists|file=File:Commons-logo.png}}→true{{#invoke:File|fileExists|file=File:DOESNOTEXIST-0a8de8c83.png}}→{{#invoke:File|fileExistsRelaxed|file=File:Ba[!#llot-sprite.png}}→
{{#invoke:File|width|file=File:Commons-logo.png}}→114{{#invoke:File|height|file=File:Commons-logo.png}}→153{{#invoke:File|dimensions|file=File:Commons-logo.png}}→114 × 153{{#invoke:File|size|file=File:Commons-logo.png}}→5557
-- Module for handling Media files (Origin: Wikimedia Commons)
require('strict')
-- ==================================================
-- === helper Lookup table ==========================
-- ==================================================
local extensionMap = {
-- File types with full support in Commons (See [[c:Commons:File types]]).
DJVU = 'image/vnd.djvu',
FLAC = 'audio/x-flac',
GIF = 'image/gif',
JPEG = 'image/jpeg',
JPG = 'image/jpeg',
MID = 'audio/midi',
MP3 = 'audio/mpeg',
OGA = 'audio/ogg',
OGG = 'audio/ogg',
OGV = 'video/ogg',
PDF = 'application/pdf',
PNG = 'image/png',
SVG = 'image/svg+xml',
TIF = 'image/tiff',
TIFF = 'image/tiff',
WEBM = 'video/webm',
WEBP = 'image/webp',
WAV = 'audio/x-wav',
XCF = 'image/xcf',
-- Other file types with restrictions (not accepted in standard uploads on Commons but in 'User:' namespace).
-- They could be supported in Wiki pages by embedding their content in an <pre> or <source> elements.
CSS = 'text/css',
CSV = 'text/csv',
JS = 'application/javascript',
JSON = 'application/json',
TXT = 'text/plain',
XML = 'application/xml',
-- Only generated by MediaWiki on output of some queries, restricted in all uploads.
GZ = 'application/gzip', -- delivered only only for some wiki results
ZIP = 'application/zip', -- delivered only for some wiki data exports
-- Other file types not supported and to convert (a few of them may be in special administration namespaces).
DOC = 'application/msword', -- please convert to PDF, DJVU, or Wiki
F4V = 'video/mpeg', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
FLV = 'video/x-flv', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
ICO = 'image/vnd.microsoft.icon', -- used in MediaWiki resources for 'website icons'
MP4 = 'video/mp4',
QT = 'video/quicktime', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
RA = 'audio/vnd.rn-realaudio', -- (deprecated, replaced by MP3) please convert to OGA
SWF = 'video/x-flv', -- (deprecated, replaced by MP4) please convert to OGV or WEBM
WMA = 'audio/x-ms-wma', -- please convert to OGA
WMV = 'video/x-ms-wmv', -- please convert to OGV or WEBM
XLS = 'application/vnd.ms-excel', -- please convert to PDF, DJVU, or Wiki
}
-- ==================================================
-- === Local functions ==============================
-- ==================================================
local function filename(frame)
return frame.args[1] or frame.args["file"] or frame.args["title"]
end
local function getMetadata(frame)
local fname = filename(frame)
local title
if fname then
title = mw.title.new(fname, 6)
else
title = mw.title.getCurrentTitle()
end
if title then
return title.file
else
return {exists=false}
end
end
-- ==================================================
-- === External functions ===========================
-- ==================================================
local p = {}
-- p.csExtension("Foo.bar.svg")
-- @return "svg"
function p.csExtension(frame)
local fname = filename(frame) or mw.title.getCurrentTitle().text
local parts = mw.text.split(fname, '.', true)
if #parts>1 then
return parts[#parts]
else
return ''
end
end
function p.extension(frame)
return p.csExtension(frame):lower()
end
function p.extensionUpper(frame)
return p.csExtension(frame):upper()
end
-- p.woExtension("Foo.bar.svg")
-- @return "Foo.bar"
-- Original author: Bawolff at [[Module:FileName]]
function p.woExtension(frame)
local fname = filename(frame) or mw.title.getCurrentTitle().text
local parts = mw.text.split(fname , '.', true)
local upTo = #parts - 1
if upTo == 0 then upTo = 1 end
return table.concat(parts, '.', 1, upTo)
end
function p.mime(frame)
local meta = getMetadata(frame)
if meta.exists then
return meta.mimeType
else
return extensionMap[p.extensionUpper(frame)] or 'unknown'
end
end
function p.mimeType(frame)
return getMetadata(frame).mimeType
end
function p.fileExists(frame)
return getMetadata(frame).exists or ''
end
-- This one won't throw errors at you
function p.fileExistsRelaxed(frame)
local ok, metadata = pcall(getMetadata(frame))
if ok then
return metadata.exists or ''
else
return ''
end
end
function p.maxthumb(frame)
-- Limits in megapixels are currently stored in Commons templates, they could be in this module.
-- There may be more limits for other supported mime types (djvu, flac, ogv, pdf, svg, webm, xcf).
local maxthumbMap = {
['image/gif'] = 1000,
['image/png' ] = 2500, -- see Template:LargePNG/limit
['image/tiff'] = 1000, -- see Template:LargeTIFF/limit
}
local mime = p.mime(frame)
return maxthumbMap[mime] or 'unknown @Module:File'
end
function p.dateWorkCreated(frame)
return '' -- no longer supported
end
function p.width(frame)
return getMetadata(frame).width
end
function p.height(frame)
return getMetadata(frame).height
end
function p.dimensions(frame)
local d = getMetadata(frame)
if d.exists then
return d.width .. ' × ' .. d.height
else
return ''
end
end
function p.size(frame)
return getMetadata(frame).size
end
function p.pageCount(frame)
local pages = getMetadata(frame).pages or {1}
return #pages
end
return p