Module:Infobox television season name

local match = require("Module:String")._match

local p = {}

-- Local function which is used to create an pipped article link. -- local function createArticleTitleWithPipedLink(article, pipedLink) if (pipedLink == nil or pipedLink == "") then return "" .. article .. "" else return "" .. pipedLink .. "" end end

-- Local helper function which is used to get the current season number and modified show name from the show name. -- local function getModifiedShowNameAndCurrentSeasonNumberFromShowName(showName) local _, _, showNameModified, seasonNumber = string.find(showName, "(.*)%s+(%d+)$") return showNameModified, seasonNumber end

-- Local helper function which is used to get the current season number from the disambiguation. -- local function getCurrentSeasonNumberFromDisambiguation(shortDisambiguation) return match(shortDisambiguation, "%d+", 1, -1, false, "") end

--[[ Local helper function which is used to get the type of word used for "season" in the disambiguation.

Returns one of three options: "season", "series" or "story arc". --]] local function getSeasonType(shortDisambiguation) if (string.find(shortDisambiguation, "story arc")) then return "story arc" end

if (string.find(shortDisambiguation, "series")) then return "series" end

return "season" end

-- Local helper function which is used to get the short disambiguation, without the "(year) TV series," part, which can cause issues later on. -- local function getShortDisambiguation(disambiguation) return string.gsub(disambiguation, "%d+ TV series, ", "") end

-- Local helper function which is used to get the disambiguation from the title. -- local function getDisambiguation(title) local disambiguation = match(title, "%s%((.-)%)", 1, -1, false, "") if (disambiguation == "") then return nil else return disambiguation end end

-- Local helper function which is used to get the show name from the title. -- local function getShowName(title) return mw.ustring.gsub(title, "%s+%b$", "") end

--[[ Local function which is used to check if the given article exists. The function returns "true" in the following cases:	-- A season article exists.	-- A redirect exists to a season section.

The function returns nil in the following cases: -- A season article or redirect do not exist. -- A redirect exists, but it is a general redirect and not for any specific season section. ]]-- local function checkArticle(articleTitle) local article = mw.title.new(articleTitle) if (article ~= nil and article.exists) then local redirectTarget = article.redirectTarget if (redirectTarget) then local fullLink = redirectTarget.fullText local isSection = fullLink:find("#") if (isSection) then return "true"								-- Article is a section redirect; Valid link. else return nil									-- Article is a general redirect; Not a valid link. end else return "true"									-- Article exists and is not a redirect; Valid link. end else return nil											-- Article or redirect do not exist; Not a valid link. end end

--[[ Local function which returns a season article title and a piped link.

The following are the supported season naming styles: --  ( ) Example: Lost (season 2). --  (  ) Example: The Office (American season 2). Example: X Factor (British series 2). --  ( ) Example: Big Brother 2 (American season). --  ( TV series,  ) Example: Teenage Mutant Ninja Turtles (1987 TV series, season 2) --  ( TV series,  ) Example: Love Island (British TV series, series 2) --]] local function getArticleTitle(title, prevOrNextSeasonNumber) local showName = getShowName(title) local disambiguation = getDisambiguation(title) local shortDisambiguation local seasonType local seasonNumber = "" local pipedLink = "" if (disambiguation) then shortDisambiguation = getShortDisambiguation(disambiguation) seasonType = getSeasonType(shortDisambiguation) seasonNumber = getCurrentSeasonNumberFromDisambiguation(shortDisambiguation) pipedLink = seasonType:gsub("^%l", string.upper) .. " "	end

local showNameModified if (seasonNumber == "") then if (string.match(showName, "%s+(%d+)$")) then showNameModified, seasonNumber = getModifiedShowNameAndCurrentSeasonNumberFromShowName(showName) else return "" -- Not a valid next/prev season link end end if (tonumber(seasonNumber) == nil) then return "" else seasonNumber = seasonNumber + prevOrNextSeasonNumber pipedLink = pipedLink .. seasonNumber -- Titles such as "Big Brother 1 (American season)""		if (showNameModified and disambiguation) then			return showNameModified .. " " .. seasonNumber .. " (" .. disambiguation .. ")", pipedLink

-- Titles such as "Big Brother Brasil 1" elseif (showNameModified) then return showNameModified .. " " .. seasonNumber, nil -- Standard titles such as "Lost (season 1)" else disambiguation = string.gsub(disambiguation, "%d+$", seasonNumber) return showName .. " (" .. disambiguation .. ")", pipedLink end end end

-- Local helper function which is used to get the title, either from args (usually from /testcases) or from the page itself. -- local function getTitle(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame) local title = args.title if (not title) then title = mw.title.getCurrentTitle.text end

return title end

-- Local helper function which is called to create a TV season title for the next or previous season. Passes the value "1" or -1" to increment or decrement the current season number. -- local function createArticleTitleHelper(frame, number)	local title = getTitle(frame)	return getArticleTitle(title, number) end

-- Local helper function which is used to check if a season article exists. -- local function checkSeason(frame, number) local articleTitle = createArticleTitleHelper(frame, number) return checkArticle(articleTitle) end

