มอดูล:Television ratings graph

-- This module implements .
local contrast_ratio = require('Module:Color contrast')._ratio
--------------------------------------------------------------------------------
-- TVRG class
-- The main class.
--------------------------------------------------------------------------------
local TVRG = {}
-- Allow usages of  cells
function TVRG.NACell(frame,text)
	local cell = mw.html.create('td')
	local attrMatch = '(%a-*)="(^"*)"'
	
	infoParam = frame:expandTemplate{title='N/A',args={text}}
	
	-- Gather styles of  and assign to node variable
	while true do
		local a,b = string.match(infoParam,attrMatch)
		if a == nil or b == nil then break end
		cell:attr(a,b)
		infoParam = string.gsub(infoParam,attrMatch,,1)
	end
	infoParam = string.gsub(infoParam,'%s*|%s*',,1)
	cell:wikitext(infoParam)
	
	return cell
end
-- Create the graph and table
function TVRG.new(frame,args)
	args = args or {}
	
	-- Variables
	local timeline = {}
	local longestseason = -1
	local average = args.average and 1 or 0
	local season_title = args.season_title or 'ฤดูกาล'
	local root = mw.html.create('div')
		:attr('align', 'center')
	
	-- Create the timeline
	
	-- Number of actual viewer numbers
	local numberargs = 0
	for k,v in pairs(args) do 
		if (string.lower(v) == 'n/a') or (not string.match(k,'^%d+') and not string.match(v,'^%d\.+')) then numberargs = numberargs + 1 end
	end
	-- Determine number of seasons
	local num_seasons = -1
	for k,v in pairs(args) do
		local thisseason = tonumber(string.sub(k,6))
		if string.sub(k,1,5) == 'color' and thisseason > num_seasons then
			num_seasons = thisseason
		end
	end
	if num_seasons = 80 then barwidth = 9
	elseif num_episodes >= 50 then barwidth = 10
	elseif num_episodes >= 20 then barwidth = 11
	else barwidth = 12
	end
	local graphwidth = num_episodes*barwidth
	
	-- Determine maximum viewer figure
	local maxviewers = -1
	local multiple = 'ล้าน'
	for k,v in pairs(args) do
		local num = tonumber(v)
		if tonumber(k) ~= nil and num ~= nil and num > maxviewers then
			maxviewers = num
		end
	end
	if maxviewers  1 then
			timeline'y'..season..'Title' = (args"legend" .. season or season) .. " " -- The space after this is not a regular space, it is a copy-pasted non-breaking space so the graph registers season names that are numbers (such as 1984 for American Horror Story) as a string, not a number; if it registers as a number, it will register as the first season. Do not remove/change it.
		elseif timeline'legend' then
			timeline'legend' = nil
		end
		timeline'colors' = timeline'colors' .. args"color" .. season .. ','
	end
	
	-- Axis labels
	local countryDisplayUS, countryDisplayUK, countryDisplayOther
	if args.country ~= nil and args.country ~=  then
		if args.country == "U.S." or args.country == "US" or args.country == "สหรัฐ" then countryDisplayUS = 'U.S.'
		elseif args.country == "U.K." or args.country == "UK" or args.country == "สหราชอาณาจักร" then countryDisplayUK = 'UK'
		else countryDisplayOther = args.country
		end
	end
	timeline'yAxisTitle' = "จำนวนผู้ชมใน" .. ((countryDisplayUS or countryDisplayUK or countryDisplayOther) or "") .. " (" .. multiple .. ")"
	-- Add bars to timeline, one per viewer figure
	local bar = 1
	local season = 0
	local thisseason = 0
	local counted_episodes = 0
	
	for k,v in ipairs(args) do
		if string.lower(v) == 'n/a' then v =  end
		
		if v == '-' then
			-- Hyphen means new season
			season = season + 1
			timeline'y'..season = 
			for ep = 1,counted_episodes do 
				timeline'y'..season = timeline'y'..season .. ','
			end
			-- Determine highest number of counted_episodes in a season
			if thisseason > longestseason then
				longestseason = thisseason
			end
			thisseason = 0
		elseif average == 0 or (average == 1 and argsk+1 ~= '-' and argsk+1 ~= nil) then
			-- Include bar for viewer figure, do not include if averages are included and the next parameter is a new season marker
			timeline'y'..season = timeline'y'..season .. (timeline'y'..season and ',' or ) .. (v ~=  and v or 0)
			
			-- Increment tracking variables
			counted_episodes = counted_episodes + 1
			thisseason = thisseason + 1
			bar = bar + 1
		end
	end
	-- Determine highest number of episodes in a season after final season's bars
	if thisseason > longestseason then
		longestseason = thisseason
	end
	
	-- X axis variables
	for ep = 1,num_episodes do 
		timeline'x' = timeline'x' .. (timeline'x' and ',' or ) .. ep
	end
	
	-- If there's a title, add it with the viewers caption, else just display the viewers caption by itself
	if args.title ~= nil and args.title ~=  then
		root:wikitext("" .. args.title .. "" .. " " .. ": จำนวนผู้ชม" .. ((countryDisplayUS or countryDisplayUK or countryDisplayOther) or "") .. "ต่อตอน (" .. multiple .. ")"):css('margin-top', '1em')
	else
		root:wikitext("จำนวนผู้ชมต่อตอน (" .. multiple .. ")"):css('margin-top', '1em')
	end
	root:tag('div'):css('clear','both')
	-- Add timeline to div
	if args.no_graph == nil then
		timeline1 = 
		-- This reduces the WP:PEIS. มอดูล:Graph:Chart pretends to be
		-- แม่แบบ:Graph:Chart, and we pass it a modified frame with the
		-- arguments we would have sent to แม่แบบ:Graph:Chart.
		local oldArgs = frame.args
		frame.args = timeline
		root:wikitext(require('มอดูล:Graph:Chart')(frame))
		frame.args = oldArgs
		root:tag('div'):css('clear','both')
	end
	
	-- Create ratings table
	if args.no_table == nil then
		local rtable = mw.html.create('table')
		   	:addClass('wikitable')
			:css('text-align', 'center')
		
			-- Create headers rows
			local row = rtable:tag('tr')
			row:tag('th'):wikitext(season_title)
				:attr('colspan','2')
				:attr('rowspan','2')
				:css('padding-left', '.8em')
				:css('padding-right', '.8em')
				
			row:tag('th')
				:attr('colspan',longestseason)
				:wikitext("ตอนที่")
				:css('padding-left', '.8em')
				:css('padding-right', '.8em')
				
			-- Average column
			if average == 1 then
				row:tag('th')
				   :attr('scope','col')
				   :attr('rowspan','2')
				   :wikitext("เฉลี่ย")
				   :css('padding-left', '.8em')
				   :css('padding-right', '.8em')
			end
			local row = rtable:tag('tr')
			
			for i = 1,longestseason do
				row:tag('th')
				   :attr('scope','col')
				   :wikitext(i)
			end
		
		local season = 1
		local thisseason = 0
		
		-- Create table rows and cells
		for k,v in pairs(args) do
			if tonumber(k) ~= nil then
				-- New season marker, or final episode rating
				if v == '-'  or (average == 1 and argsk+1 == nil) then
					if season > 1 then
						-- Spanning empty cells with 
						if thisseason การวัดผลผู้ชมดำเนินการโดย Nielsen Media Research" .. (args.refs ~=  and args.refs or tostring(span)))
	elseif countryDisplayUK then
		root:wikitext("การวัดผลผู้ชมดำเนินการโดย Broadcasters' Audience Research Board" .. (args.refs ~=  and args.refs or tostring(span)))
	else
		root:wikitext("แหล่งที่มา: " .. (args.refs ~=  and args.refs or tostring(span)))
	end
	
	return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		removeBlanks = false,
		wrappers = 'แม่แบบ:Television ratings graph'
	})
	return TVRG.new(frame,args)
end
return p