Модуль:Таблица эпизодов

-- Этот модуль реализует {{Таблицу эпизодов}} и {{Таблицу эпизодов/часть}}. local HTMLcolor = mw . loadData ( 'Модуль:Цветовой контраст/цвета' ) -------------------------------------------------------------------------------- -- Класс EpisodeTable -- Основной класс. -------------------------------------------------------------------------------- local contrast_ratio = require ( 'Модуль:Цветовой контраст' ). _ratio local EpisodeTable = {} function EpisodeTable . cell ( background , width , text , reference , textColor ) local cell = mw . html . create ( 'th' ) — Ширина local cell_width if width == 'auto' then cell_width = 'auto' elseif tonumber ( width ) ~= nil then cell_width = width .. '%' else cell_width = nil end — Ячейка cell : attr ( 'scope' , 'col' ) : css ( 'background' , background or '#CCCCFF' ) : css ( 'width' , cell_width ) : css ( 'color' , textColor ) : wikitext ( text ) — Ссылка if reference and reference ~= '' then cell : wikitext ( " ; " .. EpisodeTable.reference ( reference , background ) ) end return cell end function EpisodeTable.reference ( reference , background ) local link1_cr =                                                     contrast_ratio { '#0645AD' ,  фон  или  '#CCCCFF' ,  [ 'error' ]  =  0 } local link2_cr = contrast_ratio { '#0B0080' , фон или '#CCCCFF' , [ 'error' ] = 0 } local refspan = mw . html . создать ( 'span' ) : wikitext ( reference ) если link1_cr < 7 или link2_cr < 7 тогда refspan : css ( 'color' , 'black' ) : css ( 'background-color' , 'white' ) : 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 . часть ( фрейм , аргументы ) локальная строка = mw . html . create ( ' tr' ) если ( args . c == nil или args . c == '' ) тогда args .c = '#CCCCFF' конец локального black_cr =                                             contrast_ratio { args . c  или  '#CCCCFF' ,  'черный' ,  [ 'ошибка' ]  =  0 } local white_cr = contrast_ratio { 'белый' , args . c или '#CCCCFF' , [ 'error' ] = 0 } local partTypes = { { 'act' , 'Act' }, { 'chapter' , 'Chapter' }, { 'part' , 'Part' }, { 'volume' , 'Volume' }, { 'week' , 'Week' }, } local displaytext = '' local isAnyPartSet = false for k , v in pairs ( partTypes ) do if args [ v [ 1 ]] then isAnyPartSet = true displaytext = v [ 2 ] .. ' ' .. args [ v [ 1 ]] end end if args . subtitle then displaytext = displaytext .. (( isAnyPartSet and ': ' or '' ) .. args . subtitle ) end local plainText = require ( 'Module:Plain text' ). _main local displayTextAnchor = plainText ( displaytext ) row : tag ( 'td' ) : attr ( 'colspan' , 13 ) : attr ( 'id' , args . id or displayTextAnchor ) :css ( 'text-align' , 'center' ) :                                                       css (    ' background - color' , args.c или ' #CCCCFF ' ) : css ( ' color' , black_cr > white_cr и 'black' или 'white' ) : wikitext (( args.nobold и displaytext или "'''" .. displaytext .. " ' ' '" ) .. ( args.r и " " .. EpisodeTable.reference ( args.r , args.c ) или ' ' ) ) return tostring ( row ) end function EpisodeTable.new ( frame , args ) args = args или { } local categories = ' ' local background = ( args.background и args.background ~ = ' ' и args.background ~ = ' # ' ) и args . background или nil — При необходимости добавьте # к фону, если background ~= nil и HTMLcolor [ background ] == nil then background = '#' .. ( mw . ustring . match ( background , '^[%s#]*([a-fA-F0-9]*)[%s]*$' ) или '' ) end — Ширина по умолчанию, указанная локальным консенсусом local defaultwidths = {}; defaultwidths . general = 5 ; defaultwidths . general2 = 5 ; defaultwidths . season = 5 ; defaultwidths .series = 5 ; ширина по умолчанию                                                                        . prodcode  =  7 ; defaultwidths . viewers = 10 ; -- Создать таблицу эпизодов local root = mw . html . create ( 'table' ) -- Ширина таблицы local table_width = string. gsub ( args . total_width или '' , '%%' , '' ) если args . total_width == 'auto' или args . total_width == '' then table_width = 'auto' elseif tonumber ( table_width ) ~= nil then table_width = table_width .. '%' else table_width = '100%' end root : addClass ( 'wikitable' ) : addClass ( 'plainrowheaders' ) : addClass ( 'wikiepisodetable' ) : css ( 'width' , table_width ) -- Подпись if args . show_caption then -- Видимая опция подписи с отслеживаемой категорией root : tag ( 'caption' ): wikitext ( args . caption ) categories = categories .. '[[Категория:Статьи с использованием таблицы Шаблон:Эпизод с видимой подписью]]' elseif args . caption then -- Если видимая подпись не определена, то по умолчанию используется подпись только для чтения с экрана root : tag ( 'caption' ): wikitext ( frame : expandTemplate { title = 'Только для чтения с экрана' , args = { args . caption }}) end -- Цветовой контраст; добавлять в категорию, только если она находится в основном пространстве local title = mw .заголовок                                          . getCurrentTitle () local black_cr = contrast_ratio { background , 'black' , [ 'error' ] = 0 } local white_cr = contrast_ratio { 'white' , background , [ 'error' ] = 0 } if title . namespace == 0 and ( args . background and args . background ~= '' and args . background ~= '#' ) and black_cr < 7 and white_cr < 7 then categories = categories .. '[[Category:Articles using Template:Episode table with invalid colour combination]]' end -- Основная строка local textColor = background and ( black_cr > white_cr and 'black' or 'white' ) or 'black' local mainRow = root : tag ( 'tr' ) mainRow : css ( 'color' , textColor ) : css ( 'text-align' , 'center' ) -- Ячейки делают local used_season = false local country = args . country ~= '' and args . страна ~= nil локальные зрители = ( страна и аргументы . страна или '' ) .. ' ' .. ( страна и 'v' или 'V' ) .. 'iewers' .. (( не аргументы . тип_зрителей или аргументы .viewers_type ~= '' ) и '<br />('                                                                                                 ..  ( args . viewers_type  или  'millions' )  ..  ')'  или  '' ) local cellNames = { { 'overall' , 'EpisodeNumber' , EpisodeTable . abbr ( 'No.' , 'Number' ) .. (( args . season или args . series или args . EpisodeNumber2 или args . EpisodeNumber2Series или args . forceoverall ) и '<br />' .. ( args . general_type или 'overall' ) или '' )}, { 'overall2' , '*' , '' }, { 'season' , 'EpisodeNumber2' , EpisodeTable . abbr ( '№' , 'Номер' ) .. 'в' .. ( args . тип_сезона или 'сезон' )}, { 'серия' , 'НомерЭпизода2Серии' , ТаблицаЭпизодов . abbr ( '№' , 'Номер' ) .. ' в<br />' .. ( args . series_type или 'series' )}, { 'title' , 'Название' , 'Название' }, { 'aux1' , 'Aux1' , '' }, { 'director' , 'DirectedBy' , 'Режиссер' }, { 'writer' , 'WrittenBy' , 'Написано' }, { 'aux2' , 'Aux2' , '' }, { 'aux3' , 'Aux3' , '' },{ 'airdate' , 'OriginalAirDate' , 'Оригинальная дата выпуска' }, { 'altdate' , 'AltDate' , ''                          }, { 'guests' , 'Гости' , 'Гость(и)' }, { 'musicalguests' , 'MusicalGuests' , 'Гость(и) мюзикла/развлечения' }, { 'prodcode' , 'ProdCode' , EpisodeTable . abbr ( 'Prod.' , 'Production' ) .. '<br />code' }, { 'viewers' , 'Viewers' , viewers }, { 'aux4' , 'Aux4' , '' } } for k , v in pairs ( cellNames ) do local thisCell = args [ v [ 1 ]] or args [ v [ 2 ]] if thisCell and ( v [ 1 ] ~= 'series' or ( v [ 1 ] == 'series' and used_season == false )) then if v [ 1 ] == 'season' then used_season = true end if ( k <= 3 and thisCell == '' ) then thisCell = '5' end if ( thisCell == '' and defaultwidths [ v [ 1 ]]) тогда thisCell = defaultwidths [ v [ 1 ]] конец local thisCellT = args [ v [ 1 ] .. 'T' ] или args [ v [ 2 ] .. 'T' ] local thisCellR = args [ v [ 1 ] ..'R' ] или args [ v [                                                                       2 ]  ..  'R' ] mainRow : node ( EpisodeTable . cell ( background , thisCell , thisCellT или v [ 3 ], thisCellR , textColor )) end end -- Эпизоды if args . episodes then if args . anchor then args . episodes = string. gsub ( args . episodes , "(id= \" )(ep%w+ \" )" , "%1" .. args . anchor .. "%2" ) end root : node ( args . episodes ) end end local templateStyles = mw . getCurrentFrame (): extensionTag { name = 'templatestyles' , args = { src = 'Module:Episode table/styles.css' } } return ((( args . dontclose или '' ) ~= '' ) и mw . ustring . gsub ( tostring ( root ), "</table>" , "" ) или tostring ( root )) .. categories .. templateStyles end -------------------------------------------------------------------------------- -- Экспортирует -------------------------------------------------------------------------------- local p = {} function p . main ( frame ) local args = require ( 'Module:Arguments' ). getArgs ( frame , { removeBlanks = false , wrappers = 'Template:Таблица эпизодов }) локальная                                                            check  =  require ( 'Модуль : Проверка неизвестных параметров' ) ._ check локальное отслеживание = ' ' локальное название = mw.название.getCurrentTitle ( ) if название . пространство имен == 0 тогда отслеживание = проверка ({ [ 'unknown' ] = '[[Категория:Страницы, использующие таблицу эпизодов с неизвестными параметрами|_VALUE_' .. title . text .. ']]' , [ 'preview' ] = 'Страница, использующая [[Шаблон:Таблица эпизодов]] с неизвестным параметром "_VALUE_"' , [ 'showblankpositional' ] = 'y' , 'airdate' , 'airdateR' , 'airdateT ' , 'altdate ' , 'AltDate' , ' altdateR' , 'AltDateR' , 'altdateT' , 'AltDateT' , 'anchor' , 'aux1' , 'Aux1' , 'aux1R' , 'Aux1R' , 'aux1T' , 'Aux1T' , 'aux2 ' , 'Aux2 ' , 'aux2R ' , 'Aux2R' , 'aux2T' , 'Aux2T' , 'aux3 ' , ' Aux3 ' , 'aux3R' , ' Aux3R ' , ' aux3T' , ' Aux3T' , 'aux4' , 'Aux4' , 'aux4R' , ' Aux4R' , 'aux4T ' , 'Aux4T' , 'b' , 'background' , 'c' , 'caption' , 'country' , 'DirectedBy' , 'DirectedByR' , 'DirectedByT' , 'director' , 'directorR' , 'directorT' ,'dontclose' , 'НомерЭпизода' , 'НомерЭпизода2' , 'НомерЭпизода2R' , 'НомерЭпизода2Серия' , 'НомерЭпизода2СерияR' , 'НомерЭпизода2СерияT' ,                                                         'EpisodeNumber2T' ,  'EpisodeNumberR' ,  'EpisodeNumberT' , 'episodes' , 'forceoverall' , 'guests' , 'Guests' , 'guestsR' , 'GuestsR' , ' guestsT' , 'GuestsT' , 'id' , 'musicalguests' , 'MusicalGuests' , 'musicalguestsR' , 'MusicalGuestsR ' , 'musicalguestsT' , 'MusicalGuestsT' , 'OriginalAirDate' , 'OriginalAirDateR' , 'OriginalAirDateT' , 'overall' , 'overall_type' , 'overall2' , 'overall2R' , 'overall2T' , 'overallR ' , 'overallT ' , 'prodcode ' , 'ProdCode' , ' prodcodeR' , 'ProdCodeR' , 'prodcodeT' , 'ProdCodeT' , 'r' , 'season' , 'season_type' , 'seasonR' , 'seasonT' , 'series' , 'series_type' , 'seriesR' , 'seriesT' , 'show_caption' , 'subtitle' , 'title' , 'Title' , 'titleR' , 'TitleR' , 'titleT' , 'TitleT' , 'total_width' , 'viewers' , 'Зрители' , 'viewers_type' , 'viewersR' , 'ViewersR' , 'viewersT' , 'ViewersT' , 'писатель' , 'writerR' , 'writerT' , 'WrittenBy' , 'WrittenByR' , 'WrittenByT' }, args ) end return EpisodeTable .new ( frame , args ) .. отслеживание конечной функции p . part ( frame ) local args = require ( 'Module:Arguments' ). getArgs (                                                            frame ,  { removeBlanks = false , wrappers = ' Шаблон: таблица эпизодов/ часть ' } ) return EpisodeTable.part ( frame , args ) end function p.ref ( frame ) local args = require ( ' Модуль : Аргументы ' ) . getArgs ( frame , { removeBlanks = false , } ) return EpisodeTable.reference ( args.r , args.b ) end return p              
Взято с "https://en.wikipedia.org/w/index.php?title=Module:Episode_table&oldid=1272040166"