Modul:Infobox television season name

Revisi sejak 6 September 2019 15.07 oleh Argo Carpathians (bicara | kontrib) (Cleanup)

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

local p = {}

--[[
Local function which is used to create an pipped article link.
--]]
local function createArticleTitleWithPipedLink(article)
	if (pipedLink == nil or pipedLink == "") then
		return ""
	else
		return "[[" .. article .. "|" .. pipedLink .. "]]"
	end
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 , "seri")
	if (seasonType) then
		seasonType = "seri"
	else
		seasonType = "musim"
	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+ seri TV, ", "")
end

--[[
Local helper function which is used to get the disambiguation from the title.
--]]
local function getDisambiguation(title)
	return match(title, "%s%((.-)%)", 1, -1, false, "")
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 is used to create a TV season 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)
--]]
local function getArticleTitle(title, prevOrNextSeasonNumber)
	local showName = mw.ustring.gsub(title, "%s+%b()$", "")
	local disambiguation = getDisambiguation(title)
	local year = match(disambiguation, "(%d+ seri TV, )", 1, -1, false, "")
	local shortDisambiguation = getShortDisambiguation(disambiguation)
	local country = match(shortDisambiguation, "(([%s%w]+)%s+)[season series]", 1, -1, false, "")
	local seasonType  = getSeasonType(shortDisambiguation)

	local realitySeriesStyle = false
	local showNameModified
	local seasonNumber = match(shortDisambiguation , "%d+", 1, -1, false, "")
	if (seasonNumber == "") then
		if (string.match(showName , "%s+(%d+)")) then
			_, _, showNameModified, seasonNumber = string.find(showName, "(.*)%s+(%d+)")
			realitySeriesStyle = true
		else
			return "" -- Not a valid next/prev season link
		end
	end
	
	if (tonumber(seasonNumber) == nil) then
		return ""
	else
		seasonNumber = seasonNumber + prevOrNextSeasonNumber
		pipedLink = seasonType:gsub("^%l", string.upper) .. " " .. seasonNumber
		
		if (realitySeriesStyle) then
			return showNameModified .. " " .. seasonNumber .. " (" .. country .. seasonType .. ")"
		else
			return showName .. " (" .. year .. country .. seasonType .. " " .. seasonNumber .. ")"
		end
		
		return 
	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 = createArticleTitleHelper(frame, number)
	return createArticleTitleWithPipedLink(articleTitle)
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)
	local shortDisambiguation = getShortDisambiguation(disambiguation)
	return getSeasonType(shortDisambiguation)
end

return p