Module:Format link: Difference between revisions
An extra layer of nil check |
Richardpruen (talk | contribs) m 1 revision imported: Templates and CSS files |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 11: | Line 11: | ||
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg | local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg | ||
local mArguments -- lazily initialise [[Module:Arguments]] | local mArguments -- lazily initialise [[Module:Arguments]] | ||
local mError -- lazily initialise [[Module:Error]] | |||
local yesno -- lazily initialise [[Module:Yesno]] | local yesno -- lazily initialise [[Module:Yesno]] | ||
Line 29: | Line 30: | ||
-- Removes the initial colon from a string, if present. | -- Removes the initial colon from a string, if present. | ||
return s:match('^:?(.*)') | return s:match('^:?(.*)') | ||
end | end | ||
local function maybeItalicize(s, shouldItalicize) | local function maybeItalicize(s, shouldItalicize) | ||
-- | -- Italicize s if s is a string and the shouldItalicize parameter is true. | ||
if s and shouldItalicize then | if s and shouldItalicize then | ||
return | return '<i>' .. s .. '</i>' | ||
else | else | ||
return s | return s | ||
Line 82: | Line 78: | ||
section = section, | section = section, | ||
display = display, | display = display, | ||
} | |||
end | |||
local function formatDisplay(parsed, options) | |||
-- Formats a display string based on a parsed link table (matching the | |||
-- output of parseLink) and an options table (matching the input options for | |||
-- _formatLink). | |||
local page = maybeItalicize(parsed.page, options.italicizePage) | |||
local section = maybeItalicize(parsed.section, options.italicizeSection) | |||
if (not section) then | |||
return page | |||
elseif (not page) then | |||
return mw.ustring.format('§ %s', section) | |||
else | |||
return mw.ustring.format('%s § %s', page, section) | |||
end | |||
end | |||
local function missingArgError(target) | |||
mError = require('Module:Error') | |||
return mError.error{message = | |||
'Error: no link or target specified! ([[' .. target .. '#Errors|help]])' | |||
} | } | ||
end | end | ||
Line 93: | Line 111: | ||
yesno = require('Module:Yesno') | yesno = require('Module:Yesno') | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
local link = args[1] | local link = args[1] or args.link | ||
if not link then | local target = args[3] or args.target | ||
return | if not (link or target) then | ||
return missingArgError('Template:Format link') | |||
end | end | ||
return p._formatLink{ | return p._formatLink{ | ||
link = link, | link = link, | ||
display = args[2], | display = args[2] or args.display, | ||
target = target, | |||
italicizePage = yesno(args.italicizepage), | italicizePage = yesno(args.italicizepage), | ||
italicizeSection = yesno(args.italicizesection), | italicizeSection = yesno(args.italicizesection), | ||
Line 112: | Line 130: | ||
-- The formatLink export function, for use in modules. | -- The formatLink export function, for use in modules. | ||
checkType('_formatLink', 1, options, 'table') | checkType('_formatLink', 1, options, 'table') | ||
checkTypeForNamedArg('_formatLink', | local function check(key, expectedType) --for brevity | ||
checkTypeForNamedArg( | |||
'_formatLink', key, options[key], expectedType or 'string', true | |||
) | |||
end | |||
check('link') | |||
check('display') | |||
check('target') | |||
check('italicizePage', 'boolean') | |||
check('italicizeSection', 'boolean') | |||
check('categorizeMissing') | |||
-- Normalize link and target and check that at least one is present | |||
if options.link == '' then options.link = nil end | |||
if options.target == '' then options.target = nil end | |||
if not (options.link or options.target) then | |||
return missingArgError('Module:Format link') | |||
end | |||
' | |||
local parsed = parseLink(options.link) | local parsed = parseLink(options.link) | ||
Line 147: | Line 154: | ||
local category = '' | local category = '' | ||
--Test if page exists if a diagnostic category is specified | -- Find the display text | ||
if not display then display = formatDisplay(parsed, options) end | |||
-- Handle the target option if present | |||
if options.target then | |||
local parsedTarget = parseLink(options.target) | |||
parsed.link = parsedTarget.link | |||
parsed.page = parsedTarget.page | |||
end | |||
-- Test if page exists if a diagnostic category is specified | |||
if catMissing and (mw.ustring.len(catMissing) > 0) then | if catMissing and (mw.ustring.len(catMissing) > 0) then | ||
local title = nil | local title = nil | ||
if parsed.page then title = mw.title.new(parsed.page) end | if parsed.page then title = mw.title.new(parsed.page) end | ||
if title and (not title.isExternal) | if title and (not title.isExternal) then | ||
local success, exists = pcall(function() return title.exists end) | |||
if success and not exists then | |||
category = mw.ustring.format('[[Category:%s]]', catMissing) | |||
end | |||
end | end | ||
end | end | ||
-- | -- Format the result as a link | ||
if | if parsed.link == display then | ||
return mw.ustring.format('[[:%s]]%s', parsed.link, category) | return mw.ustring.format('[[:%s]]%s', parsed.link, category) | ||
else | |||
return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category) | |||
end | end | ||
end | end | ||