Mô đun:Television ratings graph

-- Bổ sung hàm để chuyển đổi định dạng số thập phân tiếng Anh sang kiểu tiếng Việt
-- Hàm này hoán đổi dấu '.' và ','. Ví dụ: "2.192" -> "2,192"
local function formatVietnameseNumber(numStr)
if type(numStr) ~= 'string' or numStr == then
return numStr
end

-- Sử dụng một chuỗi tạm thời để tránh xung đột khi hoán đổi
local placeholder = "___SWAP_PLACEHOLDER___"
local s = numStr

-- Bước 1: Thay thế dấu phẩy (,) bằng chuỗi tạm thời
s = string.gsub(s, ",", placeholder)
-- Bước 2: Thay thế dấu chấm (.) bằng dấu phẩy (,)
s = string.gsub(s, "%.", ",")
-- Bước 3: Thay thế chuỗi tạm thời bằng dấu chấm (.)
s = string.gsub(s, placeholder, ".")

return s
end

-- 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 {}
local categories =
local title = mw.title.getCurrentTitle()

-- Variables
local timeline =
local longestseason = -1
local average = args.average and 1 or 0
local season_title = args.season_title or 'Mùa'
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 = 120 then barwidth = 6
elseif num_episodes >= 100 then barwidth = 7
elseif num_episodes >= 80 then barwidth = 8
elseif num_episodes >= 50 then barwidth = 9
elseif num_episodes >= 20 then barwidth = 10
else barwidth = 11
end

-- Determine maximum viewer figure
local maxviewers = -1
local multiple = 'triệu'
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 = 80 and 2 or 1)

timeline = timeline .. "\nBarData=\n"
for episode = 1,num_episodes do
episodetext = ((episode % x_intervals == 0) and episode or "")
timeline = timeline .. "\n bar:"..episode.." text:"..episodetext.."\n"
end

-- Add bars to timeline, one per viewer figure
local bar = 1
local season = 0
local thisseason = 0
local counted_episodes = 0

timeline = timeline .. "\nPlotData=\n"
timeline = timeline .. "\n width:"..barwidth.." textcolor:black align:left anchor:from shift:(10,-4)\n"

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

-- 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 args[k+1] ~= '-' and args[k+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 = timeline .. "\n bar:"..bar.." from:0 till:"..(v ~= and v or 0).." color:season"..season.."\n"

-- 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

-- 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 == "United States" then countryDisplayUS = 'U.S.'
elseif args.country "U.K." or args.country "UK" or args.country == "United Kingdom" then countryDisplayUK = 'UK'
else countryDisplayOther = args.country end
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 .. "" .. "&8202;" .. ": " .. "Người xem tại".." "..((countryDisplayUS or countryDisplayUK or countryDisplayOther)) .. " theo mỗi tập (" .. multiple .. ")"):css('margin-top', '1em')
else
root:wikitext("Người xem mỗi tập (" .. multiple .. ")"):css('margin-top', '1em')
end
root:tag('div'):css('clear','both')

-- Add timeline to div
if args.no_graph nil then
if num_episodes > 100 then
root:tag('div'):wikitext("Số tập phim đã vượt quá giới hạn (tối đa 100), không thể hiển thị biểu đồ.")
if title.namespace 0 then
categories = categories ..
end
else
timelineBase = frame:preprocess(""..timeline.."")
root:node(timelineBase)
root:tag('div'):css('clear','both')
end
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('scope','col')
:attr('colspan','2')
:attr('rowspan','2')
:css('padding-left', '.8em')
:css('padding-right', '.8em')

row:tag('th')
:attr('scope','colgroup')
:attr('colspan',longestseason)
:wikitext("Số tập")
:css('padding-left', '.8em')
:css('padding-right', '.8em')

-- Average column
if average == 1 then
row:tag('th')
:attr('scope','col')
:attr('rowspan','2')
:wikitext("Trung bình")
: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 args[k+1] == nil) then
if season > 1 then
-- Spanning empty cells with
if thisseason Thống kê lượt xem bởi Nielsen Media Research" .. (args.refs ~= and args.refs or tostring(span)))
elseif countryDisplayUK then
root:wikitext("Thống kê lượt xem bởi Broadcasters' Audience Research Board" .. (args.refs ~= and args.refs or tostring(span)))
else
root:wikitext("Nguồn: " .. (args.refs ~= and args.refs or tostring(span)))
end

return tostring(root) .. categories
end

--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------

local p = {}

function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
removeBlanks = false,
wrappers = 'Template:Television ratings graph'
})
return TVRG.new(frame,args)
end

return p