Документация
-- Модуль для построения турнирной таблицы в спорте
require('strict')

local p = {}

-- Main function
function p.main(frame)
-- Declare locals
	local getArgs = require('Модуль:Arguments').getArgs
	local Args = getArgs(frame, {parentFirst = true})
	local ii_start, ii_end, N_rows_res = 0
	local text_field_result
	local notes_exist = false
	local t = {}
	local t_footer = {}
	local t_return = {}
	local team_list = {}
	local jj, jjj
	local table_anchor = mw.ustring.gsub(Args['section'] and 'sports-table-' .. Args['section'] or '', ' ', '_')

-- Exit early if we are using section transclusion for a different section
	local tsection = frame:getParent().args['transcludesection'] or frame:getParent().args['section'] or ''
	local bsection = frame.args['section'] or ''
	if ( tsection ~= '' and bsection ~= '') then
		if ( tsection ~= bsection) then
			return ''
		end
	end

-- Редактируем ссылки по запросу
	local baselink = frame:getParent():getTitle()
	if baselink == 'Модуль:Excerpt' then
		baselink = ''
	end
	if mw.title.getCurrentTitle().text == baselink then
		baselink = ''
	end
	local template_name = Args['template_name'] or (baselink ~= '' and (':' .. baselink .. (table_anchor ~= '' and '#' .. table_anchor or ''))) or ''

-- Получаем пользовательскую начальную точку для таблицы (большинство из них по умолчанию начинаются с 1)
	local top_pos = tonumber(Args['highest_pos']) or 1
-- Получаем пользовательскую конечную точку для таблицы (неограниченную, если bottom_pos равно < top_pos)
	local bottom_pos = tonumber(Args['lowest_pos']) or 0
	local N_teams = top_pos - 1 -- Значение по умолчанию равно 0 при запуске, но для пропуска определенных записей требуется большее число

-- Load modules
	local yesno = require('Модуль:Yesno')
-- Load style and (sub) modules
	local style_def = Args['style'] or 'WDL'
-- Historically 'football' exists as style, this is now forwarded to WDL
	if style_def == 'football' then
		style_def = 'WDL'
	end
	local p_style = require('Модуль:Sports table/' .. style_def)
	local p_sub = require('Модуль:Sports table/sub')

-- Random value used for uniqueness
	math.randomseed( os.clock() * 10 ^ 8)
	local rand_val = math.random()

-- Declare colour scheme
	local result_col = {}
	result_col = {
		green1 = '#bbf3bb', green2 = '#ccf9cc', green3 = '#ddfcdd', green4 = '#eeffee',
		blue1 = '#bbf3ff', blue2 = '#ccf9ff', blue3 = '#ddfcff', blue4 = '#eeffff',
		yellow1 = '#ffffbb', yellow2 = '#ffffcc', yellow3 = '#ffffdd', yellow4 = '#ffffee',
		red1 = '#ffbbbb', red2 = '#ffcccc', red3 = '#ffdddd', red4 = '#ffeeee',
		black1 = '#bbbbbb', black2 = '#cccccc', black3 = '#dddddd', black4 = '#eeeeee',
		orange1 = '#fedcba', orange2 = '#feead5',
		white1 = 'inherit',
		[''] = 'inherit'}

-- Показать всю статистику в таблице или только сыгранные матчи и очки
	local full_table = true
	local hide_results = yesno(Args['hide_results'] or 'no')
	local hide_footer = yesno(Args['hide_footer'] or 'no')
	local pld_pts_val = string.lower(Args['only_pld_pts'] or 'no')
	local show_class_rules = yesno(Args['show_class_rules'] or 'yes') and true or false
-- Истинно, если параметр не существует, ложно в противном случае
	if yesno(pld_pts_val) then
		full_table = false
	elseif pld_pts_val == 'no_hide_class_rules' then
		full_table = true
		show_class_rules = false
	end

-- Объявляем заголовок столбца результатов
	local results_header = {}
	results_header = {
		Q = 'Квалификация',
		QR = 'Квалификация или выбывание',
		P = 'Повышение',
		PQR = 'Повышение, квалификация или выбывание',
		PR = 'Повышение или выбывание',
		PQ = 'Повышение или квалификация',
		R = 'Выбывание'}
	local results_defined = false -- Проверьте, понадобится ли это
