<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FGonnym%2Fsometest7</id>
	<title>Module:Sandbox/Gonnym/sometest7 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FGonnym%2Fsometest7"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Gonnym/sometest7&amp;action=history"/>
	<updated>2026-07-28T23:15:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Gonnym/sometest7&amp;diff=145490&amp;oldid=prev</id>
		<title>imported&gt;Gonnym at 18:06, 11 December 2019</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Gonnym/sometest7&amp;diff=145490&amp;oldid=prev"/>
		<updated>2019-12-11T18:06:41Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local descriptionList = {&lt;br /&gt;
	[1] = {&lt;br /&gt;
		[1] = &amp;quot;This episode is a crossover with %s.&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	[2] = {&lt;br /&gt;
		[1] = &amp;quot;This episode begins a crossover event that concludes on %s.&amp;quot;,&lt;br /&gt;
		[2] = &amp;quot;This episode concludes a crossover event that begins on %s.&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	[3] = {&lt;br /&gt;
		[1] = &amp;quot;This episode begins a crossover event that continues on %s and concludes on %s.&amp;quot;,&lt;br /&gt;
		[2] = &amp;quot;This episode continues a crossover event that begins on %s and concludes on %s.&amp;quot;,&lt;br /&gt;
		[3] = &amp;quot;This episode concludes a crossover event that begins on %s and continues on %s.&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	[4] = {&lt;br /&gt;
		[1] = &amp;quot;This episode begins a crossover event that continues on %s and %s, and concludes on %s.&amp;quot;,&lt;br /&gt;
		[2] = &amp;quot;This episode continues a crossover event that begins on %s continues on %s, and concludes on %s.&amp;quot;,&lt;br /&gt;
		[3] = &amp;quot;This episode continues a crossover event that begins on %s and %s, and concludes on %s.&amp;quot;,&lt;br /&gt;
		[4] = &amp;quot;This episode concludes a crossover event that begins on %s and continues on %s and %s.&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	[5] = {&lt;br /&gt;
		[1] = &amp;quot;This episode begins a crossover event that continues on %s, %s, and %s, and concludes on %s.&amp;quot;,&lt;br /&gt;
		[2] = &amp;quot;This episode continues a crossover event that begins on %s, continues on %s and %s, and concludes on %s.&amp;quot;,&lt;br /&gt;
		[3] = &amp;quot;This episode continues a crossover event that begins on %s and %s, continues on %s, and concludes on %s.&amp;quot;,&lt;br /&gt;
		[4] = &amp;quot;This episode continues a crossover event that begins on %s, %s, and %s, and concludes on %s.&amp;quot;,&lt;br /&gt;
		[5] = &amp;quot;This episode concludes a crossover event that begins on %s, and continues on %s, %s, and %s.&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local validLinkList = {&lt;br /&gt;
	&amp;quot;^List of (.*) episodes&amp;quot;,		-- List of episodes article.&lt;br /&gt;
	&amp;quot;^(.*) %(season %d+%)&amp;quot;,			-- Season article.&lt;br /&gt;
	&amp;quot;^(.*)#&amp;quot;						-- Main article.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local seriesEntryList = {&lt;br /&gt;
	[&amp;quot;FULL&amp;quot;] = &amp;quot;[[%s|&amp;#039;&amp;#039;%s&amp;#039;&amp;#039; season %s episode %s]]&amp;quot;,&lt;br /&gt;
	[&amp;quot;SPECIAL&amp;quot;] = &amp;quot;[[%s|&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;s special episode]]&amp;quot;,&lt;br /&gt;
	[&amp;quot;SPECIAL_SEASON&amp;quot;] = &amp;quot;[[%s|&amp;#039;&amp;#039;%s&amp;#039;&amp;#039; season %s&amp;#039;s special episode]]&amp;quot;,&lt;br /&gt;
	[&amp;quot;SHORT&amp;quot;] = &amp;quot;[[%s|&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;]]&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local errorMessages = {&lt;br /&gt;
	[&amp;quot;MISSING_VALUE&amp;quot;] = &amp;quot;missing |%s= value&amp;quot;,&lt;br /&gt;
	[&amp;quot;NOT_A_NUMBER&amp;quot;] = &amp;quot;value of |%s= should be a number&amp;quot;,&lt;br /&gt;
	[&amp;quot;INCORRECT_LINK&amp;quot;] = &amp;quot;Incorrect |link%s= link&amp;quot;,&lt;br /&gt;
	[&amp;quot;INCORRECT_LINK_SERIES&amp;quot;] = &amp;quot;Incorrect |series%s= link&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local errors = {}&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which is used to create an error message.&lt;br /&gt;
--]]&lt;br /&gt;
local function createErrorMsg(errorText) &lt;br /&gt;
	local errorMsg = &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%;&amp;quot; class=&amp;quot;error&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;Error: &amp;lt;/strong&amp;gt;&amp;#039; .. errorText .. &amp;#039;.&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	table.insert(errors, errorMsg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which is used to create a missing value error message.&lt;br /&gt;
--]]&lt;br /&gt;
local function 	createMissingValueError(link, season, episode, paramNumber)&lt;br /&gt;
	if (not link) then&lt;br /&gt;
		createErrorMsg(string.format(errorMessages[&amp;quot;MISSING_VALUE&amp;quot;], &amp;quot;link&amp;quot; .. paramNumber))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if (not season) then&lt;br /&gt;
		createErrorMsg(string.format(errorMessages[&amp;quot;MISSING_VALUE&amp;quot;], &amp;quot;season&amp;quot; .. paramNumber))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if (not episode) then&lt;br /&gt;
		createErrorMsg(string.format(errorMessages[&amp;quot;MISSING_VALUE&amp;quot;], &amp;quot;episode&amp;quot; .. paramNumber))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which is used to retrieve the series name without the disambiguation.&lt;br /&gt;
--]]&lt;br /&gt;
local function getSeriesNameWithoutDisambiguation(seriesName)&lt;br /&gt;
	return mw.ustring.gsub(seriesName, &amp;quot;%s+%b()$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which is used to retrieve the series name from the episode link.&lt;br /&gt;
--]]&lt;br /&gt;
local function getSeriesNameFromLink(link)&lt;br /&gt;
	for i = 1, #validLinkList do&lt;br /&gt;
		-- Get series name with possibile disambiguation from link.&lt;br /&gt;
		local _, _, seriesName = string.find(link, validLinkList[i])&lt;br /&gt;
		&lt;br /&gt;
		if (seriesName and ((i &amp;lt; 3) or ((i == 3) and mw.title.new(seriesName).exists))) then&lt;br /&gt;
			-- Remove disambiguation.&lt;br /&gt;
			return getSeriesNameWithoutDisambiguation(seriesName)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which is used to create a series entry of a consistent style from&lt;br /&gt;
the crossover episode parameters.&lt;br /&gt;
--]]&lt;br /&gt;
local function createSeriesEntryFromMultiParameters(link, season, episode)&lt;br /&gt;
	local seriesName = getSeriesNameFromLink(link)&lt;br /&gt;
	if (seriesName) then&lt;br /&gt;
		if (episode == &amp;quot;special&amp;quot;) then&lt;br /&gt;
			if (season) then&lt;br /&gt;
				return string.format(seriesEntryList[&amp;quot;SPECIAL_SEASON&amp;quot;], link, seriesName, season, episode)&lt;br /&gt;
			else&lt;br /&gt;
				return string.format(seriesEntryList[&amp;quot;SPECIAL&amp;quot;], link, seriesName, season, episode)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return string.format(seriesEntryList[&amp;quot;FULL&amp;quot;], link, seriesName, season, episode)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which is used to create a series entry of a consistent style from&lt;br /&gt;
the crossover episode parameters.&lt;br /&gt;
--]]&lt;br /&gt;
local function createSeriesEntryFromSeriesParameter(seriesArticle)&lt;br /&gt;
	local seriesName = getSeriesNameWithoutDisambiguation(seriesArticle)&lt;br /&gt;
	if (seriesName) then&lt;br /&gt;
		return string.format(seriesEntryList[&amp;quot;SHORT&amp;quot;], seriesArticle, seriesName)&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which gets the series list from either the numbered (positional) or named parameters,&lt;br /&gt;
and checks if the number of series parameters match the value of parts - creates an error message if they aren&amp;#039;t.&lt;br /&gt;
Returns the series list or nil.&lt;br /&gt;
--]]&lt;br /&gt;
local function getSeriesList(parts, args)&lt;br /&gt;
	local seriesList = {}&lt;br /&gt;