-- Local helper function which is used to create a season article link. -- local function getSeasonArticleLink(frame, number) local articleTitle, pipedLink = createArticleTitleHelper(frame, number) return createArticleTitleWithPipedLink(articleTitle, pipedLink) end

-- Public function which is used to check if the next season has a valid created article or redirect. -- function p.checkNextSeason(frame) return checkSeason(frame, 1) end

-- Public function which is used to check if the previous season has a valid article or redirect. -- function p.checkPrevSeason(frame) return checkSeason(frame, -1) end

--[[ Public function which is used to check if the next or previous season have a valid article or redirect.

Parameters: --]] function p.checkAll(frame) if (p.checkPrevSeason(frame) == "true") then return "true" else return p.checkNextSeason(frame) end end

-- Public function which is used to get the next season article title. -- function p.getNextSeasonArticle(frame) return getSeasonArticleLink(frame, 1) end

-- Public function which is used to get the previous season article title. -- function p.getPrevSeasonArticle(frame) return getSeasonArticleLink(frame, -1) end

-- Public function which is used to get the type of season word used - "season" or "series". -- function p.getSeasonWord(frame) local title = getTitle(frame) local disambiguation = getDisambiguation(title) if (disambiguation) then local shortDisambiguation = getShortDisambiguation(disambiguation) return getSeasonType(shortDisambiguation) else return "" end end

-- Public function which is used to return the relevant text for the sub-header field. The text is returned in the format of  or , depending on either what the article disambiguation uses, or on manually entered parameters of the infobox. -- function p.getInfoboxSubHeader(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame)

local seasonType local seasonNumber if (args.season_number) then seasonType = "Season" seasonNumber = args.season_number elseif (args.series_number) then seasonType = "Series" seasonNumber = args.series_number end

local title = getTitle(frame) local showName = getShowName(title) local disambiguation = getDisambiguation(title) if (not seasonNumber and disambiguation) then local shortDisambiguation = getShortDisambiguation(disambiguation)

seasonType = getSeasonType(shortDisambiguation) seasonType = seasonType:sub(1, 1):upper .. seasonType:sub(2) seasonNumber = getCurrentSeasonNumberFromDisambiguation(shortDisambiguation) end

if (seasonNumber and seasonNumber ~= "") then return seasonType .. " " .. seasonNumber end return nil end

--[[ Public function which is used to return the formatted link to the list of episodes article in the style of: [List of episodes |List of   episodes ]

The link will only return if the page exists. --]] function p.getListOfEpisodes(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame)

local listRange = "" local title = getTitle(frame) local showName local disambiguation

if (args.link) then -- Parameter should be unformatted. if (string.find(args.link, "%[")) then local delink = require('Module:Delink')._delink args.link = delink({args.link}) end

-- Get the season or year range if present. -- Examples: -- List of The Simpsons episodes (seasons 1–20) will return '(seasons 1–20)'. -- List of Doctor Who episodes (2005–present) will return '(2005–present)'. listRange = args.link:match('episodes(.*)$') or ""

-- Get the series name with disambiguation. local seriesNameWithDisambiguation = args.link:match('List of (.*) episodes')

if (seriesNameWithDisambiguation) then showName = getShowName(seriesNameWithDisambiguation) disambiguation = getDisambiguation(seriesNameWithDisambiguation) end

else showName = getShowName(title) disambiguation = getDisambiguation(title) end

if (disambiguation) then if string.match(disambiguation, "^season %d*$") or string.match(disambiguation, "^series %d*$") then -- Check if the disambiguation is normal 'season #' or 'series #'. -- If so, remove disambiguation. disambiguation = "" elseif (string.find(disambiguation, "TV series")) then -- Check if the disambiguation is extended -- and has 'TV series' and isn't just season #. -- Only leave the TV series disambiguation, not including the season #. -- Example: Teenage Mutant Ninja Turtles (1987 TV series, season 55) will return '1987 TV series'. disambiguation = disambiguation:match('^(.*),') or disambiguation disambiguation = string.format(" (%s)", disambiguation) else -- Check if the disambiguation is extended with country adjective. -- Example: The Office (American season 2) will return "American season 2". -- Keep only country adjective. local countryDisambiguation = disambiguation:match('^(.*) season %d*') or disambiguation:match('^(.*) series %d*') local data = mw.loadData('Module:Country adjective') local valid_result = data.getCountryFromAdj[countryDisambiguation] -- Check if the country adjective is valid. if (valid_result) then -- Add 'TV series' suffix disambiguation = string.format(" (%s)", countryDisambiguation .. ' TV series') else -- Not a known diambiguation style. Use whatever was used in the title or manually added. -- Note: might not be a valid style link. disambiguation = string.format(" (%s)", disambiguation) end end else disambiguation = "" end

if (showName) then local episodeListArticle = "List of %s%s episodes%s" episodeListArticle = episodeListArticle:format(showName, disambiguation, listRange) local episodeListArticlePage = mw.title.new(episodeListArticle, 0)

if (episodeListArticlePage.exists and episodeListArticlePage.redirectTarget ~= mw.title.getCurrentTitle) then local episodeList = "List of %s episodes%s" episodeList = episodeList:format(episodeListArticle, showName, listRange) return episodeList end end end

return p