memory alpha
Module documentation ()

A Lua implementation of {{External link}}.

Module source

local p = {}

local function setProtocol(url)
	local protocol = mw.text.split(string.lower(url), '://', true)[1]
	if protocol ~= 'http' and protocol ~= 'https' then
		url = 'http://' .. url
	end
	return url
end

local function hasValue(arg)
	return arg and #mw.text.trim(arg) > 0
end

function p.main(frame)
	local args = frame:getParent().args
	local target = setProtocol(args[1])
	local linkWrapper = hasValue(args[5]) and args[5] or ''
	local mainLink = target
	local currentPage = mw.title.getCurrentTitle()
	local archiveFileExists = hasValue(args.archivefile) and mw.title.new(args.archivefile, 6).file.exists
	local archiveDate = type(tonumber(args.archivedate)) == 'number' and args.archivedate or '*'
	local originalLink = ''
	local templateStyles = ''
	local category = ''
	local displayText = ''
	if hasValue(args[2]) then
		displayText = ' ' .. args[2]
	elseif hasValue(args[3]) then
		displayText = ' ' .. currentPage.text
	end
	if args.urlstatus == 'dead' then
		templateStyles = frame:extensionTag{
			name = 'templatestyles',
			args = {src = 'External link/styles.css'}
		}
		originalLink = '<sup class="original-link plainlinks" title="Original link">[' .. target .. ' (X)]</sup>'
		if archiveFileExists then
			mainLink = mw.title.new('Special:FilePath/' .. args.archivefile):canonicalUrl()
		else
			mainLink = 'https://web.archive.org/web/' .. archiveDate .. '/' .. target
		end
	end
	if currentPage.namespace == 0 and not archiveFileExists and archiveDate == '*' then
		local categoryName
		if args.urlstatus == 'dead' then
			categoryName = 'Memory Alpha link rot'
		else
			categoryName = 'Memory Alpha articles risking link rot'
		end
		category = '[[Category:' .. categoryName .. ']]'
	end
	local linkString = linkWrapper .. '[' .. mainLink .. displayText .. ']' .. linkWrapper .. originalLink
	linkString = category .. templateStyles .. linkString
	if hasValue(args[3]) then
		local siteTarget = setProtocol(args[3])
		local mainSiteLink = siteTarget
		local originalSiteLink = ''
		local siteDisplayText
		if hasValue(args[4]) then
			siteDisplayText = args[4]
		else
			siteDisplayText = mw.ustring.gsub(mw.text.split(siteTarget, '://', true)[2], '[wW][wW][wW]%.', '')
		end
		if args.urlstatus == 'dead' and not hasValue(args.site) then
			originalSiteLink = '<sup class="original-link plainlinks" title="Original link">[' .. siteTarget .. ' (X)]</sup>'
			mainSiteLink = 'https://web.archive.org/web/' .. archiveDate .. '/' .. target
		end
		local siteLinkString = '[' .. mainSiteLink .. ' ' .. siteDisplayText .. ']' .. originalSiteLink
		return '<span class="plainlinks">' .. linkString .. ' at ' .. siteLinkString .. '</span>'
	end
	return linkString
end

return p