-- Возможный префикс для полей результатов
	local respre = (Args['result_prefix'] or '') .. '_'
	respre = (respre == '_') and '' or respre
-- Определяем строку для заголовка столбца (опцию либо пользовательскую)
	local local_res_header = results_header[Args[respre .. 'res_col_header']] or Args[respre .. 'res_col_header'] or ''
-- Проверяем наличие примечаний
	local res_head_note = Args['note_header_res']
	local res_head_note_text = ''
	if full_table and res_head_note then
		notes_exist = true
		res_head_note_text = frame:expandTemplate{title = 'efn',
			args = {group = 'lower-alpha', res_head_note}
		}
	end
	local results_header_txt = '! scope="col" |' .. local_res_header .. res_head_note_text .. '\n'

-- Получаем опцию "статус"
	local t_status = p_style.status(Args)

-- Альтернативный синтаксис для списка команд
	if Args['team_order'] and Args['team_order'] ~= '' then
		local team_order_offset = (tonumber(Args['team_order_start']) or 1) - 1
		local tlist = mw.text.split(Args['team_order'], '%s*[;,]%s*')
		for k, tname in ipairs(tlist) do
			if tname ~= '' then
				Args['team' .. (k + team_order_offset)] = tname
			end
		end
	end

-- Считаем количество команд подряд (игнорируем записи после пропуска места)
	while Args['team' .. N_teams + 1] ~= nil and (bottom_pos < top_pos or N_teams < bottom_pos) do
		N_teams = N_teams + 1
-- Добавляем его дважды в параметр team_list, один раз для фактического ранжирования, второй для поиска позиции во вложенных таблицах
-- Это возможно, потому что Lua допускает как числа, так и строки в качестве индексов.
		team_list[N_teams] = Args['team' .. N_teams] -- i^th entry is team X
		team_list[Args['team' .. N_teams]] = N_teams -- team X entry is position i
	end

-- Optional totals
	local total_row_name = 'SPORTS_TABLE_TOTAL'
	if yesno(Args['show_totals'] or 'no') then
		N_teams = N_teams + 1
		Args['team' .. N_teams] = total_row_name
		Args['name_' .. total_row_name] = 'Total'
		Args['result' .. N_teams] = total_row_name
		Args['col_' .. total_row_name] = '#eee'
		team_list[N_teams] = Args['team' .. N_teams]
		team_list[Args['team' .. N_teams]] = N_teams
	end

-- Показать позицию
	local position_col = yesno(Args['show_positions'] or 'yes') and true or false

-- Показать группы или коментарии
	local group_col = yesno(Args['show_groups'] or 'no') and true or false

-- Show match_table or not
	local match_table = yesno(Args['show_matches'] or 'no') and true or false
	local p_matches = match_table and (style_def == 'Chess' and require('Модуль:Sports results/' .. style_def) or require('Модуль:Sports results'))

-- Пользовательская метка столбца позиция и коментарий к ней
	local pos_label = Args['postitle'] or '<abbr title="Позиция">Поз</abbr>'
	if position_col == false then
		pos_label = nil
	end

-- Показывать статус или нет
	local show_status = yesno(Args['show_status'] or 'yes') and true or false

-- Получаем текст комментария к "шестерёнке" (только для непустого текста)
	local VTE_text = ''
	if (template_name ~= '') then
		VTE_text = '&nbsp;' .. require('Модуль:Navbar')._ruwikiNavbar({
			template_name,
		})

-- удалите следующую часть, если https://en.wikipedia.org/w/index.php?oldid=832717047#Sortable_link_disables_navbar_links? когда-либо будет исправлено
		if yesno(Args['sortable_table'] or 'no') then
			VTE_text = mw.ustring.gsub(VTE_text, '<%/?abbr[^<>]*>', ' ')
		end
	end

-- Добавляем источник в заголовок, если указано и возможно
	local title_source = false
	if Args['title'] and Args['title_source'] then
		Args['title'] = Args['title'] .. Args['title_source']
		title_source = true
	elseif Args['table_header'] and Args['table_header_source'] then
		Args['table_header'] = Args['table_header'] .. Args['table_header_source']
		title_source = true
	end

-- Добавляем привязку к таблице
	if table_anchor ~= '' then
		table.insert(t, '<span class="anchor" id="' .. table_anchor .. '"></span>\n')
	end

