Jump to content

Module:Professional wrestling results table

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Prefall (talk | contribs) at 13:11, 28 May 2023 (cleanup). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}

function p.main(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame)
	local error_msg = {}

	-- Preprocessing
	local future_event
	local results_label = 'Results'

	if (args['future'] or args['current']) == 'yes' then
		future_event = true
		results_label = 'Matches*'
	end

	local tense = args['future'] == 'yes' and 'will be' or 'was'
	local live_msg = tense ..' broadcast prior to the pay-per-view on '
	local taped_msg = 'was taped for a future broadcast of '
	local notes = {
		dark = { -- Dark match
			id = 'D',
			key = 'was a [[dark match]]'
		},
		pre = { -- Pre-show
			id = 'P',
			key = tense ..' broadcast on the pre-show'
		},
		aewd = { -- AEW Dark
			id = 'AD',
			key = taped_msg ..'<i>[[AEW Dark]]</i>'
		},
		aewde = { -- AEW Dark: Elevation
			id = 'DE',
			key = taped_msg ..'<i>[[AEW Dark: Elevation]]</i>'
		},
		ffa = { -- WWE Free for All
			id = 'F',
			key = live_msg .. '<i>[[WWE Free for All|Free for All]]</i>'
		},
		fusion = { -- MLW Fusion (taped)
			id = 'FT',
			key = taped_msg ..'<i>[[MLW Fusion|Fusion]]</i>'
		},
		fusionlive = { -- MLW Fusion (live)
			id = 'F',
			key = live_msg ..'<i>[[MLW Fusion|Fusion]]</i>'
		},
		heat = { -- WWE Sunday Night Heat
			id = 'H',
			key = live_msg ..'<i>[[WWE Heat|Sunday Night Heat]]</i>'
		},
		regnxt = { -- WWE NXT (taped)
			id = 'N',
			key = taped_msg ..'<i>[[WWE NXT|NXT]]</i>'
		},
		regnxtuk = { -- WWE NXT UK (taped)
			id = 'UK',
			key = taped_msg ..'<i>[[WWE NXT UK|NXT UK]]</i>'
		},
		slam = { -- WWF Sunday Night Slam
			id = 'S',
			key = live_msg ..'<i>[[WWF Sunday Night Slam|Sunday Night Slam]]</i>'
		},
		wcwme = { -- WCW Main Event
			id = 'ME',
			key = live_msg ..'<i>[[WCW Main Event|Main Event]]</i>'
		},
		wcwsn = { -- WCW Saturday Night
			id = 'SN',
			key = live_msg ..'<i>[[WCW Saturday Night|Saturday Night]]</i>'
		},
		xplosion = { -- Impact! Xplosion
			id = 'X',
			key = taped_msg ..'<i>[[Impact! Xplosion|Xplosion]]</i>'
		}
	}
	local notes_active = {}
	local notes_active_filter = {}

	local matches = {}
	local col_notes, col_times
	local row_num = 1

	while args['match'..row_num] ~= nil do
		local row_note = args['note'..row_num]
		if row_note ~= nil then
			if notes[row_note] ~= nil then
				if not col_notes then
					col_notes = true
				end
				table.insert(notes_active, row_note) -- For sorting
				row_note = notes[row_note].id
			else -- Error: invalid note
				table.insert(error_msg, ' note'.. row_num ..' with args "'.. row_note ..'".')
				row_note = nil
			end
		else -- Fetch old notes, to be deprecated
			for k, v in pairs(notes) do
				if args[k .. row_num] == 'yes' then
					table.insert(notes_active, k) -- For sorting
					row_note = v.id
					break
				end
			end
		end

		local row_time = args['time'..row_num]
		if row_time ~= nil then
			row_time = string.lower(row_time)
			if row_time == '—'
			or row_time == '–'
			or row_time == '-'
			or row_time == 'n/a'
			or row_time == 'unknown' then
				-- Consistent formatting for unknown values
				row_time = nil
			elseif not col_times then
				col_times = true
			end
		end
		
		table.insert(matches, {row_note, args['match'..row_num], args['stip'..row_num], row_time})
		row_num = row_num+1
	end

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

	if args['caption'] ~= nil then
		root
		:tag('caption')
			:wikitext(args['caption'])
	end

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

	header
		:tag('th')
			:attr('scope', 'col')
			:attr('colspan', col_notes and '2' or nil)
			:wikitext('No.')
			:done()
		:tag('th')
			:attr('scope', 'col')
			:wikitext(results_label .. (args['results'] or '')) -- Optional reference
			:done()
		:tag('th')
			:attr('scope', 'col')
			:wikitext('Stipulations')

	if col_times then
		header
		:tag('th')
			:attr('scope', 'col')
			:wikitext('Times'.. (args['times'] or '')) -- Optional reference
	end

	-- Matches
	for num, v in ipairs(matches) do
		local row = root:tag('tr')

		-- Note
		if col_notes then
			if v[1] ~= nil then
				row
				:tag('th')
					:attr('scope', 'row')
					:tag('span')
						:css('font-size', '90%')
						:wikitext(v[1])
			else
				-- Blank col to maintain consistent alignment of match number
				-- Hide border to draw less attention to blank col
				row
				:tag('th')
					:attr('scope', 'row')
					:css('border-right-color', 'transparent')
			end
		end

		row
		-- Match number
		:tag('th')
			:attr('scope', 'row')
			:wikitext(num)
			:done()
		-- Match
		:tag('td')
			:wikitext(v[2])
			:done()
		-- Stipulation
		:tag('td')
			:wikitext(v[3])

		-- Time
		if col_times then
			if v[4] ~= nil then
				row
				:tag('td')
					:css('text-align', 'center')
					:wikitext(v[4])
			else -- mirror Template:N/a
				row
				:tag('td')
					:addClass('table-na')
					:css('text-align', 'center')
					:css('background-color', '#ececec')
					:css('color', '#2C2C2C')
					:wikitext('—')
			end
		end
	end

	-- Key
	-- Optionally hide key or champions note
	if args['hide'] ~= 'key'
	and args['hide'] ~= 'all' then
		local key = root:tag('tr')
			:tag('th')
				:attr('scope', 'row')
				:attr('colspan', '5')
				: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.4em')

		if args['hide'] ~= 'champions'
		and args['hide'] ~= 'champs' then
			key
			:tag('tr')
				:tag('td')
					:css('text-align', 'right')
					:wikitext('(c)&nbsp;')
					:done()
				:tag('td')
					:wikitext('– the champion(s) heading into the match')
		end

		for _, v in ipairs(notes_active) do
			if notes_active_filter[v] == nil then -- Filter duplicates
				notes_active_filter[v] = true
				key
				:tag('tr')
					:tag('td')
						:css('text-align', 'right')
						:tag('span')
							:css('font-size', '90%')
							:css('font-weight', 'bold')
							:wikitext(notes[v].id ..'&nbsp;')
							:done()
						:done()
					:tag('td')
						:wikitext('– the match '.. notes[v].key)
			end
		end

		if future_event then
			key
			:tag('tr')
				:tag('td')
					:attr('colspan', '2')
					:css('text-align', 'center')
					:css('font-size', '85%')
					:css('font-weight', 'bold')
					:wikitext('*Card subject to change')
		end
	end

	-- Display errors
	if next(error_msg) ~= nil then
		root
		:tag('strong')
			:addClass('error')
			:wikitext('Error: invalid value at'.. table.concat(error_msg))
		-- Add tracking category later
	end

	return root
end

return p