<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.digitalcellulose.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AFile</id>
	<title>Module:File - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.digitalcellulose.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AFile"/>
	<link rel="alternate" type="text/html" href="https://www.digitalcellulose.com/wiki/index.php?title=Module:File&amp;action=history"/>
	<updated>2026-05-12T17:37:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://www.digitalcellulose.com/wiki/index.php?title=Module:File&amp;diff=152281&amp;oldid=prev</id>
		<title>Adminsuzy: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://www.digitalcellulose.com/wiki/index.php?title=Module:File&amp;diff=152281&amp;oldid=prev"/>
		<updated>2020-09-13T20:46:19Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 20:46, 13 September 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Adminsuzy</name></author>
		
	</entry>
	<entry>
		<id>https://www.digitalcellulose.com/wiki/index.php?title=Module:File&amp;diff=152280&amp;oldid=prev</id>
		<title>Imported&gt;Perhelion: Fulfilling edit request by Speravir. Thanks for helping!</title>
		<link rel="alternate" type="text/html" href="https://www.digitalcellulose.com/wiki/index.php?title=Module:File&amp;diff=152280&amp;oldid=prev"/>
		<updated>2018-02-16T20:20:06Z</updated>

		<summary type="html">&lt;p&gt;Fulfilling edit request by Speravir. Thanks for helping!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module for handling Media files (Origin: Wikimedia Commons)&lt;br /&gt;
&lt;br /&gt;
-- Helpers&lt;br /&gt;
local h = {}&lt;br /&gt;
h.expandPage = function(fullPageName, args)&lt;br /&gt;
	-- This expansion may fail, use it with pcall and inspect error status&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{title = ':' .. fullPageName, args}&lt;br /&gt;
end&lt;br /&gt;
h.expandPageNoFail = function(fullPageName, args)&lt;br /&gt;
	local ok, wikiText = pcall(h.expandPage, fullPageName, args)&lt;br /&gt;
	if ok then&lt;br /&gt;
		return wikiText&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