&lt;br /&gt;
	-- This parameter is used for a general crossover that happens in 1 episode.&lt;br /&gt;
	if (args.series) then&lt;br /&gt;
		local series = createSeriesEntryFromSeriesParameter(args.series)&lt;br /&gt;
		if (series) then&lt;br /&gt;
			seriesList[1] = series&lt;br /&gt;
			return seriesList&lt;br /&gt;
		else&lt;br /&gt;
			createErrorMsg(string.format(errorMessages[&amp;quot;INCORRECT_LINK_SERIES&amp;quot;]))&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Multi-episode crossovers.&lt;br /&gt;
&lt;br /&gt;
	parts = parts - 1&lt;br /&gt;
	if (parts &amp;lt; 1) then&lt;br /&gt;
		parts = 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i = 1, parts do&lt;br /&gt;
		local link = args[&amp;quot;link&amp;quot; .. i]&lt;br /&gt;
		local season = args[&amp;quot;season&amp;quot; .. i]&lt;br /&gt;
		local episode = args[&amp;quot;episode&amp;quot; .. i]&lt;br /&gt;
&lt;br /&gt;
		if (link and episode and (season or (episode == &amp;quot;special&amp;quot;))) then&lt;br /&gt;
			local series = createSeriesEntryFromMultiParameters(link, season, episode)&lt;br /&gt;
			if (series) then&lt;br /&gt;
				seriesList[i] = series&lt;br /&gt;
			else&lt;br /&gt;
				createErrorMsg(string.format(errorMessages[&amp;quot;INCORRECT_LINK&amp;quot;], i)) &lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			createMissingValueError(link, season, episode, i)&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return seriesList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which checks if the parameters used are correct.&lt;br /&gt;
