Module:Episode list

local p = {}

local getArgs
local yesno = require('Module:Yesno')
local mm = require('Module:Math')
local contrast_ratio = require('Module:Color contrast')._ratio

function p.sublist(frame)
	return main(frame,true)
end

function p.list(frame)
	return main(frame,false)
end

function main(frame, sublist)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args

	-- Most parameters should still display when blank, so don't remove blanks
	if sublist then
		args = getArgs(frame, {removeBlanks = false, wrappers = 'Template:Episode list/sublist'})
	else
		args = getArgs(frame, {removeBlanks = false, wrappers = 'Template:Episode list'})
	end
	
	local title = mw.title.getCurrentTitle()
	local page_title = mw.title.getCurrentTitle().text
	local mainlist = args.MainList or args['1'] or ''
	
	-- Is this list on the same page as the page directly calling the template?
	local on_main_page
	
	-- Only sublist had anything about hiding, so only it needs to even check
	if sublist then
		on_main_page = mw.uri.anchorEncode(page_title) == mw.uri.anchorEncode(mainlist)
		-- avoid processing ghost references
		if on_main_page then
			args.ShortSummary = nil
		end
	else
	-- Normal lists can ALWAYS show the summary
		on_main_page = false
	end
	
	-- Declare all the possible <td>/<th> tags here, and the return string
	local EpisodeNumber,EpisodeNumber2,Title,Aux1,DirectedBy,WrittenBy,
			DirectedBy,Aux2,Aux3,OriginalAirDate,AltDate,ProdCode,
			Viewers,Aux4,return_table
	
	-- Need just this parameter removed if blank, no others
	if args.ShortSummary then
		if not args.ShortSummary:find('%S') then
			args.ShortSummary = nil
		end
	end

	-- Default color to light blue
	-- Hash (#) left out because it was left out in the original wikicode, so we can add it later
	local line_color = args.LineColor or 'CCCCFF'
	
	-- List of parameter names to test
	-- Keep this order as is
	local cell_names = {
		'EpisodeNumber2',
		'Title',
		'Aux1',
		'DirectedBy',
		'WrittenBy',
		'Aux2',
		'Aux3',
		'OriginalAirDate',
		'AltDate',
		'ProdCode',
		'Viewers',
		'Aux4'
	}
	
	-- Is there a way to call a variable by its name stored as a string? Doubt it
	-- This list matches strings with the table cell variables
	local td_tags = {
		['EpisodeNumber2'] = EpisodeNumber2,
		['Title'] = Title,
		['Aux1'] = Aux1,
		['DirectedBy'] = DirectedBy,
		['WrittenBy'] = WrittenBy,
		['DirectedBy'] = DirectedBy,
		['Aux2'] = Aux2,
		['Aux3'] = Aux3,
		['OriginalAirDate'] = OriginalAirDate,
		['AltDate'] = AltDate,
		['ProdCode'] = ProdCode,
		['Viewers'] = Viewers,
		['Aux4'] = Aux4,
	}
	
	local table_row = mw.html.create('tr')
				:addClass('vevent')
				:css('text-align','center')
	
	local row_color = yesno(args.RowColor, false)
	if args.RowColor and string.lower(args.RowColor) == 'on' then
		row_color = true
	end

	local top_color
	local epn = mm._cleanNumber(args.EpisodeNumber) or 1
	if args.TopColor then
		top_color = '#'..args.TopColor
	elseif row_color and not on_main_page and mm._mod(epn,2) == 0 then
		top_color = '#E9E9E9'
	elseif not on_main_page and args.ShortSummary then
		top_color = '#F2F2F2'
	else
		top_color = 'inherit'
	end
		
	table_row:css('background',top_color)
	
	-- This will decide the colspan= of the summary cell
	-- Start as 1 because EpisodeNumber is always created
	local nonnil_params = 1
	
	-- Created separately because it is the only <th> tag
	
	if args.EpisodeNumber then
		EpisodeNumber = mw.html.create('th')
				:attr('scope','row')
				:attr('id','ep'..args.EpisodeNumber)
				:css('text-align','center')
				:wikitext(args.EpisodeNumber)
		table_row:css('background',top_color)
		table_row:node(EpisodeNumber)
	end
	
	-- The wikitext in the Title cell is a little more involved than the others
	local function add_title()
		local title_string = ''
		
		-- Surround the Title with quotes; no quotes if empty
		if args.Title and args.Title:find('%S') then
			title_string = title_string..'"'..args.Title..'"'
		end
		
		if args.RTitle then
			title_string = title_string..args.RTitle
		end
		
		-- Surround the AltTitle with quotes; no quotes if empty
		if args.AltTitle and args.AltTitle:find('%S') then
			title_string = title_string..'<br>"'..args.AltTitle..'"'
		end
			
		if args.RAltTitle then
			title_string = title_string..args.RAltTitle
		end
		return title_string
	end

	for _,v in ipairs(cell_names) do
		-- Title is in the middle, so it's probably better to just switch back and again instead of doing 2 nodes
		-- and then title, and then the rest in a loop
		if v == 'Title' then
			nonnil_params = nonnil_params + 1
			local title_text = add_title()
			td_tags[v] = mw.html.create('td')
			td_tags[v]:wikitext(title_text)
					:addClass('summary')
					:css('text-align','left')
			table_row:node(td_tags[v])
		elseif args[v] then
			nonnil_params = nonnil_params + 1
			td_tags[v] = mw.html.create('td')
			td_tags[v]:wikitext(args[v])
			table_row:node(td_tags[v])
		end
	end

	-- Production code also has an additional attribute, so add it separately here
	if td_tags.ProdCode and args.ProdCode then
		td_tags.ProdCode:attr('id','pc'..args.ProdCode)
	end
	
	local categories = ''
	
	-- add these categories only in the mainspace and only if they are on the page where the template is used
	if not on_main_page and title.namespace == 0 then
		if args.LineColor and args.LineColor ~= '' then
			local black_cr = contrast_ratio{args.LineColor, 'black', ['error'] = 0}
			local white_cr = contrast_ratio{'white', args.LineColor, ['error'] = 0}
			if black_cr < 7 and white_cr < 7 then
				categories = categories..'[[Category:Episode lists with invalid line colors]]' 
			end
		else
			categories = categories..'[[Category:Episode list using the default LineColor]]'
		end
		
		if args.TopColor and args.TopColor ~= '' then
			categories = categories..'[[Category:Episode lists with row deviations]]'

			-- Track top colors that have a color contrast rating below AAA with
			-- respect to text color, link color, or visited link color. See
			-- [[WP:COLOR]] for more about color contrast requirements.
			local text_cr = contrast_ratio{args.TopColor, 'black', ['error'] = 0}
			local link_cr = contrast_ratio{args.TopColor, '#0B0080', ['error'] = 0}
			local visited_link_cr = contrast_ratio{args.TopColor, '#0645AD', ['error'] = 0}
			if text_cr < 7 or link_cr < 7 or visited_link_cr < 7 then
				categories = categories..'[[Category:Episode lists with invalid top colors]]'
			end
		end
	end
	
	-- Do not show the summary if this is being transcluded on the mainlist page
	-- Do include it on all other lists
	if not on_main_page and args.ShortSummary then
		local bottom_wrapper = mw.html.create('tr')
		-- fix for lists in the Short Summary
		local ss = args.ShortSummary
		if ss:match('^[*:;#]') or ss:match('^{|') then
			ss = '<span></span>\n' .. ss
		end
		if ss:match('\n[*:;#]') then
			ss = ss .. '\n<span></span>'
		end
		local ShortSummary = mw.html.create('td')
					:addClass('description')
					:css('border-bottom','solid 3px #'..line_color)
					:attr('colspan',nonnil_params)
					:newline()
					:wikitext(ss)
		bottom_wrapper:node(ShortSummary)
		return tostring(table_row)..tostring(bottom_wrapper)..categories
	else
		return tostring(table_row)..categories
	end
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.