-- Выводим заголовки столбцов
	t_return = p_style.header(t, Args, p_sub, pos_label, group_col, VTE_text, full_table, results_header_txt)
	if match_table then
-- Добавляем пустой заголовок
		t_return.count = t_return.count + 1
		table.insert(t_return.tab_text, '! scope="row" class="unsortable" style="background-color:white; border-top:white; border-bottom:white; line-width:3pt;"| \n')

-- Добавляем остальную часть заголовка
		t_return = p_matches.header(t_return, Args, p_sub, N_teams, team_list, tonumber(Args['legs']) or 1)
	end
	t = t_return.tab_text
	local N_cols = t_return.count

--  Определяем, какие записи попадают в таблицу, а также узнаём какую команду показывать (если таковая имеется)
	local ii_show = team_list[Args['showteam'] or nil] -- ноль или не существует
-- Начальное и конечное положения для отображения
	local n_to_show = tonumber(Args['show_limit']) or N_teams
-- Check for "legal value", if not legal (or non declared), then show all
	local check_n = ((n_to_show >= (N_teams - top_pos + 1)) or (n_to_show <= 1) or (n_to_show ~= math.floor(n_to_show)))
-- Also check whether there is a valid ii_show
	if check_n or (not ii_show) then
		ii_start = top_pos
		ii_end = N_teams
	else
-- It's a proper integer between top_pos+1 and N_teams-1
-- If it is in the middle show the same number above and below If it is in the top or bottom, show the exact number
-- How many to show on the side
		local n_show_side = math.floor(n_to_show / 2)
		if (ii_show - top_pos + 1) <= n_show_side then
		-- Top team
			ii_start = top_pos
			ii_end = top_pos + n_to_show - 1
		elseif ii_show >= (N_teams + 1 - n_show_side) then
		-- Bottom team
			ii_start = N_teams + 1 - n_to_show
			ii_end = N_teams
		else
		-- Normal case
			ii_start = ii_show - n_show_side
			ii_end = ii_show + n_show_side
		end
	end

-- Для столбца результатов
	local new_res_ii = ii_start
-- Предварительная проверка наличия столбца
	if not hide_results then
		for ii = ii_start, ii_end do
			if Args[respre .. 'result' .. ii] and Args[respre .. 'text_' .. Args[respre .. 'result' .. ii]] then
				results_defined = true
			end
		end
	end
-- Удаляем заголовок результатов, если он не используется
	if full_table and not results_defined then
-- First get it as one string, then use string replace to replace that header by empty string
		local t_str = tostring(table.concat(t))
		t_str = mw.ustring.gsub( t_str, results_header_txt, '')
		N_cols = N_cols - 1 -- На самом деле на одну колонку меньше
		t = {}
		table.insert(t, t_str)
	end

-- Формирование строк
	local team_name, team_code_ii, team_code_jj, pos_num, group_txt, note_local
	local note_string, note_local, note_local_num, note_id
	local note_id_list = {}
	local hth_id_list = {}
-- Русские псевдонимы для обозначения статуса, используются по умолчанию, если не подавлены параметром keep_english_status_labels
	local rus_letters = {A = 'С', C = 'Ч', D = 'Д', E = 'В', G = 'Г', H = 'Х', O = 'П/О', P = 'П', Q = 'К', R = 'В', T = 'Н'}
	local letter_wrapper
	if yesno(Args["keep_english_status_labels"] or 'no') then
		letter_wrapper = function(x)
			return x
		end
	else
		letter_wrapper = function(x)
			return rus_letters[x] or x
		end
	end
	for ii = ii_start, ii_end do
-- Сначала получаем код
		team_code_ii = team_list[ii]
-- Теперь получаем значения
		pos_num = Args['pos_' .. team_code_ii] or ii
		group_txt = Args['group_' .. team_code_ii] or ' '
		team_name = Args['name_' .. team_code_ii] or team_code_ii
		note_local = Args['note_' .. team_code_ii] or nil

-- Нужен ли для этого тег повышения / квалификации / вылета
		local result_local = Args[respre .. 'result' .. ii] or nil
		local bg_col = nil
-- Получить локальный цвет фона
		if result_local then
			bg_col = result_col[Args[respre .. 'col_' .. result_local]] or Args[respre .. 'col_' .. result_local] or 'inherit'
			bg_col = 'background-color:' .. bg_col .. ';' -- Full style tag
		end
		if not bg_col then
			bg_col = 'background-color:transparent;'
		end -- Становится значением по умолчанию, если не определено

