<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AExcerpt_slideshow</id>
	<title>Module:Excerpt slideshow - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AExcerpt_slideshow"/>
	<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:Excerpt_slideshow&amp;action=history"/>
	<updated>2026-04-13T19:20:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.tiffa.net/w/index.php?title=Module:Excerpt_slideshow&amp;diff=3677&amp;oldid=prev</id>
		<title>imported&gt;Fire: Created page with &quot;local p = {} local excerptModule = require(&#039;Module:Excerpt/portals&#039;) local slideshowModule = require(&#039;Module:Random slideshow&#039;) local randomModule = require(&#039;Module:Random&#039;)  local DEFAULT_LIMIT = 25 -- max number of excerpts to be shown in the slideshow local SOURCE_PAGES_LIMIT = 10 -- max number of pages to check for links / list items  -- begin BHG addition for tracking source pages local sourcepgagesused = {}; local sourcepgagesusedcounter = 0; local articlelistcount...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:Excerpt_slideshow&amp;diff=3677&amp;oldid=prev"/>
		<updated>2022-12-25T06:01:49Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local excerptModule = require(&amp;#039;Module:Excerpt/portals&amp;#039;) local slideshowModule = require(&amp;#039;Module:Random slideshow&amp;#039;) local randomModule = require(&amp;#039;Module:Random&amp;#039;)  local DEFAULT_LIMIT = 25 -- max number of excerpts to be shown in the slideshow local SOURCE_PAGES_LIMIT = 10 -- max number of pages to check for links / list items  -- begin BHG addition for tracking source pages local sourcepgagesused = {}; local sourcepgagesusedcounter = 0; local articlelistcount...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local excerptModule = require(&amp;#039;Module:Excerpt/portals&amp;#039;)&lt;br /&gt;
local slideshowModule = require(&amp;#039;Module:Random slideshow&amp;#039;)&lt;br /&gt;
local randomModule = require(&amp;#039;Module:Random&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local DEFAULT_LIMIT = 25 -- max number of excerpts to be shown in the slideshow&lt;br /&gt;
local SOURCE_PAGES_LIMIT = 10 -- max number of pages to check for links / list items&lt;br /&gt;
&lt;br /&gt;
-- begin BHG addition for tracking source pages&lt;br /&gt;
local sourcepgagesused = {};&lt;br /&gt;
local sourcepgagesusedcounter = 0;&lt;br /&gt;
local articlelistcount = -1;&lt;br /&gt;
local usesEmbeddedList = false;&lt;br /&gt;
-- end BHG addition for tracking source pages&lt;br /&gt;
&lt;br /&gt;
function cleanupArgs(argsTable)&lt;br /&gt;
	local cleanArgs = {}&lt;br /&gt;
	for key, val in pairs(argsTable) do&lt;br /&gt;
		if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			val = val:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
			if val ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				cleanArgs[key] = val&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			cleanArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return cleanArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isDeclined(val)&lt;br /&gt;
	if not val then return false end&lt;br /&gt;
	local declinedWords = &amp;quot; decline declined exclude excluded false none not no n off omit omitted remove removed &amp;quot;&lt;br /&gt;
	return string.find(declinedWords , &amp;#039; &amp;#039;..val..&amp;#039; &amp;#039;, 1, true ) and true or false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	@param {String} wikitext: Wikitext of just the list (i.e. each line is a list item)&lt;br /&gt;
	@param {String} symbol:   Special character used in the wikitext markup for the list, e.g. &amp;#039;*&amp;#039; or &amp;#039;#&amp;#039;&lt;br /&gt;
	@param {String} outerTag: Text portion of the tag for each list or sublist, e.g. &amp;#039;ul&amp;#039; or &amp;#039;ol&amp;#039;&lt;br /&gt;
	@param {String} innerTag: Text portion of the tag for each list item, e.g. &amp;#039;li&amp;#039;&lt;br /&gt;
]]&lt;br /&gt;
local wikitextToHtmlList = function(wikitext, symbol, outerTag, innerTag)&lt;br /&gt;
	local listParts = {}&lt;br /&gt;
	for level, item in mw.ustring.gmatch(&amp;#039;\n&amp;#039;..wikitext..&amp;#039;\n&amp;#039;, &amp;#039;\n(%&amp;#039;..symbol..&amp;#039;+)(.-)%f[\n]&amp;#039;) do&lt;br /&gt;
	    table.insert(listParts, {level=level, item=item})&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(listParts, {level=&amp;#039;&amp;#039;, item=&amp;#039;&amp;#039;})&lt;br /&gt;
	&lt;br /&gt;
	local htmlList = {}&lt;br /&gt;
	for i, this in ipairs( listParts ) do&lt;br /&gt;
		local isFirstItem = (i == 1)&lt;br /&gt;
		local isLastItem = (i == #listParts)&lt;br /&gt;
	    local lastLevel = isFirstItem and &amp;#039;&amp;#039; or listParts[i-1][&amp;#039;level&amp;#039;]&lt;br /&gt;
	    local tags&lt;br /&gt;
	    if #lastLevel == #this.level then&lt;br /&gt;
	    	tags = &amp;#039;&amp;lt;/&amp;#039;..innerTag..&amp;#039;&amp;gt;&amp;lt;&amp;#039;..innerTag..&amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
	    elseif #this.level &amp;gt; #lastLevel then&lt;br /&gt;
	    	tags = string.rep(&amp;#039;&amp;lt;&amp;#039;..outerTag..&amp;#039;&amp;gt;&amp;lt;&amp;#039;..innerTag..&amp;#039;&amp;gt;&amp;#039;, #this.level - #lastLevel)&lt;br /&gt;
	    elseif isLastItem then&lt;br /&gt;
	    	tags = string.rep(&amp;#039;&amp;lt;/&amp;#039;..innerTag..&amp;#039;&amp;gt;&amp;lt;/&amp;#039;..outerTag..&amp;#039;&amp;gt;&amp;#039;, #lastLevel)&lt;br /&gt;
	    else -- ( #this.level &amp;lt; #lastLevel ) and not last item&lt;br /&gt;
	    	tags = string.rep(&amp;#039;&amp;lt;/&amp;#039;..innerTag..&amp;#039;&amp;gt;&amp;lt;/&amp;#039;..outerTag..&amp;#039;&amp;gt;&amp;#039;, #lastLevel - #this.level ) .. &amp;#039;&amp;lt;/&amp;#039;..innerTag..&amp;#039;&amp;gt;&amp;lt;&amp;#039;..innerTag..&amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
	    end&lt;br /&gt;
	    table.insert(htmlList, tags .. this.item)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(htmlList)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	@param {String} wikitext: Wikitext excertp containg zero or more lists&lt;br /&gt;
	@param {String} symbol:   Special character used in the wikitext markup for the list, e.g. &amp;#039;*&amp;#039; or &amp;#039;#&amp;#039;&lt;br /&gt;
	@param {String} outerTag: Text portion of the tag for each list or sublist, e.g. &amp;#039;ul&amp;#039; or &amp;#039;ol&amp;#039;&lt;br /&gt;
	@param {String} innerTag: Text portion of the tag for each list item, e.g. &amp;#039;li&amp;#039;&lt;br /&gt;
]]&lt;br /&gt;
local gsubWikitextLists = function(wikitext, symbol, outerTag, innerTag)&lt;br /&gt;
	-- temporarily remove list linebreaks... &lt;br /&gt;
	wikitext = mw.ustring.gsub(wikitext..&amp;#039;\n&amp;#039;, &amp;#039;\n%&amp;#039;..symbol, &amp;#039;¿¿¿&amp;#039;..symbol) &lt;br /&gt;
	-- ...so we can grab the whole list (and just the list)...&lt;br /&gt;
	return mw.ustring.gsub(&lt;br /&gt;
		wikitext,&lt;br /&gt;
		&amp;#039;¿¿¿%&amp;#039;..symbol..&amp;#039;[^\n]+&amp;#039;, &lt;br /&gt;
		function(listWikitext)&lt;br /&gt;
			-- ...and then reinstate linebreaks...&lt;br /&gt;
			listWikitext = mw.ustring.gsub(listWikitext, &amp;#039;¿¿¿%&amp;#039;..symbol, &amp;#039;\n&amp;#039;..symbol)&lt;br /&gt;
			-- ...and finally do the conversion&lt;br /&gt;
			return wikitextToHtmlList(listWikitext, symbol, outerTag, innerTag)&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ help gsub strip tables and templates that aren&amp;#039;t part of the prose,&lt;br /&gt;
     and remove linebreaks from within other templates,&lt;br /&gt;
     and preprocess parser functions ]]&lt;br /&gt;
local processBraces = function(t)&lt;br /&gt;
	local isTable = mw.ustring.sub(mw.text.trim(t), 2, 2) == &amp;#039;|&amp;#039;&lt;br /&gt;
	if isTable then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- else it&amp;#039;s a template or parser function&lt;br /&gt;
	local first = mw.ustring.sub(t, 1, 1)&lt;br /&gt;
	local last = mw.ustring.sub(t, -1)&lt;br /&gt;
	local isNotPartOfProse = first == &amp;#039;\n&amp;#039; and last == &amp;#039;\n&amp;#039;&lt;br /&gt;
	if isNotPartOfProse then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local isParserFunction = mw.ustring.sub(mw.text.trim(t), 3, 3) == &amp;#039;#&amp;#039;&lt;br /&gt;
	if isParserFunction then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		return frame:preprocess(t)&lt;br /&gt;
	end&lt;br /&gt;
	-- else replace pipes and remove internal linebreaks&lt;br /&gt;
	return mw.ustring.gsub(t, &amp;#039;\n*&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local cleanUpExcerpt = function(excerpt)&lt;br /&gt;
	-- strip galleries&lt;br /&gt;
	excerpt = mw.ustring.gsub(excerpt, &amp;quot;&amp;lt;%s*[Gg]allery.-&amp;gt;.-&amp;lt;%s*/%s*[Gg]allery%s*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	-- strip tables and block templates; strip newlines and replace pipes within inline templates&lt;br /&gt;
	excerpt = mw.ustring.gsub(excerpt..&amp;#039;\n&amp;#039;, &amp;#039;\n?%b{}\n?&amp;#039;, processBraces)&lt;br /&gt;
	-- replace wikitext bulleted lists with html bulleted lists&lt;br /&gt;
	excerpt = gsubWikitextLists(excerpt, &amp;#039;*&amp;#039;, &amp;#039;ul&amp;#039;, &amp;#039;li&amp;#039;)&lt;br /&gt;
	-- replace wikitext numbered lists with html numbered lists&lt;br /&gt;
	excerpt = gsubWikitextLists(excerpt, &amp;#039;#&amp;#039;, &amp;#039;ol&amp;#039;, &amp;#039;li&amp;#039;)&lt;br /&gt;
	excerpt = mw.text.trim(excerpt)&lt;br /&gt;
	return excerpt&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function makeGalleryArgs(titles, options, limit, nonRandom)&lt;br /&gt;
	local galleryArgs = {}&lt;br /&gt;
	local titlesSequence = {}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while titles[i] do&lt;br /&gt;
		titlesSequence[i] = titles[i]&lt;br /&gt;
		i  = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	local sortedTitles = nonRandom and titlesSequence or randomModule.main(&amp;#039;array&amp;#039;, {t=titlesSequence, limit=limit})&lt;br /&gt;
	for _i, title in ipairs(sortedTitles) do&lt;br /&gt;
		if (#galleryArgs / 2) &amp;lt; limit then&lt;br /&gt;
			local success, excerpt = pcall(excerptModule.get, title, options)&lt;br /&gt;
			if not success then&lt;br /&gt;
				mw.log(&amp;quot;require(&amp;#039;Module:Excerpt&amp;#039;).get failed: &amp;quot; .. excerpt) -- probably got a redlink&lt;br /&gt;
				excerpt = nil&lt;br /&gt;
			end&lt;br /&gt;
			if excerpt and excerpt ~= &amp;#039;&amp;#039; and #excerpt &amp;gt; 10 then -- check again in case we had a few characters plus (Full article...)&lt;br /&gt;
				excerpt = cleanUpExcerpt(excerpt)&lt;br /&gt;
				if options.more then&lt;br /&gt;
					excerpt = excerpt .. &amp;quot; (&amp;#039;&amp;#039;&amp;#039;[[&amp;quot; .. title .. &amp;quot;|&amp;quot; .. options.more .. &amp;quot;]]&amp;#039;&amp;#039;&amp;#039;)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				local text = &amp;#039;&amp;lt;div style=&amp;quot;text-align:left;&amp;quot;&amp;gt;&amp;#039; .. mw.ustring.gsub(excerpt, &amp;#039;%c&amp;#039;, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
				table.insert(galleryArgs, &amp;#039;File:Blank.png&amp;#039;)&lt;br /&gt;
				table.insert(galleryArgs, text)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if nonRandom then&lt;br /&gt;
		galleryArgs.random = &amp;#039;false&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if #galleryArgs == 0 and options.nostubs then&lt;br /&gt;
		-- try again, this time including stubs&lt;br /&gt;
		options.nostubs = false&lt;br /&gt;
		return makeGalleryArgs(titles, options, limit, nonRandom)&lt;br /&gt;
	else&lt;br /&gt;
		return galleryArgs&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local makeOptions = function(args)&lt;br /&gt;
	local options = args -- pick up miscellaneous options: more, errors, fileargs&lt;br /&gt;
	options.paraflags = excerptModule.numberFlags(args.paragraphs or &amp;quot;&amp;quot;) -- parse paragraphs, e.g. &amp;quot;1,3-5&amp;quot; → {&amp;quot;1&amp;quot;,&amp;quot;3-5&amp;quot;}&lt;br /&gt;
	options.fileflags = excerptModule.numberFlags(args.files or &amp;quot;&amp;quot;) -- parse file numbers&lt;br /&gt;
	if args.nostubs and isDeclined(args.nostubs) then&lt;br /&gt;
		options.nostubs = false&lt;br /&gt;
	else &lt;br /&gt;
		options.nostubs = true&lt;br /&gt;
	end&lt;br /&gt;
	return options&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local isArticle = function(pagetitle)&lt;br /&gt;
	local titleObject = mw.title.new(pagetitle)&lt;br /&gt;
	return ( titleObject and titleObject.namespace == 0 ) and true or false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local getLinkedTitles = function(args, method, limit)&lt;br /&gt;
	local pagenames = {}&lt;br /&gt;
	local ii = 1&lt;br /&gt;
	local isNotCategory&lt;br /&gt;
	while args[ii] and ii &amp;lt; limit do&lt;br /&gt;
		local pageContent = excerptModule.getContent(args[ii])&lt;br /&gt;
		if pageContent then&lt;br /&gt;
			local pageSection = args[&amp;quot;section&amp;quot;..ii] or args[&amp;quot;section&amp;quot;]&lt;br /&gt;
			local sectionOnly = args[&amp;quot;sectiononly&amp;quot;..ii] or args[&amp;quot;sectiononly&amp;quot;]&lt;br /&gt;
			local text = pageContent&lt;br /&gt;
			if pageSection then -- check relevant section only&lt;br /&gt;
				local success, result = pcall(excerptModule.getSection, pageContent, pageSection, sectionOnly)&lt;br /&gt;
				if not success then&lt;br /&gt;
					mw.log(&amp;quot;require(&amp;#039;Module:Excerpt&amp;#039;).getSection failed on the content of &amp;quot; .. args[ii] .. &amp;quot;: &amp;quot; .. result)&lt;br /&gt;
					result = nil&lt;br /&gt;
				end&lt;br /&gt;
				text = result or pageContent&lt;br /&gt;
			end&lt;br /&gt;
			-- begin BHG addition for tracking source pages&lt;br /&gt;
			local thisPage = mw.title.getCurrentTitle().nsText .. &amp;quot;:&amp;quot; .. mw.title.getCurrentTitle().text&lt;br /&gt;
			local thisBareParam = mw.ustring.gsub(args[ii], &amp;quot;^([^#]+).*$&amp;quot;, &amp;quot;%1&amp;quot;, 1) -- strip any section anchor from the parameter&amp;#039;s page name&lt;br /&gt;
			if (thisPage == thisBareParam) then&lt;br /&gt;
				usesEmbeddedList = true;&lt;br /&gt;
			end&lt;br /&gt;
			-- end BHG addition for tracking source pages&lt;br /&gt;
			-- replace annotated links with real links&lt;br /&gt;
			text = mw.ustring.gsub(text, &amp;quot;{{%s*[Aa]nnotated[ _]link%s*|%s*(.-)%s*}}&amp;quot;, &amp;quot;[[%1]]&amp;quot;)&lt;br /&gt;
			if method == &amp;quot;linked&amp;quot; then&lt;br /&gt;
				for p in mw.ustring.gmatch(text, &amp;quot;%[%[%s*([^%]|\n]*)&amp;quot;) do&lt;br /&gt;
					if isArticle(p) then&lt;br /&gt;
						table.insert(pagenames, p)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				-- listitem: first wikilink on a line beginning *, :#, etc. except in &amp;quot;See also&amp;quot; or later section&lt;br /&gt;
				text = mw.ustring.gsub(text, &amp;quot;\n== *See also.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				for p in mw.ustring.gmatch(text, &amp;quot;\n:*[%*#][^\n]-%[%[%s*([^%]|\n]*)&amp;quot;) do&lt;br /&gt;
					if isArticle(p) then&lt;br /&gt;
						table.insert(pagenames, p)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- begin BHG addition for tracking source pages&lt;br /&gt;
			if ((method == &amp;quot;listitem&amp;quot;) or (method == &amp;quot;linked&amp;quot;)) then&lt;br /&gt;
				table.insert(sourcepgagesused, args[ii])&lt;br /&gt;
				sourcepgagesusedcounter = sourcepgagesusedcounter + 1&lt;br /&gt;
			end&lt;br /&gt;
			-- end BHG addition for tracking source pages&lt;br /&gt;
		end&lt;br /&gt;
		ii = ii + 1&lt;br /&gt;
	end&lt;br /&gt;
	-- begin BHG addition for tracking&lt;br /&gt;
	articlelistcount = #pagenames&lt;br /&gt;
	-- end BHG addition for tracking&lt;br /&gt;
	return pagenames&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Template entry points:&lt;br /&gt;
&lt;br /&gt;
-- randomExcerpt: Titles specified in template parameters (equivalent to {{Transclude random excerpt}})&lt;br /&gt;
p.randomExcerpt = function(frame)&lt;br /&gt;
	local parent = frame.getParent(frame)&lt;br /&gt;
	local output = p._excerpt(parent.args, &amp;#039;random&amp;#039;)&lt;br /&gt;
	return frame:extensionTag{ name=&amp;#039;templatestyles&amp;#039;, args = { src=&amp;#039;Module:Random slideshow/styles.css&amp;#039;} } &lt;br /&gt;
		.. frame:preprocess(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- linkedExcerpt: Titles from links on one or more pages (similar to {{Transclude linked excerpt}})&lt;br /&gt;
p.linkedExcerpt = function(frame)&lt;br /&gt;
	local parent = frame.getParent(frame)&lt;br /&gt;
	local output = p._excerpt(parent.args, &amp;#039;linked&amp;#039;)&lt;br /&gt;
	return frame:extensionTag{ name=&amp;#039;templatestyles&amp;#039;, args = { src=&amp;#039;Module:Random slideshow/styles.css&amp;#039;} } &lt;br /&gt;
		.. frame:preprocess(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- listItemExcerpt: Titles from linked list items one one or more pages (similar to {{Transclude list item excerpt}})&lt;br /&gt;
p.listItemExcerpt = function(frame)&lt;br /&gt;
	local parent = frame.getParent(frame)&lt;br /&gt;
	local output = p._excerpt(parent.args, &amp;#039;listitem&amp;#039;)&lt;br /&gt;
	return frame:extensionTag{ name=&amp;#039;templatestyles&amp;#039;, args = { src=&amp;#039;Module:Random slideshow/styles.css&amp;#039;} } &lt;br /&gt;
		.. frame:preprocess(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Module entry point:&lt;br /&gt;
&lt;br /&gt;
p._excerpt = function(_args, method)&lt;br /&gt;
	local args = cleanupArgs(_args)&lt;br /&gt;
	args.more = excerptModule.getMoreLinkText(_args.more)&lt;br /&gt;
	local options = makeOptions(args)&lt;br /&gt;
	local limit = args.limit and tonumber(args.limit) or DEFAULT_LIMIT&lt;br /&gt;
	local titles&lt;br /&gt;
	if method == &amp;#039;linked&amp;#039; or method == &amp;#039;listitem&amp;#039; then&lt;br /&gt;
		titles = getLinkedTitles(args, method, SOURCE_PAGES_LIMIT)&lt;br /&gt;
	else&lt;br /&gt;
		titles = args&lt;br /&gt;
	end&lt;br /&gt;
	local galleryArgs = makeGalleryArgs(titles, options, limit, isDeclined(_args.random))&lt;br /&gt;
	return slideshowModule._main(galleryArgs, false, &amp;#039;excerptSlideshow-container&amp;#039;) .. checksourcepages()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p._cleanUpExcerpt = cleanUpExcerpt&lt;br /&gt;
&lt;br /&gt;
-- begin BHG addition for tracking source pages&lt;br /&gt;
function checksourcepages()&lt;br /&gt;
	-- no tracking unless we are in Portal namespace&lt;br /&gt;
	if (mw.title.getCurrentTitle().nsText ~= &amp;quot;Portal&amp;quot;) then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local pagecounter = 0;&lt;br /&gt;
	local templatecount = 0;&lt;br /&gt;
	local outlinecount = 0;&lt;br /&gt;
	local retval =&amp;quot;&amp;quot;;&lt;br /&gt;
	local usesEponymousArticle = false;&lt;br /&gt;
	local debugging = false;&lt;br /&gt;
	local thisPageBareName = mw.title.getCurrentTitle().text;&lt;br /&gt;
	if debugging then&lt;br /&gt;
		retval = &amp;#039;&amp;lt;div style=&amp;quot;display:block; border:10px solid green; background-color:#efe; padding:1em; margin:1em&amp;quot;&amp;gt;\n----\n&amp;#039;&lt;br /&gt;
		retval = retval .. &amp;quot;sourcepgagesusedcounter: &amp;quot; .. sourcepgagesusedcounter .. &amp;quot;\n----\n&amp;quot;&lt;br /&gt;
		retval = retval .. &amp;quot;pages used:&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local apage&lt;br /&gt;
	for apage in arrayvalues(sourcepgagesused) do&lt;br /&gt;
		if debugging then &lt;br /&gt;
			retval = retval .. &amp;quot;\n# [[:&amp;quot; .. apage .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			retval = retval .. &amp;quot; — &amp;quot; .. &amp;quot;First 999 = /&amp;quot; .. string.sub(apage, 1, 999) .. &amp;quot;/&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if (string.find(apage, &amp;quot;^[tT]emplate ?:&amp;quot;) == 1) then&lt;br /&gt;
			templatecount = templatecount + 1;&lt;br /&gt;
		end&lt;br /&gt;
		if (string.find(apage, &amp;quot;^[oO]utline +of &amp;quot;) == 1) then&lt;br /&gt;
			outlinecount = outlinecount + 1;&lt;br /&gt;
		end&lt;br /&gt;
		if (apage == thisPageBareName) then&lt;br /&gt;
			usesEponymousArticle = true;&lt;br /&gt;
		end&lt;br /&gt;
		pagecounter = pagecounter + 1&lt;br /&gt;
	end&lt;br /&gt;
	if debugging then&lt;br /&gt;
		retval = retval .. &amp;quot;\nTotal pages: &amp;quot; .. pagecounter&lt;br /&gt;
		retval = retval .. &amp;quot;\ntemplatecount: &amp;quot; .. templatecount&lt;br /&gt;
		retval = retval .. &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- first do a sanity check that both counting methods have produced the same result&lt;br /&gt;
	if (sourcepgagesusedcounter == pagecounter) then&lt;br /&gt;
		-- if all pages are templates, then populate tracking categories&lt;br /&gt;
		if (pagecounter == templatecount) then&lt;br /&gt;
			if (templatecount == 1) then&lt;br /&gt;
				retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with article list built solely from one template]]&amp;quot;&lt;br /&gt;
			elseif (templatecount == 2) then&lt;br /&gt;
				retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with article list built solely from two templates]]&amp;quot;&lt;br /&gt;
			elseif (templatecount == 3) then&lt;br /&gt;
				retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with article list built solely from three templates]]&amp;quot;&lt;br /&gt;
			elseif (templatecount &amp;gt; 3) then&lt;br /&gt;
				retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with article list built solely from four or more templates]]&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		elseif (templatecount &amp;gt; 0) then&lt;br /&gt;
			retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with article list built using one or more templates, and other sources]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (outlinecount &amp;gt;= 1) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with article list built using one or more outline pages]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if (articlelistcount &amp;lt; 2) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with less than 2 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 5) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 2–5 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 10) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 6–10 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 15) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 11–15 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 20) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 16–20 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 25) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 21–25 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 30) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 26–30 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 40) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 31–40 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 50) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 41–50 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 100) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 51–100 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 200) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 101–200 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 500) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 201–500 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;lt;= 1000) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with 501–1000 articles in article list]]&amp;quot;&lt;br /&gt;
	elseif (articlelistcount &amp;gt; 1000) then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with over 1000 articles in article list]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if usesEmbeddedList then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with embedded list]]&amp;quot;	&lt;br /&gt;
	end&lt;br /&gt;
	if usesEponymousArticle then&lt;br /&gt;
		retval = retval .. &amp;quot;[[Category:Automated article-slideshow portals with article list built using eponymous article]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function arrayvalues(t)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	return function() i = i + 1; return t[i] end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- end BHG addition for tracking source pages&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Fire</name></author>
	</entry>
</feed>