Модуль:Таблица эпизодов: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
отмена Режиссёра; желательно сделать работоспособными оба написания
мНет описания правки
(не показана 1 промежуточная версия этого же участника)
Строка 166: Строка 166:
local cellNames = {
local cellNames = {
{'overall','Номер',EpisodeTable.abbr('№','Номер') ..
{'overall','Номер','',EpisodeTable.abbr('№','Номер') ..
((args.season or args['Сезон'] or args.forceoverall or args['ОбщийНомер']) and '<br>об­щий' or '')},
((args.season or args['Сезон'] or args.forceoverall or args['ОбщийНомер']) and '<br>об­щий' or '')},
{'overall2','Номер2',EpisodeTable.abbr('№','Номер') .. (args['Номер2ТАббр'] and args['Номер2АббрТ'] and '<br>' .. EpisodeTable.abbr(args['Номер2ТАббр'],args['Номер2АббрТ']) or '')},
{'overall2','Номер2','',EpisodeTable.abbr('№','Номер') .. (args['Номер2ТАббр'] and args['Номер2АббрТ'] and '<br>' .. EpisodeTable.abbr(args['Номер2ТАббр'],args['Номер2АббрТ']) or '')},
{'season','Сезон',EpisodeTable.abbr('№','Номер') .. ' в<br>се­зо­не'},
{'season','Сезон','',EpisodeTable.abbr('№','Номер') .. ' в<br>се­зо­не'},
{'series','Серия',EpisodeTable.abbr('№','Номер') .. 'в<br>се­зо­не'},
{'series','Серия','',EpisodeTable.abbr('№','Номер') .. 'в<br>се­зо­не'},
{'title','Название','Наз­ва­ние'},
{'title','Название','','Наз­ва­ние'},
{'aux1','Столбец1',''},
{'aux1','Столбец1','',''},
{'director','Режиссер','Ре­жис­сёр'},
{'director','Режиссер','Режиссёр','Ре­жис­сёр'},
{'writer','Сценарист','Ав­тор сце­на­рия'},
{'writer','Сценарист','','Ав­тор сце­на­рия'},
{'aux2','Столбец2',''},
{'aux2','Столбец2','',''},
{'aux3','Столбец3',''},
{'aux3','Столбец3','',''},
{'airdate','ДатаПоказа','Да­та пре­мье­ры'},
{'airdate','ДатаПоказа','','Да­та пре­мье­ры'},
{'altdate','ДатаПоказа2',''},
{'altdate','ДатаПоказа2','',''},
{'prodcode','ПродКод',EpisodeTable.abbr('Про­изв.','Производственный') .. '<br>код'},
{'prodcode','ПродКод','',EpisodeTable.abbr('Про­изв.','Производственный') .. '<br>код'},
{'viewers','Зрителей',viewers},
{'viewers','Зрителей','',viewers},
{'aux4','Столбец4',''}
{'aux4','Столбец4','',''}
}
}
for k,v in pairs(cellNames) do
for k,v in pairs(cellNames) do
local thisCell = args[v[1]] or args[v[2]]
local thisCell = args[v[1]] or args[v[2]] or args[v[3]]
if thisCell and ((v[1] ~= 'series' or v[2] ~= 'Серия') or (v[1] == 'series' or v[2] == 'Серия' and used_season == false)) then
if thisCell and ((v[1] ~= 'series' or v[2] ~= 'Серия') or (v[1] == 'series' or v[2] == 'Серия' and used_season == false)) then
if v[1] == 'season' or v[2] == 'Сезон' then used_season = true end
if v[1] == 'season' or v[2] == 'Сезон' then used_season = true end
Строка 193: Строка 193:
local thisCellT = args[v[1] .. 'T'] or args[v[2] .. 'T'] or args[v[1] .. 'Т'] or args[v[2] .. 'Т']
local thisCellT = args[v[1] .. 'T'] or args[v[2] .. 'T'] or args[v[1] .. 'Т'] or args[v[2] .. 'Т']
local thisCellR = args[v[1] .. 'R'] or args[v[2] .. 'R'] or args[v[1] .. 'С'] or args[v[2] .. 'С']
local thisCellR = args[v[1] .. 'R'] or args[v[2] .. 'R'] or args[v[1] .. 'С'] or args[v[2] .. 'С']
mainRow:node(EpisodeTable.cell(background, thisCell, thisCellT or v[3], thisCellR))
mainRow:node(EpisodeTable.cell(background, thisCell, thisCellT or v[4], thisCellR))
end
end
end
end

