Jump to content

Module:PageLinks

Permanently protected module
From Wikipedia, the free encyclopedia

local ToolbarBuilder = require('Module:Toolbar')

local p = {} -- Page object
local trackingCategories = {} -- Table for storing the tracking categories.
local demo

-- Define a custom error message for this module.
local function err(msg, section)
	local help
	if section then
		help = ' ([[Template:Page-multi#' .. section .. '|help]])'
	else
		help = ''
	end
	local cat
	if demo == 'yes' then
		cat = ''
	else
		cat = '[[Category:PageLinks transclusions with errors]]'
	end
	return '<span class="error">[[Template:Page-multi|Page-multi]] error: ' .. msg 
        .. help .. '.</span>' .. cat
end

----------------------------------------------------------------------------------------------
--      To add more link types, write a function that produces an individual link, and put  --
--      it at the bottom of the list below. Then, add a link code for your function to the  --
--      "linktypes" table. Try and make the code three letters or less. 
--
--      If you want more helper strings, you can define them in the generatePageDataStrings --
--      function below.                                                                     --
----------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------
--                                LINK FUNCTIONS START                                      --
----------------------------------------------------------------------------------------------

local function makePageLink()
	return p.fullText and '[[:' .. p.fullText .. '|' .. p.fullText .. ']]' or ''
end

local function makeTalkLink()
	return '[[' .. tostring(p.talkPageTitle) .. '|talk]]'
end

local function makeTalkOrSubjectLink()
	if p.isTalkPage then
		return '[[:' .. tostring(p.subjectPageTitle) .. '|subject]]'
	else
		return '[[' .. tostring(p.talkPageTitle) .. '|talk]]'
	end
end

local function makeWhatLinksHereLink()
	return '[[Special:WhatLinksHere/' .. p.fullText .. '|links]]'
end

local function makeRelatedChangesLink()
	return '[[Special:RelatedChanges/' .. p.fullText .. '|related]]'
end

local function makeEditLink()
	return '[[Special:EditPage/' .. p.fullText .. '|edit]]'
end

local function makeHistoryLink()
	return '[[Special:PageHistory/' .. p.fullText .. '|history]]'
end

local function makeWatchLink()
	return '[' .. p:fullUrl( 'action=watch' ) .. ' watch]'
end

local function makeTargetLogsLink()
	local url = mw.uri.fullUrl( 'Special:Log', 'page=' .. mw.uri.encode(p.fullText) )
	return '[' .. tostring(url) .. ' logs]'
end

local function makeEditFilterLogLink()
	local url = mw.uri.fullUrl( 'Special:AbuseLog', 'wpSearchTitle=' .. mw.uri.encode(p.fullText) )
	return '[' .. tostring(url) .. ' abuse&nbsp;filter&nbsp;log]'
end

local function makePageViewsLink(args)
	local endDate, startDate = "", ""
	
	if args.date then
		local date = string.gsub(args.date,"-","")
		date = os.time{year=string.sub(date,1,4), month=string.sub(date,5,6), day=string.sub(date,7,8)}
		endDate = os.date("%Y-%m-%d", date - (1*86400))
		startDate = os.date("%Y-%m-%d", date - (30*86400))
	else
		endDate = os.date("%Y-%m-%d")
		startDate = os.date("%Y-%m-%d", os.time() - (60*86400))
	end
	
	local project = string.sub(mw.site.server,3)
	local url = mw.uri.encode(p.fullText, "WIKI")
	local urlargs = '?start=' .. startDate .. '&end=' .. endDate .. '&project=' .. project .. '&pages=' .. tostring(url)
	
	if #urlargs > 255 then -- Extra chars can tip it over the max length for an IW link.
		return '[https://pageviews.toolforge.org/?' .. urlargs .. ' stats]'
	end
	return '[[:toolforge:pageviews/' .. urlargs .. '|stats]]'
end

local function makeHistory500Link()
	local url = p:fullUrl( 'action=history&limit=500' );
	return '[' .. url .. ' long history]'
end

----------------------------------------------------------------------------------------------
--                                   LINK FUNCTIONS END                                     --
--      To enable new link functions, add the code to the "linktypes" table directly below. --
----------------------------------------------------------------------------------------------