-- Выделять жирным шрифтом эту строку или нет
		local ii_fw = ii == ii_show and 'font-weight:bold;' or 'font-weight:normal;'
		if yesno(Args['show_totals'] or 'no') and team_code_ii == total_row_name then
			ii_fw = 'font-weight:bold;'
		end

-- Проверяем, есть ли комментарии или нет, если да, подготавливаем для них текст
		if note_local and full_table then
-- Устанавливаем для глобальной проверки комментариев значение true
			notes_exist = true
-- Теперь есть три варианта комментариев
-- 1) It is a full note
-- 2) It is a referal to another note (i.e. it's just a team code; e.g. note_AAA=Text, note_BBB=AAA) in which the note for BBB should link to the same footnote as AAA, with
-- 2a) The other linked note exist in the part of the table shown
-- 2b) The part of the note does not exist in the part of the table shown
			if not Args['note_' .. note_local] then
		-- Option 1
		-- Now define the identifier for this
				note_id = '"table_note_' .. team_code_ii .. rand_val .. '"' -- Add random end for unique ID if more tables are present on article (which might otherwise share an ID)
				note_id_list[team_code_ii] = note_id

		-- Call refn template
				note_string = frame:expandTemplate{title = 'efn',
					args = {group = 'lower-alpha', name = note_id, note_local}
				}
			else
		-- Option 2
		-- It is option 2a in either one if either the main note is inside the sub-table or another ref to that note is inside the sub-table
		-- Basically when it either has been defined, or the main link will be in the table
				note_local_num = team_list[note_local]
				if note_id_list[note_local] or ((note_local_num >= ii_start) and (note_local_num <= ii_end)) then
		-- Option 2a
					note_id = '"table_note_' .. note_local .. rand_val .. '"'
					note_string = frame:extensionTag{name = 'ref',
						args = {group = 'lower-alpha', name = note_id}
					}
				else
		-- Option 2b
		-- Now define the identifier for this
					note_id = '"table_note_' .. note_local .. rand_val .. '"' -- Add random end for unique ID
					note_id_list[note_local] = note_id

		-- Call refn template
					note_string = frame:expandTemplate{title = 'efn',
						args = {group = 'lower-alpha', name = note_id,
							Args['note_' .. note_local]}
					}
				end
			end
		else
			note_string = '';
		end

-- Вставьте статус, когда это необходимо
		local status_string = ''
		local status_local = show_status and Args[respre .. 'status_' .. team_code_ii] or nil
		local status_let_first = true
		local curr_letter
-- Только если он определён
		if status_local then
-- Принимайте это буква за буквой
			for jjj = 1, mw.ustring.len(status_local) do
				curr_letter = mw.ustring.upper(mw.ustring.sub(status_local, jjj, jjj))
-- Посмотрите, существует ли он
				if t_status.code[curr_letter] then
-- В зависимости от того, является ли это первой буквой или нет
					if status_let_first then
						status_string = letter_wrapper(curr_letter)
						t_status.called[curr_letter] = true
						status_let_first = false
					else
						status_string = status_string .. ', ' .. letter_wrapper(curr_letter)
						t_status.called[curr_letter] = true
					end
				end
			end
-- Добавляйте скобки / тире и жирный шрифт только в том случае, если они существуют
			if not status_let_first then
				if t_status.position == 'before' then
					status_string = '<span style="font-weight:bold">' .. string.lower(status_string) .. ' &ndash;</span> '
				else
					status_string = ' <span style="font-weight:bold">(' .. status_string .. ')</span>'
				end
			end
		end

-- Now build the rows
		if yesno(Args['show_totals'] or 'no') and team_code_ii == total_row_name then
			table.insert(t, '|- class="sortbottom"\n')	-- New row
		else
			table.insert(t, '|- \n')					-- New row
		end
		if position_col then
			table.insert(t, '| style="text-align:center;' .. ii_fw .. bg_col .. '"| ' .. pos_num .. '\n') -- Position number
		end
		if full_table and group_col then
			table.insert(t, '| style="' .. ii_fw .. bg_col .. '" |' .. group_txt .. '\n') -- Group number/name
		end
