-- This module implements .  local p = {}  local su = require('Module:Su')._main  local function makeWikilink(link, display) 	if display then 		return string.format('%s', link, display) 	else 		return string.format('%s', link) 	end end  local function makeUrlLink(data, display) 	local url = mw.uri.new(data) 	url = tostring(url) 	return string.format('[%s %s]', url, display) end  local function makeFullUrlLink(page, query, display) 	local url = mw.uri.fullUrl(page, query) 	url = tostring(url) 	return string.format('[%s %s]', url, display) end  local function getTitle(page) 	local success, title = pcall(mw.title.new, page) 	if success then 		return title 	else 		return nil 	end end  local function getLinkIfExists(pagePrefix, username, display) 	local title = getTitle(pagePrefix .. username) 	if title and title.exists then 		return makeWikilink(title.prefixedText, display) 	end end  function p.main(frame) 	local args = require('Module:Arguments').getArgs(frame, {parentOnly = true}) 	return p._main(args) end  function p._main(args) 	local username, usernameEncoded 	do 		local lang = mw.language.getContentLanguage() 		username = args.User or args[1] or 'Example' 		username = lang:ucfirst(username) 		usernameEncoded = mw.uri.encode(username) 	end  	local links = {}  	-- Talk 	links[#links + 1] = makeWikilink('User talk:' .. username, 'talk')  	-- Contribs 	links[#links + 1] = makeWikilink( 		'Special:Contributions/' .. username, 		'contribs' 	)  	-- Block log and autoblocks 	do 		local blockLogLink = makeFullUrlLink( 			'Special:Log/block', 			{page = 'User:' .. username}, 			'block log' 		) 		local autoblocksLink = makeUrlLink( 			{ 				host = 'tools.wmflabs.org', 				path = '/xtools/autoblock/', 				query = {user = username} 			}, 			'auto' 		) 		links[#links + 1] = blockLogLink .. autoblocksLink 	end  	-- Ban listing 	if args.ban then 		links[#links + 1] = makeWikilink( 			mw.site.namespaces[4].name .. 'List of banned users#' .. username, 			'ban' 		) 	end  	-- Arbitration requests 	links[#links + 1] = getLinkIfExists( 		'Wikipedia:Requests for arbitration/', 		username, 		'rfarb' 	)  	-- Requests for comment 	links[#links + 1] = getLinkIfExists( 		'Wikipedia:Requests for comment/', 		username, 		'rfcuser' 	)  	-- Long-term abuse 	links[#links + 1] = getLinkIfExists( 		'Wikipedia:Long term abuse/', 		username, 		'lta' 	)  	-- Requests for checkuser 	links[#links + 1] = getLinkIfExists( 		'Wikipedia:Requests for checkuser/Case/', 		username, 		'rfcu' 	)  	-- Sockpuppet investigations 	links[#links + 1] = getLinkIfExists( 		'Wikipedia:Sockpuppet investigations/', 		username, 		'spi' 	)  	-- Suspected sockpuppets 	links[#links + 1] = getLinkIfExists( 		'Wikipedia:Suspected sock puppets/', 		username, 		'ssp' 	)  	-- Sockpuppet categories 	-- There isn't a seperator between these and the suspected sockpuppets link, 	-- so we will add them later instead of adding them to the links table. 	local sockCategoryLinks 	do 		local confirmed = getTitle( 			'Category:Wikipedia sockpuppets of ' .. username 		) 		local suspected = getTitle( 			'Category:Suspected Wikipedia sockpuppets of ' .. username 		) 		if confirmed and confirmed.exists or suspected and suspected.exists then 			local sup, sub 			if confirmed and confirmed.exists then 				sup = ' ' .. makeWikilink( 					':' .. confirmed.prefixedText, 					'confirmed socks' 				) 			end 			if suspected and suspected.exists then 				sub = ' ' .. makeWikilink( 					':' .. suspected.prefixedText, 					'suspected socks' 				) 			end 			sockCategoryLinks = su(sup, sub) 		end 	end  	-- Add the user link and the outer span tags. 	return string.format( 		'%s (%s%s)', 		username, 		makeWikilink('User:' .. username, username), 		table.concat(links, ' • '), 		sockCategoryLinks or '' 	) end  return p