Editing Module:File link

From MINR.ORG WIKI

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
-- This module provides a library for formatting file wikilinks.
+
-- This module provides a library for formatting image wikilinks.
  
local yesno = require('Module:Yesno')
+
local libraryUtil = require('libraryUtil')
local checkType = require('libraryUtil').checkType
+
local checkType = libraryUtil.checkType
  
local p = {}
+
local image = {}
  
function p._main(args)
+
function image.new(filename)
checkType('_main', 1, args, 'table')
+
checkType('image.new', 1, filename, 'string', true)
 
+
local obj, data = {}, {}
-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
+
-- own function to get the right error level.
+
local checkSelf = libraryUtil.makeCheckSelfFunction(
local function checkArg(key, val, level)
+
'image',
if type(val) ~= 'string' then
+
'image',
 +
obj,
 +
'image object'
 +
)
 +
 +
-- Set the filename if we were passed it as an input to image.new.
 +
if filename then
 +
data.theName = filename
 +
end
 +
 +
function data:name(s)
 +
checkSelf(self, 'image:name')
 +
checkType('image:name', 1, s, 'string')
 +
data.theName = s
 +
return self
 +
end
 +
 +
function data:format(s, filename)
 +
checkSelf(self, 'image:format')
 +
checkType('image:format', 1, s, 'string')
 +
checkType('image:format', 2, format, 'string', true)
 +
local validFormats = {
 +
thumb = true,
 +
thumbnail = true,
 +
frame = true,
 +
framed = true,
 +
frameless = true
 +
}
 +
if validFormats[s] then
 +
data.theFormat = s
 +
data.theFormatFilename = filename
 +
else
 
error(string.format(
 
error(string.format(
"type error in '%s' parameter of '_main' (expected string, got %s)",
+
"bad argument #1 to 'image:format' ('%s' is not a valid format)",
key, type(val)
+
s
), level)
+
), 2)
 
end
 
end
 +
return self
 
end
 
end
  
local ret = {}
+
local function sizeError(methodName)
 
+
-- Used for formatting duplication errors in size-related methods.
-- Adds a positional parameter to the buffer.
+
error(string.format(
local function addPositional(key)
+
"duplicate size argument detected in '%s'"
local val = args[key]
+
.. " ('upright' cannot be used in conjunction with height or width)",
if not val then
+
methodName
return nil
+
), 3)
 +
end
 +
 +
function data:width(px)
 +
checkSelf(self, 'image:width')
 +
checkType('image:width', 1, px, 'number')
 +
if data.isUpright then
 +
sizeError('image:width')
 +
end
 +
data.theWidth = px
 +
return self
 +
end
 +
 +
function data:height(px)
 +
checkSelf(self, 'image:height')
 +
checkType('image:height', 1, px, 'number')
 +
if data.isUpright then
 +
sizeError('image:height')
 +
end
 +
data.theHeight = px
 +
return self
 +
end
 +
 +
function data:upright(factor)
 +
checkSelf(self, 'image:upright')
 +
checkType('image:upright', 1, factor, 'number', true)
 +
if data.theWidth or data.theHeight then
 +
sizeError('image:upright')
 +
end
 +
data.isUpright = true
 +
data.uprightFactor = factor
 +
return self
 +
end
 +
 +
function data:resetSize()
 +
checkSelf(self, 'image:resetSize')
 +
for i, field in ipairs{'theWidth', 'theHeight', 'isUpright', 'uprightFactor'} do
 +
data[field] = nil
 
end
 
