Jump to content
Toggle menu
  • 8 articles
  • 75 files
  • 7 users
  • 37.8K edits
Neodyland Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:File: Difference between revisions

From Neodyland Wiki
m Protected Module:File: Default for modules ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
Add webp to list of supported file types
 
(33 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 = function(title)
 
local funcs = {}
require('strict')
-- =p.File("Foo.bar.svg").extension()
 
funcs.extension = function()
-- ==================================================
local parts = mw.text.split( title, '.', true )
-- === 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]
return parts[#parts]
else
return ''
end
end
-- mapping file extensions to MIME-types
end
funcs.extensionMap = {
 
PNG  = "image/png",
function p.extension(frame)
GIF  = "image/gif",
return p.csExtension(frame):lower()
SVG  = "image/svg+xml",
end
TIFF = "image/tiff",
 
TIF  = "image/tiff",
function p.extensionUpper(frame)
JPEG = "image/jpeg",
return p.csExtension(frame):upper()
JPE  = "image/jpeg"
end
}
 
-- =p.File("Foo.bar.svg").mime()
-- p.woExtension("Foo.bar.svg")
funcs.mime = function()
-- @return "Foo.bar"
local extension = funcs.extension():upper()
-- Original author: Bawolff at [[Module:FileName]]
return funcs.extensionMap[extension] or "unknown"
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
-- =p.File("Foo.bar.tiff").maxthumb()
end
funcs.maxthumb = function()
 
local mime = funcs.mime()
function p.mimeType(frame)
if mime == "image/png" then
return getMetadata(frame).mimeType
return mw.getCurrentFrame():preprocess( '{{LargePNG/limit}}' )
end
elseif mime == "image/tiff" or mime == "image/gif" then
 
return mw.getCurrentFrame():preprocess( '{{LargeTIFF/limit}}' )
function p.fileExists(frame)
else
return getMetadata(frame).exists or ''
return ''
end
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
return funcs
end
end


local p = {}
function p.maxthumb(frame)
p.File = File
-- Limits in megapixels are currently stored in Commons templates, they could be in this module.
p.extension = function(frame)
-- There may be more limits for other supported mime types (djvu, flac, ogv, pdf, svg, webm, xcf).
    return File(frame.args[1] or frame.args["file"] or frame.args["title"]).extension():lower()
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
end
p.extensionUpper = function(frame)
 
    return File(frame.args[1] or frame.args["file"] or frame.args["title"]).extension():upper()
function p.dimensions(frame)
local d = getMetadata(frame)
if d.exists then
return d.width .. ' × ' .. d.height 
else
return ''
end
end
end
p.mime = function(frame)
 
    return File(frame.args[1] or frame.args["file"] or frame.args["title"]).mime()
function p.size(frame)
return getMetadata(frame).size
end
end
p.maxthumb = function(frame)
 
    return File(frame.args[1] or frame.args["file"] or frame.args["title"]).maxthumb()
function p.pageCount(frame)
local pages = getMetadata(frame).pages or {1}
return #pages
end
end


return p
return p

Latest revision as of 15:32, 29 October 2024

Module documentation[ view · edit · history · purge ]
This documentation is transcluded from Module:File/doc.

Scope

edit

File 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

edit

Note 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

edit

Examples:

{{#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/png deprecated (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
Contents
Cookies help us deliver our services. By using our services, you agree to our use of cookies.