![]() |
مسابقه سال اسلامیکال |
همزمان با آغاز ماه رمضان، مسابقه سال اسلامیکال با هدف معرفی اسلامیکال و توسعه مقالات در زمینه اسلامی آغاز شدهاست. علاقهمندان به شرکت در این مسابقه میتوانند تا پایان ماه رمضان ۱۴۴۶ قمری برای آن نامنویسی کنند. فهرستی از مقالات پیشنهادی جهت ایجاد در اینجا وجود دارد |
پودمان:Television infoboxes disambiguation check
پرش به ناوبری
پرش به جستجو
توضیحات این پودمان میتواند در پودمان:Television infoboxes disambiguation check/توضیحات قرار گیرد.
local libraryUtil = require('libraryUtil')
--=============================================================--
-- DisambiguationPattern class.
local function DisambiguationPattern(o)
local DisambiguationPattern = o or {pattern = "", type = ""}
local checkSelf = libraryUtil.makeCheckSelfFunction( 'Television infoboxes disambiguation check', 'DisambiguationPattern', DisambiguationPattern, 'Television infoboxes disambiguation check object' )
return DisambiguationPattern
end
--=============================================================--
-- Constants.
local DAB_VALID = {
[true] = "valid",
[false] = "invalid"
}
local CATEGORY_INCORRECT = "[[Category:Television articles with incorrect naming style]]"
local validationTypeList = {
["VALIDATION_TYPE_YEAR_COUNTRY"] = 1,
["VALIDATION_TYPE_YEAR"] = 2,
["VALIDATION_TYPE_COUNTRY"] = 3,
["VALIDATION_TYPE_YEAR_SEASON_NUMBER"] = 4,
["VALIDATION_TYPE_COUNTRY_SEASON_NUMBER"] = 5,
["VALIDATION_TYPE_SEASON_NUMBER"] = 6,
["VALIDATION_TYPE_COUNTRY_SEASON"] = 7,
["VALIDATION_TYPE_YEAR_COUNTRY_SEASON_NUMBER"] = 8
}
local debugMessageList = {
["DEBUG_EMPTY_TITLE"] = "Debug: Error: Empty title.",
["DEBUG_NO_DAB"] = "Debug: No disambiguation.",
["DEBUG_TITLE_ON_EXCEPTION"] = "Debug: Title on exception list.",
["DEBUG_VALID_FORMAT"] = "Debug: Using a valid format.",
["DEBUG_NOT_VALID_FORMAT"] = "Debug: Not a valid format.",
["DEBUG_YEAR_COUNTRY"] = "Debug: Using a valid format with an extended Year and Country - {}.",
["DEBUG_YEAR"] = "Debug: Using a valid format with an extended Year - {}.",
["DEBUG_COUNTRY"] = "Debug: Using a valid format with an extended Country - {}.",
["DEBUG_INCORRECT_STYLE"] = "Debug: Using a valid format but using an incorrect extended style.",
["DEBUG_INCORRECT_INFOBOX"] = "Debug: Using incorrect infobox - {}.",
["DEBUG_YEAR_SEASON_NUMBER"] = "Debug: Using a valid format with an extended Year and Season number - {}.",
["DEBUG_COUNTRY_SEASON_NUMBER"] = "Debug: Using a valid format with an extended Country and Season number - {}.",
["DEBUG_SEASON_NUMBER"] = "Debug: Using a valid format with a Season number - {}.",
["DEBUG_COUNTRY_SEASON"] = "Debug: Using a valid format with a Country and the word Season - {}.",
["DEBUG_YEAR_COUNTRY_SEASON_NUMBER"] = "Debug: Using a valid format with an extended Year, Country and Season number - {}."
}
-- Local function which checks if both booleans are true or not.
local function validateTwoParameters(isValid1, isValid2)
if (isValid1 and isValid2) then
return true
else
return false
end
end
-- Validate that the season number entered is a valid number -
-- that it does not start with a leading zero (0).
local function validateSeasonNumber(seasonNumber)
if (tonumber(string.sub(seasonNumber, 1, 1)) == 0) then
return false
else
return true
end
end
-- Validate that the year entered is a valid year.
local function validateYear(year)
if (string.len(year) == 4) then
return true
else
return false
end
end
-- Validate that the text entered is a supported country adjective.
local function validateCountryAdjective(adjective)
local data = mw.loadData('Module:Country adjective')
-- Search for a country corresponding to the given text.
if (data.getCountryFromAdj[adjective]) then
return true
else
return false
end
end
-- Checks pages using by validating the disambiguation patterns.
local function validatePatterns(disambiguation, disambiguationPatternList)
local year = ""
local adjective = ""
local seasonNumber = ""
local isYearValid
local isAdjectiveValid
local isSeasonNumberValid
for i, v in ipairs(disambiguationPatternList) do
local currentDisambiguationPattern = disambiguationPatternList[i]
if (disambiguation:match(currentDisambiguationPattern.pattern)) then
-- Year and Country styles: "1999 American TV series"
if (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_YEAR_COUNTRY"]) then
year, adjective = disambiguation:match(currentDisambiguationPattern.pattern)
isYearValid = validateYear(year)
isAdjectiveValid = validateCountryAdjective(adjective)
local isValid = validateTwoParameters(isYearValid, isAdjectiveValid)
return isValid, debugMessageList["DEBUG_YEAR_COUNTRY"]:gsub("{}", DAB_VALID[isValid])
-- Year styles: "1999 TV series"
elseif (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_YEAR"]) then
year = disambiguation
isYearValid = validateYear(year)
return isYearValid, debugMessageList["DEBUG_YEAR"]:gsub("{}", DAB_VALID[isYearValid])
-- Country styles: "American TV series"
elseif (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_COUNTRY"]) then
adjective = disambiguation
isAdjectiveValid = validateCountryAdjective(adjective)
return isAdjectiveValid, debugMessageList["DEBUG_COUNTRY"]:gsub("{}", DAB_VALID[isAdjectiveValid])
-- Year and Season number styles: "1999 TV series, season 1"
elseif (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_YEAR_SEASON_NUMBER"]) then
year, seasonNumber = disambiguation:match(currentDisambiguationPattern.pattern)
isYearValid = validateYear(year)
isSeasonNumberValid = validateSeasonNumber(seasonNumber)
local isValid = validateTwoParameters(isYearValid, isSeasonNumberValid)
return isValid, debugMessageList["DEBUG_YEAR_SEASON_NUMBER"]:gsub("{}", DAB_VALID[isValid])
-- Country and Season number styles: "American season 1" and "American TV series, season 1"
elseif (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_COUNTRY_SEASON_NUMBER"]) then
adjective, seasonNumber = disambiguation:match(currentDisambiguationPattern.pattern)
isAdjectiveValid = validateCountryAdjective(mw.text.trim(adjective))
isSeasonNumberValid = validateSeasonNumber(seasonNumber)
local isValid = validateTwoParameters(isAdjectiveValid, isSeasonNumberValid)
return isValid, debugMessageList["DEBUG_COUNTRY_SEASON_NUMBER"]:gsub("{}", DAB_VALID[isValid])
-- Country and the word season: "American season"
elseif (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_COUNTRY_SEASON"]) then
adjective = disambiguation:match(currentDisambiguationPattern.pattern)
isAdjectiveValid = validateCountryAdjective(mw.text.trim(adjective))
return isAdjectiveValid, debugMessageList["DEBUG_COUNTRY_SEASON"]:gsub("{}", DAB_VALID[isAdjectiveValid])
--Season number styles: "season 1"
elseif (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_SEASON_NUMBER"]) then
seasonNumber = disambiguation:match(currentDisambiguationPattern.pattern)
isSeasonNumberValid = validateSeasonNumber(seasonNumber)
return isSeasonNumberValid, debugMessageList["DEBUG_SEASON_NUMBER"]:gsub("{}", DAB_VALID[isSeasonNumberValid])
-- Year, Country and Season number styles: "Gladiators (2008 British TV series, series 2)"
elseif (currentDisambiguationPattern.type == validationTypeList["VALIDATION_TYPE_YEAR_COUNTRY_SEASON_NUMBER"]) then
year, adjective, seasonNumber = disambiguation:match(currentDisambiguationPattern.pattern)
isYearValid = validateYear(year)
isAdjectiveValid = validateCountryAdjective(mw.text.trim(adjective))
isSeasonNumberValid = validateSeasonNumber(seasonNumber)
local isValid = validateTwoParameters(isYearValid, isAdjectiveValid)
isValid = validateTwoParameters(isValid, isSeasonNumberValid)
return isValid, debugMessageList["DEBUG_YEAR_COUNTRY_SEASON_NUMBER"]:gsub("{}", DAB_VALID[isValid])
-- Not a valid supported style.
else
-- Do nothing.
end
else
-- Do nothing.
end
end
return false, debugMessageList["DEBUG_INCORRECT_STYLE"]
end
-- Validate that the disambiguation type is one of the supported types.
local function validateDisambiguationType(disambiguation, validDisambiguationTypeList)
local extendedDisambiguation
local count = 0
for i, v in ipairs(validDisambiguationTypeList) do
extendedDisambiguation, count = disambiguation:gsub(v, '')
extendedDisambiguation = mw.text.trim(extendedDisambiguation)
if (count ~= 0) then
-- Disambiguation was a valid type; Exit loop.
break
end
end
count = count ~= 0
return count, extendedDisambiguation
end
-- Validate that the complete disambiguation is using a supported style.
local function validateDisambiguation(invoker, disambiguation, validDisambiguationTypeList, validDisambiguationPatternList)
-- Check if the list is empty.
if (table.getn(validDisambiguationTypeList) ~= 0) then
local isDisambiguationValid, extendedDisambiguation = validateDisambiguationType(disambiguation, validDisambiguationTypeList)
-- Exit module if the disambiguation type is not a supported style.
if (not isDisambiguationValid) then
return false, debugMessageList["DEBUG_NOT_VALID_FORMAT"]
end
-- Check if there is no extended disambiguation.
if (extendedDisambiguation == '') then
return true, debugMessageList["DEBUG_VALID_FORMAT"]
end
-- A bit of hack so I won't need to refactor a ton of code.
if (invoker ~= "infobox television season") then
disambiguation = extendedDisambiguation
end
end
return validatePatterns(disambiguation, validDisambiguationPatternList)
end
-- Check if the page is using disambiguation style that belongs to a different infobox.
local function isPageUsingIncorrectInfobox(disambiguation, otherInfoboxList)
for k, v in pairs(otherInfoboxList) do
if (string.match(disambiguation, k)) then
return true, v, debugMessageList["DEBUG_INCORRECT_INFOBOX"]:gsub("{}", k)
end
end
return false
end
-- Validate that the title has brackets that are part of the title and not part of disambiguation.
local function isOnExceptionList(title, exceptionList)
for _, v in ipairs(exceptionList) do
if (v == title) then
return true
elseif (string.match(title, v)) then
return true
end
end
return false
end
-- Get the disambiguation text and make sure that if the title has more than 1 pair of brackets, it returns the last one.
local function getDisambiguation(title)
local match = require("Module:String")._match
return match(title, "%s%((.-)%)", 1, -1, false, "")
-- return (string.match (title, '%s*%b()$') or ''):gsub('[%(%)]', '')
end
-- Validate that arg is not nill and not empty.
local function isEmpty(arg)
if (not arg or arg == "") then
return true
else
return false
end
end
-- Returns two objects:
--- The first is either an empty string or a tracking category which will appear when using the live version.
--- The second is a debug string which will appear when using /testcases.
local function main(title, invoker, validDisambiguationTypeList, validDisambiguationPatternList, exceptionList, otherInfoboxList, invalidTitleStyleList)
-- Exit module if the parameter has no value.
if (isEmpty(title)) then
return "", debugMessageList["DEBUG_EMPTY_TITLE"]
end
-- Exit module if the title has brackets that are part of the title (not disambiguation).
if (isOnExceptionList(title, exceptionList)) then
return "", debugMessageList["DEBUG_TITLE_ON_EXCEPTION"]
end
if (invoker == "infobox television season") then
if (#invalidTitleStyleList ~= 0) then
for i = 1, #invalidTitleStyleList do
if (string.find(title, invalidTitleStyleList[i])) then
return CATEGORY_INCORRECT, debugMessageList["DEBUG_NOT_VALID_FORMAT"]
end
end
end
end
-- Get the disambiguation.
local disambiguation = getDisambiguation(title)
-- Exit module if the title has no disambiguation.
if (isEmpty(disambiguation)) then
return "", debugMessageList["DEBUG_NO_DAB"]
end
-- Exit module if the disambiguation belongs to a different infobox.
local isValid, category, debugString = isPageUsingIncorrectInfobox(disambiguation, otherInfoboxList)
if (isValid) then
return category, debugString
end
-- Check if the disambiguation is valid.
isValid, debugString = validateDisambiguation(invoker, disambiguation, validDisambiguationTypeList, validDisambiguationPatternList)
-- Check if the disambiguation is not valid and add category.
if (not isValid) then
category = CATEGORY_INCORRECT
end
return category, debugString
end
return {
main = main,
DisambiguationPattern = DisambiguationPattern
}