-- Build the team string order based on status position
		local team_string
		if t_status.position == 'before' then
			team_string = status_string .. team_name .. note_string
		else
			team_string = team_name .. note_string .. status_string
		end
		table.insert(t, '! scope="row" style="text-align:left; white-space:nowrap;' .. ii_fw .. bg_col .. '"| ' .. team_string .. '\n') -- Team (with possible note)
-- Call to subfunction
		t_return = p_style.row(frame, t, Args, p_sub, notes_exist, hth_id_list, full_table, rand_val, team_list, team_code_ii, ii_start, ii_end, ii_fw, bg_col, N_teams, ii, ii_show)
		t = t_return.t
		notes_exist = t_return.notes_exist
		hth_id_list = t_return.hth_id_list

-- Проверяем, что нужно добавить в столбец результатов
		if full_table then
			local res_jjj
			if ii == new_res_ii then
-- Сначала проверьте, сколько строк вам нужно для этого
				N_rows_res = 1
				jjj = ii + 1
				result_local = Args[respre .. 'result' .. ii] or ''
				local cont_loop = true
				while (jjj <= ii_end) and cont_loop do
					if Args['split' .. tostring(jjj - 1)] then
						cont_loop = false
						new_res_ii = jjj
					else
						res_jjj = Args[respre .. 'result' .. jjj] or ''
						if result_local == res_jjj then
							N_rows_res = N_rows_res + 1
						else
							cont_loop = false
							new_res_ii = jjj
						end
					end
					jjj = jjj + 1
				end
-- Now create this field (reuse ii_fw and bg_col)
-- Bold (if in range) or not
				if ii_show and (ii_show >= ii) and (ii_show <= (ii + N_rows_res - 1)) then
					ii_fw = 'font-weight:bold;'
				else
					ii_fw = 'font-weight:normal;'
				end
-- Get background colour
				bg_col = nil
				if Args[respre .. 'result' .. ii] then
					bg_col = result_col[Args[respre .. 'col_' .. result_local]] or Args[respre .. 'col_' .. result_local] or 'inherit'
					bg_col = 'background-color:' .. bg_col .. ';' -- Full style tag
				end
				if not bg_col then
					bg_col = 'background-color:transparent;'
				end -- Становится значением по умолчанию, если не определено
-- Check for notes
				local note_res_string, note_ref, note_text = '', '', ''
				if Args['note_res_' .. result_local] then
					notes_exist = true
					local note_res_local = Args['note_res_' .. result_local]