Creates an error message if they aren&amp;#039;t.&lt;br /&gt;
--]]&lt;br /&gt;
local function isArgValidNumber(name, value)&lt;br /&gt;
	if (value) then&lt;br /&gt;
		if (tonumber(value)) then&lt;br /&gt;
			return tonumber(value)&lt;br /&gt;
		else&lt;br /&gt;
			createErrorMsg(string.format(errorMessages[&amp;quot;NOT_A_NUMBER&amp;quot;], name))&lt;br /&gt;
			return nil &lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		createErrorMsg(string.format(errorMessages[&amp;quot;MISSING_VALUE&amp;quot;], name)) &lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Local function which is used to handle the actual main process.&lt;br /&gt;
--]]&lt;br /&gt;
local function _main(args)&lt;br /&gt;
	local parts = isArgValidNumber(&amp;quot;parts&amp;quot;, args.parts)&lt;br /&gt;
	local currentPart = isArgValidNumber(&amp;quot;part&amp;quot;, args.part)&lt;br /&gt;
&lt;br /&gt;
	-- If missing parts or current part values, show an error.&lt;br /&gt;
	if (not parts or not (currentPart or parts == 1)) then&lt;br /&gt;
		-- Error message handling.&lt;br /&gt;
		return table.concat(errors)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local seriesList = getSeriesList(parts, args)&lt;br /&gt;
&lt;br /&gt;
	-- If missing series parts, show an error.&lt;br /&gt;
	if (not seriesList) then&lt;br /&gt;
		-- Error message handling.&lt;br /&gt;
		return table.concat(errors)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (parts == 1) then&lt;br /&gt;
		currentPart = 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text = string.format(descriptionList[parts][currentPart], seriesList[1], seriesList[2], seriesList[3], seriesList[4], seriesList[5])&lt;br /&gt;
	if (args.no_hr) then&lt;br /&gt;
		return text&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;lt;hr&amp;gt;&amp;quot; .. text&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Public function which is used to handle the logic for creating a note for television crossover episodes.&lt;br /&gt;
The numbered parameters represent the order of the episodes in the crossover.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
	-- |part=					— required; The crossover part number of the current episode.&lt;br /&gt;
	-- |parts=					— required; The number of total crossover episodes.&lt;br /&gt;
	-- |no_hr=					— optional; Any value will disable the addition of the &amp;lt;hr&amp;gt; tag.&lt;br /&gt;
	-- |series=					— optional; The link to the series that has the crossover with. Used for a general crossover that happens in 1 episode.&lt;br /&gt;
											If |series= is used, |link#=, |season#= and |episode#= should not be used.&lt;br /&gt;
	-- |link1...link5=			— required; The link to the episode entry in the list of episodes.&lt;br /&gt;
	-- |season1...season5=		— required; The episode&amp;#039;s season number.&lt;br /&gt;
	-- |episode1...episode5=	— required; The episode&amp;#039;s episode number.&lt;br /&gt;
--]]&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return _main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Gonnym</name></author>
	</entry>
</feed>