Modul:File link: Unterschied zwischen den Versionen

Permanently protected module
ZIM HilfeWiki - das Wiki
K (Schützte „Modul:File link“ ([Bearbeiten=Nur Administratoren erlauben] (unbeschränkt) [Verschieben=Nur Administratoren erlauben] (unbeschränkt)))
imported>Oetterer
 
Zeile 1: Zeile 1:
 
-- This module provides a library for formatting file wikilinks.
 
-- This module provides a library for formatting file wikilinks.
  
local libraryUtil = require('libraryUtil')
+
local yesno = require('Module:Yesno')
local checkType = libraryUtil.checkType
+
local checkType = require('libraryUtil').checkType
 +
local fileExtension = require('Module:Util').globalFileExtension()
  
local fileLink = {}
+
local p = {}
  
function fileLink.new(filename)
+
function p._main(args)
checkType('fileLink.new', 1, filename, 'string', true)
+
checkType('_main', 1, args, 'table')
local obj, data = {}, {}
+
 
+
-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
local checkSelf = libraryUtil.makeCheckSelfFunction(
+
-- own function to get the right error level.
'fileLink',
+
local function checkArg(key, val, level)
'fileLink',
+
if type(val) ~= 'string' then
obj,
 
'fileLink object'
 
)
 
 
-- Set the filename if we were passed it as an input to fileLink.new.
 
if filename then
 
data.theName = filename
 
end
 
 
function data:name(s)
 
checkSelf(self, 'name')
 
checkType('fileLink:name', 1, s, 'string')
 
data.theName = s
 
return self
 
end
 
 
function data:format(s, filename)
 
checkSelf(self, 'format')
 
checkType('fileLink:format', 1, s, 'string', true)
 
checkType('fileLink:format', 2, format, 'string', true)
 
local validFormats = {
 
thumb = true,
 
thumbnail = true,
 
frame = true,
 
framed = true,
 
frameless = true
 
}
 
if s == nil or validFormats[s] then
 
data.theFormat = s
 
data.theFormatFilename = filename
 
else
 
 
error(string.format(
 
error(string.format(
"bad argument #1 to 'fileLink:format' ('%s' is not a valid format)",
+
"type error in '%s' parameter of '_main' (expected string, got %s)",
s
+
key, type(val)
), 2)
+
), level)
 
end
 
end
return self
 
 
end
 
end
  
local function sizeError(methodName)
+
local ret = {}
-- Used for formatting duplication errors in size-related methods.
+
 
error(string.format(
+
-- Adds a positional parameter to the buffer.
"duplicate size argument detected in '%s'"
+
local function addPositional(key)
.. " ('upright' cannot be used in conjunction with height or width)",
+
local val = args[key]
methodName
+
if not val then
), 3)
+
return nil
end
 
 
function data:width(px)
 
checkSelf(self, 'width')
 
checkType('fileLink:width', 1, px, 'number', true)
 
if px and data.isUpright then
 
sizeError('fileLink:width')
 
 
end
 
