Modul:Episode table
Megjelenés
Episode table[mi ez?] • [dokumentáció: mutat, ] • [tesztek: létrehozás]
-- This module implements {{Epizód táblázat}} and {{Epizód táblázat/rész}}.
local HTMLcolor = mw.loadData( 'Modul:Color contrast/colors' )
--------------------------------------------------------------------------------
-- EpisodeTable class
-- The main class.
--------------------------------------------------------------------------------
local contrast_ratio = require('Modul:Color contrast')._ratio
local EpisodeTable = {}
local parameterAliases = {
caption = {'caption', 'felirat'},
background = {'background', 'háttér'},
overall = {'overall', 'összesen'},
season = {'season', 'évad'},
title = {'title', 'cím'},
titleR = {'titleR', 'címF'},
titleT = {'titleT', 'címC'},
aux1 = {'aux1', 'egyéb1'},
aux1R = {'aux1R', 'egyéb1F'},
aux1T = {'aux1T', 'egyéb1C'},
director = {'director', 'rendező'},
directorR = {'directorR', 'rendezőF'},
directorT = {'directorT', 'rendezőC'},
writer = {'writer', 'író'},
writerR = {'writerR', 'íróF'},
writerT = {'writerT', 'íróC'},
aux2 = {'aux2', 'egyéb2'},
aux2R = {'aux2R', 'egyéb2F'},
aux2T = {'aux2T', 'egyéb2C'},
aux3 = {'aux3', 'egyéb3'},
aux3R = {'aux3R', 'egyéb3F'},
aux3T = {'aux3T', 'egyéb3C'},
airdate = {'airdate', 'sugárzás'},
airdateR = {'airdateR', 'sugárzásF'},
airdateT = {'airdateT', 'sugárzásC'},
prodcode = {'prodcode', 'gyártási szám'},
viewers = {'viewers', 'nézettség'},
viewersR = {'viewersR', 'nézettségF'},
viewersT = {'viewersT', 'nézettségC'},
country = {'country', 'eredeti ország'},
aux4 = {'aux4', 'egyéb4'},
aux4R = {'aux4R', 'egyéb4F'},
aux4T = {'aux4T', 'egyéb4C'},
episodes = {'episodes', 'epizódok'},
act = {'act', 'felvonás'},
chapter = {'chapter', 'fejezet'},
part = {'part', 'rész'},
volume = {'volume', 'kötet'},
week = {'week', 'hét'},
subtitle = {'subtitle', 'alcím'},
c = {'c', 'sz'}
}
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
-- Add # to color if necessary
if args.c ~= nil and HTMLcolor[args.c] == nil then
args.c = '#'..(mw.ustring.match(args.c, '^[%s#]*([a-fA-F0-9]*)[%s]*$') or '')
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','felvonás'},
{'chapter','fejezet'},
{'part','rész'},
{'volume','kötet'},
{'week','hét'},
}
local displaytext = ''
local isAnyPartSet = false
for k,v in pairs(partTypes) do
if args[v[1]] then
isAnyPartSet = true
displaytext = args[v[1]] .. '. ' .. v[2]
end
end
if args.subtitle then
displaytext = displaytext .. ((isAnyPartSet and ': ' or '') .. args.subtitle)
end
local plainText = require('Modul: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
local function applyParameterAliases(args)
for internal, aliases in pairs(parameterAliases) do
for _, alias in ipairs(aliases) do
if args[alias] ~= nil then
if args[internal] ~= nil and args[internal] ~= args[alias] then
error('Parameter conflict: "' .. alias .. '" and "' .. internal .. '" cannot be used together.')
end
args[internal] = args[alias]
end
end
end
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 Sablon:Epizód táblázat 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 Sablon:Epizód táblázat 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('Sor.','Epizód sorszáma a sorozatban')},
{'overall2','*',''},
{'season','EpisodeNumber2',EpisodeTable.abbr('Év.','Epizód sorszáma az évadban')},
{'series','EpisodeNumber2Series',EpisodeTable.abbr('Év.','Epizód sorszáma az évadban')},
{'title','Title','Cím'},
{'aux1','Aux1',''},
{'director','DirectedBy','Rendező'},
{'writer','WrittenBy','Író'},
{'aux2','Aux2',''},
{'aux3','Aux3',''},
{'airdate','OriginalAirDate','Premier'},
{'guests','Guests','Vendég(ek)'},
{'musicalguests','MusicalGuests','Musical/entertainment guest(s)'},
{'prodcode','ProdCode','Gyártási<br />szám'},
{'viewers','Viewers',"Nézettség"},
{'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 = 'Modul: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('Modul:Arguments').getArgs(frame, {
removeBlanks = false,
wrappers = 'Sablon:Epizód táblázat'
})
local check = require('Modul: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 [[Sablon:Epizód táblázat]] with unknown parameter "_VALUE_"',
['showblankpositional']='y',
['regexp1']='[%w_]+NULL',
'airdate', 'airdateR', 'airdateT', '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',
'altdate', 'altdateR', 'altdateT',
-- MAGYAR PARAMÉTEREK
'háttér', 'felirat', 'összesen', 'összesenF', 'összesenC', 'összesen2', 'összesen2F', 'összesen2C',
'sorozat', 'sorozatF', 'sorozatC', 'évad', 'évadF', 'évadC', 'cím', 'címF', 'címC',
'rendező', 'rendezőF', 'rendezőT', 'író', 'íróF', 'íróC', 'sugárzás', 'sugárzásF', 'sugárzásC',
'gyártási szám', 'gyártási számR', 'gyártási számT', 'nézettség', 'nézettségR', 'nézettségT',
'ország', 'epizódok', 'teljes szélesség', 'egyéb1', 'egyéb1F', 'egyéb1C',
'egyéb2', 'egyéb2F', 'egyéb2C', 'egyéb3', 'egyéb3F', 'egyéb3C',
'egyéb4', 'egyéb4F', 'egyéb4C',
}, args)
end
applyParameterAliases(args)
return EpisodeTable.new(frame,args) .. tracking
end
function p.part(frame)
local args = require('Modul:Arguments').getArgs(frame, {
removeBlanks = false,
wrappers = 'Sablon:Epizód táblázat/rész'
})
applyParameterAliases(args)
return EpisodeTable.part(frame,args)
end
function p.ref(frame)
local args = require('Modul:Arguments').getArgs(frame, {
removeBlanks = false,
})
return EpisodeTable.reference(args.r,args.b)
end
return p