<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3APortal_pictures</id>
	<title>Module:Portal pictures - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3APortal_pictures"/>
	<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Portal_pictures&amp;action=history"/>
	<updated>2026-04-17T03:08:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://moasspedia.org/w/index.php?title=Module:Portal_pictures&amp;diff=2936&amp;oldid=prev</id>
		<title>Wikipedia&gt;Andrybak: fix usage of Module:yesno</title>
		<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Portal_pictures&amp;diff=2936&amp;oldid=prev"/>
		<updated>2021-11-19T00:00:17Z</updated>

		<summary type="html">&lt;p&gt;fix usage of Module:yesno&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local randomModule = require(&amp;#039;Module:Random&amp;#039;)&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local slideshowModule = require(&amp;#039;Module:Random slideshow&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
p = {}&lt;br /&gt;
&lt;br /&gt;
-- == Utility functions ==&lt;br /&gt;
local function getCleanArgs(frame)&lt;br /&gt;
	return getArgs(frame, {&lt;br /&gt;
		trim = true,&lt;br /&gt;
		removeBlanks = true&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikiError(message)&lt;br /&gt;
	return mw.html.create(&amp;#039;div&amp;#039;):addClass(&amp;#039;error&amp;#039;):wikitext(message)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- replace all newlines in the string with break tags&lt;br /&gt;
-- slideshow only supports single line captions&lt;br /&gt;
local function replaceNewlines(s)&lt;br /&gt;
	return mw.ustring.gsub(s, &amp;#039;%c&amp;#039;, &amp;#039;&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- == Argument preparation functions ==&lt;br /&gt;
-- Extracts dates, custom images, and subpages from args&lt;br /&gt;
local function extractPictures(args)&lt;br /&gt;
	local dates = {}&lt;br /&gt;
	local images = {}&lt;br /&gt;
	local subpages = {}&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		if value then&lt;br /&gt;
			if type(key) == &amp;quot;number&amp;quot; then&lt;br /&gt;
				-- positional parameters correspond to POTD dates&lt;br /&gt;
				table.insert(dates, value)&lt;br /&gt;
			elseif string.sub(key, 1, 1) == &amp;quot;i&amp;quot; then&lt;br /&gt;
				-- named parameters with prefixes &amp;quot;i&amp;quot;, &amp;quot;title&amp;quot;, &amp;quot;credit&amp;quot;, and &amp;quot;caption&amp;quot;&lt;br /&gt;
				-- correspond to custom images&lt;br /&gt;
				local num = string.sub(key, 2)&lt;br /&gt;
				local title = args[&amp;quot;title&amp;quot; .. num]&lt;br /&gt;
				local credit = args[&amp;quot;credit&amp;quot; .. num]&lt;br /&gt;
				local caption = args[&amp;quot;caption&amp;quot; .. num] or &amp;quot;&amp;quot;&lt;br /&gt;
				local image = {&lt;br /&gt;
					file = value,&lt;br /&gt;
					title = title,&lt;br /&gt;
					credit = credit,&lt;br /&gt;
					caption = caption&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(images, image)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local subpageMax = tonumber(args[&amp;#039;subpagemax&amp;#039;]) or 0&lt;br /&gt;
	if subpageMax &amp;gt; 0&lt;br /&gt;
	then&lt;br /&gt;
		local root = args[&amp;#039;demoroot&amp;#039;] or (mw.title.getCurrentTitle().rootPageTitle.prefixedText)&lt;br /&gt;
		local picturesRoot = root .. &amp;#039;/&amp;#039; .. (args[&amp;#039;subpage&amp;#039;] or &amp;#039;Selected picture&amp;#039;)&lt;br /&gt;
		for i = 1, subpageMax do&lt;br /&gt;
			table.insert(subpages, picturesRoot .. &amp;#039;/&amp;#039; .. tostring(i))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return dates, images, subpages&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getDefaultMoreLink(args)&lt;br /&gt;
	local root = args[&amp;#039;demoroot&amp;#039;] or (mw.title.getCurrentTitle().rootPageTitle.prefixedText)&lt;br /&gt;
	local picturesPage = args[&amp;#039;subpage&amp;#039;] or &amp;#039;Selected picture&amp;#039;&lt;br /&gt;
	return &amp;quot;[[&amp;quot; .. root .. &amp;quot;/&amp;quot; .. picturesPage .. &amp;quot;|More selected pictures]]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- == Formatting functions ==&lt;br /&gt;
-- transclude [[Template:Portal POTD]]&lt;br /&gt;
local function formatPortalPotd(frame, potdDate)&lt;br /&gt;
	return frame:expandTemplate{&lt;br /&gt;
		title = &amp;quot;Portal POTD&amp;quot;,&lt;br /&gt;
		args = {&lt;br /&gt;
			potdDate,&lt;br /&gt;
			more = &amp;#039;no&amp;#039;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatMoreHtml(more)&lt;br /&gt;
	if not yesno(more, true)&lt;br /&gt;
	then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local moreHtml = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		:attr(&amp;quot;class&amp;quot;, &amp;quot;noprint&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;style&amp;quot;, &amp;quot;margin-top:0.5em; font-weight:bold; width:100%; text-align:right;&amp;quot;)&lt;br /&gt;
		:wikitext(more)&lt;br /&gt;
	return tostring(moreHtml)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- manual recreation of the bottom half of [[Template:Portal POTD]]&lt;br /&gt;
local function formatPotdText(frame, titleText, creditText, captionText, moreHtml)&lt;br /&gt;
	local res = frame:expandTemplate{&lt;br /&gt;
		title = &amp;quot;POTD portal layout/text&amp;quot;,&lt;br /&gt;
		args = {&lt;br /&gt;
			title = titleText,&lt;br /&gt;
			credit = creditText,&lt;br /&gt;
			caption = captionText,&lt;br /&gt;
			[&amp;#039;margin-top&amp;#039;]=&amp;#039;0.5em&amp;#039;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if moreHtml&lt;br /&gt;
	then&lt;br /&gt;
		-- ideally, the &amp;quot;more&amp;quot; text should be trancluded _once_ for the whole box&lt;br /&gt;
		-- but we do it for _every_ image for compatibility with portals, which use numbered subpages&lt;br /&gt;
		res = res .. moreHtml&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatFile(filename)&lt;br /&gt;
	local html = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		:attr(&amp;quot;class&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
		:wikitext(&amp;quot;[[File:&amp;quot; .. filename .. &amp;quot;|380px]]&amp;quot;)&lt;br /&gt;
	return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Extract value named &amp;quot;paramName&amp;quot; from a subpage of [[Template:POTD]]&lt;br /&gt;
local function getPotdPart(frame, potdSubpage, paramName)&lt;br /&gt;
	return frame:expandTemplate{&lt;br /&gt;
		title = potdSubpage,&lt;br /&gt;
		args = { paramName }&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- bottom half of [[Template:Portal POTD]] for a POTD subpage&lt;br /&gt;
local function getPotdText(frame, potdDate, moreHtml)&lt;br /&gt;
	local potdText = getPotdPart(frame, &amp;quot;POTD/&amp;quot; .. potdDate, &amp;quot;portal layout/text&amp;quot;)&lt;br /&gt;
	potdText = replaceNewlines(potdText)&lt;br /&gt;
	if moreHtml&lt;br /&gt;
	then&lt;br /&gt;
		potdText = potdText .. moreHtml&lt;br /&gt;
	end&lt;br /&gt;
	return potdText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- prepare arguments for [[Module:Random slideshow]]&lt;br /&gt;
-- alternating: image1, text1, image2, text2, ...&lt;br /&gt;
local function makeSlideShowArgs(frame, dates, images, subpages, more, limit)&lt;br /&gt;
	local slideShowArgs = {}&lt;br /&gt;
	local moreHtml = formatMoreHtml(more)&lt;br /&gt;
	if #dates &amp;gt; 0 then&lt;br /&gt;
		local randomDates = randomModule.main(&amp;#039;array&amp;#039;, {t=dates, limit=limit})&lt;br /&gt;
		for _, potdDate in ipairs(randomDates) do&lt;br /&gt;
			local image = getPotdPart(frame, &amp;quot;POTD/&amp;quot; .. potdDate, &amp;quot;image&amp;quot;)&lt;br /&gt;
			local image2 = &amp;#039;&amp;#039;&lt;br /&gt;
			if image == &amp;#039;{{{image}}}&amp;#039; then&lt;br /&gt;
				image = getPotdPart(frame, &amp;quot;POTD/&amp;quot; .. potdDate, &amp;quot;image1&amp;quot;)&lt;br /&gt;
				image2 = &amp;#039;[[File:&amp;#039; .. getPotdPart(frame, &amp;quot;POTD/&amp;quot; .. potdDate, &amp;quot;image2&amp;quot;) .. &amp;#039;|200px|center]]&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			local text = image2 .. getPotdText(frame, potdDate, moreHtml)&lt;br /&gt;
			table.insert(slideShowArgs, image)&lt;br /&gt;
			table.insert(slideShowArgs, text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #images &amp;gt; 0 then&lt;br /&gt;
		local randomImages = randomModule.main(&amp;#039;array&amp;#039;, {t=images, limit=limit})&lt;br /&gt;
		for _, image in pairs(randomImages) do&lt;br /&gt;
			table.insert(slideShowArgs, image[&amp;#039;file&amp;#039;])&lt;br /&gt;
			local text = formatPotdText(frame, image[&amp;#039;title&amp;#039;], image[&amp;#039;credit&amp;#039;], image[&amp;#039;caption&amp;#039;], moreHtml)&lt;br /&gt;
			table.insert(slideShowArgs, text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #subpages &amp;gt; 0 then&lt;br /&gt;
		local randomSubpages = randomModule.main(&amp;#039;array&amp;#039;, {t=subpages, limit=math.floor(limit / 2)})&lt;br /&gt;
		for _, subpage in pairs(randomSubpages) do&lt;br /&gt;
			table.insert(slideShowArgs, &amp;#039;Blank.png&amp;#039;)&lt;br /&gt;
			local subpageContent = replaceNewlines(frame:expandTemplate{ title = subpage })&lt;br /&gt;
			table.insert(slideShowArgs, subpageContent)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return slideShowArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- == Main functions ==&lt;br /&gt;
-- Create a list gallery of all passed images&lt;br /&gt;
local function gallery(frame)&lt;br /&gt;
	local args = getCleanArgs(frame)&lt;br /&gt;
	local dates, images, subpages = extractPictures(args)&lt;br /&gt;
	local texts = {}&lt;br /&gt;
&lt;br /&gt;
	for _, value in pairs(dates) do&lt;br /&gt;
		local topText = &amp;#039;&amp;lt;span id=&amp;quot;Template:POTD/&amp;#039; .. value .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;#039; .. &amp;quot;[[Template:POTD/&amp;quot; .. value .. &amp;quot;]]\n\n&amp;quot;&lt;br /&gt;
		table.insert(texts,	topText .. formatPortalPotd(frame, value))&lt;br /&gt;
	end&lt;br /&gt;
	for _, image in pairs(images) do&lt;br /&gt;
		local topText = &amp;quot;[[:File:&amp;quot; .. image[&amp;#039;file&amp;#039;] .. &amp;quot;]]\n\n&amp;quot;&lt;br /&gt;
		local bottomText = formatPotdText(frame, image[&amp;#039;title&amp;#039;], image[&amp;#039;credit&amp;#039;], image[&amp;#039;caption&amp;#039;])&lt;br /&gt;
		table.insert(texts, topText .. formatFile(image[&amp;#039;file&amp;#039;]) .. &amp;quot;\n\n&amp;quot; .. bottomText)&lt;br /&gt;
	end&lt;br /&gt;
	for _, subpage in pairs(subpages) do&lt;br /&gt;
		local topText = &amp;quot;[[:&amp;quot; .. subpage .. &amp;quot;]]\n\n&amp;quot;&lt;br /&gt;
		local subpageContent = frame:expandTemplate{ title = subpage }&lt;br /&gt;
		table.insert(texts, topText .. subpageContent)&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess(table.concat(texts, &amp;quot;\n----\n&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create a slideshow of passed images using [[Module:Random slideshow]]&lt;br /&gt;
local function slideShow(frame)&lt;br /&gt;
	local args = getCleanArgs(frame)&lt;br /&gt;
	local more = args[&amp;quot;more&amp;quot;] or getDefaultMoreLink(args)&lt;br /&gt;
	local dates, images, subpages = extractPictures(args)&lt;br /&gt;
	local limit = 15&lt;br /&gt;
&lt;br /&gt;
	local slideShowArgs = makeSlideShowArgs(frame, dates, images, subpages, more, limit)&lt;br /&gt;
&lt;br /&gt;
	local slideShow = slideshowModule._main(slideShowArgs, false, &amp;#039;portalSlideshow-container&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;} } .. frame:preprocess(slideShow)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- entry point for the module&lt;br /&gt;
function main(frame)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if title.isSubpage&lt;br /&gt;
	then&lt;br /&gt;
		return gallery(frame)&lt;br /&gt;
	else&lt;br /&gt;
		return slideShow(frame)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = main&lt;br /&gt;
p.slideShow = slideShow&lt;br /&gt;
p.gallery = gallery&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikipedia&gt;Andrybak</name></author>
	</entry>
</feed>