Модуль:Реслінг-таблиця результатів

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]

Цей модуль реалізує {{Таблиця результатів у реслінгу}}. Будь ласка, дивіться сторінку шаблону для документації.

Додавання приміток матчів[ред. код]

По-перше, ознайомтеся з форматом таблиці приміток:

	local notes = {
		dark		= {  'D',			'[[Темний матч (реслінг)|темний]]'		    },
		pre			= {  'P',			'на перед-шоу'								},
		aewd		= { 'AD',	taped ..'<i>[[AEW Dark|Dark]]</i>'								},
		aewde		= { 'DE',	taped ..'<i>[[AEW Dark: Elevation|Dark: Elevation]]</i>'		},
		bti	        = {  'B',	taped ..'<i>[[Before the Impact]]</i>'				         	},
		ffa			= {  'F',	 live ..'<i>[[WWE Free for All|Free for All]]</i>'				},
		fusion		= { 'FT',	taped ..'<i>[[MLW Fusion|Fusion]]</i>'							},
		fusionlive	= {  'F',	 live ..'<i>[[MLW Fusion|Fusion]]</i>'							},
		heat		= {  'H',	 live ..'<i>[[WWE Heat|Sunday Night Heat]]</i>'					},
		mem 		= {'MEM',   taped ..'<i>Main Event Mondays</i>'                             },
		regnxt		= {  'N',	taped ..'<i>[[WWE NXT|NXT]]</i>'								},
		regnxtuk	= { 'UK',	taped ..'<i>[[WWE NXT UK|NXT UK]]</i>'							},
		slam		= {  'S',	 live ..'<i>[[WWF Sunday Night Slam|Sunday Night Slam]]</i>'	},
		wcwme		= { 'ME',	 live ..'<i>[[WCW Main Event|Main Event]]</i>'					},
		wcwsn		= { 'SN',	 live ..'<i>[[WCW Saturday Night|Saturday Night]]</i>'			},
		xplosion	= {  'X',	taped ..'<i>[[Impact! Xplosion|Xplosion]]</i>'					}
	}

Таблицю приміток було вирівняно, щоб її було легше зрозуміти редакторам, які не мають досвіду роботи з Lua. Давайте розберемо її далі, на конкретному прикладі:

		heat		= {  'H',	 live ..'<i>[[WWE Heat|Sunday Night Heat]]</i>'					},
  • heat є значенням поля приміток (наприклад, |note1=heat)
  • H це символ примітки, який з'являється поряд з порядковим номером матчу у таблиці
  • далі йде ключ, що формує речення внизу таблиці. Ключі: live (для матчів, що транслювались до шоу) і taped (для наперед записаних матчів). В ідеалі, опісля має йти вікіпосилання на програму, виділене курсивом через HTML-теги (<i></i>).

Додаючи примітку в модуль, слід пам'ятати про декілька речей:

  • Значення поля примітки має бути коротким, але зрозумілим. Використовуйте абревіатуру або акронім програми. Якщо результуюче значення є загальним і є потенціал для дублювання, розгляньте можливість включення абревіатури промоушну.
  • Позначення примітки для таблиці (символ примітки) повинне бути обмеженим одним або двома символами. Якщо існує потенційний збіг з іншими символами в тій самій таблиці результатів, відкоригуйте відповідним чином. Уникайте використання «D» або «P», оскільки вони є узагальненими позначеннями для темного матчу і матчів на перед-шоу, відповідно.
local p = {}

