Module:Sandbox/Gonnym/sometest7

local descriptionList = { [1] = {		[1] = "This episode is a crossover with %s." },	[2] = {		[1] = "This episode begins a crossover event that concludes on %s.", [2] = "This episode concludes a crossover event that begins on %s." },	[3] = {		[1] = "This episode begins a crossover event that continues on %s and concludes on %s.", [2] = "This episode continues a crossover event that begins on %s and concludes on %s.", [3] = "This episode concludes a crossover event that begins on %s and continues on %s." },	[4] = {		[1] = "This episode begins a crossover event that continues on %s and %s, and concludes on %s.", [2] = "This episode continues a crossover event that begins on %s continues on %s, and concludes on %s.", [3] = "This episode continues a crossover event that begins on %s and %s, and concludes on %s.", [4] = "This episode concludes a crossover event that begins on %s and continues on %s and %s." },	[5] = {		[1] = "This episode begins a crossover event that continues on %s, %s, and %s, and concludes on %s.", [2] = "This episode continues a crossover event that begins on %s, continues on %s and %s, and concludes on %s.", [3] = "This episode continues a crossover event that begins on %s and %s, continues on %s, and concludes on %s.", [4] = "This episode continues a crossover event that begins on %s, %s, and %s, and concludes on %s.", [5] = "This episode concludes a crossover event that begins on %s, and continues on %s, %s, and %s." } }

local validLinkList = { "^List of (.*) episodes",		-- List of episodes article. "^(.*) %(season %d+%)",			-- Season article. "^(.*)#"						-- Main article. }

local seriesEntryList = { ["FULL"] = "%s season %s episode %s", ["SPECIAL"] = "%s's special episode", ["SPECIAL_SEASON"] = "%s season %s's special episode", ["SHORT"] = "%s" }

local errorMessages = { ["MISSING_VALUE"] = "missing |%s= value", ["NOT_A_NUMBER"] = "value of |%s= should be a number", ["INCORRECT_LINK"] = "Incorrect |link%s= link", ["INCORRECT_LINK_SERIES"] = "Incorrect |series%s= link" }

local errors = {}

local p = {}

-- Local function which is used to create an error message. -- local function createErrorMsg(errorText) local errorMsg = ' Error: ' .. errorText .. '. '	table.insert(errors, errorMsg) end

-- Local function which is used to create a missing value error message. -- local function 	createMissingValueError(link, season, episode, paramNumber) if (not link) then createErrorMsg(string.format(errorMessages["MISSING_VALUE"], "link" .. paramNumber)) end if (not season) then createErrorMsg(string.format(errorMessages["MISSING_VALUE"], "season" .. paramNumber)) end if (not episode) then createErrorMsg(string.format(errorMessages["MISSING_VALUE"], "episode" .. paramNumber)) end end

-- Local function which is used to retrieve the series name without the disambiguation. -- local function getSeriesNameWithoutDisambiguation(seriesName) return mw.ustring.gsub(seriesName, "%s+%b$", "") end

-- Local function which is used to retrieve the series name from the episode link. -- local function getSeriesNameFromLink(link) for i = 1, #validLinkList do -- Get series name with possibile disambiguation from link. local _, _, seriesName = string.find(link, validLinkList[i]) if (seriesName and ((i < 3) or ((i == 3) and mw.title.new(seriesName).exists))) then -- Remove disambiguation. return getSeriesNameWithoutDisambiguation(seriesName) end end

return nil end

-- Local function which is used to create a series entry of a consistent style from the crossover episode parameters. -- local function createSeriesEntryFromMultiParameters(link, season, episode) local seriesName = getSeriesNameFromLink(link) if (seriesName) then if (episode == "special") then if (season) then return string.format(seriesEntryList["SPECIAL_SEASON"], link, seriesName, season, episode) else return string.format(seriesEntryList["SPECIAL"], link, seriesName, season, episode) end else return string.format(seriesEntryList["FULL"], link, seriesName, season, episode) end else return nil end end

-- Local function which is used to create a series entry of a consistent style from the crossover episode parameters. -- local function createSeriesEntryFromSeriesParameter(seriesArticle) local seriesName = getSeriesNameWithoutDisambiguation(seriesArticle) if (seriesName) then return string.format(seriesEntryList["SHORT"], seriesArticle, seriesName) else return nil end end

-- Local function which gets the series list from either the numbered (positional) or named parameters, and checks if the number of series parameters match the value of parts - creates an error message if they aren't. Returns the series list or nil. -- local function getSeriesList(parts, args) local seriesList = {}

-- This parameter is used for a general crossover that happens in 1 episode. if (args.series) then local series = createSeriesEntryFromSeriesParameter(args.series) if (series) then seriesList[1] = series return seriesList else createErrorMsg(string.format(errorMessages["INCORRECT_LINK_SERIES"])) return nil end end

-- Multi-episode crossovers.

parts = parts - 1 if (parts < 1) then parts = 1 end

for i = 1, parts do local link = args["link" .. i] local season = args["season" .. i] local episode = args["episode" .. i]

if (link and episode and (season or (episode == "special"))) then local series = createSeriesEntryFromMultiParameters(link, season, episode) if (series) then seriesList[i] = series else createErrorMsg(string.format(errorMessages["INCORRECT_LINK"], i)) return nil end else createMissingValueError(link, season, episode, i)			return nil end end return seriesList end

-- Local function which checks if the parameters used are correct. Creates an error message if they aren't. -- local function isArgValidNumber(name, value) if (value) then if (tonumber(value)) then return tonumber(value) else createErrorMsg(string.format(errorMessages["NOT_A_NUMBER"], name)) return nil end else createErrorMsg(string.format(errorMessages["MISSING_VALUE"], name)) return nil end end

-- Local function which is used to handle the actual main process. -- local function _main(args) local parts = isArgValidNumber("parts", args.parts) local currentPart = isArgValidNumber("part", args.part)

-- If missing parts or current part values, show an error. if (not parts or not (currentPart or parts == 1)) then -- Error message handling. return table.concat(errors) end

local seriesList = getSeriesList(parts, args)

-- If missing series parts, show an error. if (not seriesList) then -- Error message handling. return table.concat(errors) end

if (parts == 1) then currentPart = 1 end

local text = string.format(descriptionList[parts][currentPart], seriesList[1], seriesList[2], seriesList[3], seriesList[4], seriesList[5]) if (args.no_hr) then return text else return " " .. text end end

--[[ Public function which is used to handle the logic for creating a note for television crossover episodes. The numbered parameters represent the order of the episodes in the crossover.

Parameters: -- |part=					— required; The crossover part number of the current episode. -- |parts=					— required; The number of total crossover episodes. -- |no_hr=					— optional; Any value will disable the addition of the tag. -- |series=					— optional; The link to the series that has the crossover with. Used for a general crossover that happens in 1 episode. If |series= is used, |link#=, |season#= and |episode#= should not be used. -- |link1...link5=			— required; The link to the episode entry in the list of episodes. -- |season1...season5=		— required; The episode's season number. -- |episode1...episode5=	— required; The episode's episode number. --]] function p.main(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame) return _main(args) end

return p