end
data.theWidth = px
+
checkArg(key, val, 4)
return self
+
ret[#ret + 1] = val
 
end
 
end
+
 
function data:height(px)
+
-- Adds a named parameter to the buffer. We assume that the parameter name
checkSelf(self, 'height')
+
-- is the same as the argument key.
checkType('fileLink:height', 1, px, 'number', true)
+
local function addNamed(key)
if px and data.isUpright then
+
local val = args[key]
sizeError('fileLink:height')
+
if not val then
 +
return nil
 
end
 
end
data.theHeight = px
+
checkArg(key, val, 4)
return self
+
ret[#ret + 1] = key .. '=' .. val
 
end
 
end
 +
 +
-- Filename
 +
checkArg('file', args.file, 3)
 +
ret[#ret + 1] = 'File:' .. args.file
 
 
function data:upright(isUpright, factor)
+
-- add global extension, if none given
checkSelf(self, 'upright')
+
if not mw.ustring.match( args.file, '%.[a-zA-Z0-9]+$' ) then
checkType('fileLink:upright', 1, isUpright, 'boolean', true)
+
ret[#ret] = ret[#ret] .. fileExtension
checkType('fileLink:upright', 2, factor, 'number', true)
 
if isUpright and (data.theWidth or data.theHeight) then
 
sizeError('fileLink:upright')
 
end
 
data.isUpright = isUpright
 
data.uprightFactor = factor
 
return self
 
 
end
 
end
+
 
function data:resetSize()
+
-- Format
checkSelf(self, 'resetSize')
+
if args.format then
for i, field in ipairs{'theWidth', 'theHeight', 'isUpright', 'uprightFactor'} do
+
checkArg('format', args.format)
data[field] = nil
+
if args.formatfile then
end
+
checkArg('formatfile', args.formatfile)
return self
+
ret[#ret + 1] = args.format .. '=' .. args.formatfile
end
 
 
function data:location(s)
 
checkSelf(self, 'location')
 
checkType('fileLink:location', 1, s, 'string', true)
 
local validLocations = {
 
right = true,
 
left = true,
 
center = true,
 
none = true
 
}
 
if s == nil or validLocations[s] then
 
data.theLocation = s
 
 
else
 
else
error(string.format(
+
ret[#ret + 1] = args.format
"bad argument #1 to 'fileLink:location' ('%s' is not a valid location)",
 
s
 
), 2)
 
 
end
 
end
return self
 
 
end
 
end
+
 
function data:alignment(s)
+
-- Border
checkSelf(self, 'alignment')
+
if yesno(args.border) then
checkType('fileLink:alignment', 1, s, 'string', true)
+
ret[#ret + 1] = 'border'
local validAlignments = {
 
baseline = true,
 
middle = true,
 
sub = true,
 
super = true,
 
['text-top'] = true,
 
['text-bottom'] = true,
 
top = true,
 
bottom = true
 
}
 
if s == nil or validAlignments[s] then
 
data.theAlignment = s
 
else
 
error(string.format(
 
"bad argument #1 to 'fileLink:alignment' ('%s' is not a valid alignment)",
 
s
 
), 2)
 
end
 
return self
 
end
 
 
function data:border(hasBorder)
 
checkSelf(self, 'border')
 
checkType('fileLink:border', 1, hasBorder, 'boolean', true)
 
data.hasBorder = hasBorder
 
return self
 
end
 
 
function data:link(s)
 
checkSelf(self, 'link')
 
checkType('fileLink:link', 1, s, 'string', true)
 
data.theLink = s
 
return self
 
end
 
 
function data:alt(s)
 
checkSelf(self, 'alt')
 
checkType('fileLink:alt', 1, s, 'string', true)
 
data.theAlt = s
 
return self
 
end
 
 
function data:page(num)
 
checkSelf(self, 'page')
 
checkType('fileLink:page', 1, num, 'number', true)
 
data.thePage = s
 
return self
 
end
 
 
function data:class(s)
 
checkSelf(self, 'class')
 
checkType('fileLink:class', 1, s, 'string', true)
 
data.theClass = s
 
return self
 
end
 
 
function data:lang(s)
 
checkSelf(self, 'lang')
 
checkType('fileLink:lang', 1, s, 'string', true)
 
data.theLang = s
 
return self
 
 
end
 
end
  
local function checkTypeStringOrNum(funcName, pos, arg)
+
addPositional('location')
local argType = type(arg)
+
addPositional('alignment')
if argType ~= 'nil' and argType ~= 'string' and argType ~= 'number' then
+
addPositional('size')
error(string.format(
+
addNamed('upright')
"bad argument #%d to '%s' (string or number expected, got %s)",
+
addNamed('link')
pos,
+
addNamed('alt')
funcName,
+
addNamed('page')
argType
+
addNamed('class')
), 3)
+
addNamed('lang')
end
+
addNamed('start')
end
+
addNamed('end')
+
addNamed('thumbtime')
function data:startTime(time)
+
addPositional('caption')
checkSelf(self, 'startTime')
+
 
checkTypeStringOrNum('fileLink:startTime', 1, time)
+
return string.format('[[%s]]', table.concat(ret, '|'))
data.theStartTime = time
+
end
return self
+
 
end
+
function p.main(frame)
+
local origArgs = require('Module:Arguments').getArgs(frame, {
function data:endTime(time)
+
wrappers = 'Template:File link'
checkSelf(self, 'endTime')
+
})
checkTypeStringOrNum('fileLink:endTime', 1, time)
+
if not origArgs.file then
data.theEndTime = time
+
error("'file' parameter missing from [[Template:File link]]", 0)
return self
 
end
 
 
function data:thumbTime(time)
 
checkSelf(self, 'thumbTime')
 
checkTypeStringOrNum('fileLink:thumbTime', 1, time)
 
data.theThumbTime = time
 
return self
 
 
end
 
end
 
function data:caption(s)
 
checkSelf(self, 'caption')
 
checkType('fileLink:caption', 1, s, 'string', true)
 
data.theCaption = s
 
return self
 
end
 
 
function data:render()
 
checkSelf(self, 'render')
 
local ret = {}
 
 
-- Filename
 
if not data.theName then
 
error('fileLink:render: no filename was found')
 
end
 
ret[#ret + 1] = 'File:' .. data.theName
 
 
-- Format
 
if data.theFormat and data.theFormatFilename then
 
ret[#ret + 1] = data.theFormat .. '=' .. data.theFormatFilename
 
elseif data.theFormat then
 
ret[#ret + 1] = data.theFormat
 
end
 
 
-- Border
 
if data.hasBorder then
 
ret[#ret + 1] = 'border'
 
end
 
 
-- Location
 
ret[#ret + 1] = data.theLocation
 
  
-- Alignment
+
-- Copy the arguments that were passed to a new table to avoid looking up
ret[#ret + 1] = data.theAlignment
+
-- every possible parameter in the frame object.
+
local args = {}
-- Size
+
for k, v in pairs(origArgs) do
if data.isUpright and data.uprightFactor then
+
-- Make _BLANK a special argument to add a blank parameter. For use in
ret[#ret + 1] = 'upright=' .. tostring(data.uprightFactor)
+
-- conditional templates etc. it is useful for blank arguments to be
elseif data.isUpright then
+
-- ignored, but we still need a way to specify them so that we can do
ret[#ret + 1] = 'upright'
+
-- things like [[File:Example.png|link=]].
elseif data.theWidth and data.theHeight then
+
if v == '_BLANK' then
ret[#ret + 1] = string.format('%dx%dpx', data.theWidth, data.theHeight)
+
v = ''
elseif data.theWidth then
 
ret[#ret + 1] = tostring(data.theWidth) .. 'px'
 
elseif data.theHeight then
 
ret[#ret + 1] = string.format('x%dpx', data.theHeight)
 
end
 
 
-- Render named parameters.
 
-- That includes link, alt, page, class, lang, start, end, and thumbtime.
 
do
 
local namedParameters = {
 
{'link', 'theLink'},
 
{'alt', 'theAlt'},
 
{'page', 'thePage'},
 
{'class', 'theClass'},
 
{'lang', 'theLang'},
 
{'start', 'theStartTime'},
 
{'end', 'theEndTime'},
 
{'thumbtime', 'theThumbTime'}
 
}
 
for i, t in ipairs(namedParameters) do
 
local parameter = t[1]
 
local value = data[t[2]]
 
if value then
 
ret[#ret + 1] = parameter .. '=' .. tostring(value)
 
end
 
end
 
 
end
 
end
 
+
args[k] = v
-- Caption
 
ret[#ret + 1] = data.theCaption
 
 
return string.format('[[%s]]', table.concat(ret, '|'))
 
end
 
 
local privateFields = {
 
theName = true,
 
theFormat = true,
 
theFormatFilename = true,
 
theWidth = true,
 
theHeight = true,
 
isUpright = true,
 
uprightFactor = true,
 
theLocation = true,
 
theAlignment = true,
 
hasBorder = true,
 
theLink = true,
 
theAlt = true,
 
thePage = true,
 
theClass = true,
 
theLang = true,
 
theCaption = true
 
}
 
 
local readOnlyFields = {}
 
for field in pairs(data) do
 
readOnlyFields[field] = true
 
end
 
readOnlyFields.theName = nil -- This is set if a filename is given to fileLink.new, so remove it.
 
 
local function restrictedFieldError(key, restriction)
 
error(string.format(
 
"fileLink object field '%s' is %s",
 
tostring(key),
 
restriction
 
), 3)
 
 
end
 
end
+
return p._main(args)
setmetatable(obj, {
 
__index = function (t, key)
 
if privateFields[key] then
 
restrictedFieldError(key, 'private')
 
else
 
return data[key]
 
end
 
end,
 
__newindex = function (t, key, value)
 
if privateFields[key] then
 
restrictedFieldError(key, 'private')
 
elseif readOnlyFields[key] then
 
restrictedFieldError(key, 'read-only')
 
else
 
data[key] = value
 
end
 
end,
 
__tostring = function (t)
 
return t:render()
 
end,
 
__pairs = function ()
 
local temp = {}
 
for k, v in pairs(data) do
 
if not privateFields[k] then
 
temp[k] = v
 
end
 
end
 
return pairs(temp)
 
end
 
})
 
 
return obj
 
 
end
 
end
  
return fileLink
+
return p

Aktuelle Version vom 8. Oktober 2022, 08:34 Uhr

Documentation icon Module documentation

This module is used to construct wikitext links to files. It is primarily useful for templates and modules that use complicated logic to make file links. Simple file links should be made with wikitext markup directly, as it uses less resources than calling this module. For help with wikitext file markup please refer to the documentation at mediawiki.org.


Usage from Lua[Quelltext bearbeiten]

First, you need to import the module.

local mFileLink = require('Module:File link')

Then you can make file links using the _main function.

mFileLink._main(args)

args is a table of arguments that can have the following keys:

  • file - the filename. (required)
  • format - the file format, e.g. 'thumb', 'thumbnail', 'frame', 'framed', or 'frameless'.
  • formatfile - a filename to specify with the 'thumbnail' format option. The filename specified will be used instead of the automatically generated thumbnail.
  • border - set this to true or "yes" (or any other value recognized as true by Module:Yesno) to set a border for the image.
  • location - the horizontal alignment of the file, e.g. 'right', 'left', 'center', or 'none'.
  • alignment - the vertical alignment of the file, e.g. 'baseline', 'middle', 'sub', 'super', 'text-top', 'text-bottom', 'top', or 'bottom'.
  • size - the size of the image, e.g. '100px', 'x100px' or '100x100px'.
  • upright - the 'upright' parameter, used for setting the size of tall and thin images.
  • link - the page that the file should link to. Use the blank string '' to suppress the default link to the file description page.
  • alt - the alt text. Use the blank string '' to suppress the default alt text.
  • caption - a caption for the file.
  • page - sets a page number for multi-paged files such as PDFs.
  • class - adds a class parameter to image links. The MediaWiki software adds this parameter to the class="..." attribute of the image's <img /> element when the page is rendered into HTML.
  • lang - adds a language attribute to specify what language to render the file in.
  • start - specifies a start time for audio and video files.
  • end - specifies an end time for audio and video files.
  • thumbtime - specifies the time to use to generate the thumbnail image for video files.

To see the effect of each of these parameters, see the images help page on mediawiki.org.

Examples[Quelltext bearbeiten]

With the file only:

mFileLink.main{file = 'Example.png'}
-- Renders as [[File:Example.png]]

With format, size, link and caption options:

mFileLink.main{
	file = 'Example.png',
	format = 'thumb',
	size = '220px',
	link = 'Wikipedia:Sandbox',
	caption = 'An example.'
}
-- Renders as [[File:Example.png|thumb|220px|link=Wikipedia:Sandbox|An example.]]

With format, size, and border:

mFileLink.main{
	file = 'Example.png',
	format = 'frameless',
	size = '220px',
	border = true
}
-- Renders as [[File:Example.png|frameless|border|220px]]

-- This module provides a library for formatting file wikilinks.

local yesno = require('Module:Yesno')
local checkType = require('libraryUtil').checkType
local fileExtension = require('Module:Util').globalFileExtension()

local p = {}

function p._main(args)
	checkType('_main', 1, args, 'table')

	-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
	-- own function to get the right error level.
	local function checkArg(key, val, level)
		if type(val) ~= 'string' then
			error(string.format(
				"type error in '%s' parameter of '_main' (expected string, got %s)",
				key, type(val)
			), level)
		end
	end

	local ret = {}

	-- Adds a positional parameter to the buffer.
	local function addPositional(key)
		local val = args[key]
		if not val then
			return nil
		end
		checkArg(key, val, 4)
		ret[#ret + 1] = val
	end

	-- Adds a named parameter to the buffer. We assume that the parameter name
	-- is the same as the argument key.
	local function addNamed(key)
		local val = args[key]
		if not val then
			return nil
		end
		checkArg(key, val, 4)
		ret[#ret + 1] = key .. '=' .. val
	end

	-- Filename
	checkArg('file', args.file, 3)
	ret[#ret + 1] = 'File:' .. args.file
	
	-- add global extension, if none given
	if not mw.ustring.match( args.file, '%.[a-zA-Z0-9]+$' ) then
		ret[#ret] = ret[#ret] .. fileExtension
	end

	-- Format
	if args.format then
		checkArg('format', args.format)
		if args.formatfile then
			checkArg('formatfile', args.formatfile)
			ret[#ret + 1] = args.format .. '=' .. args.formatfile
		else
			ret[#ret + 1] = args.format
		end
	end

	-- Border
	if yesno(args.border) then
		ret[#ret + 1] = 'border'
	end

	addPositional('location')
	addPositional('alignment')
	addPositional('size')
	addNamed('upright')
	addNamed('link')
	addNamed('alt')
	addNamed('page')
	addNamed('class')
	addNamed('lang')
	addNamed('start')
	addNamed('end')
	addNamed('thumbtime')
	addPositional('caption')

	return string.format('[[%s]]', table.concat(ret, '|'))
end

function p.main(frame)
	local origArgs = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:File link'
	})
	if not origArgs.file then
		error("'file' parameter missing from [[Template:File link]]", 0)
	end

	-- Copy the arguments that were passed to a new table to avoid looking up
	-- every possible parameter in the frame object.
	local args = {}
	for k, v in pairs(origArgs) do
		-- Make _BLANK a special argument to add a blank parameter. For use in
		-- conditional templates etc. it is useful for blank arguments to be
		-- ignored, but we still need a way to specify them so that we can do
		-- things like [[File:Example.png|link=]].
		if v == '_BLANK' then
			v = ''
		end
		args[k] = v
	end
	return p._main(args)
end

return p
Cookies helfen uns bei der Bereitstellung des ZIM HilfeWikis. Bei der Nutzung vom ZIM HilfeWiki werden die in der Datenschutzerklärung beschriebenen Cookies gespeichert.