function p.main(frame)
	local args = require('Модуль:Arguments').getArgs(frame, {wrappers = 'Шаблон:Таблиця результатів у реслінгу'})
	local warnings = {}

	-- Preprocessing
	local live = ' транслювався перед платним показом шоу у рамках '
	local taped = ' був записаний для майбутньої трансляції '
	local notes = {
		dark		= {  'D',			'[[Темний матч (реслінг)|темний]]'						},
		pre			= {  'P',			'на перед-шоу'								            },
		aewd		= { 'AD',	taped ..'<i>[[AEW Dark|Dark]]</i>'								},
		aewde		= { 'DE',	taped ..'<i>[[AEW Dark: Elevation|Dark: Elevation]]</i>'		},
		bti	        = {  'B',	taped ..'<i>[[Before the Impact]]</i>'				         	},
		ffa			= {  'F',	 live ..'<i>[[WWE Free for All|Free for All]]</i>'				},
		fusion		= { 'FT',	taped ..'<i>[[MLW Fusion|Fusion]]</i>'							},
		fusionlive	= {  'F',	 live ..'<i>[[MLW Fusion|Fusion]]</i>'							},
		heat		= {  'H',	 live ..'<i>[[WWE Heat|Sunday Night Heat]]</i>'					},
		mem 		= {'MEM',   taped ..'<i>Main Event Mondays</i>'                             },
		regnxt		= {  'N',	taped ..'<i>[[WWE NXT|NXT]]</i>'								},
		regnxtuk	= { 'UK',	taped ..'<i>[[WWE NXT UK|NXT UK]]</i>'							},
		slam		= {  'S',	 live ..'<i>[[WWF Sunday Night Slam|Sunday Night Slam]]</i>'	},
		wcwme		= { 'ME',	 live ..'<i>[[WCW Main Event|Main Event]]</i>'					},
		wcwsn		= { 'SN',	 live ..'<i>[[WCW Saturday Night|Saturday Night]]</i>'			},
		xplosion	= {  'X',	taped ..'<i>[[Impact! Xplosion|Xplosion]]</i>'					}
	}
	local matches, notes_key, notes_key_filter = {}, {}, {}
	local future_match, times_active, champions_active
	local row_num = 1

	while args['match'.. row_num] do
		-- Validate match status and order
		local row_match = args['match'.. row_num]
		if not (row_match:match(' переміг ') or row_match:match(' перемогла ') or row_match:match(' виграв ') or row_match:match(' перемогли ') or row_match:match(' виграла ') or row_match:match(' виграли ') or row_match:match(' закінчився ')) or row_match:match(' закінчили ') then
			future_match = true
		elseif future_match then
			table.insert(warnings, '<b>match'.. row_num-1 ..'</b> (future match in wrong order OR not properly marked as complete — "перемогла", "переміг", "перемогли", "закінчився", "виграв", "виграли", "виграла", "закінчили",  очікується)')
			future_match = false
		end

		-- Validate note
		-- Add note to Key (maintain order, avoid duplicates)
		-- Create sub-note if discrepancy in match status
		local row_note = args['note'.. row_num]
		if row_note then
			if notes[row_note] then
				local suffix = future_match and 'F' or ''
				local row_note_symbol = notes[row_note][1] .. (future_match and notes_key_filter[row_note] and 'F' or '')
				if not notes_key_filter[row_note .. suffix] then
					table.insert(notes_key, {
						row_note_symbol,
						(row_note == 'dark' and 'цей матч' or 'матч') .. (future_match and row_note == 'dark' and ' запланований як ' or future_match ~= true and row_note == 'dark' and ' пройшов як ' or future_match and row_note == 'pre' and ' буде проведений ' or future_match ~= true and row_note == 'pre' and ' пройшов ') .. notes[row_note][2]
					})
					notes_key_filter[row_note .. suffix] = true
				end
				row_note = row_note_symbol
			else
				table.insert(warnings, '<b>note'.. row_num ..'</b> (див. [[Шаблон:Таблиця результатів у реслінгу]])')
				row_note = nil
			end
		end

		-- Validate stipulation
		if mw.text.killMarkers(args['stip'.. row_num] or '') == '' then
			table.insert(warnings, '<b>stip'.. row_num ..'</b> (умови не мають бути пустими)')
		end

		-- Validate time (M:SS minimum)
		local row_time = args['time'.. row_num]
		if row_time then
			if row_time:match('[0-9]:[0-5][0-9]') then
				times_active = true
			else
				table.insert(warnings, '<b>time'.. row_num ..'</b> (M:SS expected)')
				row_time = nil
			end
		end

		-- Detect champions for Key
		if not champions_active and row_match:match('%(c%)') then
			champions_active = true
		end
		
		-- Перевірка на кирилицю
		if not champions_active and row_match:match('%(с%)') then
			table.insert(warnings, '<b>match'.. row_num .. '</b> (Використовуйте англійську "c")')
		end

		table.insert(matches, {row_note, row_match, args['stip'.. row_num], row_time})
		row_num = row_num+1
	end

	local notes_active = #notes_key > 0 and true or false

	-- Validate extra parameters
	if args['align'] and args['align'] ~= 'center' then
		table.insert(warnings, '<b>align</b> ("center" expected)')
	end

	-- Table start
	local root = mw.html.create('table')
		:addClass('wikitable')
		:css('max-width', '1440px')
		:css('margin', args['align'] == 'center' and '1em auto !important' or nil) -- Optional center align

	if args['caption'] then
		root
		:tag('caption')
			:css('font-size', '16px')
			:wikitext(args['caption'])
	end

	-- Header
	local header = root:tag('tr')

	header
	:tag('th')
		:attr('scope', 'col')
		:tag('abbr')
			:attr('title', 'Номер'.. (notes_active and ' і примітка' or ''))
			:wikitext('№')
			:done()
		:done()
	:tag('th')
		:attr('scope', 'col')
		:wikitext((future_match and 'Матчі*' or 'Результати') .. (args['results'] or '')) -- Optional reference
		:done()
	:tag('th')
		:attr('scope', 'col')
		:wikitext('Умови')
	if times_active then
		header
		:tag('th')
			:attr('scope', 'col')
			:wikitext('Час'.. (args['times'] or '')) -- Optional reference
	end

	-- Матчі
	for num, v in ipairs(matches) do
		local row = root:tag('tr')

		row
		-- Номер
		:tag('th')
			:attr('scope', 'row')
			:wikitext(num)
		-- Примітка
			:tag('sup')
				:css('font-size', '85%')
				:wikitext(v[1])
				:done()
			:done()
		-- Match
		:tag('td')
			:wikitext(v[2])
			:done()
		-- Умови
		:tag('td')
			:wikitext(v[3])
		-- Час
		if v[4] then
			row
			:tag('td')
				:css('text-align', 'center')
				:wikitext(v[4])
		elseif times_active then
			-- mirror Template:N/a
			row
			:tag('td')
				:addClass('table-na')
				:css('text-align', 'center')
				:css('background-color', '#ececec')
				:css('color', '#2C2C2C')
				:wikitext('—')
		end
	end

	-- Key
	if champions_active or notes_active or future_match then
		local key = root:tag('tr')
			:tag('th')
				:attr('scope', 'row')
				:attr('colspan', times_active and '4' or '3')
				:css('border-top', 'solid 2px #aaa')
				:css('font-weight', 'normal')
				:css('text-align', 'left')
				:tag('table')
					:css('margin', '0 auto !important')
					:css('padding', '0')
					:css('border-spacing', '0')
					:css('line-height', '1.45em')

		if champions_active then
			key
			:tag('tr')
				:tag('td')
					:css('text-align', 'right')
					:wikitext('(c)')
					:done()
				:tag('td')
					:wikitext('&nbsp;– чемпіон(-и) на момент старту поєдинку')
		end
		for _, v in ipairs(notes_key) do
			key
			:tag('tr')
				:tag('td')
					:css('text-align', 'right')
					:css('font-size', '85%')
					:css('font-weight', 'bold')
					:wikitext(v[1])
					:done()
				:tag('td')
					:wikitext('&nbsp;– '.. v[2])
		end
		if future_match then
			key
			:tag('tr')
				:tag('td')
					:attr('colspan', '2')
					:css('text-align', 'center')
					:css('font-size', '85%')
					:css('font-weight', 'bold')
					:wikitext('*Кард може змінюватись з часом')
		end
	end

	-- Preview warnings and tracking
	if #warnings > 0 then
		root = require('Модуль:If preview')._warning({'Invalid parameter value at '.. table.concat(warnings, '; ') ..'.'})
		.. (mw.title.getCurrentTitle().namespace == 0 and '[[Категорія:Сторінки з невалідними значеннями у таблиці результатів реслінгу]]' or '')
		.. tostring(root)
	end

	return root
end

return p