<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ATelevision_Rotten_Tomatoes_scores</id>
	<title>Module:Television Rotten Tomatoes scores - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.bharatpedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ATelevision_Rotten_Tomatoes_scores"/>
	<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=Module:Television_Rotten_Tomatoes_scores&amp;action=history"/>
	<updated>2026-11-09T06:01:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://en.bharatpedia.org/w/index.php?title=Module:Television_Rotten_Tomatoes_scores&amp;diff=556140&amp;oldid=prev</id>
		<title>WikiDwarf: Add missing module</title>
		<link rel="alternate" type="text/html" href="https://en.bharatpedia.org/w/index.php?title=Module:Television_Rotten_Tomatoes_scores&amp;diff=556140&amp;oldid=prev"/>
		<updated>2026-01-17T01:26:38Z</updated>

		<summary type="html">&lt;p&gt;Add missing module&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements {{Television Rotten Tomatoes scores}}.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- TVRT class&lt;br /&gt;
-- The main class.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local TVRT = {}&lt;br /&gt;
&lt;br /&gt;
function TVRT.upper(str)&lt;br /&gt;
    return (str:gsub(&amp;quot;^%l&amp;quot;, string.upper))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TVRT.round(value)&lt;br /&gt;
	return math.floor(value + 0.5)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create the graph and table&lt;br /&gt;
function TVRT.new(frame,args)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	&lt;br /&gt;
	-- Variables&lt;br /&gt;
	local timeline = &amp;quot;&amp;quot;&lt;br /&gt;
	local episodes = 0&lt;br /&gt;
	local graph_width = args.width and tonumber(args.width) or 600&lt;br /&gt;
	local graph_height = args.height and tonumber(args.height) or 300&lt;br /&gt;
	local force_gap = args.forcegap or nil&lt;br /&gt;
