<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://chabadpedia.com/index.php?action=history&amp;feed=atom&amp;title=Module%3APageLinks</id>
	<title>Module:PageLinks - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://chabadpedia.com/index.php?action=history&amp;feed=atom&amp;title=Module%3APageLinks"/>
	<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=Module:PageLinks&amp;action=history"/>
	<updated>2026-04-09T13:24:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://chabadpedia.com/index.php?title=Module:PageLinks&amp;diff=5726&amp;oldid=prev</id>
		<title>Shia.k: Created page with &quot;local ToolbarBuilder = require(&#039;Module:Toolbar&#039;)  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 = &#039; (help)&#039; 	else 		help = &#039;&#039; 	end 	local cat 	if demo == &#039;yes&#039; then 		cat = &#039;&#039; 	else 		cat = &#039;Category:PageLinks transclusions with errors&#039; 	en...&quot;</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=Module:PageLinks&amp;diff=5726&amp;oldid=prev"/>
		<updated>2025-03-20T20:40:26Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local ToolbarBuilder = require(&amp;#039;Module:Toolbar&amp;#039;)  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 = &amp;#039; (&lt;a href=&quot;/index.php?title=Template:Page-multi&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Template:Page-multi (page does not exist)&quot;&gt;help&lt;/a&gt;)&amp;#039; 	else 		help = &amp;#039;&amp;#039; 	end 	local cat 	if demo == &amp;#039;yes&amp;#039; then 		cat = &amp;#039;&amp;#039; 	else 		cat = &amp;#039;&lt;a href=&quot;/index.php?title=Category:PageLinks_transclusions_with_errors&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Category:PageLinks transclusions with errors (page does not exist)&quot;&gt;Category:PageLinks transclusions with errors&lt;/a&gt;&amp;#039; 	en...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local ToolbarBuilder = require(&amp;#039;Module:Toolbar&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {} -- Page object&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 = &amp;#039; ([[Template:Page-multi#&amp;#039; .. section .. &amp;#039;|help]])&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		help = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local cat&lt;br /&gt;
	if demo == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		cat = &amp;#039;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		cat = &amp;#039;[[Category:PageLinks transclusions with errors]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;[[Template:Page-multi|Page-multi]] error: &amp;#039; .. msg &lt;br /&gt;
        .. help .. &amp;#039;.&amp;lt;/span&amp;gt;&amp;#039; .. 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. &lt;br /&gt;
--&lt;br /&gt;
--      If you want more helper strings, you can define them in the generatePageDataStrings --&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 makePageLink()&lt;br /&gt;
	return p.fullText and &amp;#039;[[:&amp;#039; .. p.fullText .. &amp;#039;|&amp;#039; .. p.fullText .. &amp;#039;]]&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTalkLink()&lt;br /&gt;
	return &amp;#039;[[&amp;#039; .. tostring(p.talkPageTitle) .. &amp;#039;|talk]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTalkOrSubjectLink()&lt;br /&gt;
	if p.isTalkPage then&lt;br /&gt;
		return &amp;#039;[[:&amp;#039; .. tostring(p.subjectPageTitle) .. &amp;#039;|subject]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;[[&amp;#039; .. tostring(p.talkPageTitle) .. &amp;#039;|talk]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWhatLinksHereLink()&lt;br /&gt;
	return &amp;#039;[[Special:WhatLinksHere/&amp;#039; .. p.fullText .. &amp;#039;|links]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRelatedChangesLink()&lt;br /&gt;
	return &amp;#039;[[Special:RelatedChanges/&amp;#039; .. p.fullText .. &amp;#039;|related]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEditLink()&lt;br /&gt;
	return &amp;#039;[[Special:EditPage/&amp;#039; .. p.fullText .. &amp;#039;|edit]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeHistoryLink()&lt;br /&gt;
	return &amp;#039;[[Special:PageHistory/&amp;#039; .. p.fullText .. &amp;#039;|history]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWatchLink()&lt;br /&gt;
	return &amp;#039;[&amp;#039; .. p:fullUrl( &amp;#039;action=watch&amp;#039; ) .. &amp;#039; watch]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTargetLogsLink()&lt;br /&gt;
	local url = mw.uri.fullUrl( &amp;#039;Special:Log&amp;#039;, &amp;#039;page=&amp;#039; .. mw.uri.encode(p.fullText) )&lt;br /&gt;
	return &amp;#039;[&amp;#039; .. tostring(url) .. &amp;#039; logs]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEditFilterLogLink()&lt;br /&gt;
	local url = mw.uri.fullUrl( &amp;#039;Special:AbuseLog&amp;#039;, &amp;#039;wpSearchTitle=&amp;#039; .. mw.uri.encode(p.fullText) )&lt;br /&gt;
	return &amp;#039;[&amp;#039; .. tostring(url) .. &amp;#039; abuse&amp;amp;nbsp;filter&amp;amp;nbsp;log]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makePageViewsLink(args)&lt;br /&gt;
	local endDate, startDate = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if args.date then&lt;br /&gt;
		local date = string.gsub(args.date,&amp;quot;-&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
		date = os.time{year=string.sub(date,1,4), month=string.sub(date,5,6), day=string.sub(date,7,8)}&lt;br /&gt;
		endDate = os.date(&amp;quot;%Y-%m-%d&amp;quot;, date - (1*86400))&lt;br /&gt;
		startDate = os.date(&amp;quot;%Y-%m-%d&amp;quot;, date - (30*86400))&lt;br /&gt;
	else&lt;br /&gt;
		endDate = os.date(&amp;quot;%Y-%m-%d&amp;quot;)&lt;br /&gt;
		startDate = os.date(&amp;quot;%Y-%m-%d&amp;quot;, os.time() - (60*86400))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local project = string.sub(mw.site.server,3)&lt;br /&gt;
	local url = mw.uri.encode(p.fullText, &amp;quot;WIKI&amp;quot;)&lt;br /&gt;
	local urlargs = &amp;#039;?start=&amp;#039; .. startDate .. &amp;#039;&amp;amp;end=&amp;#039; .. endDate .. &amp;#039;&amp;amp;project=&amp;#039; .. project .. &amp;#039;&amp;amp;pages=&amp;#039; .. tostring(url)&lt;br /&gt;
	&lt;br /&gt;
	if #urlargs &amp;gt; 255 then -- Extra chars can tip it over the max length for an IW link.&lt;br /&gt;
		return &amp;#039;[https://pageviews.toolforge.org/?&amp;#039; .. urlargs .. &amp;#039; stats]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;[[:toolforge:pageviews/&amp;#039; .. urlargs .. &amp;#039;|stats]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeHistory500Link()&lt;br /&gt;
	local url = p:fullUrl( &amp;#039;action=history&amp;amp;limit=500&amp;#039; );&lt;br /&gt;
	return &amp;#039;[&amp;#039; .. url .. &amp;#039; long history]&amp;#039;&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;
    [&amp;#039;t&amp;#039;]       = makeTalkLink,&lt;br /&gt;
    [&amp;#039;ts&amp;#039;]      = makeTalkOrSubjectLink,&lt;br /&gt;
    [&amp;#039;wlh&amp;#039;]     = makeWhatLinksHereLink,&lt;br /&gt;
    [&amp;#039;rc&amp;#039;]      = makeRelatedChangesLink,&lt;br /&gt;
    [&amp;#039;edit&amp;#039;]    = makeEditLink,&lt;br /&gt;
    [&amp;#039;h&amp;#039;]       = makeHistoryLink,&lt;br /&gt;
    [&amp;#039;w&amp;#039;]       = makeWatchLink,&lt;br /&gt;
    [&amp;#039;tl&amp;#039;]      = makeTargetLogsLink,&lt;br /&gt;
    [&amp;#039;efl&amp;#039;]     = makeEditFilterLogLink,&lt;br /&gt;
    [&amp;#039;vlm-sgs&amp;#039;] = makePageViewsLink,&lt;br /&gt;
    [&amp;#039;pv&amp;#039;]      = makePageViewsLink,&lt;br /&gt;
    [&amp;#039;h500&amp;#039;]    = makeHistory500Link,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function getLink(linktype, args)&lt;br /&gt;
	local func = linktypes[linktype]&lt;br /&gt;
	if func then&lt;br /&gt;
		return func(args)&lt;br /&gt;
	else&lt;br /&gt;
        return err(&amp;#039;&amp;quot;&amp;#039; .. linktype .. &amp;#039;&amp;quot; is not a valid link code&amp;#039;, &amp;#039;Not a valid link code&amp;#039;)&lt;br /&gt;
	end&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) == &amp;#039;number&amp;#039; and p then&lt;br /&gt;
            numArgsExist = true&lt;br /&gt;
            targs[k] = getLink(v, args)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    targs.style = args.small and &amp;#039;font-size: 90%;&amp;#039;&lt;br /&gt;
    targs.separator = args.separator or &amp;#039;dot&amp;#039;&lt;br /&gt;
    targs.class = &amp;#039;lx&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    if numArgsExist == false then&lt;br /&gt;
        return nil -- Don&amp;#039;t return a toolbar if no numeric arguments exist. -- this bit looks odd&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;
local function generatePageDataStrings(args)&lt;br /&gt;
    -- If the page name is absent or blank, return an error and a tracking category.&lt;br /&gt;
    if args.page == &amp;#039;&amp;#039; or not args.page then&lt;br /&gt;
        return err(&amp;#039;no page detected&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    local noError&lt;br /&gt;
    noError, p = pcall(mw.title.new, args.page)&lt;br /&gt;
    if not noError then&lt;br /&gt;
    	return err(&amp;#039;pcall mw.title failed&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if args.exists and (not p or p[&amp;#039;id&amp;#039;] == 0) then&lt;br /&gt;
    	return err(&amp;#039;page not found&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function generateTrackingCategories()&lt;br /&gt;
    if demo == &amp;#039;yes&amp;#039; then&lt;br /&gt;
        return &amp;#039;&amp;#039;&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 page data strings and return any errors.&lt;br /&gt;
    local dataStringError = generatePageDataStrings(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;#039;&amp;lt;table class=&amp;quot;wikitable plainlinks sortable&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        .. &amp;#039;\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;&amp;#039;&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;#039;&amp;#039;&amp;#039;&amp;quot; .. code .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. getLink(code, args) .. &amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    result = result .. &amp;#039;\n&amp;lt;/table&amp;gt;&amp;#039;&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 page data strings and return any errors.&lt;br /&gt;
    local dataStringError = generatePageDataStrings(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(&amp;#039;no link type specified&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    local result = getLink(linktype, args)&lt;br /&gt;
    result = result .. generateTrackingCategories()&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLinksToolbar(args)&lt;br /&gt;
    demo = args.demo -- Set the demo variable.&lt;br /&gt;
    -- Generate the page data strings and return any errors.&lt;br /&gt;
    local dataStringError = generatePageDataStrings(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;
    result = (result or &amp;#039;&amp;#039;) .. generateTrackingCategories()&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLinks(args)&lt;br /&gt;
	local result = getLinksToolbar(args)&lt;br /&gt;
&lt;br /&gt;
	if result then&lt;br /&gt;
		if args.sup then&lt;br /&gt;
			result = &amp;#039;&amp;lt;sup&amp;gt;&amp;#039; .. result .. &amp;#039;&amp;lt;/sup&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		result = &amp;#039;&amp;amp;nbsp;&amp;#039; .. result&lt;br /&gt;
	else&lt;br /&gt;
		result = &amp;#039;&amp;#039; -- If there are no links specified, don&amp;#039;t return the toolbar at all.&lt;br /&gt;
	end&lt;br /&gt;
	if args.nopage then&lt;br /&gt;
		result = &amp;#039;&amp;lt;span&amp;gt;&amp;#039; .. result .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		if p then&lt;br /&gt;
			result = &amp;#039;&amp;lt;span&amp;gt;&amp;#039; .. makePageLink() .. result .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			result = &amp;#039;&amp;lt;span&amp;gt;[[&amp;#039; .. args.page .. &amp;#039;]]&amp;#039; .. result .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&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 = &amp;#039;yes&amp;#039;&lt;br /&gt;
    args.page = &amp;#039;Example&amp;#039;&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;
        -- &amp;#039;page&amp;#039;, and &amp;#039;separator&amp;#039; 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 ~= &amp;#039;&amp;#039; or k == &amp;#039;page&amp;#039; or k == &amp;#039;separator&amp;#039; 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;
    toolbar = makeWrapper(getLinksToolbar),&lt;br /&gt;
    linktable = makeWrapper(getLinkTable),&lt;br /&gt;
    example = makeWrapper(getExampleLinks)&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Shia.k</name></author>
	</entry>
</feed>