Module:UserLinks
From the Croc Wiki, the Croc encyclopedia
Documentation for this module may be created at Module:UserLinks/doc
local ToolbarBuilder = require('Module:Toolbar')
local u = {} -- Table for user-data helper strings.
-- Define a custom error message for this module.
local function err(msg, cat)
cat = (cat and ('[[Category:' .. cat .. ']]')) or ''
return '<span class="error">[[Module:UserLinks]] error: ' .. msg .. '.</span>' .. cat
end
--------------------------------------------------------------------------------------------------
-- Below are the helper strings available for writing user link functions. --
-- If the project name has not been specified, all the project strings will be --
-- the blank string, ''. If the username is not specified, the module outputs an error. --
-- Either way, there is no need to worry about escaping nil values when using the --
-- helper strings. --
-- --
-- u.username The plain username --
-- u.usernameHtml The username html-encoded. Spaces are encoded with plus signs. --
-- --
-- u.project The plain project name. --
-- u.projectColon The project name with two colons surrounding it, i.e. ":project:" --
-- --
-- If you want more strings, you can define them in the generateUserDataStrings --
-- function below. --
--------------------------------------------------------------------------------------------------
local function makeUserLink()
return '[[' .. u.projectColon .. 'User:' .. u.username .. '|' .. u.username .. ']]'
end
local function makeTalkLink()
return '[[' .. u.projectColon .. 'User talk:' .. u.username .. '|talk]]'
end
local function makeContribsLink()
return '[[' .. u.projectColon .. 'Special:Contributions/' .. u.username .. '|contribs]]'
end
local function makeCountLink()
return '[//tools.wmflabs.org/xtools/pcount/index.php?name=' .. u.usernameHtml .. '&lang=en&wiki=wikipedia count]'
end
local function makeMovesLink()
return '[[' .. u.projectColon .. 'Special:Log/move/' .. u.username .. '|page moves]]'
end
local function makeLogsLink()
return '[[' .. u.projectColon .. 'Special:Log/' .. u.username .. '|logs]]'
end
local function makeBlockLogLink()
local url = mw.uri.fullUrl('Special:Log/block', 'page=User:' .. u.usernameHtml)
return '[' .. tostring(url) .. ' block log]'
end
local function makeBlocksLink()
return '[[' .. u.projectColon .. 'Special:Log/block/' .. u.username .. '|blocks]]'
end
local function makeBlockUserLink()
return '[[' .. u.projectColon .. 'Special:Block/' .. u.username .. '|block user]]'
end
local function makeCentralAuthLink()
return '[[' .. u.projectColon .. 'Special:CentralAuth/' .. u.username .. '|central auth]]'
end
local function makeDeletedContribsLink()
return '[[' .. u.projectColon .. 'Special:DeletedContributions/' .. u.username .. '|deleted contribs]]'
end
local function makeEmailLink()
return '[[' .. u.projectColon .. 'Special:Emailuser/' .. u.username .. '|email]]'
end
local function makeEditSummariesLink()
return '[http://toolserver.org/~tparis/editsummary/index.php?name=' .. u.usernameHtml .. '&lang=en&wiki=wikipedia edit summaries]'
end
local function makeDeletionsLink()
return '[[' .. u.projectColon .. 'Special:Log/delete/' .. u.username .. '|deletions]]'
end
local function makeListUserLink()
local url = mw.uri.fullUrl('Special:ListUsers', 'limit=1&username=' .. u.usernameHtml)
return '[' .. tostring(url) .. ' list user]'
end
local function makeSulLink()
return '[[sulutil:' .. u.username .. '|global contribs]]'
end
local function makeTargetLogsLink()
local url = mw.uri.fullUrl('Special:Log', 'page=User:' .. u.usernameHtml)
return '[' .. tostring(url) .. ' target logs]'
end
local function makeEditFilterLogLink()
local url = mw.uri.fullUrl('Special:AbuseLog', 'wpSearchUser=' .. u.usernameHtml)
return '[' .. tostring(url) .. ' edit filter log]'
end
local function makeProtectionsLink()
return '[[' .. u.projectColon .. 'Special:Log/protect/' .. u.username .. '|protections]]'
end
local function makeRightsLink()
return '[[' .. u.projectColon .. 'Special:Log/rights/' .. u.username .. '|rights]]'
end
local function makeRenamesLink()
return '[[' .. u.projectColon .. 'Special:Log/renameuser/' .. u.username .. '|renames]]'
end
local function makeRfaLink()
return '[[Special:PrefixIndex/Wikipedia:Requests for adminship/' .. u.username .. '|RfA]]'
end
local function getLink(linktype)
local linktypes = {
t = makeTalkLink,
c = makeContribsLink,
ct = makeCountLink,
m = makeMovesLink,
l = makeLogsLink,
bl = makeBlockLogLink,
bls = makeBlocksLink,
bu = makeBlockUserLink,
ca = makeCentralAuthLink,
dc = makeDeletedContribsLink,
e = makeEmailLink,
es = makeEditSummariesLink,
del = makeDeletionsLink,
lu = makeListUserLink,
sul = makeSulLink,
tl = makeTargetLogsLink,
efl = makeEditFilterLogLink,
pr = makeProtectionsLink,
rl = makeRightsLink,
ren = makeRenamesLink,
rfa = makeRfaLink
}
if not linktypes[linktype] then
return err('"' .. linktype .. '" is not a valid link code', 'UserLinks transclusions with invalid link types')
end
return linktypes[linktype]()
end
local function makeToolbar(args)
local targs = {}
local numArgsExist = false
for k, v in pairs(args) do
if type(k) == 'number' then
numArgsExist = true
targs[k] = getLink(v)
end
end
targs.style = args.small and 'font-size: 90%;'
targs.separator = args.separator or 'dot'
if numArgsExist == false then
return -- Don't return a toolbar if no numeric arguments exist.
else
return ToolbarBuilder.main(targs)
end
end
local function generateUserDataStrings(args)
-- Username helper strings.
u.username = args.user or args.User
u.usernameHtml = mw.uri.encode(u.username) -- Html-encoded username. Spaces are encoded as pluses.
-- Project helper strings.
u.project = args.Project
u.projectColon = (u.project and (':' .. args.Project .. ':')) or '' -- Project value plus colons, for escaping interwiki links.
u.project = u.project or '' -- Control for nil values of args.Project.
end
local function getSingleLink(args)
local linktype = args[1]
if not linktype then
return err('No link type specified', 'UserLinks transclusions with invalid link types')
end
return getLink(linktype)
end
local function getLinks(args)
-- Build the template output.
local result = makeToolbar(args) -- Get the toolbar contents.
if result then
if args.sup then
result = '<sup>' .. result .. '</sup>'
end
result = ' ' .. result
else
result = '' -- If there are no links specified, don't return the toolbar at all.
end
result = '<span>' .. makeUserLink() .. result .. '</span>'
return result
end
local function makeWrapper(func)
return function (frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Strip whitespace, and treat blank arguments as nil.
-- 'user', 'User', and 'separator' have different behaviour depending on
-- whether they are blank or nil, so keep them as they are.
local args = {}
for k, v in pairs(origArgs) do
v = mw.text.trim(v)
if v ~= '' or k == 'user' or k == 'User' or k == 'separator' then
args[k] = v
end
end
-- If the username is absent or blank, return an error and a tracking category.
if args.user == '' or (not args.user and (not args.User or args.User == '')) then
return err('No username detected', 'UserLinks transclusions without usernames')
end
-- Generate the user data strings.
generateUserDataStrings(args)
return func(args)
end
end
return {
main = makeWrapper(getLinks),
single = makeWrapper(getSingleLink)
}