Module:UserLinks

local ToolbarBuilder = require('Module:Toolbar') local u = {} -- Table for user-data helper strings. local demo

-- Define a custom error message for this module. local function err(msg, cat) if cat and not demo then cat = '' else cat = '' end return ' Module:UserLinks error: ' .. msg .. '. ' .. 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.username ..  end

local function makeTalkLink return 'talk' end

local function makeContribsLink return '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 'page moves' end

local function makeLogsLink return '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 'blocks' end

local function makeBlockUserLink return 'block user' end

local function makeCentralAuthLink return 'central auth' end

local function makeDeletedContribsLink return 'deleted contribs' end

local function makeEmailLink return '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 '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 '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 'protections' end

local function makeRightsLink return 'rights' end

local function makeRenamesLink return 'renames' end

local function makeRfaLink return '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 or args.project u.projectColon = (u.project and (':' .. u.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 generateTrackingCategories(args) local ret = '' if (args.Project or args.project) and not demo then ret = ret .. ''   end return ret 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 local result = getLink(linktype) result = result .. generateTrackingCategories(args) return result 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 = '' .. result .. ''       end result = ' ' .. result else result = '' -- If there are no links specified, don't return the toolbar at all. end result = ' ' .. makeUserLink .. result .. ' '   result = result .. generateTrackingCategories(args) 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 demo = args.demo -- Set the demo variable. -- 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) }