Версия от 18:15, 7 февраля 2024

Документация

Документацию смотри на странице шаблонов {{Таблица эпизодов}} и {{Список серий}}

-- Этот модуль реализован шаблонами {{Таблица эпизодов}}, {{Таблица эпизодов/шапка}} и {{Таблица эпизодов/часть}}.

local HTMLcolor = mw.loadData('Модуль:Color contrast/colors')
local contrast_ratio = require('Модуль:Color contrast')._ratio
local anchor = require('Модуль:Якорь').main

--------------------------------------------------------------------------------
-- EpisodeTable class
-- The main class.
--------------------------------------------------------------------------------

local EpisodeTable = {}

function EpisodeTable.cell(background, width, text, reference)
	local cell = mw.html.create('th')
	
	-- Ячейка
	cell:attr('scope','col')
		:css('background',background or '#ccccff')
		:css('width',width ~= '' and width .. '%' or nil)
		:wikitext(text)
	
	-- Сноска на примечание
	if reference then
		cell:wikitext("&#8202;" .. EpisodeTable.reference(reference, background))
	end
	
	return cell
end

function EpisodeTable.reference(reference, background)
	-- контрастность с непосещенной и посещенной ссылкой
	local link1_cr = contrast_ratio{background or '#ccccff', '#0645AD', ['error'] = 0}
	local link2_cr = contrast_ratio{background or '#ccccff', '#0B0080', ['error'] = 0}
	
	local refspan = mw.html.create('span')
			:wikitext(reference)
	
	if link1_cr < 7 or link2_cr < 7 then
		refspan
			:css('background-color',link1_cr < 3 and link2_cr < 3 and '#f8f9fa' or 'transparent')
			:css('color',link1_cr < 3 and link2_cr < 3 and 'white' or 'black')
			:css('padding','1px')
			:css('display','inline-block')
			:css('line-height','50%')
	end
	
	return tostring(refspan)
end

function EpisodeTable.abbr(text,title)
	local abbr = mw.html.create('abbr')
		:attr('title',title)
		:wikitext(text)
	return tostring(abbr)
end

function EpisodeTable.part(frame,args)
	local row = mw.html.create('tr')
		:newline()
	
	local partArgs = {'nopart','Часть','c','Цвет','p','Текст','r','Ссылка'}
	local noAnchor = args[partArgs[1]] or args[partArgs[2]]
	local cellColor = args[partArgs[3]] or args[partArgs[4]] or '#ccccff'
	local cellText = args[partArgs[5]] or args[partArgs[6]]
	local cellRef = args[partArgs[7]] or args[partArgs[8]] or ''
	
	-- Добавление # при необходимости
	if args[partArgs[3]]  == '' or args[partArgs[4]] == '' then
		cellColor = '#ccccff'
	end
	
	if cellColor ~= nil and HTMLcolor[cellColor] == nil then
		cellColor = '#'..(mw.ustring.match(cellColor, '^[%s#]*([a-fA-F0-9]*)[%s]*$') or 'ccccff')
	end
	
	local black_cr = contrast_ratio{'black', cellColor or '#ccccff', ['error'] = 0}
	local white_cr = contrast_ratio{'white', cellColor or '#ccccff', ['error'] = 0}
	
	local anchorText = (not noAnchor and 'Part ' or '') .. (cellText or '')
	local displayText = (not noAnchor and 'Часть ' or '') .. (cellText or '')
	
	if (cellRef ~= nil and cellRef ~= '') then
		cellRef = EpisodeTable.reference(cellRef, cellColor)
	else
		cellRef = ''
	end
	
	row:tag('td')
		:attr('colspan',13)
		:css('text-align','center')
		:css('background-color', cellColor)
		:css('color', black_cr > white_cr and 'black' or 'white')
		:wikitext("'''" .. (not noAnchor and anchor{visible = true, text = displayText, anchorText or args.id} or displayText) .. "'''" .. "&#8202;" .. (cellRef or '')) 
	
	return tostring(row)
