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 p = {}
+
local image = {}
  
function p._main(args)
+
function image.new()
checkType('_main', 1, args, 'table')
+
local obj, data = {}, {}
 
+
-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
+
local checkSelf = libraryUtil.makeCheckSelfFunction('image', 'image', obj, 'image object')
-- own function to get the right error level.
+
local checkType = libraryUtil.checkType
local function checkArg(key, val, level)
+
if type(val) ~= 'string' then
+
function data:name(s)
error(string.format(
+
checkSelf(self, 'name')
"type error in '%s' parameter of '_main' (expected string, got %s)",
+
checkType('name', 1, s, 'string')
key, type(val)
+
data.theName = s
), level)
+
end
 +
 +
function data:format(s, filename)
 +
checkSelf(self, 'format')
 +
checkType('format', 1, s, 'string')
 +
checkType('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('invalid format')
 
end
 
end
 
end
 
end
 
+
local ret = {}
+
function data:width(px)
 
+
checkSelf(self, 'width')
-- Adds a positional parameter to the buffer.
+
checkType('width', 1, px, 'number')
local function addPositional(key)
+
data.theWidth = px
local val = args[key]
+
end
if not val then
+
return nil
+
function data:height(px)
 +
checkSelf(self, 'height')
 +
checkType('height', 1, px, 'number')
 +
data.theHeight = px
 +
end
 +
 +
function data:upright(factor)
 +
checkSelf(self, 'upright')
 +
checkType('upright', 1, factor, 'number', true)
 +
data.isUpright = true
 +
data.uprightFactor = factor
 +
end
 +
 +
function data:resetSize()
 +
checkSelf(self, 'resetSize')
 +
for i, field in ipairs{'theWidth', 'theHeight', 'isUpright', 'uprightFactor'} do
 +
data[field] = nil
 
end
 
end
checkArg(key, val, 4)
 
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, 'location')
local function addNamed(key)
+
checkType('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 'location' ('%s' is not a valid location)",
 +
s
 +
))
 
end
 
end
checkArg(key, val, 4)
 
ret[#ret + 1] = key .. '=' .. val
 
 
end
 
end
 
+
-- Filename
+
function data:alignment(s)
checkArg('file', args.file, 3)
+
checkSelf(self, 'alignment')
ret[#ret + 1] = 'File:' .. args.file
+
checkType('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 'alignment' ('%s' is not a valid alignment)"
 +
))
 
end
 
end
 
end
 
end
 
+
-- Border
+
function data:border()
if yesno(args.border) then
+
checkSelf(self, 'border')
ret[#ret + 1] = 'border'
+
data.hasBorder = true
 +
end
 +
 +
function data:link(s)
 +
checkSelf(self, 'link')
 +
checkType('link', 1, s, 'string')
 +
data.theLink = s
 +
end
 +
 +
function data:alt(s)
 +
checkSelf(self, 'alt')
 +
checkType('alt', 1, s, 'string')
 +
data.theAlt = s
 
end
 
end
 
+
addPositional('location')
+
function data:caption(s)
addPositional('alignment')
+
checkSelf(self, 'caption')
addPositional('size')
+
checkType('caption', 1, s, 'string')
addNamed('upright')
+
data.theCaption = s
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
 
end
 +
 +
function data:render()
 +
checkSelf(self, '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.theWidth or data.theHeight) then
-- conditional templates etc. it is useful for blank arguments to be
+
error("duplicate size value detected in 'render' (height/width cannot be used at the same time as 'upright')")
-- ignored, but we still need a way to specify them so that we can do
+
elseif data.isUpright and data.uprightFactor then
-- things like [[File:Example.png|link=]].
+
ret[#ret + 1] = 'upright=' .. tostring(data.uprightFactor)
if v == '_BLANK' then
+
elseif data.isUpright then
v = ''
+
ret[#ret + 1] = 'upright'
 +
elseif data.theWidth and data.theHeight then
 +
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
 
end
args[k] = v
+
 +
-- Alt
 +
if data.theAlt then
 +
ret[#ret + 1] = 'alt=' .. data.theAlt
 +
end
 +
 +
-- Caption
 +
ret[#ret + 1] = data.theCaption
 +
 +
return string.format('[[%s]]', table.concat(ret, '|'))
 
end
 
end
return p._main(args)
+
 +
local readOnlyFields = {
 +
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
 +
}
 +
for field in pairs(data) do
 +
readOnlyFields[field] = true
 +
end
 +
 +
setmetatable(obj, {
 +
__index = data,
 +
__newindex = function (t, key, value)
 +
if readOnlyFields[key] then
 +
error(string.format(
 +
"field '%s' is read-only",
 +
tostring(key)
 +
), 2)
 +
else
 +
data[key] = value
 +
end
 +
end,
 +
__tostring = function (t)
 +
return t:render()
 +
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)