-- Split the note_res_local into a table if all the entries are valid
					local multiref = 1
					local note_res_local_table = mw.text.split(note_res_local, '%s*,%s*')
					if (# note_res_local_table > 1) then
						for k, note_res_loc in ipairs(note_res_local_table) do
							multiref = multiref * (Args['note_res_' .. note_res_loc] and 1 or 0)
						end
					else
						multiref = 0
					end

-- Split failed, so make a single entry table with hth_local inside
					if multiref < 1 then
						note_res_local_table = {note_res_local}
					end
					for k, note_res_local in ipairs(note_res_local_table) do
						if not Args['note_res_' .. note_res_local] then
-- It does not point to another result note
							note_ref = respre .. 'res_' .. result_local
							note_id = '"table_note_res_' .. result_local .. rand_val .. '"' -- Identifier
							note_text = note_res_local
						else
-- Это действительно указывает на другой результат обратите внимание
							note_ref = respre .. 'res_' .. note_res_local
							note_id = '"table_note_res_' .. note_res_local .. rand_val .. '"' -- Identifier
							note_text = Args['note_res_' .. note_res_local]
						end
-- Check whether it is already printed
						if not note_id_list[note_ref] then
						-- Print it
							note_id_list[note_ref] = note_id
							note_res_string = note_res_string .. frame:expandTemplate{title = 'efn',
								args = {group = 'lower-alpha', name = note_id, note_text}
							}
						else
						-- Refer to it
							note_res_string = note_res_string .. frame:extensionTag{name = 'ref',
								args = {group = 'lower-alpha', name = note_id}
							}
						end
					end
				end
				-- Get text
				local text_result = Args[respre .. 'text_' .. result_local] or ''
				if text_result:match('fbmulticomp') then
					ii_fw = 'padding:0;' .. ii_fw
					if text_result:match('fbmulticompefn') then
						notes_exist = true
					end
				end
				text_field_result = '| style="' .. ii_fw .. bg_col .. '" rowspan="' .. tostring(N_rows_res) .. '" |' .. text_result .. note_res_string .. '\n'
-- Посмотрите, нужно ли это (только если поле пусто для всех записей)
				if results_defined then
					table.insert(t, text_field_result)
				end
			end
		end

-- При необходимости вставьте соответствующую строку
		if match_table then
			local legs = tonumber(Args['legs']) or 1
-- Добавить пусту ячейку
			table.insert(t, '| style="background-color:white; border-top:white; border-bottom:white;"| \n')

-- Включаем примечания, чтобы при необходимости сопоставить результаты
			for jj = top_pos, N_teams do
				team_code_jj = team_list[jj]
				if ii == jj then
				-- Nothing
				else
					for l = 1, legs do
						local m = (legs == 1) and 'match_' or 'match' .. l .. '_'
						local match_note = Args[m .. team_code_ii .. '_' .. team_code_jj .. '_note']
						if match_note then
							notes_exist = true
-- Only when it exist
-- Сначала проверьте наличие ссылки на комментарии
							if not (Args['note_' .. match_note] or Args[m .. match_note .. '_note']) then
							-- It's the entry
								note_id = '"table_note_' .. team_code_ii .. '_' .. team_code_jj .. rand_val .. '"' -- Add random end for unique ID if more tables are present on article (which might otherwise share an ID)
								note_id_list[team_code_ii .. '_' .. team_code_jj] = note_id
								note_string = frame:expandTemplate{title = 'efn',
									args = {group = 'lower-alpha', name = note_id, match_note}
								}
							else
							-- Проверяем наличие в другом месте
								note_local_num = team_list[match_note] or ii_end + 1
								if note_id_list[match_note] or ((note_local_num >= ii_start) and (note_local_num <= ii_end)) then
							-- Оно существует
									note_id = '"table_note_' .. match_note .. rand_val .. '"' -- Identifier
									note_string = frame:extensionTag{name = 'ref',
										args = {group = 'lower-alpha', name = note_id}
									}
								else
							-- Now define the identifier for this
									note_id = '"table_note_' .. match_note .. rand_val .. '"' -- Add random end for unique ID
									note_id_list[match_note] = note_id
							-- Call refn template
									note_string = frame:expandTemplate{title = 'efn',
										args = {group = 'lower-alpha', name = note_id,
											Args['note_' .. match_note]}
									}
								end
							end

-- Now append this to the match result string
							Args[m .. team_code_ii .. '_' .. team_code_jj] = (Args[m .. team_code_ii .. '_' .. team_code_jj] or '') .. note_string
						end
					end
				end
			end

-- Add rest of match row
			t = p_matches.row(t, Args, N_teams, team_list, ii, ii_show, legs)
		end

-- Now, if needed, insert a split (solid line to indicate split in standings, but only when it is not at the last shown position)
		if Args['split' .. ii] and (ii < ii_end) then
-- Base size on N_cols (it needs 2*N_cols |)
			table.insert(t, '|- style="background-color:' .. result_col['black1'] .. '; line-height:3pt;"\n')
			table.insert(t, string.rep('|', 2 * N_cols) .. '\n')
		end
	end

-- Закрываем таблицу
	table.insert(t, '|}')

-- Получаем информацию для нижнего колонтитула
	local update = Args['update'] or '(дата неизвестна)'
	local start_date = Args['start_date'] or '(дата неизвестна)'
	local source = Args['source'] or (title_source == true and '') or frame:expandTemplate{
		title = 'нет источника',
		args = {reason = 'Источник не задан', date = os.date('%B %Y')}
	}
	local class_rules = Args['class_rules'] or nil

-- Создаём текст нижнего колонтитула
-- Дата обновления
	local matches_text = Args['matches_text'] or 'матчей'
	if string.lower(update) == 'complete' or hide_footer then
-- Ничего не делать
	elseif update == '' then
-- Пустой параметр
		table.insert(t_footer, 'Обновлено для ' .. matches_text .. ', сыгранных на. ')
	elseif string.lower(update) == 'future' then
-- Дата начала будущих соревнований
		table.insert(t_footer, 'Первые матчи пройдут ' .. start_date .. '. ')
	else
		table.insert(t_footer, 'Обновлено для ' .. matches_text .. ', сыгранных на ' .. update .. '. ')
	end

-- Stack footer or not
	local footer_break = yesno(Args['stack_footer'] or 'no') and true or false

-- Variable for linebreak
	local stack_string = '<br>'
	if footer_break and (not (string.lower(update) == 'complete')) and not hide_footer then
		table.insert(t_footer, stack_string)
	end
	if source ~= '' and not hide_footer then
		table.insert(t_footer, 'Источник: ' .. source)
	end
	if class_rules and full_table and show_class_rules and not hide_footer then
		if (# t_footer > 0) then
			table.insert(t_footer, '<br>')
		end
		table.insert(t_footer, 'Правила классификации: ' .. class_rules)
	end

-- Now for the named status
	local status_exist = false
	local status_string = ''
	local curr_letter
	for jjj = 1, mw.ustring.len(t_status.letters) do
		curr_letter = mw.ustring.upper(mw.ustring.sub(t_status.letters, jjj, jjj))
		if t_status.called[curr_letter] then
			if (footer_break and status_exist) then
				status_string = status_string .. stack_string
			end
			if t_status.position == 'before' then
				status_string = status_string .. '<span style="font-weight:bold">' .. string.lower(letter_wrapper(curr_letter)) .. ' &ndash;</span> ' .. t_status.code[curr_letter] .. '; '
			else
				status_string = status_string .. '<span style="font-weight:bold">(' .. letter_wrapper(curr_letter) .. ')</span> ' .. t_status.code[curr_letter] .. '; '
			end
			status_exist = true
		end
	end
-- Now if it contains entries the '; ' needs to be removed
	if status_exist and not hide_footer then
		if (# t_footer > 0) then
			table.insert(t_footer, '<br>')
		end
		status_string = mw.ustring.sub(status_string, 1, mw.ustring.len(status_string) - 2)
		table.insert(t_footer, status_string)
	end

--Добавляем комментарии (если применимо)
	if notes_exist then
		if (# t_footer > 0) then
			table.insert(t_footer, '<br>')
		end
		table.insert(t_footer, 'Примечания:')
-- As reflist size text
		t_footer = '<div class="reflist">' .. table.concat(t_footer) .. '</div>'
		t_footer = t_footer .. frame:expandTemplate{title = 'Комментарии',
			args = {group = 'lower-alpha'}
		}
	else
-- As reflist size text
		t_footer = '<div class="reflist">' .. table.concat(t_footer) .. '</div>'
	end

-- Добавляем нижний колонтитул к основной таблице
	table.insert(t, t_footer)

-- Переопределяем якорь
	for k = 1, # t do
		if t[k]:match('%[%[#[^%[%]]*%|') then
			t[k] = mw.ustring.gsub(t[k], '(%[%[)(#[^%[%]]*%|)', '%1' .. baselink .. '%2')
		end
	end

-- Отслеживающие категории
	if not Args['notracking'] then
		local getTracking = require('Модуль:Sports table/argcheck').check
		local warning_categories, tracking_categories = getTracking(Args, frame:getParent().args)
		if # warning_categories > 0 then
			if frame:preprocess("{{REVISIONID}}") == "" then
				for k = 1, # warning_categories do
					warning_categories[k] = mw.ustring.gsub(warning_categories[k], '^%[%[Категория:Страницы, использующие спортивные таблицы с (.*)|(.*)%]%]$', '<div style="color:red">Предупреждение: %1 = %2</div>')
				end
			end
		end
		for k = 1, # warning_categories do
			table.insert(t, warning_categories[k])
		end
		for k = 1, # tracking_categories do
			table.insert(t, tracking_categories[k])
		end
		if (Args['showteam'] == nil) then
			local getWarnings = require('Модуль:Sports table/totalscheck').check
			local total_warnings = getWarnings(Args, team_list, ii_start, ii_end)
			if # total_warnings > 0 then
				if frame:preprocess("{{REVISIONID}}") == "" then
					for k = 1, # total_warnings do
						table.insert(t, '<div style="color:green">Возможная проблема: ' .. total_warnings[k] .. '</div>')
					end
				end
			end
		end
	else
		table.insert(t, '[[Категория:Страницы, использующие спортивные таблицы без отслеживания]]')
	end
	return table.concat(t)
end

return p