Список эпизодов телесериала «Друзья»
- 1 year ago
- 0
- 0
Этот шаблон реализован на основе
Lua
:
|
Документацию смотри на странице шаблона {{ Таблица эпизодов }}
-- Этот модуль реализован шаблонами {{Таблица эпизодов}}, {{Таблица эпизодов/шапка}} и {{Таблица эпизодов/часть}}.
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(" " .. 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) .. "'''" .. " " .. (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]]
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[3], 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