-- Limits in megapixels are currently stored in Commons templates, they could be in this module.&lt;br /&gt;
-- There may be more limits for other supported mime types (djvu, flac, ogv, pdf, svg, webm, xcf).&lt;br /&gt;
h.maxthumbMap = {&lt;br /&gt;
--	['image/gif'] = h.expandPageNoFail('Template:LargeTIFF/limit', {}), -- current value is '50' but higher now&lt;br /&gt;
	['image/png' ] = h.expandPageNoFail('Template:LargePNG/limit', {}), -- current value is '2500'&lt;br /&gt;
	['image/tiff'] = h.expandPageNoFail('Template:LargeTIFF/limit', {}), -- current value is '50' but higher now&lt;br /&gt;
}&lt;br /&gt;
h.maxthumbMap['image/gif' ] = h.maxthumbMap['image/tiff'] -- current value is '50' but higher now&lt;br /&gt;
h.extensionMap = {&lt;br /&gt;
	-- File types with full support in Commons (See [[c:Commons:File types]]).&lt;br /&gt;
	DJVU = 'image/vnd.djvu',&lt;br /&gt;
	FLAC = 'audio/x-flac',&lt;br /&gt;
	GIF  = 'image/gif',&lt;br /&gt;
	JPEG = 'image/jpeg',&lt;br /&gt;
	JPG  = 'image/jpeg',&lt;br /&gt;
	MID  = 'audio/midi',&lt;br /&gt;
	MP3  = 'audio/mpeg',&lt;br /&gt;
	OGA  = 'audio/ogg',&lt;br /&gt;
	OGG  = 'audio/ogg',&lt;br /&gt;
	OGV  = 'video/ogg',&lt;br /&gt;
	PDF  = 'application/pdf',&lt;br /&gt;
	PNG  = 'image/png',&lt;br /&gt;
	SVG  = 'image/svg+xml',&lt;br /&gt;
	TIF  = 'image/tiff',&lt;br /&gt;
	TIFF = 'image/tiff',&lt;br /&gt;
	WEBM = 'video/webm',&lt;br /&gt;
	WAV  = 'audio/x-wav',&lt;br /&gt;
	XCF  = 'image/xcf',&lt;br /&gt;
&lt;br /&gt;
	-- Other file types with restrictions (not accepted in standard uploads on Commons but in 'User:' namespace).&lt;br /&gt;
	-- They could be supported in Wiki pages by embedding their content in an &amp;lt;pre&amp;gt; or &amp;lt;source&amp;gt; elements.&lt;br /&gt;
	CSS  = 'text/css',&lt;br /&gt;
	CSV  = 'text/csv',&lt;br /&gt;
	JS   = 'application/javascript',&lt;br /&gt;
	JSON = 'application/json',&lt;br /&gt;
	TXT  = 'text/plain',&lt;br /&gt;
	XML  = 'application/xml',&lt;br /&gt;
&lt;br /&gt;
	-- Only generated by MediaWiki on output of some queries, restricted in all uploads.&lt;br /&gt;
	GZ   = 'application/gzip', -- delivered only only for some wiki results&lt;br /&gt;
	ZIP  = 'application/zip', -- delivered only for some wiki data exports&lt;br /&gt;
&lt;br /&gt;
	-- Other file types not supported and to convert (a few of them may be in special administration namespaces).&lt;br /&gt;
	DOC  = 'application/msword', -- please convert to PDF, DJVU, or Wiki&lt;br /&gt;
	F4V  = 'video/mpeg', -- (deprecated, replaced by MP4) please convert to OGV or WEBM&lt;br /&gt;
	FLV  = 'video/x-flv', -- (deprecated, replaced by MP4) please convert to OGV or WEBM&lt;br /&gt;
	ICO  = 'image/vnd.microsoft.icon', -- used in MediaWiki resources for 'website icons'&lt;br /&gt;
	MP4  = 'video/mp4', -- please convert to OGV or WEBM&lt;br /&gt;
	QT   = 'video/quicktime', -- (deprecated, replaced by MP4) please convert to OGV or WEBM&lt;br /&gt;
	RA   = 'audio/vnd.rn-realaudio', -- (deprecated, replaced by MP3) please convert to OGA&lt;br /&gt;
	SWF  = 'video/x-flv', -- (deprecated, replaced by MP4) please convert to OGV or WEBM&lt;br /&gt;
	WMA  = 'audio/x-ms-wma', -- please convert to OGA&lt;br /&gt;
	WMV  = 'video/x-ms-wmv', -- please convert to OGV or WEBM&lt;br /&gt;
	XLS  = 'application/vnd.ms-excel', -- please convert to PDF, DJVU, or Wiki&lt;br /&gt;
}&lt;br /&gt;
h.parse = require(&amp;quot;Module:HTMLParser&amp;quot;).parse&lt;br /&gt;
&lt;br /&gt;
local File = function(title)&lt;br /&gt;
	local funcs = {}&lt;br /&gt;
	local titleInstance, metadataInstance&lt;br /&gt;
