<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.limswiki.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AUserLinks</id>
	<title>Module:UserLinks - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.limswiki.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AUserLinks"/>
	<link rel="alternate" type="text/html" href="https://www.limswiki.org/index.php?title=Module:UserLinks&amp;action=history"/>
	<updated>2026-04-05T19:43:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.limswiki.org/index.php?title=Module:UserLinks&amp;diff=13274&amp;oldid=prev</id>
		<title>Shawndouglas: Created as needed.</title>
		<link rel="alternate" type="text/html" href="https://www.limswiki.org/index.php?title=Module:UserLinks&amp;diff=13274&amp;oldid=prev"/>
		<updated>2013-10-31T17:53:15Z</updated>

		<summary type="html">&lt;p&gt;Created as needed.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local ToolbarBuilder = require('Module:Toolbar')&lt;br /&gt;
local interwikiTable = mw.loadData(&amp;quot;Module:InterwikiTable&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local u = {} -- Table for user-data helper strings.&lt;br /&gt;
local trackingCategories = {} -- Table for storing the tracking categories.&lt;br /&gt;
local demo&lt;br /&gt;
&lt;br /&gt;
-- Define a custom error message for this module.&lt;br /&gt;
local function err(msg, section)&lt;br /&gt;
    local help&lt;br /&gt;
    if section then&lt;br /&gt;
        help = ' ([[Template:User-multi#' .. section .. '|help]])'&lt;br /&gt;
    else&lt;br /&gt;
        help = ''&lt;br /&gt;
    end&lt;br /&gt;
    local cat&lt;br /&gt;
    if demo == 'yes' then&lt;br /&gt;
        cat = ''&lt;br /&gt;
    else&lt;br /&gt;
        cat = '[[Category:UserLinks transclusions with errors]]'&lt;br /&gt;
    end&lt;br /&gt;
    return '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;[[Template:User-multi|User-multi]] error: ' .. msg &lt;br /&gt;
        .. help .. '.&amp;lt;/span&amp;gt;' .. cat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
--      To add more link types, write a function that produces an individual link, and put  --&lt;br /&gt;
--      it at the bottom of the list below. Then, add a link code for your function to the  --&lt;br /&gt;
--      &amp;quot;linktypes&amp;quot; table. Try and make the code three letters or less. There are a number  --&lt;br /&gt;
--      of helper strings available for writing the functions:                       --&lt;br /&gt;
--                                                                                          --&lt;br /&gt;
--      u.username          The plain username. If the username is not present then the     --&lt;br /&gt;
--                          module returns an error.                                        --&lt;br /&gt;
--      u.usernameHtml      The username html-encoded. Spaces are encoded with plus signs.  --&lt;br /&gt;
--      u.project           The project name. Nil if not specified.                         --&lt;br /&gt;
--      u.lang              The language code. Nil if not specified.                        --&lt;br /&gt;
--      u.interwiki         The interwiki prefix, consisting of the project and language    --&lt;br /&gt;
--                          values, separated by colons, e.g. &amp;quot;:wikt:es:&amp;quot;. If no project    --&lt;br /&gt;
--                          or language values are found, this is the blank string, &amp;quot;&amp;quot;.     --&lt;br /&gt;
--      u.projectCode       If a valid project is specified, this is the code for that      --&lt;br /&gt;
--                          project in [[Module:InterwikiTable]]. Otherwise this is nil.    --&lt;br /&gt;
--      u.projectLong       The long project name, e.g. &amp;quot;wikipedia&amp;quot; or &amp;quot;wikibooks&amp;quot;. If      --&lt;br /&gt;
--                          not specified the default is &amp;quot;wikipedia&amp;quot;.                       --&lt;br /&gt;
--      u.toolLang          The language code for use with toolserver or labs tools. The    --&lt;br /&gt;
--                          default is &amp;quot;en&amp;quot;.                                                --&lt;br /&gt;
--                                                                                          --&lt;br /&gt;
--      If you want more helper strings, you can define them in the generateUserDataStrings --&lt;br /&gt;
--      function below.                                                                     --&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
--                                LINK FUNCTIONS START                                      --&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeUserLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'User:' .. u.username .. '|' .. u.username .. ']]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTalkLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'User talk:' .. u.username .. '|talk]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeContribsLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Contributions/' .. u.username .. '|contribs]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeCountLink()&lt;br /&gt;
    return '[//tools.wmflabs.org/xtools/pcount/index.php?name=' .. u.usernameHtml&lt;br /&gt;
        .. '&amp;amp;lang=' .. u.toolLang&lt;br /&gt;
        .. '&amp;amp;wiki=' .. u.projectLong&lt;br /&gt;
        .. ' count]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeMovesLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Log/move/' .. u.username .. '|page&amp;amp;nbsp;moves]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeLogsLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Log/' .. u.username .. '|logs]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeBlockLogLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. 'Special:Log/block', 'page=User:' .. u.usernameHtml)&lt;br /&gt;
    return '[' .. tostring(url) .. ' block&amp;amp;nbsp;log]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeBlocksLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Log/block/' .. u.username .. '|blocks]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeBlockUserLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Block/' .. u.username .. '|block&amp;amp;nbsp;user]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeCentralAuthLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:CentralAuth/' .. u.username .. '|central&amp;amp;nbsp;auth]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeDeletedContribsLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:DeletedContributions/' .. u.username .. '|deleted&amp;amp;nbsp;contribs]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEmailLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Emailuser/' .. u.username .. '|email]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEditSummariesLink()&lt;br /&gt;
    return '[http://toolserver.org/~tparis/editsummary/index.php?name=' .. u.usernameHtml&lt;br /&gt;
        .. '&amp;amp;lang=' .. u.toolLang&lt;br /&gt;
        .. '&amp;amp;wiki=' .. u.projectLong&lt;br /&gt;
        .. ' edit&amp;amp;nbsp;summaries]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeDeletionsLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Log/delete/' .. u.username .. '|deletions]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeListUserLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. 'Special:ListUsers', 'limit=1&amp;amp;username=' .. u.usernameHtml)&lt;br /&gt;
    return '[' .. tostring(url) .. ' list&amp;amp;nbsp;user]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeSulLink()&lt;br /&gt;
    return '[[sulutil:' .. u.username .. '|global&amp;amp;nbsp;contribs]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTargetLogsLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. 'Special:Log', 'page=User:' .. u.usernameHtml)&lt;br /&gt;
    return '[' .. tostring(url) .. ' target&amp;amp;nbsp;logs]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEditFilterLogLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. 'Special:AbuseLog', 'wpSearchUser=' .. u.usernameHtml)&lt;br /&gt;
    return '[' .. tostring(url) .. ' edit&amp;amp;nbsp;filter&amp;amp;nbsp;log]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeProtectionsLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Log/protect/' .. u.username .. '|protections]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRightsLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Log/rights/' .. u.username .. '|rights]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRenamesLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:Log/renameuser/' .. u.username .. '|renames]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRfaLink()&lt;br /&gt;
    if u.project or u.lang then&lt;br /&gt;
        table.insert( trackingCategories, '[[Category:UserLinks transclusions with unresolvable interwiki links]]' )&lt;br /&gt;
    end&lt;br /&gt;
    return '[[Special:PrefixIndex/Wikipedia:Requests for adminship/' .. u.username .. '|RfA]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeApiLink()&lt;br /&gt;
    -- Find the full domain, as the API can't be accessed through the interwiki system.&lt;br /&gt;
    local fulldomain&lt;br /&gt;
    local lang = u.lang or 'en'&lt;br /&gt;
    if u.projectCode then&lt;br /&gt;
        local domain = interwikiTable[u.projectCode].domain&lt;br /&gt;
        local takesLangPrefix = interwikiTable[u.projectCode].takes_lang_prefix&lt;br /&gt;
        if not takesLangPrefix then&lt;br /&gt;
            fulldomain = domain&lt;br /&gt;
        else&lt;br /&gt;
            fulldomain = lang .. '.' .. domain&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        fulldomain = lang .. '.wikipedia.org'&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Return the API link&lt;br /&gt;
    return '[//' .. fulldomain .. '/w/api.php?action=query&amp;amp;list=users&amp;amp;usprop=editcount&amp;amp;ususers=' .. u.usernameHtml .. ' api]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeUploadsLink()&lt;br /&gt;
    return '[[' .. u.interwiki .. 'Special:ListFiles/' .. u.username .. '|uploads]]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
