Module:Infobox television season name
Documentation for this module may be created at Module:Infobox television season name/doc
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 "[[" .. article .. "|" .. 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. --]] local function getSeasonType(shortDisambiguation) local seasonType = string.find(shortDisambiguation , "series") if (seasonType) then seasonType = "series" else seasonType = "season" end return seasonType 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: -- <showName> (<seasonType> <seasonNumber>) Example: Lost (season 2). -- <showName> (<country> <seasonType> <seasonNumber>) Example: The Office (American season 2). Example: X Factor (British series 2). -- <showName> (<country> <seasonType>) Example: Big Brother 2 (American season). -- <showName> (<year> TV series, <seasonType> <seasonNumber>) Example: Teenage Mutant Ninja Turtles (1987 TV series, season 2) -- <showName> (<country> TV series, <seasonType> <seasonNumber>) 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 get the infobox header text. Currently set to retrieve it as follows: title (season/series #). --]] function p.getInfoboxHeader(frame) local title = getTitle(frame) local showName = getShowName(title) local disambiguation = getDisambiguation(title) local header = "" local seasonNumber = "" if (disambiguation) then local shortDisambiguation = getShortDisambiguation(disambiguation) local seasonType = getSeasonType(shortDisambiguation) seasonNumber = getCurrentSeasonNumberFromDisambiguation(shortDisambiguation) header = "''" .. showName .. "'' (" .. seasonType .. " " .. seasonNumber .. ")" end if (seasonNumber == "") then header = "''" .. showName .. "''" end return header end return p