Module:File: Difference between revisions
From Neodyland Wiki
More actions
adding tests, woExtension |
Add webp to list of supported file types |
||
| (31 intermediate revisions by 8 users not shown) | |||
| Line 1: | Line 1: | ||
-- Module for handling Media files (Origin: Wikimedia Commons) | -- Module for handling Media files (Origin: Wikimedia Commons) | ||
local File = | |||
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 | end | ||
if title then | |||
return title.file | |||
else | |||
return {exists=false} | |||
end | 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 | return parts[#parts] | ||
else | |||
return '' | |||
end | end | ||
-- | end | ||
function p.extension(frame) | |||
return p.csExtension(frame):lower() | |||
end | |||
function p.extensionUpper(frame) | |||
else | 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 | ||
return | end | ||
function p.mimeType(frame) | |||
return getMetadata(frame).mimeType | |||
end | end | ||
function p.fileExists(frame) | |||
return getMetadata(frame).exists or '' | |||
return | |||
end | end | ||
-- | -- This one won't throw errors at you | ||
function p.fileExistsRelaxed(frame) | |||
p. | 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 | end | ||
p. | |||
function p.dateWorkCreated(frame) | |||
return '' -- no longer supported | |||
end | end | ||
p. | |||
return | function p.width(frame) | ||
return getMetadata(frame).width | |||
end | end | ||
p. | |||
function p.height(frame) | |||
return getMetadata(frame).height | |||
end | end | ||
p. | |||
function p.dimensions(frame) | |||
local d = getMetadata(frame) | |||
if d.exists then | |||
return d.width .. ' × ' .. d.height | |||
else | |||
return '' | |||
end | |||
end | end | ||
function p.size(frame) | |||
return getMetadata(frame).size | |||
end | |||
p. | function p.pageCount(frame) | ||
local | local pages = getMetadata(frame).pages or {1} | ||
return #pages | |||
end | end | ||
return p | return p | ||