Module:UserLinks

local ToolbarBuilder = require('Module:Toolbar') local interwikiTable = mw.loadData("Module:InterwikiTable")

local u = {} -- Table for user-data helper strings. local demo

-- Define a custom error message for this module. local function err(msg) return ' Module:UserLinks error: ' .. msg .. '. ' end

-- --     Below are the helper strings available for writing user link functions. -- --                                                                                         -- --      u.username          The plain username. If the username is not present then the    -- --                         module returns an error. -- --     u.usernameHtml      The username html-encoded. Spaces are encoded with plus signs. -- --     u.project           The project name. Nil if not specified. -- --     u.lang              The language code. Nil if not specified. -- --     u.interwiki         The interwiki prefix, consisting of the project and language    -- --                         values, separated by colons, e.g. ":wikt:es:". If no project   -- --                         or language values are found, this is the blank string, "". -- --                                                                                         -- --      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') 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 isKnownProject(prefix) for projectKey, projectVal in pairs(interwikiTable) do       for _, iwCode in ipairs(projectVal.iw_prefix) do            if iwCode == prefix then return true end end end return false end

local function generateUserDataStrings(args) -- 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') else u.username = args.user or args.User end -- Get other basic user data strings. u.project = args.Project or args.project u.lang = args.lang or args.Lang -- Process the project value if it is present. if u.project then -- If u.project is a known project, we don't need to do anything. If the project isn't known, first -- check whether it is a valid language code, and if not then see if it's an interwiki code -- separated by colons, e.g. "wikt:es". if not isKnownProject(u.project) then if mw.language.isKnownLanguageTag(u.project) then u.lang = u.project u.project = nil else -- Guess local pref1, pref2 = mw.ustring.match( u.project, '(%w+):(%w+)' ) if pref1 and pref2 then if isKnownProject(pref1) and mw.language.isKnownLanguageTag(pref2) then u.project = pref1 u.lang = pref2 elseif isKnownProject(pref2) and mw.language.isKnownLanguageTag(pref1) then u.project = pref2 u.lang = pref1 else return err('"' .. u.project .. '" is not a valid interwiki prefix') end else return err('"' .. u.project .. '" is not a valid interwiki prefix') end end end end -- Generate the interwiki prefix. This includes colons. if u.project or u.lang then u.interwiki = '' if u.project then u.interwiki = u.interwiki .. ':' .. u.project end if u.lang then u.interwiki = u.interwiki .. ':' .. u.lang end u.interwiki = u.interwiki .. ':'   else u.interwiki = '' end

-- Generate the other helper strings. u.usernameHtml = mw.uri.encode(u.username) -- Html-encoded username. Spaces are encoded as pluses. 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') 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. -- Generate the user data strings and return any errors. local dataStringError = generateUserDataStrings(args) if dataStringError then return dataStringError end return func(args) end end

return { main = makeWrapper(getLinks), single = makeWrapper(getSingleLink) }