--                                   LINK FUNCTIONS END                                     --&lt;br /&gt;
--      To enable new link functions, add the code to the &amp;quot;linktypes&amp;quot; table directly below. --&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local linktypes = {&lt;br /&gt;
    {'t'   , makeTalkLink},&lt;br /&gt;
    {'c'   , makeContribsLink},&lt;br /&gt;
    {'ct'  , makeCountLink},&lt;br /&gt;
    {'m'   , makeMovesLink},&lt;br /&gt;
    {'l'   , makeLogsLink},&lt;br /&gt;
    {'bl'  , makeBlockLogLink},&lt;br /&gt;
    {'bls' , makeBlocksLink},&lt;br /&gt;
    {'bu'  , makeBlockUserLink},&lt;br /&gt;
    {'ca'  , makeCentralAuthLink},&lt;br /&gt;
    {'dc'  , makeDeletedContribsLink},&lt;br /&gt;
    {'e'   , makeEmailLink},&lt;br /&gt;
    {'es'  , makeEditSummariesLink},&lt;br /&gt;
    {'del' , makeDeletionsLink},&lt;br /&gt;
    {'lu'  , makeListUserLink},&lt;br /&gt;
    {'sul' , makeSulLink},&lt;br /&gt;
    {'tl'  , makeTargetLogsLink},&lt;br /&gt;
    {'efl' , makeEditFilterLogLink},&lt;br /&gt;
    {'pr'  , makeProtectionsLink},&lt;br /&gt;
    {'rl'  , makeRightsLink},&lt;br /&gt;
    {'ren' , makeRenamesLink},&lt;br /&gt;
    {'rfa' , makeRfaLink},&lt;br /&gt;
    {'api' , makeApiLink},&lt;br /&gt;
    {'up'  , makeUploadsLink}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function getLink(linktype)&lt;br /&gt;
    local linkNumber&lt;br /&gt;
    for i, value in ipairs(linktypes) do&lt;br /&gt;
        if value[1] == linktype then&lt;br /&gt;
            linkNumber = i&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not linkNumber then&lt;br /&gt;
        return err('&amp;quot;' .. linktype .. '&amp;quot; is not a valid link code', 'Not a valid link code')&lt;br /&gt;
    end&lt;br /&gt;
    local result = linktypes[linkNumber][2]()&lt;br /&gt;
    if type(result) ~= 'string' then&lt;br /&gt;
        return err(&lt;br /&gt;
            'the function for code &amp;quot;' .. linktype .. '&amp;quot; did not return a string value',&lt;br /&gt;
            'Function did not return a string value'&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeToolbar(args)&lt;br /&gt;
    local targs = {}&lt;br /&gt;
    local numArgsExist = false&lt;br /&gt;
    for k, v in pairs(args) do&lt;br /&gt;
        if type(k) == 'number' then&lt;br /&gt;
            numArgsExist = true&lt;br /&gt;
            targs[k] = getLink(v)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    targs.style = args.small and 'font-size: 90%;'&lt;br /&gt;
    targs.separator = args.separator or 'dot'&lt;br /&gt;
    &lt;br /&gt;
    if numArgsExist == false then&lt;br /&gt;
        return nil -- Don't return a toolbar if no numeric arguments exist.&lt;br /&gt;
    else&lt;br /&gt;
        return ToolbarBuilder.main(targs)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This function finds whether a string is a valid interwiki project prefix.&lt;br /&gt;
-- If the string is valid, the function outputs two values: true, and the site code&lt;br /&gt;
-- used in [[Module:InterwikiTable]]. If the string is valid, the function outputs&lt;br /&gt;
-- false and nil.&lt;br /&gt;
local function isKnownProject(prefix)&lt;br /&gt;
    for projectCode, projectVal in pairs(interwikiTable) do&lt;br /&gt;
        for _, iwCode in ipairs(projectVal.iw_prefix) do&lt;br /&gt;
            if iwCode == prefix then&lt;br /&gt;
                return true, projectCode&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false, nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function generateUserDataStrings(args)&lt;br /&gt;
    -- If the username is absent or blank, return an error and a tracking category.&lt;br /&gt;
    if args.user == '' or (not args.user and (not args.User or args.User == '')) then&lt;br /&gt;
        return err('no username detected', 'No username detected')&lt;br /&gt;
    else&lt;br /&gt;
        u.username = args.user or args.User&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Get other basic user data strings.&lt;br /&gt;
    u.project = args.Project or args.project&lt;br /&gt;
    u.lang = args.lang or args.Lang&lt;br /&gt;
    if u.lang then&lt;br /&gt;
        if mw.language.isKnownLanguageTag(u.lang) then&lt;br /&gt;
            table.insert(trackingCategories, '[[Category:UserLinks transclusions with language parameters]]')&lt;br /&gt;
        else&lt;br /&gt;
            return err('&amp;quot;' .. u.lang .. '&amp;quot; is not a valid language code', 'Not a valid language code')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Process the project value if it is present.&lt;br /&gt;
    if u.project then&lt;br /&gt;
        table.insert( trackingCategories, '[[Category:UserLinks transclusions with project parameters]]' )&lt;br /&gt;
        &lt;br /&gt;
        -- If u.project is a known project, we only need to get the project code. If the project &lt;br /&gt;
        -- isn't known, first check whether it is a valid language code, and if not then see if it's&lt;br /&gt;
        -- an interwiki code separated by colons, e.g. &amp;quot;wikt:es&amp;quot;.&lt;br /&gt;
        local uprojectIsKnownProject, uprojectProjectCode = isKnownProject(u.project)&lt;br /&gt;
        if uprojectIsKnownProject then&lt;br /&gt;
            u.projectCode = uprojectProjectCode&lt;br /&gt;
        else&lt;br /&gt;
            if mw.language.isKnownLanguageTag(u.project) then&lt;br /&gt;
                u.lang = u.project&lt;br /&gt;
                u.project = nil&lt;br /&gt;
            else&lt;br /&gt;
                local pref1, pref2 = mw.ustring.match( u.project, '^(%w+):(%w+)$' )&lt;br /&gt;
                if pref1 and pref2 then&lt;br /&gt;
                    local pref1IsKnownProject, pref1ProjectCode = isKnownProject(pref1)&lt;br /&gt;
                    local pref2IsKnownProject, pref2ProjectCode = isKnownProject(pref2)&lt;br /&gt;
                    if pref1IsKnownProject&lt;br /&gt;
                        and mw.language.isKnownLanguageTag(pref2)&lt;br /&gt;
                        and interwikiTable[pref1ProjectCode].takes_lang_prefix then&lt;br /&gt;
                        u.project = pref1&lt;br /&gt;
                        u.lang = pref2&lt;br /&gt;
                        u.projectCode = pref1ProjectCode&lt;br /&gt;
                        table.insert(&lt;br /&gt;
                            trackingCategories,&lt;br /&gt;
                            '[[Category:UserLinks transclusions with project parameters containing language codes]]'&lt;br /&gt;
                        )&lt;br /&gt;
                    elseif pref2IsKnownProject&lt;br /&gt;
                        and mw.language.isKnownLanguageTag(pref1)&lt;br /&gt;
                        and interwikiTable[pref2ProjectCode].takes_lang_prefix then&lt;br /&gt;
                        u.project = pref2&lt;br /&gt;
                        u.lang = pref1&lt;br /&gt;
                        u.projectCode = pref2ProjectCode&lt;br /&gt;
                        table.insert(&lt;br /&gt;
                            trackingCategories,&lt;br /&gt;
                            '[[Category:UserLinks transclusions with project parameters containing language codes]]'&lt;br /&gt;
                        )&lt;br /&gt;
                    else&lt;br /&gt;
                        return err(&lt;br /&gt;
                            '&amp;quot;' .. u.project .. '&amp;quot; is not a valid interwiki prefix',&lt;br /&gt;
                            'Not a valid interwiki prefix'&lt;br /&gt;
                        )&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    return err(&lt;br /&gt;
                        '&amp;quot;' .. u.project .. '&amp;quot; is not a valid interwiki prefix',&lt;br /&gt;
                        'Not a valid interwiki prefix'&lt;br /&gt;
                    )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Generate the interwiki prefix. This includes colons.&lt;br /&gt;
    if u.project or u.lang then&lt;br /&gt;
        u.interwiki = ''&lt;br /&gt;
        if u.project then&lt;br /&gt;
            u.interwiki = u.interwiki .. ':' .. u.project&lt;br /&gt;
        end&lt;br /&gt;
        if u.lang then&lt;br /&gt;
            u.interwiki = u.interwiki .. ':' .. u.lang&lt;br /&gt;
        end&lt;br /&gt;
        u.interwiki = u.interwiki .. ':'&lt;br /&gt;
    else&lt;br /&gt;
        u.interwiki = ''&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Generate the other helper strings.&lt;br /&gt;
    u.usernameHtml = mw.uri.encode(u.username) -- Html-encoded username. Spaces are encoded as pluses.&lt;br /&gt;
    if u.project then&lt;br /&gt;
        local prefixes = interwikiTable[u.projectCode].iw_prefix&lt;br /&gt;
        u.projectLong = prefixes[2] or prefixes[1] -- A bit of a hack, but should find the long prefix name most of the time.&lt;br /&gt;
    else&lt;br /&gt;
        u.projectLong = 'wikipedia'&lt;br /&gt;
    end&lt;br /&gt;
    u.toolLang = u.lang or 'en' -- set the default language for tools on the toolserver or labs.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function generateTrackingCategories()&lt;br /&gt;
    if demo == 'yes' then&lt;br /&gt;
        return ''&lt;br /&gt;
    else&lt;br /&gt;
        return table.concat(trackingCategories)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This function generates a table of all available link types, with their previews.&lt;br /&gt;
-- It is used in the module documentation.&lt;br /&gt;
local function getLinkTable(args)&lt;br /&gt;
    demo = args.demo -- Set the demo variable.&lt;br /&gt;
    -- Generate the user data strings and return any errors.&lt;br /&gt;
    local dataStringError = generateUserDataStrings(args)&lt;br /&gt;
    if dataStringError then&lt;br /&gt;
        return dataStringError&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Build a table of all of the links.&lt;br /&gt;
    local result = '&amp;lt;table class=&amp;quot;wikitable plainlinks sortable&amp;quot;&amp;gt;'&lt;br /&gt;
        .. '\n&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Code&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Preview&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;'&lt;br /&gt;
    for i, value in ipairs(linktypes) do&lt;br /&gt;
        local code = value[1]&lt;br /&gt;
        result = result .. &amp;quot;\n&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;'''&amp;quot; .. code .. &amp;quot;'''&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. getLink(code) .. '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;'&lt;br /&gt;
    end&lt;br /&gt;
    result = result .. '\n&amp;lt;/table&amp;gt;'&lt;br /&gt;
    &lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getSingleLink(args)&lt;br /&gt;
    demo = args.demo -- Set the demo variable.&lt;br /&gt;
    -- Generate the user data strings and return any errors.&lt;br /&gt;
    local dataStringError = generateUserDataStrings(args)&lt;br /&gt;
    if dataStringError then&lt;br /&gt;
        return dataStringError&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local linktype = args[1]&lt;br /&gt;
    if not linktype then &lt;br /&gt;
        return err('no link type specified')&lt;br /&gt;
    end&lt;br /&gt;
    local result = getLink(linktype)&lt;br /&gt;
    result = result .. generateTrackingCategories()&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLinks(args)&lt;br /&gt;
    demo = args.demo -- Set the demo variable.&lt;br /&gt;
    -- Generate the user data strings and return any errors.&lt;br /&gt;
    local dataStringError = generateUserDataStrings(args)&lt;br /&gt;
    if dataStringError then&lt;br /&gt;
        return dataStringError&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    -- Build the template output.&lt;br /&gt;
    local result = makeToolbar(args) -- Get the toolbar contents.&lt;br /&gt;
    if result then&lt;br /&gt;
        if args.sup then&lt;br /&gt;
            result = '&amp;lt;sup&amp;gt;' .. result .. '&amp;lt;/sup&amp;gt;'&lt;br /&gt;
        end&lt;br /&gt;
        result = '&amp;amp;nbsp;' .. result&lt;br /&gt;
    else&lt;br /&gt;
        result = '' -- If there are no links specified, don't return the toolbar at all.&lt;br /&gt;
    end&lt;br /&gt;
    result = '&amp;lt;span&amp;gt;' .. makeUserLink() .. result .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
    result = result .. generateTrackingCategories()&lt;br /&gt;
    &lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getExampleLinks(args)&lt;br /&gt;
    -- This function enables example output without having to specify any&lt;br /&gt;
    -- parameters to #invoke.&lt;br /&gt;
    args.demo = 'yes'&lt;br /&gt;
    args.user = 'Example'&lt;br /&gt;
    args.User = nil&lt;br /&gt;
    return getLinks(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWrapper(func)&lt;br /&gt;
    return function (frame)&lt;br /&gt;
        -- If called via #invoke, use the args passed into the invoking template.&lt;br /&gt;
        -- Otherwise, for testing purposes, assume args are being passed directly in.&lt;br /&gt;
        local origArgs&lt;br /&gt;
        if frame == mw.getCurrentFrame() then&lt;br /&gt;
            origArgs = frame:getParent().args&lt;br /&gt;
            for k, v in pairs(frame.args) do&lt;br /&gt;
                origArgs = frame.args&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            origArgs = frame&lt;br /&gt;
        end&lt;br /&gt;
 &lt;br /&gt;
        -- Strip whitespace, and treat blank arguments as nil.&lt;br /&gt;
        -- 'user', 'User', and 'separator' have different behaviour depending on&lt;br /&gt;
        -- whether they are blank or nil, so keep them as they are.&lt;br /&gt;
        local args = {}&lt;br /&gt;
        for k, v in pairs(origArgs) do&lt;br /&gt;
            v = mw.text.trim(v)&lt;br /&gt;
            if v ~= '' or k == 'user' or k == 'User' or k == 'separator' then&lt;br /&gt;
                args[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
        return func(args)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
    main = makeWrapper(getLinks),&lt;br /&gt;
    single = makeWrapper(getSingleLink),&lt;br /&gt;
    linktable = makeWrapper(getLinkTable),&lt;br /&gt;
    example = makeWrapper(getExampleLinks)&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Shawndouglas</name></author>
	</entry>
</feed>