local linktypes = {
    ['t']       = makeTalkLink,
    ['ts']      = makeTalkOrSubjectLink,
    ['wlh']     = makeWhatLinksHereLink,
    ['rc']      = makeRelatedChangesLink,
    ['edit']    = makeEditLink,
    ['h']       = makeHistoryLink,
    ['w']       = makeWatchLink,
    ['tl']      = makeTargetLogsLink,
    ['efl']     = makeEditFilterLogLink,
    ['vlm-sgs'] = makePageViewsLink,
    ['pv']      = makePageViewsLink,
    ['h500']    = makeHistory500Link,
}

local function getLink(linktype, args)
	local func = linktypes[linktype]
	if func then
		return func(args)
	else
        return err('"' .. linktype .. '" is not a valid link code', 'Not a valid link code')
	end
end

local function makeToolbar(args)
    local targs = {}
    local numArgsExist = false
    for k, v in pairs(args) do
        if type(k) == 'number' and p then
            numArgsExist = true
            targs[k] = getLink(v, args)
        end
    end
    targs.style = args.small and 'font-size: 90%;'
    targs.separator = args.separator or 'dot'
    targs.class = 'lx'
    
    if numArgsExist == false then
        return nil -- Don't return a toolbar if no numeric arguments exist. -- this bit looks odd
    else
        return ToolbarBuilder.main(targs)
    end
end

local function generatePageDataStrings(args)
    -- If the page name is absent or blank, return an error and a tracking category.
    if args.page == '' or not args.page then
        return err('no page detected')
    end
    local noError
    noError, p = pcall(mw.title.new, args.page)
    if not noError then
    	return err('pcall mw.title failed')
	end
	if args.exists and (not p or p['id'] == 0) then
    	return err('page not found')
    end
end

local function generateTrackingCategories()
    if demo == 'yes' then
        return ''
    else
        return table.concat(trackingCategories)
    end
end

-- This function generates a table of all available link types, with their previews.
-- It is used in the module documentation.
local function getLinkTable(args)
    demo = args.demo -- Set the demo variable.
    -- Generate the page data strings and return any errors.
    local dataStringError = generatePageDataStrings(args)
    if dataStringError then
        return dataStringError
    end
    
    -- Build a table of all of the links.
    local result = '<table class="wikitable plainlinks sortable">'
        .. '\n<tr><th>Code</th><th>Preview</th></tr>'
    for i, value in ipairs(linktypes) do
        local code = value[1]
        result = result .. "\n<tr><td>'''" .. code .. "'''</td><td>" .. getLink(code, args) .. '</td></tr>'
    end
    result = result .. '\n</table>'
    
    return result
end

local function getSingleLink(args)
    demo = args.demo -- Set the demo variable.
    -- Generate the page data strings and return any errors.
    local dataStringError = generatePageDataStrings(args)
    if dataStringError then
        return dataStringError
    end
    
    local linktype = args[1]
    if not linktype then 
        return err('no link type specified')
    end
    local result = getLink(linktype, args)
    result = result .. generateTrackingCategories()
    return result
end

local function getLinksToolbar(args)
    demo = args.demo -- Set the demo variable.
    -- Generate the page data strings and return any errors.
    local dataStringError = generatePageDataStrings(args)
    if dataStringError then
        return dataStringError
    end    
    
    -- Build the template output.
    local result = makeToolbar(args) -- Get the toolbar contents.
    result = (result or '') .. generateTrackingCategories()
    return result
end

local function getLinks(args)
	local result = getLinksToolbar(args)

	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
	if args.nopage then
		result = '<span>' .. result .. '</span>'
	else
		if p then
			result = '<span>' .. makePageLink() .. result .. '</span>'
		else
			result = '<span>[[' .. args.page .. ']]' .. result .. '</span>'
		end
	end

	return result
end

local function getExampleLinks(args)
    -- This function enables example output without having to specify any
    -- parameters to #invoke.
    args.demo = 'yes'
    args.page = 'Example'
    return getLinks(args)
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.
        -- 'page', 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 == 'page' or k == 'separator' then
                args[k] = v
            end
        end
    
        return func(args)
    end
end

return {
    main = makeWrapper(getLinks),
    single = makeWrapper(getSingleLink),
    toolbar = makeWrapper(getLinksToolbar),
    linktable = makeWrapper(getLinkTable),
    example = makeWrapper(getExampleLinks)
}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy