Module:Episode table
- Afrikaans
- العربية
- Azərbaycanca
- Basa Bali
- বাংলা
- Беларуская
- Беларуская (тарашкевіца)
- भोजपुरी
- Català
- Español
- Esperanto
- فارسی
- Galego
- 한국어
- Հայերեն
- हिन्दी
- Bahasa Indonesia
- Jawa
- Kurdî
- Magyar
- മലയാളം
- मराठी
- مصرى
- Bahasa Melayu
- Mirandés
- မြန်မာဘာသာ
- नेपाली
- 日本語
- Oʻzbekcha / ўзбекча
- ਪੰਜਾਬੀ
- Português
- Qaraqalpaqsha
- Română
- Русский
- Scots
- Shqip
- Simple English
- کوردی
- Српски / srpski
- Svenska
- ၽႃႇသႃႇတႆး
- ไทย
- Тоҷикӣ
- Türkçe
- Українська
- اردو
- Tiếng Việt
- 粵語
- 中文
Appearance
From Wikipedia, the free encyclopedia
Warning This Lua module is used on approximately 22,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them.
[画像:Protected] This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing.
This module depends on the following other modules:
Usage
Creates one of three usages related to {{Episode table }} with the parameters defined in the documentation of the template:
A standard episode table with
{{#invoke:Episode table|main}}
A row for a parted season with
{{#invoke:Episode table|part}}
A white background for references used in the header row of episode tables with
{{#invoke:Episode table|ref}}
Tracking categories
The above documentation is transcluded from Module:Episode table/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
-- This module implements {{Episode table}} and {{Episode table/part}}. local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' ) -------------------------------------------------------------------------------- -- EpisodeTable class -- The main class. -------------------------------------------------------------------------------- local contrast_ratio = require('Module:Color contrast')._ratio local EpisodeTable = {} function EpisodeTable.cell(background, width, text, reference, textColor) local cell = mw.html.create('th') -- Width local cell_width if width == 'auto' then cell_width = 'auto' elseif tonumber(width) ~= nil then cell_width = width .. '%' else cell_width = nil end -- Cell cell:attr('scope','col') :css('background',background or '#CCCCFF') :css('width',cell_width) :css('color',textColor) :wikitext(text) -- Reference 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', background or '#CCCCFF', ['error'] = 0} local link2_cr = contrast_ratio{'#0B0080', background or '#CCCCFF', ['error'] = 0} local refspan = mw.html.create('span') :wikitext(reference) if link1_cr < 7 or link2_cr < 7 then 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.part(frame,args) local row = mw.html.create('tr') if (args.c == nil or args.c == '') then args.c = '#CCCCFF' end local black_cr = contrast_ratio{args.c or '#CCCCFF', 'black', ['error'] = 0} local white_cr = contrast_ratio{'white', args.c or '#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 or '#CCCCFF') :css('color', black_cr > white_cr and 'black' or 'white') :wikitext((args.nobold and displaytext or "'''" .. displaytext .. "'''") .. (args.r and " " .. EpisodeTable.reference(args.r, args.c) or '')) return tostring(row) end function EpisodeTable.new(frame,args) args = args or {} local categories = '' local background = (args.background and args.background ~= '' and args.background ~= '#') and args.background or nil -- Add # to background if necessary if background ~= nil and HTMLcolor[background] == nil then background = '#'..(mw.ustring.match(background, '^[%s#]*([a-fA-F0-9]*)[%s]*$') or '') end -- Default widths noted by local consensus local defaultwidths = {}; defaultwidths.overall = 5; defaultwidths.overall2 = 5; defaultwidths.season = 5; defaultwidths.series = 5; defaultwidths.prodcode = 7; defaultwidths.viewers = 10; -- Create episode table local root = mw.html.create('table') -- Table width local table_width = string.gsub(args.total_width or '','%%','') if args.total_width == 'auto' or 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) -- Caption if args.show_caption then -- Visible caption option, with a tracking category root:tag('caption'):wikitext(args.caption) categories = categories .. '[[Category:Articles using Template:Episode table with a visible caption]]' elseif args.caption then -- If a visible caption isn't defined, then default to the screenreader-only caption root:tag('caption'):wikitext(frame:expandTemplate{title='Screen reader-only',args={args.caption}}) end -- Colour contrast; add to category only if it's in the mainspace local title = mw.title.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 -- Main row 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') -- Cells do local used_season = false local country = args.country ~= '' and args.country ~= nil local viewers = (country and args.country or '') .. ' ' .. (country and 'v' or 'V') .. 'iewers' .. ((not args.viewers_type or args.viewers_type ~= '') and '<br />(' .. (args.viewers_type or 'millions') .. ')' or '') local cellNames = { {'overall','EpisodeNumber',EpisodeTable.abbr('No.','Number') .. ((args.season or args.series or args.EpisodeNumber2 or args.EpisodeNumber2Series or args.forceoverall) and '<br />'..(args.overall_type or 'overall') or '')}, {'overall2','*',''}, {'season','EpisodeNumber2',EpisodeTable.abbr('No.','Number') .. ' in<br />'..(args.season_type or 'season')}, {'series','EpisodeNumber2Series',EpisodeTable.abbr('No.','Number') .. ' in<br />'..(args.series_type or 'series')}, {'title','Title','Title'}, {'aux1','Aux1',''}, {'director','DirectedBy','Directed by'}, {'writer','WrittenBy','Written by'}, {'aux2','Aux2',''}, {'aux3','Aux3',''}, {'airdate','OriginalAirDate','Original release date'}, {'altdate','AltDate',''}, {'guests','Guests','Guest(s)'}, {'musicalguests','MusicalGuests','Musical/entertainment guest(s)'}, {'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]]) then thisCell = defaultwidths[v[1]] end local thisCellT = args[v[1] .. 'T'] or args[v[2] .. 'T'] local thisCellR = args[v[1] .. 'R'] or args[v[2] .. 'R'] mainRow:node(EpisodeTable.cell(background, thisCell, thisCellT or v[3], thisCellR, textColor)) end end -- Episodes 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 or '') ~= '') and mw.ustring.gsub(tostring(root), "</table>", "") or tostring(root)) .. categories .. templateStyles end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { removeBlanks = false, wrappers = 'Template:Episode table' }) local check = require('Module:Check for unknown parameters')._check local tracking = '' local title = mw.title.getCurrentTitle() if title.namespace == 0 then tracking = check({ ['unknown']='[[Category:Pages using episode table with unknown parameters|_VALUE_'..title.text..']]', ['preview']='Page using [[Template:Episode table]] with unknown parameter "_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', 'EpisodeNumber', 'EpisodeNumber2', 'EpisodeNumber2R', 'EpisodeNumber2Series', 'EpisodeNumber2SeriesR', 'EpisodeNumber2SeriesT', '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', 'viewers_type', 'viewersR', 'ViewersR', 'viewersT', 'ViewersT', 'writer', 'writerR', 'writerT', 'WrittenBy', 'WrittenByR', 'WrittenByT' }, args) end return EpisodeTable.new(frame,args) .. tracking end function p.part(frame) local args = require('Module:Arguments').getArgs(frame, { removeBlanks = false, wrappers = 'Template:Episode table/part' }) return EpisodeTable.part(frame,args) end function p.ref(frame) local args = require('Module:Arguments').getArgs(frame, { removeBlanks = false, }) return EpisodeTable.reference(args.r,args.b) end return p