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
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('Module:No globals')
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

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.