end

function EpisodeTable.new(args, dontclose)
	args = args or {}
	local categories = ''
	local cellBackground = {'background','ЦветФона'}
	local thisBackground = args[cellBackground[1]] or args[cellBackground[2]]
	local background = (thisBackground and thisBackground ~= '' and thisBackground ~= '#') and thisBackground or nil
	
	-- Добавление # при необходимости
	if background ~= nil and HTMLcolor[background] == nil then
		background = '#'..(mw.ustring.match(background, '^[%s#]*([a-fA-F0-9]*)[%s]*$') or '')
	end
	
	-- Ширина ячеек по умолчанию
	local defaultwidths = {
	overall = 5,['Номер'] = 5,
	overall2 = 5,['Номер2'] = 5,
	season = 5,['Сезон'] = 5,
	series = 5,['Серия'] = 5,
	airdate = 10,['ДатаПоказа'] = 10,
	altdate = 10,['ДатаПоказа2'] = 10,
	prodcode = 7,['ПродКод'] = 7,
	viewers = 10,['Зрителей'] = 10
	}
	
	-- Сздание таблицы эпизодов
	local root = mw.html.create('table')
	local cellTotalWidth = {'total_width','ОбщаяШирина'}
	local thisTotalWidth = args[cellTotalWidth[1]] or args[cellTotalWidth[2]]
		
	root
		:addClass('wikitable')
		:addClass('plainrowheaders')
		:addClass('wikiepisodetable')
		:css('width', thisTotalWidth and string.gsub(thisTotalWidth,'%%','') .. '%' or '100%')
	
	-- Заголовок
	local cellCaption = {'caption','Заголовок'}
	local thisCaption = args[cellCaption[1]] or args[cellCaption[2]]
	if thisCaption then
		root:tag('caption'):wikitext(thisCaption)
	end
	
	-- Цветовой контраст; добавление в категории, если основное пространство имен
	local title = mw.title.getCurrentTitle()
	local black_cr = contrast_ratio{background or '#ccccff', 'black', ['error'] = 0}
	local white_cr = contrast_ratio{'white', background or '#ccccff', ['error'] = 0}
	
	if title.namespace == 0 and (args.background and args.background ~= '' and args.background ~= '#') and black_cr < 4.5 and white_cr < 4.5 then
		categories = categories .. '[[Категория:Википедия:Потенциально нечитаемые таблицы эпизодов]]' 
	end
	
	-- Основная строка
	local mainRow = root:tag('tr')
	mainRow
		:css('color', background and (black_cr > white_cr and 'black' or 'white') or 'black')
		:css('text-align', 'center')
	
	-- Ячейки
	do
		local used_season = false
		local cellCountry = {'country','Страна'}
	    local thisCountry = args[cellCountry[1]] or args[cellCountry[2]]
		local country = thisCountry ~= '' and thisCountry ~= nil
		local cellViewersType = {'viewers_type','ЗрителейТ'}
	    local thisViewersType = args[cellViewersType[1]] or args[cellViewersType[2]]
		local viewers = 'Зри­те­ли ' .. (country and thisCountry or '') ..
			((not thisViewersType or thisViewersType ~= '') and '<br>(' .. (thisViewersType or 'млн') .. ')' or '')
		
		local cellNames = {
			{'overall','Номер','',EpisodeTable.abbr('№','Номер') ..
				((args.season or args['Сезон'] or args.forceoverall or args['ОбщийНомер']) and '<br>об­щий' or '')},
			{'overall2','Номер2','',EpisodeTable.abbr('№','Номер') .. (args['Номер2ТАббр'] and args['Номер2АббрТ'] and '<br>' .. EpisodeTable.abbr(args['Номер2ТАббр'],args['Номер2АббрТ']) or '')},
			{'season','Сезон','',EpisodeTable.abbr('№','Номер') .. ' в<br>се­зо­не'},
			{'series','Серия','',EpisodeTable.abbr('№','Номер') .. 'в<br>се­зо­не'},
			{'title','Название','','Наз­ва­ние'},
			{'aux1','Столбец1','',''},
			{'director','Режиссер','Режиссёр','Ре­жис­сёр'},
			{'writer','Сценарист','','Ав­тор сце­на­рия'},
			{'aux2','Столбец2','',''},
			{'aux3','Столбец3','',''},
			{'airdate','ДатаПоказа','','Да­та пре­мье­ры'},
			{'altdate','ДатаПоказа2','',''},
			{'prodcode','ПродКод','',EpisodeTable.abbr('Про­изв.','Производственный') .. '<br>код'},
			{'viewers','Зрителей','',viewers},
			{'aux4','Столбец4','',''}
		}
	
		for k,v in pairs(cellNames) do
			local thisCell = args[v[1]] or args[v[2]] or args[v[3]]
			if thisCell and ((v[1] ~= 'series' or v[2] ~= 'Серия') or (v[1] == 'series' or v[2] == 'Серия' and used_season == false)) then
				if v[1] == 'season' or v[2] == 'Сезон' then used_season = true end
				if (k <= 3 and thisCell == '') then thisCell = '5' end
				if (thisCell == '' and defaultwidths[v[1]]) then thisCell = defaultwidths[v[1]] end
				
				local thisCellT = args[v[1] .. 'T'] or args[v[2] .. 'T'] or args[v[1] .. 'Т'] or args[v[2] .. 'Т']
				local thisCellR = args[v[1] .. 'R'] or args[v[2] .. 'R'] or args[v[1] .. 'С'] or args[v[2] .. 'С']
				mainRow:node(EpisodeTable.cell(background, thisCell, thisCellT or v[4], thisCellR))
			end
		end
	
		-- Episodes
		local cellEpisodes = {'episodes','Эпизоды'}
		local thisEpisodes = args[cellEpisodes[1]] or args[cellEpisodes[2]]
		root:node(thisEpisodes)
	end
	
	return (dontclose and mw.ustring.gsub(tostring(root), "</table>", "") or tostring(root)) .. categories
