<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://replication-ops.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_television</id>
	<title>Module:Infobox television - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://replication-ops.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_television"/>
	<link rel="alternate" type="text/html" href="https://replication-ops.com/index.php?title=Module:Infobox_television&amp;action=history"/>
	<updated>2026-04-17T20:55:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://replication-ops.com/index.php?title=Module:Infobox_television&amp;diff=6529&amp;oldid=prev</id>
		<title>Caseytube: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://replication-ops.com/index.php?title=Module:Infobox_television&amp;diff=6529&amp;oldid=prev"/>
		<updated>2024-12-06T08:47:55Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:47, 6 December 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Caseytube</name></author>
	</entry>
	<entry>
		<id>https://replication-ops.com/index.php?title=Module:Infobox_television&amp;diff=6528&amp;oldid=prev</id>
		<title>Replication_Ops&gt;Gonnym: commenting out language checking code</title>
		<link rel="alternate" type="text/html" href="https://replication-ops.com/index.php?title=Module:Infobox_television&amp;diff=6528&amp;oldid=prev"/>
		<updated>2024-08-19T06:21:08Z</updated>

		<summary type="html">&lt;p&gt;commenting out language checking code&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;quot;strict&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
--- @module&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local maintenance_categories = {&lt;br /&gt;
	alt_name = &amp;quot;[[Category:Pages using infobox television with incorrectly formatted values|%s]]&amp;quot;,&lt;br /&gt;
	dates_incorrectly_formatted = &amp;quot;[[Category:Pages using infobox television with nonstandard dates]]&amp;quot;,&lt;br /&gt;
	dates_missing = &amp;quot;[[Category:Pages using infobox television with missing dates]]&amp;quot;,&lt;br /&gt;
	flag_icon = &amp;quot;[[Category:Pages using infobox television with flag icon]]&amp;quot;,&lt;br /&gt;
	image_values_without_an_image = &amp;quot;[[Category:Pages using infobox television with image-related values without an image]]&amp;quot;,&lt;br /&gt;
	incorrectly_formatted = &amp;quot;[[Category:Pages using infobox television with incorrectly formatted values|%s]]&amp;quot;,&lt;br /&gt;
	manual_display_title = &amp;quot;[[Category:Pages using infobox television with unnecessary manual displaytitle]]&amp;quot;,&lt;br /&gt;
	manual_display_title_temp_tracking = &amp;quot;[[Category:Pages using infobox television with manual displaytitle]]&amp;quot;,&lt;br /&gt;
	non_matching_title = &amp;quot;[[Category:Pages using infobox television with non-matching title]]&amp;quot;,&lt;br /&gt;
	unnecessary_title_parameter = &amp;quot;[[Category:Pages using infobox television with unnecessary name parameter]]&amp;quot;,&lt;br /&gt;
	unlinked_values = &amp;quot;[[Category:Pages using infobox television with unlinked values|%s]]&amp;quot;,&lt;br /&gt;
	temp = &amp;quot;[[Category:Temp infobox television tracking category|%s]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local number_of_network_sets = 7&lt;br /&gt;
&lt;br /&gt;
--- Returns a table consisting of the title&amp;#039;s title parts.&lt;br /&gt;
---&lt;br /&gt;
--- The return table&amp;#039;s properties:&lt;br /&gt;
--- - title - The title.&lt;br /&gt;
--- - disambiguation - the disambiguation text without parentheses.&lt;br /&gt;
---&lt;br /&gt;
--- Note: could potentially be moved to an outside module for other template and module uses.&lt;br /&gt;
---&lt;br /&gt;
--- @param text string&lt;br /&gt;
--- @return table&amp;lt;string, string | nil&amp;gt;&lt;br /&gt;
local function get_title_parts(text)&lt;br /&gt;
	local title, disambiguation = string.match(text, &amp;quot;^(.+) (%b())$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if not title or type(title) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		title = text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	---@type table&amp;lt;string, string | nil&amp;gt;&lt;br /&gt;
	local title_parts = {title = --[[---@not number | nil]] title, disambiguation = nil}&lt;br /&gt;
&lt;br /&gt;
	if not disambiguation or type(disambiguation) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		return title_parts&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove outside parentheses from names which use parentheses as part of the name such as &amp;quot;episode (Randall and Hopkirk (Deceased))&amp;quot;.&lt;br /&gt;
	disambiguation = string.sub(--[[---@not number | nil]] disambiguation, 2, -2)&lt;br /&gt;
	title_parts.disambiguation = --[[---@not number]] disambiguation&lt;br /&gt;
	return title_parts&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the italic_title value is not &amp;quot;no&amp;quot;.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |italic_title=&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_italic_title_valid_value(args)&lt;br /&gt;
	if args.italic_title and args.italic_title ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
		return string.format(maintenance_categories.incorrectly_formatted, &amp;quot;italic_title&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the start_date value is set to a future date.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |first_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |released[1-number_of_network_sets]=&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_start_date_in_the_future(start_date)&lt;br /&gt;
	-- Extract the date from the start_date.&lt;br /&gt;
	local date_pattern = &amp;quot;.*&amp;lt;span[^&amp;gt;]*&amp;gt;(.-)&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	local extracted_date = start_date:match(date_pattern)&lt;br /&gt;
&lt;br /&gt;
	-- Parse the date components&lt;br /&gt;
	local year, month, day = extracted_date:match(&amp;quot;(%d+)-(%d+)-(%d+)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Create a table with the parsed date components&lt;br /&gt;
	local date_table = {&lt;br /&gt;
	    year = tonumber(year) or 0,&lt;br /&gt;
	    month = tonumber(month) or 0,&lt;br /&gt;
	    day = tonumber(day) or 0,&lt;br /&gt;
	    hour = 0,	-- Assuming 00:00:00 for simplicity&lt;br /&gt;
	    min = 0,&lt;br /&gt;
	    sec = 0&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- Convert the date table to a Unix timestamp&lt;br /&gt;
	local start_date_timestamp = os.time(date_table)&lt;br /&gt;
&lt;br /&gt;
	-- Get the current date components.&lt;br /&gt;
	local current_date = os.date(&amp;quot;*t&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Set the time components to zero.&lt;br /&gt;
	current_date.hour = 0&lt;br /&gt;
	current_date.min = 0&lt;br /&gt;
	current_date.sec = 0&lt;br /&gt;
&lt;br /&gt;
	-- Convert the date components into a timestamp.&lt;br /&gt;
	local current_timestamp = os.time(current_date)&lt;br /&gt;
&lt;br /&gt;
	--local extracted_date_timestamp = os.time(extracted_date)&lt;br /&gt;
&lt;br /&gt;
	-- The infobox does not allow for future dates.&lt;br /&gt;
	mw.log(&amp;quot;current_timestamp: &amp;quot; .. current_timestamp)&lt;br /&gt;
	mw.log(&amp;quot;start_date_timestamp: &amp;quot; .. extracted_date)&lt;br /&gt;
	if current_timestamp &amp;lt; start_date_timestamp then&lt;br /&gt;
		return maintenance_categories.dates_incorrectly_formatted&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the dates are not formatted correctly with&lt;br /&gt;
--- {{Start date}} and {{End date}} templates.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |first_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |released[1-number_of_network_sets]=&lt;br /&gt;
--- - |last_aired[1-number_of_network_sets]=&lt;br /&gt;
---&lt;br /&gt;
--- Note: all_tests is meant only for /testcases testing.&lt;br /&gt;
---&lt;br /&gt;
--- @param all_tests string Testing conditional value.&lt;br /&gt;
--- @param released string The start date value.&lt;br /&gt;
--- @param first_aired string The start date value.&lt;br /&gt;
--- @param last_aired string The end date value.&lt;br /&gt;
--- @return string&lt;br /&gt;
local function are_dates_formatted_correctly(all_tests, released, first_aired, last_aired)&lt;br /&gt;
	-- To keep /testcases clean, this is set so only what is test is shown.&lt;br /&gt;
	if all_tests == &amp;quot;no&amp;quot; then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Config parameters&lt;br /&gt;
	local first_aired_future = &amp;quot;Upcoming&amp;quot;&lt;br /&gt;
	local last_aired_current = &amp;quot;present&amp;quot;&lt;br /&gt;
	local start_date_class = &amp;quot;itvstart&amp;quot;&lt;br /&gt;
	local end_date_class = &amp;quot;itvend&amp;quot;&lt;br /&gt;
	local film_date_class = &amp;quot;film%-date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local start_date = released or first_aired&lt;br /&gt;
&lt;br /&gt;
	-- A start date should always be set.&lt;br /&gt;
	if not start_date then&lt;br /&gt;
		return maintenance_categories.dates_missing&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Validate the start date is formmated using {{Start date}} and not any other template, including {{Film date}}, or uses the word &amp;quot;Upcoming&amp;quot;.&lt;br /&gt;
	if start_date and (string.find(start_date, film_date_class) or not string.find(start_date, start_date_class) and start_date ~= first_aired_future) then&lt;br /&gt;
		return maintenance_categories.dates_incorrectly_formatted&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- An end date should always be set if the show or film wasn&amp;#039;t released all at once.&lt;br /&gt;
	if first_aired and first_aired ~= first_aired_future and not last_aired then&lt;br /&gt;
		return maintenance_categories.dates_missing&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Validate the end date is formmated using {{End date}} and not any other template, or uses the word &amp;quot;present&amp;quot;.&lt;br /&gt;
	if last_aired and (not string.find(last_aired, end_date_class) and last_aired ~= last_aired_current) then&lt;br /&gt;
		return maintenance_categories.dates_incorrectly_formatted&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Only one date should be used per field.&lt;br /&gt;
	if (start_date and select(2, string.gsub(start_date, start_date_class, &amp;quot;&amp;quot;)) &amp;gt; 1) or (last_aired and select(2, string.gsub(last_aired, end_date_class, &amp;quot;&amp;quot;)) &amp;gt; 1) then&lt;br /&gt;
		return maintenance_categories.dates_incorrectly_formatted&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Check if start date is set to a future date.&lt;br /&gt;
	if start_date ~= first_aired_future then&lt;br /&gt;
		return is_start_date_in_the_future(start_date)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if exclusive parameter sets are used.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |image_alt= and |alt=&lt;br /&gt;
--- - |image_size= and |image_upright= &lt;br /&gt;
--- - |based_on= and |inspired_by=&lt;br /&gt;
--- - |screenplay= and |teleplay=&lt;br /&gt;
--- - |presenter= and |host= &lt;br /&gt;
--- - |narrator=, |narrated= and |announcer=&lt;br /&gt;
--- - |theme_music_composer= and |music=&lt;br /&gt;
--- - |open_theme= and |opentheme=&lt;br /&gt;
--- - |end_theme= and |endtheme=&lt;br /&gt;
--- - |released[1-number_of_network_sets]= and |first_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |released[1-number_of_network_sets]= and |last_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |network[1-number_of_network_sets]= and |channel[1-number_of_network_sets]=&lt;br /&gt;
---&lt;br /&gt;
--- The function currently checks if the network and channel parameters both have values.&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function _are_exclusive_parameter_sets_used(args, parameters)&lt;br /&gt;
	for _, set in ipairs(parameters) do&lt;br /&gt;
		if (args[set[1]] and args[set[2]]) or (args[set[1]] and args[set[3]]) or (args[set[2]] and args[set[3]]) then&lt;br /&gt;
			return string.format(maintenance_categories.incorrectly_formatted, &amp;quot;-duplicate&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if exclusive parameter sets are used.&lt;br /&gt;
--- Create a set parameters to check.&lt;br /&gt;
--- Does not include release information related parameters which are sent from&lt;br /&gt;
--- a different function due to their numbered variations.&lt;br /&gt;
--- See _are_exclusive_parameter_sets_used() for more details.&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function are_exclusive_parameter_sets_used(args)&lt;br /&gt;
	local parameters = {&lt;br /&gt;
		{&amp;quot;image_alt&amp;quot;, &amp;quot;alt&amp;quot;},&lt;br /&gt;
		{&amp;quot;image_size&amp;quot;, &amp;quot;image_upright&amp;quot;},&lt;br /&gt;
		{&amp;quot;based_on&amp;quot;, &amp;quot;inspired_by&amp;quot;},&lt;br /&gt;
		{&amp;quot;screenplay&amp;quot;, &amp;quot;teleplay&amp;quot;},&lt;br /&gt;
		{&amp;quot;presenter&amp;quot;, &amp;quot;host&amp;quot;},&lt;br /&gt;
		{&amp;quot;narrator&amp;quot;, &amp;quot;narrated&amp;quot;, &amp;quot;announcer&amp;quot;},&lt;br /&gt;
		{&amp;quot;theme_music_composer&amp;quot;, &amp;quot;music&amp;quot;},&lt;br /&gt;
		{&amp;quot;open_theme&amp;quot;, &amp;quot;opentheme&amp;quot;},&lt;br /&gt;
		{&amp;quot;end_theme&amp;quot;, &amp;quot;endtheme&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return _are_exclusive_parameter_sets_used(args, parameters)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the values are unlinked.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |network[1-number_of_network_sets]=&lt;br /&gt;
--- - |channel[1-number_of_network_sets]=&lt;br /&gt;
---&lt;br /&gt;
--- The function currently checks if a value is unlinked.&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function are_values_unlinked(args)&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		-- Check whether the values are linked.&lt;br /&gt;
		if value and not string.find(value, &amp;quot;%[%[.*%]%]&amp;quot;) then&lt;br /&gt;
			return string.format(maintenance_categories.unlinked_values, key)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the dates are not formatted correctly&lt;br /&gt;
--- and using &amp;quot;Original&amp;quot;, &amp;quot;Revival&amp;quot; or italics to denote a split in the date range.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |first_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |released[1-number_of_network_sets]=&lt;br /&gt;
--- - |last_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |network[1-number_of_network_sets]=&lt;br /&gt;
--- - |channel[1-number_of_network_sets]=&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function does_release_information_have_extraneous_text(args)&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if string.find(string.lower(v), &amp;quot;original&amp;quot;) and not string.find(string.lower(v), &amp;quot;aboriginal&amp;quot;)	or &lt;br /&gt;
			string.find(string.lower(v), &amp;quot;revival&amp;quot;) or &lt;br /&gt;
			string.find(v, &amp;quot;&amp;#039;&amp;#039;&amp;quot;) then&lt;br /&gt;
			return string.format(maintenance_categories.incorrectly_formatted, k)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the release information:&lt;br /&gt;
---- Is not formatted correctly&lt;br /&gt;
---- Has extraneous text&lt;br /&gt;
---- Dates don&amp;#039;t use correct mark up&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |first_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |released[1-number_of_network_sets]=&lt;br /&gt;
--- - |last_aired[1-number_of_network_sets]=&lt;br /&gt;
--- - |network[1-number_of_network_sets]=&lt;br /&gt;
--- - |channel[1-number_of_network_sets]=&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_release_information_formatted_correctly(args)&lt;br /&gt;
	local release_information = {&amp;quot;first_aired&amp;quot;, &amp;quot;released&amp;quot;, &amp;quot;last_aired&amp;quot;, &amp;quot;network&amp;quot;, &amp;quot;channel&amp;quot;}&lt;br /&gt;
	local categories = {}&lt;br /&gt;
		&lt;br /&gt;
	for i = 1, number_of_network_sets do&lt;br /&gt;
		local num = &amp;quot;&amp;quot;&lt;br /&gt;
		if i &amp;gt; 1 then&lt;br /&gt;
			num = i&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local numbered_args = {}&lt;br /&gt;
		for _, v in pairs(release_information) do&lt;br /&gt;
			numbered_args[v .. num] = args[v .. num]&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- If current table is empty, break current cycle.	&lt;br /&gt;
		if next(numbered_args) then&lt;br /&gt;
			table.insert(categories, does_release_information_have_extraneous_text(numbered_args))&lt;br /&gt;
			table.insert(categories, are_values_unlinked({network = args[&amp;quot;network&amp;quot; .. num], channel = args[&amp;quot;channel&amp;quot; .. num]}))&lt;br /&gt;
			table.insert(categories, _are_exclusive_parameter_sets_used(args, {{&amp;quot;network&amp;quot; .. num, &amp;quot;channel&amp;quot; .. num}, {&amp;quot;released&amp;quot; .. num, &amp;quot;first_aired&amp;quot; .. num}, {&amp;quot;released&amp;quot; .. num, &amp;quot;last_aired&amp;quot; .. num}}))&lt;br /&gt;
			table.insert(categories, are_dates_formatted_correctly(args.all_tests, args[&amp;quot;released&amp;quot; .. num], args[&amp;quot;first_aired&amp;quot; .. num], args[&amp;quot;last_aired&amp;quot; .. num]))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return categories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if a {{Italic title}} or {{DISPLAYTITLE}} template is used.&lt;br /&gt;
--- Checks also for the following {{Italic title}} redirects:&lt;br /&gt;
---- Italic&lt;br /&gt;
---- Italics&lt;br /&gt;
---- Italictitle&lt;br /&gt;
---- Italics title&lt;br /&gt;
---&lt;br /&gt;
--- Testing parameters:&lt;br /&gt;
--- - |page_test= - a real Wikipedia page to read the content of the page.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |italic_title=&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function has_display_title(args)&lt;br /&gt;
	--TODO: when testing below is done uncomment code&lt;br /&gt;
	--if args.italic_title then&lt;br /&gt;
	--	return &amp;quot;&amp;quot;&lt;br /&gt;
	--end&lt;br /&gt;
&lt;br /&gt;
	local article&lt;br /&gt;
	if args.page_test then&lt;br /&gt;
		article = mw.title.new(args.page_test)&lt;br /&gt;
	else&lt;br /&gt;
		article = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local page_text = article:getContent()&lt;br /&gt;
	if not page_text then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (string.find(page_text, &amp;quot;{{[Ii]talics?%s?title}}&amp;quot;) or string.find(page_text, &amp;quot;{{[Ii]talics?}}&amp;quot;)) and not string.match(page_text, &amp;quot;{{[Ii]talic title|all=yes}}&amp;quot;)then&lt;br /&gt;
		return maintenance_categories.manual_display_title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local display_title = string.match(page_text, &amp;quot;{{DISPLAYTITLE:(.*)}}&amp;quot;)&lt;br /&gt;
	local article_title = article.text&lt;br /&gt;
	--TODO: currently does not work&lt;br /&gt;
	--local display_title_no_namespace = string.gsub(display_title, article.nsText .. &amp;quot;:&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	--local display_title_no_italics = string.sub(display_title_no_namespace, 3, string.len(display_title_no_namespace) - 2)&lt;br /&gt;
	if display_title then&lt;br /&gt;
		-- if article_title == display_title or article_title == display_title_no_italics then&lt;br /&gt;
		if article_title == display_title or article_title == string.sub(display_title, 3, string.len(display_title) - 2) then&lt;br /&gt;
			return maintenance_categories.manual_display_title&lt;br /&gt;
		elseif string.find(display_title, &amp;quot;&amp;lt;sub&amp;gt;&amp;quot;) or string.find(display_title, &amp;quot;&amp;lt;sup&amp;gt;&amp;quot;) then&lt;br /&gt;
			-- TODO: This is valid. Will remove when done with cleanup.&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			-- TODO: remove when done checking results.&lt;br /&gt;
			return maintenance_categories.manual_display_title_temp_tracking&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if a flag icon is used.&lt;br /&gt;
---&lt;br /&gt;
--- All the infobox values are checked.&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function has_flag_icon(args)&lt;br /&gt;
	for _, v in pairs(args) do&lt;br /&gt;
		if string.find(v, &amp;quot;flagicon&amp;quot;) then&lt;br /&gt;
			return maintenance_categories.flag_icon&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if num_episodes uses:&lt;br /&gt;
--- - &amp;quot;as of&amp;quot; as text&lt;br /&gt;
--- - A date template&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |num_episodes=&lt;br /&gt;
---&lt;br /&gt;
--- @param num_episodes string&lt;br /&gt;
--- @return string&lt;br /&gt;
local function does_num_episodes_have_extraneous_text(num_episodes)&lt;br /&gt;
	if not num_episodes then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if string.find(string.lower(num_episodes), &amp;quot;as of&amp;quot;)&lt;br /&gt;
	or string.find(num_episodes, &amp;quot;dtstart&amp;quot;)&lt;br /&gt;
	or string.find(num_episodes, &amp;quot;episode%-counter&amp;quot;) then&lt;br /&gt;
		return	string.format(maintenance_categories.incorrectly_formatted, &amp;quot;num_episodes&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if |based_on uses a generic word instead&lt;br /&gt;
--- of the title of the original work:&lt;br /&gt;
--- &amp;quot;book&amp;quot;&lt;br /&gt;
--- &amp;quot;novel&amp;quot;&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |based_on=&lt;br /&gt;
---&lt;br /&gt;
--- @param num_episodes string&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_based_on_used_correctly(based_on)&lt;br /&gt;
	if not based_on then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local generic_titles = {&lt;br /&gt;
		&amp;quot;book&amp;quot;,&lt;br /&gt;
		&amp;quot;novel&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- Remove content enclosed by double single quotes (&amp;#039;&amp;#039;text&amp;#039;&amp;#039;)&lt;br /&gt;
	local stripped_text = based_on:gsub(&amp;quot;&amp;#039;&amp;#039;[^&amp;#039;]*&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    -- Remove content enclosed by double quotes (&amp;quot;text&amp;quot;)&lt;br /&gt;
    stripped_text = based_on:gsub(&amp;#039;&amp;quot;[^&amp;quot;]*&amp;quot;&amp;#039;, &amp;quot;&amp;quot;)&lt;br /&gt;
	-- Remove content enclosed by double square brackets ([[text]])&lt;br /&gt;
	stripped_text = based_on:gsub(&amp;quot;%[%[.-%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Convert to lowercase to ensure case-insensitive matching&lt;br /&gt;
	stripped_text = stripped_text:lower()&lt;br /&gt;
&lt;br /&gt;
	for _, word in pairs(generic_titles) do&lt;br /&gt;
		if string.find(stripped_text, word) then&lt;br /&gt;
			return string.format(maintenance_categories.incorrectly_formatted, &amp;quot;based_on&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Checks if a string is in the exceptions list.&lt;br /&gt;
--- &lt;br /&gt;
--- @param str string&lt;br /&gt;
--- @return boolean&lt;br /&gt;
local function is_in_credit_exceptions(str)&lt;br /&gt;
	local exceptions = {&lt;br /&gt;
		&amp;quot;Aulsondro \&amp;quot;Novelist\&amp;quot; Hamilton&amp;quot;,&lt;br /&gt;
		-- Booker can be a last name.&lt;br /&gt;
		&amp;quot;Booker&amp;quot;,&lt;br /&gt;
		&amp;quot;Jack Trevor Story&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    for _, exception in ipairs(exceptions) do&lt;br /&gt;
        if string.find(str, exception) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if a credit information entered is from the following list:&lt;br /&gt;
--- &amp;quot;assistant&amp;quot;, associate&amp;quot;, &amp;quot;co-&amp;quot;, &amp;quot;executive&amp;quot;, &amp;quot;line producer&amp;quot;, &amp;quot;on-line&amp;quot;, &amp;quot;prod%.&amp;quot;, &amp;quot;supervising&amp;quot;&lt;br /&gt;
--- &amp;quot;book&amp;quot;, &amp;quot;manuscript&amp;quot;, &amp;quot;novel&amp;quot;, &amp;quot;script&amp;quot;, &amp;quot;screenplay&amp;quot;, &amp;quot;story&amp;quot;, &amp;quot;teleplay&amp;quot;&lt;br /&gt;
--- TODO: &amp;quot;lyric&amp;quot; and &amp;quot;dialogue&amp;quot; should be either supported or removed.&lt;br /&gt;
--- These credits have their own unique parameters that should be used instead.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |director=&lt;br /&gt;
--- - |editor=&lt;br /&gt;
--- - |executive_producer=&lt;br /&gt;
--- - |producer=&lt;br /&gt;
--- - |screenplay=&lt;br /&gt;
--- - |story=&lt;br /&gt;
--- - |teleplay=&lt;br /&gt;
--- - |writer=&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_credit_used_correctly(args)&lt;br /&gt;
	local credits_list = {&lt;br /&gt;
		&amp;quot;director&amp;quot;,&lt;br /&gt;
		&amp;quot;editor&amp;quot;,&lt;br /&gt;
		&amp;quot;executive_producer&amp;quot;,&lt;br /&gt;
		&amp;quot;producer&amp;quot;,&lt;br /&gt;
		&amp;quot;screenplay&amp;quot;,&lt;br /&gt;
		&amp;quot;story&amp;quot;,&lt;br /&gt;
		&amp;quot;teleplay&amp;quot;,&lt;br /&gt;
		&amp;quot;writer&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local credits = {}&lt;br /&gt;
	for _, value in pairs(credits_list) do&lt;br /&gt;
	    credits[value] = args[value]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local invalid_credits = {&lt;br /&gt;
		&amp;quot;assistant&amp;quot;,&lt;br /&gt;
		&amp;quot;associate&amp;quot;,&lt;br /&gt;
		&amp;quot;book&amp;quot;,&lt;br /&gt;
		&amp;quot;co%-&amp;quot;,&lt;br /&gt;
		&amp;quot;executive&amp;quot;,&lt;br /&gt;
		&amp;quot;line producer&amp;quot;,&lt;br /&gt;
		&amp;quot;manuscript&amp;quot;,&lt;br /&gt;
		&amp;quot;novel&amp;quot;,&lt;br /&gt;
		&amp;quot;on%-line&amp;quot;,&lt;br /&gt;
		&amp;quot;prod%.&amp;quot;,&lt;br /&gt;
		&amp;quot;supervising&amp;quot;,&lt;br /&gt;
		&amp;quot;script&amp;quot;,&lt;br /&gt;
		&amp;quot;screenplay&amp;quot;,&lt;br /&gt;
		&amp;quot;story&amp;quot;,&lt;br /&gt;
		&amp;quot;teleplay&amp;quot;,&lt;br /&gt;
		&amp;quot;lyric&amp;quot;, -- temp&lt;br /&gt;
		&amp;quot;dialogue&amp;quot;, -- temp&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local delink = require(&amp;quot;Module:Delink&amp;quot;)._delink&lt;br /&gt;
	for key, credit in pairs(credits) do&lt;br /&gt;
		for _, invalid_credit in pairs(invalid_credits) do&lt;br /&gt;
			local pattern = &amp;quot;%f[%a]&amp;quot; .. invalid_credit&lt;br /&gt;
			credit = delink{credit}&lt;br /&gt;
			if string.find(string.lower(credit), pattern) and not is_in_credit_exceptions(credit) then&lt;br /&gt;
				if invalid_credit == &amp;quot;lyric&amp;quot; or invalid_credit == &amp;quot;dialogue&amp;quot; then&lt;br /&gt;
					return string.format(maintenance_categories.temp, invalid_credit)&lt;br /&gt;
				else&lt;br /&gt;
					return string.format(maintenance_categories.incorrectly_formatted, key)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the country information entered is from the following list:&lt;br /&gt;
--- U.S.A, USA, U.S., US, UK, U.K.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |country=&lt;br /&gt;
---&lt;br /&gt;
--- @param country string&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_country_name_valid(country)&lt;br /&gt;
	if not country then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local args = {&amp;quot;U.S&amp;quot;, &amp;quot;US&amp;quot;, &amp;quot;UK&amp;quot;, &amp;quot;U.K.&amp;quot;}&lt;br /&gt;
	for _, v in pairs(args) do&lt;br /&gt;
		if string.find(country, v) then&lt;br /&gt;
			return string.format(maintenance_categories.incorrectly_formatted, &amp;quot;country&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the values are linked or formatted.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |language=&lt;br /&gt;
---&lt;br /&gt;
--- The function currently checks if the following values are present:&lt;br /&gt;
--- - ] - links.&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function are_values_linked_or_formatted(args)&lt;br /&gt;
	local parameters = {language = args.language}&lt;br /&gt;
	for key, value in pairs(parameters) do&lt;br /&gt;
		for _, bad_value in pairs({&amp;quot;]&amp;quot;}) do&lt;br /&gt;
			if string.find(value, bad_value, 1, true) then&lt;br /&gt;
				return string.format(maintenance_categories.incorrectly_formatted, key)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Splits a string and returns a table.&lt;br /&gt;
--&lt;br /&gt;
-- @param str string&lt;br /&gt;
-- @return table&lt;br /&gt;
local function split(str)&lt;br /&gt;
	local sep = &amp;quot;\n&amp;quot;&lt;br /&gt;
	local result = {}&lt;br /&gt;
	local regex = (&amp;quot;([^%s]+)&amp;quot;):format(sep)&lt;br /&gt;
	for each in str:gmatch(regex) do&lt;br /&gt;
		table.insert(result, each)&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a string value clean from various list syntax.&lt;br /&gt;
--&lt;br /&gt;
-- @param str string&lt;br /&gt;
-- @return string&lt;br /&gt;
local function clean_list_syntax(str)&lt;br /&gt;
	str = string.gsub(str, &amp;quot;\127[^\127]*UNIQ%-%-(%a+)%-%x+%-QINU[^\127]*\127&amp;quot;, &amp;quot;&amp;quot;)				-- Remove all strip-markers.&lt;br /&gt;
	str = string.gsub(string.gsub(str, &amp;quot;%&amp;lt;%/? *div[^%&amp;gt;]*%&amp;gt;&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;%&amp;lt;%/? *span[^%&amp;gt;]*%&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)	-- Removes div and span tags.&lt;br /&gt;
	str = string.gsub(str, &amp;quot;%&amp;lt;%/? *ul[^%&amp;gt;]*%&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)		-- Remove list tags.&lt;br /&gt;
	str = string.gsub(str, &amp;quot;%&amp;lt;%/? *li[^%&amp;gt;]*%&amp;gt;&amp;quot;, &amp;quot;\n&amp;quot;)	-- Remove list tags. Replace with new line.&lt;br /&gt;
	str = string.gsub(str, &amp;quot;&amp;lt;/? *br */?&amp;gt;&amp;quot;, &amp;quot;\n&amp;quot;)		-- Replace &amp;lt;br /&amp;gt; (and variants) with new line.&lt;br /&gt;
	str = string.gsub(str, &amp;quot;\n\n&amp;quot;, &amp;quot;\n&amp;quot;)				-- Replace double new line with a single new line.&lt;br /&gt;
	str = string.gsub(str, &amp;quot;*&amp;quot;, &amp;quot;&amp;quot;)						-- Remove asterisks.&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if:&lt;br /&gt;
---- When alt_name= is a list of values, and not all entries are in italics.&lt;br /&gt;
---- When alt_name= is a single value and is in italics.&lt;br /&gt;
----- This is because the template automatically handles the italics and when also manually added,&lt;br /&gt;
----- results in 4 apostrophes which produce a bold title instead.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |alt_name=&lt;br /&gt;
---&lt;br /&gt;
--- @param alt_name string&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_alt_name_in_italics(alt_name)&lt;br /&gt;
	if not alt_name then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local detect_singular = require(&amp;quot;Module:Detect singular&amp;quot;)._main&lt;br /&gt;
	local args = {alt_name, [&amp;quot;no_and&amp;quot;] = &amp;quot;1&amp;quot;, [&amp;quot;no_comma&amp;quot;] = &amp;quot;1&amp;quot;}&lt;br /&gt;
	local is_singular = detect_singular(args)&lt;br /&gt;
	if is_singular &amp;gt; 1 then&lt;br /&gt;
		local alt_names = clean_list_syntax(alt_name)&lt;br /&gt;
		alt_names = split(alt_names)&lt;br /&gt;
		for _, name in ipairs(alt_names) do&lt;br /&gt;
			if not string.find(name, &amp;quot;&amp;#039;&amp;#039;&amp;quot;) then&lt;br /&gt;
				return string.format(maintenance_categories.alt_name, &amp;quot;alt_name&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if string.find(alt_name, &amp;quot;&amp;#039;&amp;#039;&amp;quot;) then&lt;br /&gt;
			return string.format(maintenance_categories.alt_name, &amp;quot;alt_name&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the |image= value includes the &amp;quot;File:&amp;quot;&lt;br /&gt;
--- or &amp;quot;Image:&amp;quot; prefix, or if it is a URL.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |image=&lt;br /&gt;
---&lt;br /&gt;
--- @param image string&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_image_using_incorrect_syntax(image)&lt;br /&gt;
	if not image then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local invalid_strings = {&lt;br /&gt;
		&amp;quot;file:&amp;quot;,&lt;br /&gt;
		&amp;quot;image:&amp;quot;,&lt;br /&gt;
		&amp;quot;http:&amp;quot;,&lt;br /&gt;
		&amp;quot;https:&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	image = string.lower(image)&lt;br /&gt;
	for _, invalid in ipairs(invalid_strings) do&lt;br /&gt;
		if string.find(image, invalid) then&lt;br /&gt;
			return string.format(maintenance_categories.incorrectly_formatted, &amp;quot;image&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the |image_size= value includes &amp;quot;px&amp;quot;.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |image_size=&lt;br /&gt;
---&lt;br /&gt;
--- @param image_size string&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_image_size_using_px(image_size)&lt;br /&gt;
	if image_size and string.find(image_size, &amp;quot;px&amp;quot;) then&lt;br /&gt;
		return string.format(maintenance_categories.incorrectly_formatted, &amp;quot;image_size&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if there is no image file while image auxiliary values are present.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |image=&lt;br /&gt;
--- - |image_size=&lt;br /&gt;
--- - |image_upright=&lt;br /&gt;
--- - |image_alt=&lt;br /&gt;
--- - |alt=&lt;br /&gt;
--- - |caption=&lt;br /&gt;
---&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function are_image_auxiliary_values_used_for_no_image(args)&lt;br /&gt;
	if args.image then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.image_size or args.image_upright or args.image_alt or args.alt or args.caption then&lt;br /&gt;
		return maintenance_categories.image_values_without_an_image&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the display title text used in either the {{DISPLAYTITLE}} or {{Italic title}} templates.&lt;br /&gt;
---&lt;br /&gt;
--- @param page_text string&lt;br /&gt;
--- @param article_title string&lt;br /&gt;
--- @return string | nil&lt;br /&gt;
local function get_display_title_text(page_text, article_title)&lt;br /&gt;
	if not page_text then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title_modification = string.match(page_text, &amp;quot;{{DISPLAYTITLE:(.-)}}&amp;quot;)&lt;br /&gt;
	if title_modification and type(title_modification) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		local title_parts = get_title_parts(title_modification)&lt;br /&gt;
		return string.gsub(title_parts.title, &amp;quot;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	title_modification = string.match(page_text, &amp;quot;{{[Ii]talic title|all=yes}}&amp;quot;)&lt;br /&gt;
	if title_modification and type(title_modification) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		return article_title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the title used in the {{Lowercase title}} template and an optional maintenance category.&lt;br /&gt;
---&lt;br /&gt;
--- @param page_text string&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @param article_title string&lt;br /&gt;
--- @param title_parts table&lt;br /&gt;
--- @param return_category boolean&lt;br /&gt;
--- @return string | nil&lt;br /&gt;
local function get_lowercase_template_status(page_text, args, article_title, title_parts, return_category)&lt;br /&gt;
	if not page_text then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local lowercase_template =  string.match(page_text, &amp;quot;{{[Ll]owercase title.-}}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if not lowercase_template then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local lowercase_title&lt;br /&gt;
	if string.find(lowercase_template, &amp;quot;|force=&amp;quot;) then&lt;br /&gt;
		lowercase_title = string.gsub(article_title,&amp;quot;^%u&amp;quot;, string.lower)&lt;br /&gt;
	else&lt;br /&gt;
		lowercase_title = string.gsub(title_parts.title,&amp;quot;^%u&amp;quot;, string.lower)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if return_category and args.name then&lt;br /&gt;
		if args.name == lowercase_title then&lt;br /&gt;
			return maintenance_categories.unnecessary_title_parameter&lt;br /&gt;
		else&lt;br /&gt;
			return maintenance_categories.non_matching_title&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return lowercase_title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the title used in the {{Correct title}} template and an optional maintenance category.&lt;br /&gt;
---&lt;br /&gt;
--- @param page_text string&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @param return_category boolean&lt;br /&gt;
--- @return string | nil&lt;br /&gt;
local function get_correct_title_value(page_text, args, return_category)&lt;br /&gt;
	if not page_text then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local correct_title_template_pattern = &amp;quot;{{[Cc]orrect title|title=(.*)|reason=.-}}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local correct_title = string.match(page_text, correct_title_template_pattern)&lt;br /&gt;
&lt;br /&gt;
	if not correct_title then&lt;br /&gt;
		correct_title_template_pattern = &amp;quot;{{[Cc]orrect title|(.*)|reason=.-}}&amp;quot;&lt;br /&gt;
		correct_title = string.match(page_text, correct_title_template_pattern)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not correct_title and type(correct_title) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local correct_title_title_parts = get_title_parts(correct_title)&lt;br /&gt;
&lt;br /&gt;
	if return_category and args.name then&lt;br /&gt;
		if args.name == correct_title or args.name == correct_title_title_parts.title then&lt;br /&gt;
			return maintenance_categories.unnecessary_title_parameter&lt;br /&gt;
		else&lt;br /&gt;
			return maintenance_categories.non_matching_title&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return correct_title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a maintenance category if the infobox title is equal to the article title.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |name=&lt;br /&gt;
---&lt;br /&gt;
--- The function currently checks if the infobox title is equal to the article title while ignoring styling such as:&lt;br /&gt;
--- - Nowrap spans.&lt;br /&gt;
--- - Line breaks.&lt;br /&gt;
---&lt;br /&gt;
--- A return value can be one of three options:&lt;br /&gt;
--- - The value of maintenance_categories.non_matching_title - when the args.title does not match the article title.&lt;br /&gt;
--- - The value of maintenance_categories.unnecessary_title_parameter - when the args.title matches the article title.&lt;br /&gt;
--- - An empty string - when args.name isn&amp;#039;t used or the args.name uses an allowed modification&lt;br /&gt;
--- (such as a nowrap template) while the rest of the args.name matches the article title.&lt;br /&gt;
---&lt;br /&gt;
--- Testing parameters:&lt;br /&gt;
--- - |page_test= - a real Wikipedia page to read the content of the page.&lt;br /&gt;
--- - |page_title_test= - the title of the page being checked.&lt;br /&gt;
---&lt;br /&gt;
--- @param frame table&lt;br /&gt;
--- @param args table&lt;br /&gt;
--- @return string&lt;br /&gt;
local function is_infobox_title_equal_to_article_title(frame, args)&lt;br /&gt;
	if not args.name then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local page_text&lt;br /&gt;
	if args.page_test then&lt;br /&gt;
		page_text = mw.title.new(args.page_test):getContent()&lt;br /&gt;
	else&lt;br /&gt;
		page_text = mw.title.getCurrentTitle():getContent()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check if the article is using a {{Correct title}} template.&lt;br /&gt;
	local correct_title = get_correct_title_value(page_text, args, true)&lt;br /&gt;
	if correct_title then&lt;br /&gt;
		return correct_title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local article_title = args.page_title_test&lt;br /&gt;
	if not args.page_title_test then&lt;br /&gt;
		article_title = mw.title.getCurrentTitle().text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove disambiguation.&lt;br /&gt;
	local title_parts = get_title_parts(article_title)&lt;br /&gt;
&lt;br /&gt;
	-- Check if the article is using a {{Lowercase title}} template.&lt;br /&gt;
	local lowercase_title = get_lowercase_template_status(page_text, args, article_title, title_parts, true)&lt;br /&gt;
	if lowercase_title then&lt;br /&gt;
		return lowercase_title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove nowrap span.&lt;br /&gt;
	if string.find(args.name, &amp;quot;nowrap&amp;quot;) then&lt;br /&gt;
		local title = frame:expandTemplate{title = &amp;quot;Strip tags&amp;quot;, args = {args.name}}&lt;br /&gt;
		if title == article_title or title == title_parts.title then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return maintenance_categories.non_matching_title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove line breaks and additional spaces as a result.&lt;br /&gt;
	if string.find(args.name, &amp;quot;&amp;lt;br%s?/?&amp;gt;&amp;quot;) then&lt;br /&gt;
		local title, _ = string.gsub(args.name, &amp;quot;&amp;lt;br%s?/?&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		title, _ = string.gsub(title, &amp;quot;  &amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
		if title == article_title or title == title_parts.title then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return maintenance_categories.non_matching_title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.name == article_title or args.name == title_parts.title then&lt;br /&gt;
		return maintenance_categories.unnecessary_title_parameter&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Article and infobox titles do not match.&lt;br /&gt;
	return maintenance_categories.non_matching_title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the relevant maintenance categories based on the {{Infobox television}} values validated.&lt;br /&gt;
---&lt;br /&gt;
--- @param frame table&lt;br /&gt;
--- @return string&lt;br /&gt;
function p.validate_values(frame)&lt;br /&gt;
	local getArgs = require(&amp;quot;Module:Arguments&amp;quot;).getArgs&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	table.insert(categories, is_infobox_title_equal_to_article_title(frame, args))&lt;br /&gt;
	table.insert(categories, has_display_title(args))&lt;br /&gt;
	table.insert(categories, are_image_auxiliary_values_used_for_no_image(args))&lt;br /&gt;
	table.insert(categories, is_image_using_incorrect_syntax(args.image))&lt;br /&gt;
	table.insert(categories, is_image_size_using_px(args.image_size))&lt;br /&gt;
	--table.insert(categories, is_alt_name_in_italics(args.alt_name))&lt;br /&gt;
	-- table.insert(categories, are_values_linked_or_formatted(args)) -- commenting out for now&lt;br /&gt;
	table.insert(categories, is_country_name_valid(args.country))&lt;br /&gt;
	table.insert(categories, has_flag_icon(args))&lt;br /&gt;
	table.insert(categories, is_credit_used_correctly(args))&lt;br /&gt;
	table.insert(categories, is_based_on_used_correctly(args.based_on))&lt;br /&gt;
	table.insert(categories, does_num_episodes_have_extraneous_text(args.num_episodes))&lt;br /&gt;
	table.insert(categories, are_exclusive_parameter_sets_used(args))&lt;br /&gt;
	local release_categories = is_release_information_formatted_correctly(args)&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(release_categories) do&lt;br /&gt;
        table.insert(categories, v)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(categories, is_italic_title_valid_value(args))&lt;br /&gt;
&lt;br /&gt;
	return table.concat(categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the text used for the |above= field of the infobox.&lt;br /&gt;
---&lt;br /&gt;
--- Infobox parameters checked:&lt;br /&gt;
--- - |name=&lt;br /&gt;
---&lt;br /&gt;
--- Testing parameters:&lt;br /&gt;
--- - |page_test= - a real Wikipedia page to read the content of the page.&lt;br /&gt;
--- - |page_title_test= - the title of the page being checked.&lt;br /&gt;
---&lt;br /&gt;
--- @param frame table&lt;br /&gt;
--- @return string&lt;br /&gt;
function p.above_title(frame)&lt;br /&gt;
	local getArgs = require(&amp;quot;Module:Arguments&amp;quot;).getArgs&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	local page&lt;br /&gt;
	if args.page_test then&lt;br /&gt;
		page = mw.title.new(args.page_test)&lt;br /&gt;
	else&lt;br /&gt;
		page = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local page_text = page:getContent()&lt;br /&gt;
&lt;br /&gt;
	local article_title = args.page_title_test&lt;br /&gt;
	if not args.page_title_test then&lt;br /&gt;
		article_title = page.text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title_format = &amp;quot;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local correct_title = get_correct_title_value(page_text, args, false)&lt;br /&gt;
	if correct_title then&lt;br /&gt;
		return string.format(title_format, correct_title)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title_parts = get_title_parts(article_title)&lt;br /&gt;
&lt;br /&gt;
	local lowercase_title = get_lowercase_template_status(page_text, args, article_title, title_parts, false)&lt;br /&gt;
	if lowercase_title then&lt;br /&gt;
		return string.format(title_format, lowercase_title)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.italic_title then&lt;br /&gt;
		local title_modification = get_display_title_text(page_text, article_title)&lt;br /&gt;
		if title_modification then&lt;br /&gt;
			return string.format(title_format, title_modification)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.name then&lt;br /&gt;
		return string.format(title_format, args.name)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return string.format(title_format, title_parts.title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Replication_Ops&gt;Gonnym</name></author>
	</entry>
</feed>