Module:UserLinks: Difference between revisions

From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
(add capability to link to a single link, use a custom error function, and generate html errors for invalid link types)
m (caps fix)
Line 179: Line 179:
local linktype = args[1]
local linktype = args[1]
if not linktype then
if not linktype then
return err('No link type specified', 'UserLinks transclusions with invalid link types')
return err('no link type specified', 'UserLinks transclusions with invalid link types')
end
end
return getLink(linktype)
return getLink(linktype)
Line 228: Line 228:
-- If the username is absent or blank, return an error and a tracking category.
-- 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
if args.user == '' or (not args.user and (not args.User or args.User == '')) then
return err('No username detected', 'UserLinks transclusions without usernames')
return err('no username detected', 'UserLinks transclusions without usernames')
end
end
-- Generate the user data strings.
-- Generate the user data strings.

Revision as of 13:40, June 13, 2013

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&nbsp;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&nbsp;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&nbsp;user]]'
end

local function makeCentralAuthLink()
    return '[[' .. u.projectColon .. 'Special:CentralAuth/' .. u.username .. '|central&nbsp;auth]]'
end

local function makeDeletedContribsLink()
    return '[[' .. u.projectColon .. 'Special:DeletedContributions/' .. u.username .. '|deleted&nbsp;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&nbsp;user]'
end

local function makeSulLink()
    return '[[sulutil:' .. u.username .. '|global&nbsp;contribs]]'
end

local function makeTargetLogsLink()
    local url = mw.uri.fullUrl('Special:Log', 'page=User:' .. u.usernameHtml)
    return '[' .. tostring(url) .. ' target&nbsp;logs]'
end

local function makeEditFilterLogLink()
    local url = mw.uri.fullUrl('Special:AbuseLog', 'wpSearchUser=' .. u.usernameHtml)
    return '[' .. tostring(url) .. ' edit&nbsp;filter&nbsp;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 = '&nbsp;' .. 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)
}