&lt;br /&gt;
	function getTitle()&lt;br /&gt;
		if titleInstance == nil then&lt;br /&gt;
			titleInstance = mw.title.new(title, 6)&lt;br /&gt;
		end&lt;br /&gt;
		return titleInstance&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function getFullName()&lt;br /&gt;
		return getTitle().prefixedText&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- =p.File(&amp;quot;Foo.bar.svg&amp;quot;).extension()&lt;br /&gt;
	-- @return &amp;quot;svg&amp;quot;&lt;br /&gt;
	funcs.extension = function()&lt;br /&gt;
		local parts = mw.text.split(title, '.', true)&lt;br /&gt;
		return parts[#parts]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- =p.File(&amp;quot;Foo.bar.svg&amp;quot;).woExtension()&lt;br /&gt;
	-- @return &amp;quot;Foo.bar&amp;quot;&lt;br /&gt;
	-- Original author: Bawolff at [[Module:FileName]]&lt;br /&gt;
	funcs.woExtension = function()&lt;br /&gt;
		local parts = mw.text.split(title , '.', true)&lt;br /&gt;
		local upTo = #parts - 1&lt;br /&gt;
		if upTo == 0 then upTo = 1 end&lt;br /&gt;
		return table.concat(parts, '.', 1, upTo)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function getMetadata()&lt;br /&gt;
		if metadataInstance == nil then&lt;br /&gt;
			metadataInstance = getTitle().file&lt;br /&gt;
		end&lt;br /&gt;
		return metadataInstance&lt;br /&gt;
	end&lt;br /&gt;
	funcs.metadata = function()&lt;br /&gt;
		return getMetadata()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Mapping file extensions to MIME-types (only MIME types accepted for files in Commons).&lt;br /&gt;
	-- Works even if file still does not exist.&lt;br /&gt;
	-- =p.File('Foo.bar.svg').extension()&lt;br /&gt;
	-- @return 'image/svg+xml'&lt;br /&gt;
	funcs.mime = function()&lt;br /&gt;
		local ok, metadata = pcall(funcs.metadata())&lt;br /&gt;
		if ok and metadata.exists then&lt;br /&gt;
			-- Note: does not work if file does not exist, where metadata == {'exists': false} only&lt;br /&gt;
			return metadata.mimeType&lt;br /&gt;
		end&lt;br /&gt;
		-- mw.log('mime() is deprecated. Use metadata().mimeType.')&lt;br /&gt;
		return h.extensionMap[funcs.extension():upper()] or 'unknown'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- =p.File('Foo.bar.tiff').maxthumb()&lt;br /&gt;
	funcs.maxthumb = function()&lt;br /&gt;
		return h.maxthumbMap[funcs.mime()] or 'unknown @Module:File'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	funcs.dateWorkCreated = function()&lt;br /&gt;
		-- Parse the expanded wiki text into an html root node and select a child node by specific ID.&lt;br /&gt;
		local root = h.parse('&amp;lt;html&amp;gt;' ..&lt;br /&gt;
			h.expandPageNoFail(getFullName(), {})&lt;br /&gt;
				:gsub('&amp;lt;nowiki&amp;gt;.*?&amp;lt;/nowiki&amp;gt;', '')&lt;br /&gt;
			.. '&amp;lt;/html&amp;gt;')&lt;br /&gt;
		local tdElem = root('#fileinfotpl_date')&lt;br /&gt;
		for td in pairs(tdElem) do -- We queried an ID so there should be only one result in this loop.&lt;br /&gt;
			-- We need the next sibling, which doesn't seem to be directly supported by HTMLParser.&lt;br /&gt;
			-- ... so ask him for the parent &amp;lt;tr&amp;gt; node and find the first &amp;lt;time&amp;gt; element in it.&lt;br /&gt;
			local timeElem = td.parent('time')&lt;br /&gt;
			for t in pairs(timeElem) do&lt;br /&gt;
				return t.attributes['datetime']&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return funcs&lt;br /&gt;
end&lt;br /&gt;
h.getFile = function(frame)&lt;br /&gt;
	return File(frame.args[1] or frame.args[&amp;quot;file&amp;quot;] or frame.args[&amp;quot;title&amp;quot;] or mw.title.getCurrentTitle().text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- @exports&lt;br /&gt;
local p = {}&lt;br /&gt;
p.File = File&lt;br /&gt;
p.extension = function(frame)&lt;br /&gt;
	return h.getFile(frame).extension():lower()&lt;br /&gt;
end&lt;br /&gt;
p.extensionUpper = function(frame)&lt;br /&gt;
	return h.getFile(frame).extension():upper()&lt;br /&gt;
end&lt;br /&gt;
p.csExtension = function(frame)&lt;br /&gt;
	return h.getFile(frame).extension()&lt;br /&gt;
end&lt;br /&gt;
p.woExtension = function(frame)&lt;br /&gt;
	return h.getFile(frame).woExtension()&lt;br /&gt;
end&lt;br /&gt;
p.mime = function(frame)&lt;br /&gt;
	return h.getFile(frame).mime()&lt;br /&gt;
end&lt;br /&gt;
p.fileExists = function(frame)&lt;br /&gt;
	return h.getFile(frame).metadata().exists or ''&lt;br /&gt;
end&lt;br /&gt;
-- This one won't throw errors at you&lt;br /&gt;
p.fileExistsRelaxed = function(frame)&lt;br /&gt;
	local ok, metadata = pcall(h.getFile(frame).metadata)&lt;br /&gt;
	if ok then&lt;br /&gt;
		return metadata.exists or ''&lt;br /&gt;
	else&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
p.mimeType = function(frame)&lt;br /&gt;
	return h.getFile(frame).metadata().mimeType&lt;br /&gt;
end&lt;br /&gt;
p.maxthumb = function(frame)&lt;br /&gt;
	return h.getFile(frame).maxthumb()&lt;br /&gt;
end&lt;br /&gt;
p.dateWorkCreated = function(frame)&lt;br /&gt;
	return h.getFile(frame).dateWorkCreated(frame) or ''&lt;br /&gt;
end&lt;br /&gt;
p.width = function(frame)&lt;br /&gt;
	return h.getFile(frame).metadata().width&lt;br /&gt;
end&lt;br /&gt;
p.height = function(frame)&lt;br /&gt;
	return h.getFile(frame).metadata().height&lt;br /&gt;
end&lt;br /&gt;
p.dimensions = function(frame)&lt;br /&gt;
	local d = h.getFile(frame).metadata()&lt;br /&gt;
	return d.width .. ' × ' .. d.height&lt;br /&gt;
end&lt;br /&gt;
p.size = function(frame)&lt;br /&gt;
	return h.getFile(frame).metadata().size&lt;br /&gt;
end&lt;br /&gt;
p.pageCount = function(frame)&lt;br /&gt;
	local pages = h.getFile(frame).metadata().pages or {1}&lt;br /&gt;
	return #pages&lt;br /&gt;
end&lt;br /&gt;
-- Module autotest&lt;br /&gt;
p.runTests = function()&lt;br /&gt;
	local toTest = require('Module:File/tests/all')&lt;br /&gt;
	local result = true&lt;br /&gt;
	for i, t in ipairs(toTest) do&lt;br /&gt;
		local f = File(t.fileName)&lt;br /&gt;
		local stringResult = ''&lt;br /&gt;
		local ret = true&lt;br /&gt;
		local results = {&lt;br /&gt;
			extension = (t.extension == f.extension()),&lt;br /&gt;
			extensionLower = (t.extensionLower == f.extension():lower()),&lt;br /&gt;
			extensionUpper = (t.extensionUpper == f.extension():upper()),&lt;br /&gt;
			woExtension = (t.woExtension == f.woExtension()),&lt;br /&gt;
			mime = (t.mime == f.mime()),&lt;br /&gt;
			maxthumb = (not (tonumber(f.maxthumb()) == nil) == t.maxthumbIsNumber),&lt;br /&gt;
			dateWorkCreated = t.dateWorkCreated == f.dateWorkCreated()&lt;br /&gt;
		}&lt;br /&gt;
		for k, v in pairs(results) do&lt;br /&gt;
			stringResult = stringResult .. k .. ': ' .. (v and 'ok    ' or 'failed') .. ' '&lt;br /&gt;
			ret = ret and v&lt;br /&gt;
		end&lt;br /&gt;
		mw.log(i, ret and 'passed' or 'FAILED', t.typeOfFileName, (not ret) and ('\n\t&amp;gt;&amp;gt;\t' .. t.fileName .. '\n\t&amp;gt;&amp;gt;\t' .. stringResult) or '')&lt;br /&gt;
		result = result and ret&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
-- p.h = h -- if needed for running some tests&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Imported&gt;Perhelion</name></author>
		
	</entry>
</feed>