end

--------------------------------------------------------------------------------
-- Экспорт
--------------------------------------------------------------------------------

local p = {}

function p.main(frame)
	local args = require('Модуль:Arguments').getArgs(frame, {
		removeBlanks = false,
		wrappers = {
			'Шаблон:Таблица эпизодов',
			'Шаблон:Таблица эпизодов/песочница'
			},
	})
	return EpisodeTable.new(args)
end

function p.maint(frame)
	local args = require('Модуль:Arguments').getArgs(frame, {
		removeBlanks = false,
		wrappers = {
			'Шаблон:Таблица эпизодов/шапка',
			'Шаблон:Таблица эпизодов/песочница/шапка'
			}
	})
	return EpisodeTable.new(args, true)
end

function p.part(frame)
	local args = require('Модуль:Arguments').getArgs(frame, {
		removeBlanks = false,
		wrappers = {
			'Шаблон:Таблица эпизодов/часть',
			'Шаблон:Таблица эпизодов/песочница/часть'
			}
	})
	return EpisodeTable.part(frame,args)
end

function p.ref(frame)
	local args = require('Модуль:Arguments').getArgs(frame, {
		removeBlanks = false,
		-- wrappers = 'Шаблон:Таблица эпизодов/примечание'
	})
	return EpisodeTable.reference(args.r,args.b)
end

return p