end
checkArg(key, val, 4)
+
return self
ret[#ret + 1] = val
 
 
end
 
end
 
+
-- Adds a named parameter to the buffer. We assume that the parameter name
+
function data:location(s)
-- is the same as the argument key.
+
checkSelf(self, 'image:location')
local function addNamed(key)
+
checkType('image:location', 1, s, 'string')
local val = args[key]
+
local validLocations = {
if not val then
+
right = true,
return nil
+
left = true,
 +
center = true,
 +
none = true
 +
}
 +
if validLocations[s] then
 +
data.theLocation = s
 +
else
 +
error(string.format(
 +
"bad argument #1 to 'image:location' ('%s' is not a valid location)",
 +
s
 +
), 2)
 
end
 
end
checkArg(key, val, 4)
+
return self
ret[#ret + 1] = key .. '=' .. val
 
 
end
 
end
 
+
-- Filename
+
function data:alignment(s)
checkArg('file', args.file, 3)
+
checkSelf(self, 'image:alignment')
ret[#ret + 1] = 'File:' .. args.file
+
checkType('image:alignment', 1, s, 'string')
 
+
local validAlignments = {
-- Format
+
baseline = true,
if args.format then
+
middle = true,
checkArg('format', args.format)
+
sub = true,
if args.formatfile then
+
super = true,
checkArg('formatfile', args.formatfile)
+
['text-top'] = true,
ret[#ret + 1] = args.format .. '=' .. args.formatfile
+
['text-bottom'] = true,
 +
top = true,
 +
bottom = true
 +
}
 +
if validAlignments[s] then
 +
data.theAlignment = s
 
else
 
else
ret[#ret + 1] = args.format
+
error(string.format(
 +
"bad argument #1 to 'image:alignment' ('%s' is not a valid alignment)",
 +
s
 +
), 2)
 
end
 
end
 +
return self
 
end
 
end
 
+
-- Border
+
function data:border()
if yesno(args.border) then
+
checkSelf(self, 'image:border')
ret[#ret + 1] = 'border'
+
data.hasBorder = true
 +
return self
 +
end
 +
 +
function data:link(s)
 +
checkSelf(self, 'image:link')
 +
checkType('image:link', 1, s, 'string')
 +
data.theLink = s
 +
return self
 +
end
 +
 +
function data:alt(s)
 +
checkSelf(self, 'image:alt')
 +
checkType('image:alt', 1, s, 'string')
 +
data.theAlt = s
 +
return self
 
end
 
end
 
+
addPositional('location')
+
function data:caption(s)
addPositional('alignment')
+
checkSelf(self, 'image:caption')
addPositional('size')
+
checkType('image:caption', 1, s, 'string')
addNamed('upright')
+
data.theCaption = s
addNamed('link')
+
return self
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
 
end
 +
 +
function data:render()
 +
checkSelf(self, 'image:render')
 +
local ret = {}
 +
 +
-- Image name.
 +
if not data.theName then
 +
error('image:render: no image name was found')
 +
end
 +
ret[#ret + 1] = 'File:' .. data.theName
 +
 +
-- Image 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
  
-- Copy the arguments that were passed to a new table to avoid looking up
+
-- Alignment
-- every possible parameter in the frame object.
+
ret[#ret + 1] = data.theAlignment
local args = {}
+
for k, v in pairs(origArgs) do
+
-- Size
-- Make _BLANK a special argument to add a blank parameter. For use in
+
if data.isUpright and data.uprightFactor then
-- conditional templates etc. it is useful for blank arguments to be
+
ret[#ret + 1] = 'upright=' .. tostring(data.uprightFactor)
-- ignored, but we still need a way to specify them so that we can do
+
elseif data.isUpright then
-- things like [[File:Example.png|link=]].
+
ret[#ret + 1] = 'upright'
if v == '_BLANK' then
+
elseif data.theWidth and data.theHeight then
v = ''
+
ret[#ret + 1] = string.format('%dx%dpx', data.theWidth, data.theHeight)
 +
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
 +
 +
-- Link
 +
if data.theLink then
 +
ret[#ret + 1] = 'link=' .. data.theLink
 +
end
 +
 +
-- Alt
 +
if data.theAlt then
 +
ret[#ret + 1] = 'alt=' .. data.theAlt
 
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,
 +
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 image.new, so remove it.
 +
 +
local function restrictedFieldError(key, restriction)
 +
error(string.format(
 +
"image 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 p
+
return image

Please note that all contributions to MINR.ORG WIKI may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see MINR.ORG WIKI:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)