Module:Series overview
| This Lua module is used on approximately 9,200 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. |
| This module depends on the following other modules: |
{{Series overview}} easily creates a series overview table (as per WP:TVOVERVIEW) for television series' that require it, in either a simple format (i.e. just episodes and dates) or with extra information (e.g. networks, ratings, etc).
When a "Series overview" header is not present in the article, set |id=y to set the table's HTML ID to "Series overview" so it can be directly linked to via #Series overview.
For pages using a manually created table, either convert them to use this template, or tag them with {{Convert to Series overview}}, which will place the pages in Category:Articles lacking a Series overview template (0).
Usage
[dezie ebe o si]Basic example
[dezie ebe o si]Code
|
|---|
{{Series overview
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
}}
|
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 26 | September 19, 2014 | June 26, 2015 | |
Alternate link text with caption and raw link text
[dezie ebe o si]Code
|
|---|
{{Series overview
| caption = Series overview
| color1 = #74E387
| link1 = #Season 1
| linkT1 = Chapter One
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| linkT2 = Chapter Two
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| linkT3 = Chapter Three
| linkR3 = {{dummy ref|1}}
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
}}
|
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| Chapter One | 26 | September 8, 2012 | June 15, 2013 | |
| Chapter Two | 26 | September 13, 2013 | June 21, 2014 | |
| Chapter Three[1] | 26 | September 19, 2014 | June 26, 2015 | |
Series or Season and "DD MM YYYY" dates
[dezie ebe o si]The top-left cell displays either Series or Season, determined if the |df= parameter of the first {{Start date}} template is set. If it is included (|df=y), the cell will display Series, otherwise the cell will display Season. This can be overridden by setting either |seriesT= or |seasonT= to custom text.
Code
|
|---|
{{Series overview
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8|df=y}}
| end1 = {{End date|2013|6|15|df=y}}
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13|df=y}}
| end2 = {{End date|2014|6|21|df=y}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19|df=y}}
| end3 = {{End date|2015|6|26|df=y}}
}}
|
| Series | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | 8 September 2012 | 15 June 2013 | |
| 2 | 26 | 13 September 2013 | 21 June 2014 | |
| 3 | 26 | 19 September 2014 | 26 June 2015 | |
Split season
[dezie ebe o si]Code
|
|---|
{{Series overview
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| link3 = #Season 3
| episodes3 = 38
| color3A = #000000
| episodes3A = 13
| start3A = {{Start date|2014|9|19}}
| end3A = {{End date|2014|12|24}}
| color3B = #00004A
| episodes3B = 12
| start3B = {{Start date|2015|2|15}}
| end3B = {{End date|2015|6|26}}
| color3C = #00008A
| episodes3C = 13
| start3C = {{Start date|2015|11|4}}
| end3C = {{End date|2016|1|31}}
}}
|
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 38 | 13 | September 19, 2014 | December 24, 2014 |
| 12 | February 15, 2015 | June 26, 2015 | ||
| 13 | November 4, 2015 | January 31, 2016 | ||
Setting episodes=hide
[dezie ebe o si]And with the |episodes=hide.
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 13 | September 19, 2014 | December 24, 2014 | |
| 12 | February 15, 2015 | June 26, 2015 | ||
| 13 | November 4, 2015 | January 31, 2016 | ||
Setting episodesA=hide
[dezie ebe o si]And with the |episodesA=hide.
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 38 | September 19, 2014 | December 24, 2014 | |
| February 15, 2015 | June 26, 2015 | |||
| November 4, 2015 | January 31, 2016 | |||
Specials
[dezie ebe o si]Code
|
|---|
{{Series overview
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
| color3S = #00004A
| link3S = #Special
| linkT3S = S
| episodes3S = 1
| released3S = {{Start date|2015|10|21}}
}}
|
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 26 | September 19, 2014 | June 26, 2015 | |
| S | 1 | October 21, 2015 | ||
Without the episodes parameter
[dezie ebe o si]And with the |episodes= parameter removed and the link text changed.
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 26 | September 19, 2014 | June 26, 2015 | |
| Special | October 21, 2015 | |||
Multiple specials in a row
[dezie ebe o si]Code
|
|---|
{{Series overview
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
| color3SA = #00004A
| link3SA = #Special
| linkT3SA = Special 1
| released3SA = {{Start date|2015|10|21}}
| color3SB = #7487E3
| link3SB = #Special
| linkT3SB = Special 2
| released3SB = {{Start date|2016|1|22}}
}}
|
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 26 | September 19, 2014 | June 26, 2015 | |
| Special 1 | October 21, 2015 | |||
| Special 2 | January 22, 2016 | |||
Special first, followed by season one
[dezie ebe o si]Code
|
|---|
{{Series overview
| color0S = #00004A
| link0S = #Special
| linkT0S = S
| episodes0S = 1
| released0S = {{Start date|2011|10|21}}
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
}}
|
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| S | 1 | October 21, 2011 | ||
| 1 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 26 | September 19, 2014 | June 26, 2015 | |
Extra information and country-based header
[dezie ebe o si]Code
|
|---|
{{Series overview
| infoA = Rank
| infoB = Rating
| infoC = Average viewership (in millions)
| country = U.S.
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| infoA1 = 55
| infoB1 = 11.8
| infoC1 = 3.2
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| infoA2 = 65
| infoB2 = 9.2
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
| infoA3 = 63
}}
|
| Season | Episodes | Originally released (U.S.) | Rank | Rating | Average viewership (in millions) | ||
|---|---|---|---|---|---|---|---|
| First released | Last released | ||||||
| 1 | 26 | September 8, 2012 | June 15, 2013 | 55 | 11.8 | 3.2 | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | 65 | 9.2 | TBA | |
| 3 | 26 | September 19, 2014 | June 26, 2015 | 63 | TBA | TBA | |
Multiple networks
[dezie ebe o si]Code
|
|---|
{{Series overview
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| network1 = [[The WB]]
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
| network3 = [[The CW]]
}}
|
| Season | Episodes | Originally released | |||
|---|---|---|---|---|---|
| First released | Last released | Network | |||
| 1 | 26 | September 8, 2012 | June 15, 2013 | The WB | |
| 2 | 26 | September 13, 2013 | June 21, 2014 | ||
| 3 | 26 | September 19, 2014 | June 26, 2015 | The CW | |
Auxiliary columns
[dezie ebe o si]Code
|
|---|
{{Series overview
| auxA = Title
| auxB = Stories
| color1 = #74E387
| link1 = #Season 1
| auxA1 = ''First''
| auxB1 = 13
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| auxA2 = ''Second''
| auxB2 = 14
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| auxA3 = ''Third''
| auxB3 = 15
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
}}
|
| Season | Title | Stories | Episodes | Originally released | ||
|---|---|---|---|---|---|---|
| First released | Last released | |||||
| 1 | First | 13 | 26 | September 8, 2012 | June 15, 2013 | |
| 2 | Second | 14 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | Third | 15 | 26 | September 19, 2014 | June 26, 2015 | |
Using aux and postaux
[dezie ebe o si]And with a combination of |aux= and |postaux= parameters.
Code
|
|---|
{{Series overview
| auxA = Title
| postauxA = Stories
| color1 = #74E387
| link1 = #Season 1
| auxA1 = ''First''
| episodes1 = 26
| postauxA1 = 13
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| color2 = #004000
| link2 = #Season 2
| auxA2 = ''Second''
| episodes2 = 26
| postauxA2 = 14
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| auxA3 = ''Third''
| episodes3 = 26
| postauxA3 = 15
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
}}
|
| Season | Title | Episodes | Stories | Originally released | ||
|---|---|---|---|---|---|---|
| First released | Last released | |||||
| 1 | First | 26 | 13 | September 8, 2012 | June 15, 2013 | |
| 2 | Second | 26 | 14 | September 13, 2013 | June 21, 2014 | |
| 3 | Third | 26 | 15 | September 19, 2014 | June 26, 2015 | |
Released
[dezie ebe o si]Code
|
|---|
{{Series overview
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| released1 = {{Start date|2012|9|8}}
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| released3 = {{Start date|2014|9|19}}
}}
|
| Season | Episodes | Originally released | ||
|---|---|---|---|---|
| First released | Last released | |||
| 1 | 26 | September 8, 2012 | ||
| 2 | 26 | September 13, 2013 | June 21, 2014 | |
| 3 | 26 | September 19, 2014 | ||
Using release dates
[dezie ebe o si]Start and End dates not used; entirely Release dates used.
Multi-series franchise and part subheaders
[dezie ebe o si]Part subheaders, such as those shown below, can be inserted using {{Series overview/part}}; as this particular sub-template is simply a redirect of {{Episode table/part}}, the documentation and correct parameter usage can be viewed at Script error: No such module "Section link"..
Code
|
|---|
{{Series overview
| width = 75%
| infoA = [[Showrunner]]
| infoB = Status
| multiseries =
{{Series overview/part|c=#ccf|subtitle=Live-action series}}
{{Series overview
| series = ''Series A''
| infoA = y
| infoB = y
| color1 = #74E387
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2012|9|8}}
| end1 = {{End date|2013|6|15}}
| infoA1 = John Smith
| infoB1 = Released
| infoB1span = 4
| color2 = #004000
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2013|9|13}}
| end2 = {{End date|2014|6|21}}
| color3 = #000000
| link3 = #Season 3
| episodes3 = 26
| start3 = {{Start date|2014|9|19}}
| end3 = {{End date|2015|6|26}}
}}
{{Series overview
| series = ''Series B''
| infoA = y
| infoB = y
| color1 = #7487E3
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2015|9|21}}
| end1 = {{End date|2016|6|11}}
| infoA1 = Jane Doe
| color2 = #000040
| link2 = #Season 2
| episodes2 = 26
| start2 = {{Start date|2016|9|17}}
| end2 = {{End date|2017|6|30}}
| infoB2 = Airing
}}
{{Series overview/part|c=#ccf|subtitle=Animated series}}
{{Series overview
| series = ''Series C''
| infoA = y
| infoB = y
| color1 = #D6D955
| link1 = #Season 1
| episodes1 = 26
| start1 = {{Start date|2017|9|9}}
| end1 = {{End date|2018|6|18}}
| infoA1 = Richard Roe
| infoB1 = Post-production
}}
}}
|
| Series | Season | Episodes | Originally released | Showrunner | Status | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| First released | Last released | |||||||||||
| Live-action series | ||||||||||||
| Series A | 1 | 26 | September 8, 2012 | June 15, 2013 | John Smith | Released | ||||||
| 2 | 26 | September 13, 2013 | June 21, 2014 | |||||||||
| 3 | 26 | September 19, 2014 | June 26, 2015 | |||||||||
| Series B | 1 | 26 | September 21, 2015 | June 11, 2016 | Jane Doe | |||||||
| 2 | 26 | September 17, 2016 | June 30, 2017 | Airing | ||||||||
| Animated series | ||||||||||||
| Series C | 1 | 26 | September 9, 2017 | June 18, 2018 | Richard Roe | Post-production | ||||||
The following is an example of an alternate franchise overview table, where the entries per row are condensed by series rather than season; if a separate "List of [franchise] television series" article exists, these are typically used in the parent franchise article, with the more-detailed above example used in the list article.
Code
|
|---|
{{Series overview
| width = 50%
| seasonT = Seasons
| network = y
| multiseries =
{{Series overview
| series = ''Series A''
| episodes3 = 78
| start3 = {{Start date|2012|9|8}}
| end3 = {{End date|2015|6|26}}
| network3 = [[American Broadcasting Company|ABC]]
| network3span = 2
}}
{{Series overview
| series = ''Series B''
| episodes2 = 52
| start2 = {{Start date|2015|9|21}}
| end2 = {{End date|2017|6|30}}
}}
{{Series overview
| series = ''Series C''
| episodes1 = 26
| start1 = {{Start date|2017|9|9}}
| end1 = {{End date|2018|6|18}}
| network1 = [[Disney+]]
}}
}}
|
| Series | Seasons | Episodes | Originally released | |||
|---|---|---|---|---|---|---|
| First released | Last released | Network | ||||
| Series A | 3 | 78 | September 8, 2012 | June 26, 2015 | ABC | |
| Series B | 2 | 52 | September 21, 2015 | June 30, 2017 | ||
| Series C | 1 | 26 | September 9, 2017 | June 18, 2018 | Disney+ | |
Parameters
[dezie ebe o si]|
Key for alternate rows: |
Parameter available for split seasons as {parameter}* and {parameter}*{A–Z} |
Parameter available for split seasons only as {parameter}*{A–Z} |
Parameter available for specials as {parameter}*S or {parameter}*S{A–Z} |
A * next to parameters below indicates any number that is a positive integer, starting from one for regular/split seasons, and zero for specials.
| Parameter | Description | Type | Status | ||
|---|---|---|---|---|---|
| Caption | caption | An appropriate caption for the table, normally something like "Series overview", which uses {{Screen reader-only}} to not be displayed in a browser but be voiced by a screen reader for accessibility. Required for proper accessibility. When a caption is not required on the page where the table is located, but is on a page where the table is transcluded, the caption may be wrapped in <includeonly>...</includeonly>.
|
Text | Required | |
| HTML ID | id | When a "Series overview" header is not present in the article, set |id=y to set the table's HTML ID to "Series overview" so it can be directly linked to via #Series overview.
|
Text | Optional | |
| Header titles | Season/Series | seasonT |
|
Text | Optional |
| Info sub-headers | info{A-Z} |
|
Text | Optional | |
| Auxiliary | aux{A-Z} |
|
Text | Optional | |
| postaux{A-Z} | |||||
| Country | country |
|
Text | Optional | |
| Network | network | The network that multiple seasons have been released by, if a series has been released on two or more networks. Only use as a header title in multi-series franchises, in the initial declaration of the template, not the season-specific networks and set to "y" in this case. | Text | Optional | |
| Transclusion display | info{A-Z}_transclude | Gives the option to toggle the display of certain columns (network and info columns are the only ones supported so far) when transcluding the overview. This parameter takes one of two values: 1) "onlyinclude", so the column is only included in the table when transcluded (i.e. not shown on the origin page), or 2) "noinclude", so the column is only included in the table on the origin page (i.e. not shown on the transcluding page). For the template to determine what the original article is, the original article title must be included as the first unnamed parameter (e.g. as {{Series overview|PAGE NAME}} or {{Series overview|1=PAGE NAME}}).
|
Text | Optional | |
| network_transclude | |||||
| Franchises | Multiple series | multiseries | The individual series overviews that make up a multi-series franchise table. Use in the first series overview that declares the headers. The parameter value should be the separate series overviews. Set to "y" when "dontclose" is declared. | Series overviews | Optional |
| Series | series | The linked, italicized title of the series when used in a multi-series franchise. Use in each separate series overview. | Link | Required when multiseries is set | |
| Don't Close | dontclose | Set this parameter to "y" to be able to close the initial wikicode declaration of the multi-series franchise header overview, but to be able to continue displaying the separate series and rows after the header but outside of the initial declaration. Particularly useful for when the individual rows have to be transcluded outside of the article and thus must be outside of a template. To close the initial declaration, {{Series overview/end}} must be used. {{End}} is deprecated due to lint errors. | Text | Optional | |
| Season specifics | Part | part* |
|
Template | Optional |
| Color | color* |
|
Color | Required | |
| Link | link* |
|
Text | Required | |
| Link Text | linkT* |
|
Text | Optional | |
| Raw Link Text | linkR* |
|
Text | Optional | |
| Auxiliary | aux{A-Z}* |
|
Text | Optional | |
| postaux{A-Z}* | |||||
| Episodes | episodes* |
|
Number / Text | Optional | |
| Released date | released* |
|
Date | Required (when used instead of start) | |
| Start date | start* |
|
Date | Required (when used instead of released) | |
| End date | end* | Date/Text | Optional | ||
| Network | network* |
|
Text | Optional | |
| Info | info{A-Z}* |
|
Text | Optional | |
| Spanning cells | aux{A-Z}*[{A-Z}]span |
|
Number | Optional | |
| postaux{A-Z}*[{A-Z}]span | |||||
| network*{A-Z}span | |||||
| info{A-Z}*span | |||||
TemplateData
[dezie ebe o si]TemplateData documentation used by VisualEditor and other tools
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
See a monthly parameter usage report for Template:Series overview in articles based on its TemplateData.
TemplateData for Series overview Enweghị nkọwa.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tracking categories
[dezie ebe o si]- Category:Articles using Template:Series overview with only one row (0)
- Category:Pages using series overview with unknown parameters (5)
- Category:Articles using Template:Series overview with deprecated start-parameter format (3)
-- This module implements {{Series overview}}.
require('strict')
local yesno = require('Module:Yesno')
local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' )
local tableEmptyCellModule = require('Module:Table empty cell')
--------------------------------------------------------------------------------
-- SeriesOverview class
-- The main class.
--------------------------------------------------------------------------------
local SeriesOverview = {}
function SeriesOverview.cellspan(SeasonEntries, SeasonEntries_ordered, key, cell, multipart, setspan)
if setspan ~= nil then return setspan end
local spanlength = 1
local firstEntry = SeasonEntries[SeasonEntries_ordered[cell]]
if key == 'network' and firstEntry.networkA and not firstEntry.networkB then spanlength = 2 end
for i = cell+1, #SeasonEntries_ordered do
local entry = SeasonEntries[SeasonEntries_ordered[i]]
-- Split season, then regular season
if entry.startA or entry.releasedA then
if not entry[key..'A'] then spanlength = spanlength + 1
else break end
if not entry[key..'B'] then spanlength = spanlength + 1
else break end
else
if not entry[key] and (key == 'network' or ((string.sub(key,0,7) == 'postaux' or string.sub(key,0,3) == 'aux') and (not entry.special or entry.episodes)) or (string.sub(key,0,4) == 'info') and multipart) then
spanlength = spanlength + 1
else break end
end
end
return spanlength
end
-- Sorting function
function SeriesOverview.series_sort(op1, op2)
local n1,s1 = string.match(op1,"(%d+)(%a*)")
local n2,s2 = string.match(op2,"(%d+)(%a*)")
local n1N,n2N = tonumber(n1),tonumber(n2)
if n1N == n2N then
return s1 < s2
else
return n1N < n2N
end
end
-- Function to add either text or {{N/a}} to cell
function SeriesOverview.season_cell(text, frame)
local cell
if string.find(text or '', 'table-na', 0, true) ~= nil then
local findpipe = string.find(text, ' | ', 0, true)
if findpipe ~= nil then
cell = SeriesOverview.series_attributes( frame:expandTemplate{title='N/A',args={string.sub(text,findpipe+3)}} )
else
cell = SeriesOverview.series_attributes( frame:expandTemplate{title='N/A'} )
end
else
cell = mw.html.create('td'):wikitext(text)
end
return cell
end
-- Allow usages of {{N/A}} cells
function SeriesOverview.series_attributes(infoParam)
local entries = {}
local infoCell = mw.html.create('td')
local attrMatch = '([%a-]*)="([^"]*)"'
while true do
local a,b = string.match(infoParam,attrMatch)
if a == nil or b == nil then break end
infoCell:attr(a,b)
infoParam = string.gsub(infoParam,attrMatch,'',1)
end
infoParam = string.gsub(infoParam,'%s*|%s*','',1)
infoCell:wikitext(infoParam)
return infoCell
end
function SeriesOverview.endtable()
return "</table></div>"
end
function SeriesOverview.new(frame, args)
args = args or {}
local initialArticle = args['1'] or ''
local categories = ''
local title = mw.title.getCurrentTitle()
local oldDateSupport = true
-- Create series overview table
local root = mw.html.create((args.multiseries or not args.series) and 'table' or '')
local cellPadding = '0 8px'
local basePadding = '0.2em 0.4em'
root
:addClass('wikitable')
:addClass('plainrowheaders')
:css('text-align', 'center')
:css('height', '1px')
:css('display', 'table')
-- Sortable
if args.sortable then
root:addClass('sortable');
end
-- "Series overview" ID
if args.id then
root:attr('id', 'Series overview')
end
-- Width
if args.width then
root:css('width', args.width)
end
-- Caption
if args.caption then
root:tag('caption'):wikitext(frame:expandTemplate{title='Screen reader-only',args={args.caption}})
end
-- Extract seasons info and place into a 3D array
local SeasonEntries = {}
for k,v in pairs(args) do
local str, num, str2 = string.match(k, '([^%d]*)(%d*)(%a*)')
if tonumber(k) ~= 1 and num ~= '' then
-- Special
local special = false
if string.sub(str2,1,1) == 'S' then
special = true
num = num .. str2
str2 = ''
end
-- Add to entries, create if necessary
if not SeasonEntries[num] then
SeasonEntries[num] = {}
end
SeasonEntries[num][str .. str2] = v
if special then
SeasonEntries[num]['special'] = 'y'
end
end
end
-- Order table by season number
local SeasonEntries_ordered = {}
for k in pairs(SeasonEntries) do
table.insert(SeasonEntries_ordered, k)
end
table.sort(SeasonEntries_ordered,SeriesOverview.series_sort)
local firstRow = args.multiseries and {} or SeasonEntries[SeasonEntries_ordered[1]]
-- Colspan calculation for information cells (0 = no info set)
local numAuxCells = 0
local numInfoCells = 0
for i = string.byte('A'), string.byte('Z') do
local param = 'info' .. string.char(i)
if args[param] then numInfoCells = numInfoCells + 1 end
end
-- Use of colors and network
local noColors = true
local setNetwork = false
local allReleased = true
local noEndDates = true
if (args.multiseries and args.network) then setNetwork = true end
if (args.multiseries) then allReleased = false end
for i = 1, #SeasonEntries_ordered do
local season, entry = SeasonEntries_ordered[i], SeasonEntries[SeasonEntries_ordered[i]]
for j0 = string.byte('A')-1, string.byte('Z') do
local j = string.char(j0)
if j0 == string.byte('A')-1 then j = '' end
if entry['color' .. j] then noColors = false end
if entry['network' .. j] then setNetwork = true end
if entry['start' .. j] then allReleased = false end
if entry['end' .. j] then noEndDates = false end
end
end
if title.namespace == 0 and not args.multiseries and not allReleased and noEndDates then
categories = categories .. '[[Category:Articles using Template:Series overview with deprecated start-parameter format]]'
end
-- Top info cell
-- @ = string.char(64), A = string.char(65)
local topInfoCell = numInfoCells > 0 and string.char(numInfoCells + (string.byte('A') - 1)) or '@'
-- Networks are included if the very first entry sets the first network
local networkTransclude = args.network_transclude
if (networkTransclude == 'onlyinclude' and title.fullText == initialArticle) or (networkTransclude == 'noinclude' and title.fullText ~= initialArticle) then
setNetwork = false
end
-- Headers
do
if args.multiseries or not args.series then
local headerRow = root:tag('tr')
headerRow
:css('text-align', 'center')
-- Base series/season content on the format of the first date; Series = D M Y, Season = M D, Y
local matchDMY = false
local thisStart = firstRow.start or firstRow.startA or firstRow.released or firstRow.releasedA
if thisStart then
if string.match(thisStart:gsub(" "," "), '(%d+)%s(%a+)%s(%d+)') then
matchDMY = true
end
end
-- Multiple series header
if args.multiseries then
headerRow:tag('th')
:attr('scope', 'col')
:css('padding', cellPadding)
:attr('rowspan', allReleased and 1 or 2)
:wikitext('Series')
end
-- Season header
headerRow:tag('th')
:attr('scope', 'col')
:attr('rowspan', allReleased and 1 or 2)
:css('min-width', '50px')
:css('padding', cellPadding)
:wikitext(args.seriesT or args.seasonT or (matchDMY and 'Series') or 'Season')
for _a = 1, 3 do
if _a == 1 or _a == 3 then
-- Aux headers
local auxtype = (_a == 3 and 'post' or '') .. 'aux'
for i = string.byte('A'), string.byte('Z') do
local param = auxtype .. string.char(i)
if args[param] then
numAuxCells = numAuxCells + 1
headerRow:tag('th')
:attr('scope', 'col')
:css('padding', cellPadding)
:attr('rowspan', allReleased and 1 or 2)
:wikitext(args[param])
end
end
end
if _a == 2 then
-- Episodes header
headerRow:tag('th')
:attr('scope', 'col')
:attr('rowspan', allReleased and 1 or 2)
:attr('colspan', 2)
:css('padding', cellPadding)
:wikitext(args.episodesT or 'Episodes')
end
end
-- Originally aired header
local OriginallyColspan = (not allReleased and setNetwork) and 3 or 2
local countryBlurb = ''
if args.country then
countryBlurb = ' (' .. args.country .. ')'
end
headerRow:tag('th')
:attr('scope', (setNetwork and allReleased) and 'col' or 'colgroup')
:attr('colspan', OriginallyColspan)
:wikitext('Originally released' .. countryBlurb)
-- Network subheader for released series
if setNetwork and allReleased then
headerRow:tag('th')
:attr('scope', 'col')
:attr('rowspan', allReleased and 1 or 2)
:css('padding', cellPadding)
:wikitext('Network')
end
-- Information headers
if topInfoCell ~= '@' then
for i = string.byte('A'), string.byte(topInfoCell) do
local param = 'info' .. string.char(i)
local infoTransclude = args[param .. '_transclude']
if (infoTransclude == 'onlyinclude' and title.fullText == initialArticle) or (infoTransclude == 'noinclude' and title.fullText ~= initialArticle) then else
headerRow:tag('th')
:attr('scope', 'col')
:attr('rowspan', allReleased and 1 or 2)
:css('padding', cellPadding)
:wikitext(args[param])
end
end
end
-- Subheader row
local subheaderRow = mw.html.create('tr')
if not allReleased then
-- First aired subheader
subheaderRow:tag('th')
:attr('scope', 'col')
:wikitext('First released')
-- Last aired subheader
subheaderRow:tag('th')
:attr('scope', 'col')
:wikitext('Last released')
-- Network subheader for aired series
if setNetwork then
subheaderRow:tag('th')
:attr('scope', 'col')
:css('padding', cellPadding)
:wikitext('Network')
end
end
-- Check for scenarios with an empty subheaderRow
if not allReleased or numInfoCells > 0 then
root:node(subheaderRow)
end
end
end
-- Season rows
do
if args.multiseries then
-- Multi series individual entries
if args.multiseries ~= "y" then
root:node(args.multiseries)
end
else
-- One row entries, only categorized in the mainspace
if title.namespace == 0 and #SeasonEntries == 1 then
categories = categories .. '[[Category:Articles using Template:Series overview with only one row]]'
end
-- Determine number of rows in the whole overview
local SeasonEntriesRows = 0
for X = 1, #SeasonEntries_ordered do
local season, entry = SeasonEntries_ordered[X], SeasonEntries[SeasonEntries_ordered[X]]
local splits = 0
for i = string.byte('A'), string.byte('Z') do
local paramS = 'start' .. string.char(i)
local paramR = 'released' .. string.char(i)
if entry[paramS] or entry[paramR] then splits = splits + 1 end
end
if splits == 0 then splits = 1 end
SeasonEntriesRows = SeasonEntriesRows + splits
end
for X = 1, #SeasonEntries_ordered do
local season, entry = SeasonEntries_ordered[X], SeasonEntries[SeasonEntries_ordered[X]]
-- Determine number of splits in a season
local splits = 0
for i = string.byte('A'), string.byte('Z') do
local paramS = 'start' .. string.char(i)
local paramR = 'released' .. string.char(i)
if entry[paramS] or entry[paramR] then splits = splits + 1 end
end
local splitSeason = (splits > 1)
-- Season rows for each season
for k0 = string.byte('A')-1, string.byte('Z') do
local k = string.char(k0)
if k0 == string.byte('A')-1 then k = '' end
-- Part header
if entry.part and k == '' then
root:node(entry.part)
end
-- New season row
local seasonRow = (entry['start' .. k] or entry['released' .. k]) and root:tag('tr') or mw.html.create('tr')
seasonRow:css('height', '100%')
local borderBottom = '2px solid #8D939A'
-- Series name for group overviews
if X == 1 and (k == '' or k == 'A') and args.series then
seasonRow:tag('th')
:attr('scope', 'row')
:attr('rowspan', SeasonEntriesRows)
:wikitext(args.series)
:css('border-bottom', borderBottom)
end
if X == #SeasonEntries_ordered and args.series then
seasonRow:css('border-bottom', borderBottom)
end
-- Season number link, included only in the first row
local cellColor
if not noColors then
if entry['color' .. k] ~= nil and HTMLcolor[entry['color' .. k]] == nil then
entry['color' .. k] = '#'..(mw.ustring.match(entry['color' .. k], '^[%s#]*([a-fA-F0-9]*)[%s]*$') or '')
end
if splitSeason then
if entry.color then
cellColor = entry.color
else
cellColor = "linear-gradient(to bottom"
for i = 0, splits-1 do
local _color = 'color' .. string.upper(string.char(i+97))
cellColor = cellColor .. ", " .. (entry[_color] or 'rgba(0,0,0,0)') .. " " .. (100/splits *i) .. "%"
.. ", " .. (entry[_color] or 'rgba(0,0,0,0)') .. " " .. (100/splits *(i+1)) .. "%"
end
cellColor = cellColor .. ")"
end
else
cellColor = entry['color' .. k]
end
end
if k == '' or k == 'A' then
local colorWidth = '14px'
-- Overall table cell
local cellRow = mw.html.create(args.series and 'td' or 'th')
:attr('scope', splitSeason and 'rowgroup' or 'row')
:attr('rowspan', splitSeason and splits or nil)
:attr('colspan', entry.special and not entry.episodes and 3+numAuxCells or 1)
:css('height', 'inherit')
:css('padding', '0')
-- Overall inner span
local spanRow = mw.html.create('span')
spanRow
:css('width: 100%')
:css('text-align', 'center')
:css('float', 'left')
:css('width', '100%')
:css('height', '100%')
-- Coloured nested span
local spanRow2 = mw.html.create('span')
spanRow2
:css('width', colorWidth)
:css('background', cellColor)
:css('color', '#202122')
:css('height', '100%')
:css('float', 'left')
:css('box-shadow', 'inset -1px 0 #A2A9B1')
-- Link nested span
local spanRow3 = mw.html.create('span')
spanRow3
:css('height', '100%')
:css('width', not noColors and 'calc(100% - ' .. colorWidth .. ' - 8px)' or '100%')
:css('display', 'flex')
:css('vertical-align', 'middle')
:css('align-items', 'center')
:css('justify-content', 'center')
:css('padding', not noColors and '0 4px' or '')
local spanRow4 = mw.html.create('span')
spanRow4
:addClass('nowrap')
-- Coloured span first into the overall span
if not noColors then
spanRow:node(spanRow2)
end
-- Link into the blank span
spanRow4:wikitext((entry.link and '[[' .. entry.link .. '|' .. (entry.linkT or season) .. ']]' or (entry.linkT or season)) .. (entry.linkR or ''))
-- Blank span into the Link nested span
spanRow3:node(spanRow4)
-- Link span second into the overall span
spanRow:node(spanRow3)
-- Overall span into the actual cell
cellRow:node(spanRow)
-- The actual cell into the season row
seasonRow:node(cellRow)
end
for _a = 1, 3 do
if _a == 1 or _a == 3 then
-- Aux headers
local auxtype = (_a == 3 and 'post' or '') .. 'aux'
-- Aux cells
for i = string.byte('A'), string.byte('Z') do
local param = auxtype .. string.char(i)
if entry[param .. k] then
local thisCell = SeriesOverview.season_cell(entry[param .. k], frame)
:attr('scope', 'col')
:attr('rowspan', SeriesOverview.cellspan(SeasonEntries, SeasonEntries_ordered, param, X, (args.series and true or false), entry[param .. k .. 'span'] or nil))
:css('padding', cellPadding)
seasonRow:node(thisCell)
end
end
end
if _a == 2 then
-- Episodes counts
if ((splitSeason and k == 'A' and entry.episodes ~= 'hide') or not splitSeason) then
if entry.episodes then
local thisCell = SeriesOverview.season_cell(entry.episodes, frame)
:attr('colspan', (splitSeason and entry.episodesA ~= 'hide') and 1 or 2)
:attr('rowspan', splitSeason and splits or nil)
seasonRow:node(thisCell)
elseif not entry.special then
local infoCell = SeriesOverview.series_attributes( tableEmptyCellModule._main({}) )
infoCell
:attr('colspan', (splitSeason and entry.episodesA ~= 'hide') and 1 or 2)
:attr('rowspan', splitSeason and splits or nil)
seasonRow:node(infoCell)
end
end
if splitSeason and entry.episodesA ~= 'hide' then
if entry['episodes' .. k] then
local thisCell = SeriesOverview.season_cell(entry['episodes' .. k], frame)
:attr('colspan', (entry.episodes ~= 'hide') and 1 or 2)
seasonRow:node(thisCell)
else
local infoCell = SeriesOverview.series_attributes( tableEmptyCellModule._main({}) )
:attr('colspan', (entry.episodes ~= 'hide') and 1 or 2)
seasonRow:node(infoCell)
end
end
end
end
-- Start date
if entry['start' .. k] or entry['released' .. k] then
local thisCell = oldDateSupport and (
SeriesOverview.season_cell(entry['start' .. k] or entry['released' .. k], frame)
) or (
SeriesOverview.season_cell((not allReleased or entry['end' .. k]) and entry['start' .. k] or entry['released' .. k], frame)
)
thisCell:attr('colspan', oldDateSupport and (
((not entry.special and entry['released' .. k]) or (entry.special and not entry['end' .. k]) or allReleased) and 2 or 1
) or (
(entry['released' .. k] or allReleased) and 2 or 1
))
:css('padding',basePadding)
seasonRow:node(thisCell)
else
local infoCell = SeriesOverview.series_attributes( tableEmptyCellModule._main({}) )
infoCell:css('padding',basePadding)
seasonRow:node(infoCell)
end
-- End date
local canIncludeEnd = oldDateSupport and (
(not allReleased and not entry['released' .. k] and ((entry.special and entry['end' .. k]) or not entry.special)) and 'yes' or 'no'
) or (
(not allReleased and not entry['released' .. k] and ((entry.special and entry['end' .. k]) or not entry.special)) and 'yes' or 'no'
)
if canIncludeEnd == 'yes' then
if entry['end' .. k] then
local thisCell = SeriesOverview.season_cell(entry['end' .. k], frame)
:css('padding',cellPadding)
seasonRow:node(thisCell)
else
local infoCell = SeriesOverview.series_attributes( tableEmptyCellModule._main({}) )
infoCell:css('padding',cellPadding)
seasonRow:node(infoCell)
end
end
-- Network
if entry['network' .. k] and setNetwork then
local thisCell = SeriesOverview.season_cell(entry['network' .. k], frame)
:attr('rowspan', SeriesOverview.cellspan(SeasonEntries, SeasonEntries_ordered, 'network', X, (args.series and true or false), entry['network' .. k .. 'span'] or nil))
seasonRow:node(thisCell)
end
-- Information
for i = string.byte('A'), string.byte(topInfoCell) do
local param0 = 'info' .. string.char(i)
local param = 'info' .. string.char(i) .. k
local infoTransclude = args[param .. '_transclude']
if (infoTransclude == 'onlyinclude' and title.fullText == initialArticle) or (infoTransclude == 'noinclude' and title.fullText ~= initialArticle) then else
local infoParam = entry[param]
if infoParam and splitSeason and k == '' and not entry[param .. 'A'] then
entry[param .. 'A'] = entry[param]
entry[param .. 'spanning'] = 'y'
end
local rowspan = (entry[param0 .. 'spanning'] and splits) or
(args.series and SeriesOverview.cellspan(SeasonEntries, SeasonEntries_ordered, param0, X, (args.series and true or false), entry[param0 .. 'span'] or nil))
or nil
if k == 'A' or (k ~= 'A' and not entry[param0 .. 'spanning']) then
-- Cells with {{N/A|...}} already expanded
if infoParam then
if string.sub(infoParam,1,5) == 'style' then
local infoCell = SeriesOverview.series_attributes(infoParam)
infoCell:attr('rowspan', rowspan)
seasonRow:node(infoCell)
else
-- Unstyled content info cell
local thisCell = SeriesOverview.season_cell(infoParam, frame)
:attr('rowspan', rowspan)
seasonRow:node(thisCell)
end
else
if not args.series then
local infoCell = SeriesOverview.series_attributes( tableEmptyCellModule._main({}) )
infoCell:attr('rowspan', rowspan)
seasonRow:node(infoCell)
end
end
elseif not entry[param0 .. 'spanning'] then
if not args.series then
local infoCell = SeriesOverview.series_attributes( tableEmptyCellModule._main({}) )
infoCell:attr('rowspan', rowspan)
seasonRow:node(infoCell)
end
end
end
end
end -- End k0 string.byte
end -- End 'for' SeasonEntries_ordered
end -- End 'if' multiseries
end -- End 'do' season rows
local rootdiv
if args.multiseries or not args.series then
rootdiv = mw.html.create('div')
rootdiv
:css('display', 'block')
:css('overflow-x', 'auto')
rootdiv:node(root)
rootdiv = tostring(rootdiv)
else
rootdiv = tostring(root)
end
if args.dontclose then
rootdiv = mw.ustring.gsub(rootdiv, "</div>", "")
rootdiv = mw.ustring.gsub(rootdiv, "</table>", "")
end
return rootdiv .. categories
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Series overview'
})
return SeriesOverview.new(frame, args)
end
function p._end(frame)
return SeriesOverview.endtable()
end
return p