&lt;br /&gt;
	-- Create table and top caption&lt;br /&gt;
	local roottable = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
	roottable	&lt;br /&gt;
		:addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
		:addClass(args.align and &amp;#039;float&amp;#039;..args.align or &amp;#039;&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;width&amp;#039;, (args.width or 600)..&amp;#039;px&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;caption&amp;#039;):wikitext(&amp;#039;&amp;lt;i&amp;gt;&amp;#039;..(args.title or &amp;#039;&amp;#039;)..&amp;#039;&amp;lt;/i&amp;gt;&amp;#039;..(args.label and &amp;#039; &amp;#039;..string.lower(args.label) or &amp;#039;&amp;#039;)..&amp;#039;: Critical reception by episode&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local rootcell = roottable:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	-- Border widths &lt;br /&gt;
	local g_l = 50&lt;br /&gt;
	local g_r = 50&lt;br /&gt;
	local g_t = 30&lt;br /&gt;
	local g_b = 40&lt;br /&gt;
	local g_lr_border = g_l + g_r&lt;br /&gt;
	local g_tb_border = g_t + g_b&lt;br /&gt;
	&lt;br /&gt;
	local score_min = 100&lt;br /&gt;
	local score_max = 0&lt;br /&gt;
&lt;br /&gt;
	-- Number of episodes&lt;br /&gt;
	for k,v in pairs(args) do &lt;br /&gt;
		if (string.lower(v) == &amp;#039;n/a&amp;#039;) or (not string.match(k,&amp;#039;[^%d]+&amp;#039;) and not string.match(v,&amp;#039;[^%d%.]+&amp;#039;)) then&lt;br /&gt;
			episodes = episodes + 1&lt;br /&gt;
			if v ~= &amp;quot;&amp;quot; and v ~= nil then&lt;br /&gt;
				score_min = math.min(score_min, tonumber(v))&lt;br /&gt;
				score_max = math.max(score_max, tonumber(v))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Position varibles for each entry &lt;br /&gt;
	local old_x = g_l&lt;br /&gt;
	local old_y = 0&lt;br /&gt;
	local new_x = old_x&lt;br /&gt;
	local new_y = old_y&lt;br /&gt;
	local increment_x = TVRT.round((graph_width-g_lr_border)/(episodes-1))&lt;br /&gt;
	&lt;br /&gt;
	local period_min = 0&lt;br /&gt;
	local period_max = 100&lt;br /&gt;
	&lt;br /&gt;
	if args.minimize_y then&lt;br /&gt;
		period_min = math.floor(score_min/10)*10&lt;br /&gt;
		period_max = math.ceil(score_max/10)*10&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- One percentage on the y axis is this many pixels &lt;br /&gt;
	local percent_pixel = (graph_height-g_tb_border)/(period_max-period_min)&lt;br /&gt;
	&lt;br /&gt;
	-- Create the timeline&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nImageSize  = width:&amp;quot;..graph_width..&amp;quot; height:&amp;quot;..graph_height..&amp;quot;\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nPlotArea   = left:&amp;quot;..g_l..&amp;quot; bottom:&amp;quot;..g_b..&amp;quot; top:&amp;quot;..g_t..&amp;quot; right:&amp;quot;..g_r..&amp;quot;\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nTimeAxis   = orientation:vertical format:y\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nAlignBars  = justify\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nColors =\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\n id:grayH value:gray(0.95)\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\n id:grayV value:gray(0.85)\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	-- Colour from hex to 0-1 RGB&lt;br /&gt;
	local hex = args[&amp;quot;color&amp;quot;]:gsub(&amp;quot;#&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
	if #hex == 3 then&lt;br /&gt;
		hex = hex:sub(1,1) .. hex:sub(1,1) .. hex:sub(2,2) .. hex:sub(2,2) .. hex:sub(3,3) .. hex:sub(3,3) -- If it&amp;#039;s 3 hex chars then make it six instead&lt;br /&gt;
	end&lt;br /&gt;
	rgbR = tonumber(&amp;quot;0x&amp;quot;..hex:sub(1,2))/256&lt;br /&gt;
	rgbG = tonumber(&amp;quot;0x&amp;quot;..hex:sub(3,4))/256&lt;br /&gt;
	rgbB = tonumber(&amp;quot;0x&amp;quot;..hex:sub(5,6))/256&lt;br /&gt;
	timeline = timeline .. &amp;quot;\n id:graph value:rgb(&amp;quot;..rgbR..&amp;quot;, &amp;quot;..rgbG..&amp;quot;, &amp;quot;..rgbB..&amp;quot;)\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- Further the timeline &lt;br /&gt;
	timeline = timeline .. &amp;quot;\nPeriod     = from:&amp;quot;..period_min..&amp;quot; till:&amp;quot;..period_max..&amp;quot;\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nScaleMajor = unit:year start:&amp;quot;..period_min..&amp;quot; increment:10\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nScaleMinor = unit:year start:&amp;quot;..period_min..&amp;quot; increment:2\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	-- X-axis position for each entry &lt;br /&gt;
	timeline = timeline .. &amp;quot;\nBarData=\n&amp;quot;&lt;br /&gt;
	for episode = 1,episodes do &lt;br /&gt;
		timeline = timeline .. &amp;quot;\n bar:&amp;quot;..episode..&amp;quot; text:&amp;quot;..episode..&amp;quot;\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Faint line at each 10% on the y-axis &lt;br /&gt;
	timeline = timeline .. &amp;quot;\nLineData=\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\n layer:front\n&amp;quot;&lt;br /&gt;
	for variance = period_min,period_max,10 do &lt;br /&gt;
		timeline = timeline .. &amp;quot;\n at:&amp;quot;..variance..&amp;quot; frompos:&amp;quot;..old_x..&amp;quot; tillpos:&amp;quot;..(graph_width-g_r)..&amp;quot; color:grayH width:1 layer:back\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Draw the lines between each entry &lt;br /&gt;
	local all_positions = {}&lt;br /&gt;
&lt;br /&gt;
	local last_x = nil&lt;br /&gt;
	local last_y = nil&lt;br /&gt;
	local current_x = g_l&lt;br /&gt;
&lt;br /&gt;
	for episode = 1, episodes do&lt;br /&gt;
		local score = tonumber(args[episode])&lt;br /&gt;
&lt;br /&gt;
		if score then&lt;br /&gt;
			local y = TVRT.round(g_b + (score-period_min) * percent_pixel)&lt;br /&gt;
&lt;br /&gt;
			if last_x then&lt;br /&gt;
				timeline = timeline .. &amp;quot;\n points:(&amp;quot;..last_x..&amp;quot;,&amp;quot;..last_y..&amp;quot;)(&amp;quot;..current_x..&amp;quot;,&amp;quot;..y..&amp;quot;) color:graph width:1.5\n&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Draw square marker&lt;br /&gt;
			timeline = timeline .. &amp;quot;\n at:&amp;quot;..score..&amp;quot; frompos:&amp;quot;..(current_x-2)..&amp;quot; tillpos:&amp;quot;..(current_x+2)..&amp;quot; color:graph width:4\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			all_positions[#all_positions+1] = {x = current_x, y = y, episode = episode}&lt;br /&gt;
&lt;br /&gt;
			last_x = current_x&lt;br /&gt;
			last_y = y&lt;br /&gt;
		elseif force_gap then&lt;br /&gt;
			last_x = nil&lt;br /&gt;
			last_y = nil&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		current_x = current_x + increment_x&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Dud entry to allow positioning of final value&lt;br /&gt;
	all_positions[#all_positions+1] = {x = 1000, y = 1000, episode = nil}&lt;br /&gt;
	&lt;br /&gt;
	-- Draw the values on the graph&lt;br /&gt;
	local fontsize = 8&lt;br /&gt;
	local old_slope = 0&lt;br /&gt;
	local new_slope = old_slope&lt;br /&gt;
	&lt;br /&gt;
	timeline = timeline .. &amp;quot;\nTextData=\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\n pos:(&amp;quot;..(graph_width/2-20)..&amp;quot;,15) fontsize:S text:Episode\n&amp;quot;&lt;br /&gt;
	timeline = timeline .. &amp;quot;\n pos:(20,&amp;quot;..(graph_height-15)..&amp;quot;) fontsize:S text:Percent\n&amp;quot;&lt;br /&gt;
	for k,v in pairs(all_positions) do &lt;br /&gt;
		-- Determine the position of the text based on the slope of each line &lt;br /&gt;
		local nextv = all_positions[k+1]&lt;br /&gt;
		if nextv ~= nil then&lt;br /&gt;
			new_slope = (nextv.y-v.y) / (nextv.x-v.x)&lt;br /&gt;
			if new_slope &amp;gt; 0 then&lt;br /&gt;
				v.y = v.y - fontsize*1.5&lt;br /&gt;
			else&lt;br /&gt;
				v.y = v.y + fontsize*0.5&lt;br /&gt;
			end&lt;br /&gt;
			old_slope = new_slope&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local label = v.episode and args[v.episode] or &amp;quot;&amp;quot;&lt;br /&gt;
		timeline = timeline .. &amp;quot;\n pos:(&amp;quot;..v.x..&amp;quot;,&amp;quot;..v.y..&amp;quot;) textcolor:black fontsize:&amp;quot;..fontsize..&amp;quot; text:&amp;quot;..label..&amp;quot;\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Add the timeline itself to the base table&lt;br /&gt;
	local timeline_base = frame:preprocess(&amp;quot;&amp;lt;timeline&amp;gt;&amp;quot; .. timeline .. &amp;quot;&amp;lt;/timeline&amp;gt;&amp;quot;)&lt;br /&gt;
	rootcell:node(timeline_base)&lt;br /&gt;
	rootcell:tag(&amp;#039;div&amp;#039;):css(&amp;#039;clear&amp;#039;,&amp;#039;both&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	-- Create bottom caption&lt;br /&gt;
	local lower_caption_text1 = (args.label and TVRT.upper(string.lower(args.label)) or &amp;quot;&amp;lt;i&amp;gt;&amp;quot;..args.title..&amp;quot;&amp;lt;/i&amp;gt;&amp;quot;) .. &amp;quot; (&amp;quot; .. (args.year or &amp;quot;Year?&amp;quot;) .. &amp;quot;):&amp;amp;nbsp;&amp;quot;&lt;br /&gt;
	local lower_caption_text2 = &amp;quot;Percentage of positive critics&amp;#039; reviews tracked by the website [[Rotten Tomatoes]]&amp;quot; .. (args.ref or &amp;quot;Ref?&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local lower_caption1 = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
	local lower_caption2 = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	lower_caption1&lt;br /&gt;
		:css(&amp;#039;color&amp;#039;, &amp;#039;#&amp;#039;..hex)&lt;br /&gt;
		:css(&amp;#039;font-weight&amp;#039;, &amp;#039;bold&amp;#039;)&lt;br /&gt;
		:wikitext(lower_caption_text1)&lt;br /&gt;
	lower_caption2&lt;br /&gt;
		:wikitext(lower_caption_text2)&lt;br /&gt;
	&lt;br /&gt;
	if not args.nolower then rootcell:node(lower_caption1) end&lt;br /&gt;
	rootcell:node(lower_caption2)&lt;br /&gt;
&lt;br /&gt;
	return roottable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		removeBlanks = false,&lt;br /&gt;
		wrappers = &amp;#039;Template:Television Rotten Tomatoes scores&amp;#039;&lt;br /&gt;
	})&lt;br /&gt;
	return TVRT.new(frame,args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WikiDwarf</name></author>
	</entry>
</feed>